Merge branch 'master' into fs_emboss_with_CGAL_5_4

# Conflicts:
#	src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
This commit is contained in:
Filip Sykala 2022-03-09 11:08:39 +01:00
commit f75f326f8e
19 changed files with 898 additions and 134 deletions

1
.gitignore vendored
View File

@ -18,3 +18,4 @@ local-lib
build-linux/*
deps/build-linux/*
**/.DS_Store
/.idea/

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -1,4 +1,5 @@
min_slic3r_version = 2.4.0-rc
1.4.3 Added new filament profiles and SLA materials.
1.4.2 Added SLA material profiles.
1.4.1 Updated firmware version.
1.4.0 Updated for the PrusaSlicer 2.4.0-rc release. Updated SLA material colors.

View File

@ -5,7 +5,7 @@
name = Prusa Research
# Configuration version of this file. Config file will only be installed, if the config_version differs.
# This means, the server may force the PrusaSlicer configuration to be downgraded.
config_version = 1.4.2
config_version = 1.4.3
# Where to get the updates from?
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
@ -477,7 +477,7 @@ perimeter_acceleration = 800
perimeter_speed = 50
solid_infill_speed = 50
top_infill_extrusion_width = 0.4
top_solid_layers = 7
top_solid_layers = 8
bridge_flow_ratio = 1
bridge_speed = 25
@ -1543,6 +1543,7 @@ filament_max_volumetric_speed = 13
[filament:*ABSMINI*]
# inherits = *ABS*
bed_temperature = 100
first_layer_bed_temperature = 100
filament_retract_length = 2.7
filament_retract_speed = nil
filament_deretract_speed = nil
@ -2914,6 +2915,7 @@ inherits = *PET*
filament_vendor = BASF
filament_cost =
filament_density = 1.33
filament_colour = #F7F7F7
first_layer_temperature = 220
first_layer_bed_temperature = 70
temperature = 215
@ -2925,7 +2927,7 @@ bridge_fan_speed = 100
filament_type = PET
disable_fan_first_layers = 1
full_fan_speed_layer = 3
filament_notes = "BASF Forward AM Ultrafuse PET\nMaterial profile version 1.0\n\nMaterial Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion.\n"
filament_notes = "Material Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion."
filament_retract_length = 2
filament_retract_speed = 40
filament_retract_before_travel = 2
@ -2943,7 +2945,7 @@ filament_cost =
filament_density = 1.25
filament_spool_weight = 0
filament_colour = #FFFFFF
filament_notes = "BASF Forward AM Ultrafuse PLA PRO1\nMaterial profile version 1.0\n\nMaterial Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate.\n"
filament_notes = "Material Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate."
filament_retract_length = 2
filament_retract_lift = 0
filament_retract_speed = 40
@ -2969,15 +2971,303 @@ max_fan_speed = 20
bed_temperature = 100
disable_fan_first_layers = 3
filament_colour = #FFFFFF
filament_notes = "BASF Forward AM Ultrafuse ABS\nMaterial profile version 1.0\n\nMaterial Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion.\n"
filament_retract_length = 2
filament_retract_speed = 40
filament_notes = "Material Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion."
filament_retract_before_travel = 2
filament_wipe = 0
filament_retract_layer_change = 0
[filament:Ultrafuse ABS @MINI]
inherits = Ultrafuse ABS; *ABSMINI*
filament_retract_layer_change = nil
[filament:Ultrafuse ABS Fusion+]
inherits = Ultrafuse ABS
filament_density = 1.08
first_layer_bed_temperature = 105
temperature = 250
filament_colour = #FFF8D9
filament_notes = "Material Description\nABS Fusion+ made with Polyscope XILOY™ 3D is an engineering filament which has been optimized for 3D-printing. This special grade has been developed in collaboration with Polyscope Polymers - renowned for its material solutions in the automotive industry. ABS is a thermoplastic which is used in many applications. Although ABS has been classified as a standard material in 3D-printing it is known to be quite challenging to process. ABS Fusion+ combines the properties of ABS with an improved processability. The filament is based on an ABS grade which can be directly printed on glass without any adhesives or tape and has a higher success rate of prints due to extreme low warping."
filament_retract_before_travel = 2
filament_wipe = nil
filament_retract_layer_change = 0
filament_retract_lift = 0
[filament:Ultrafuse ABS Fusion+ @MINI]
inherits = Ultrafuse ABS Fusion+; *ABSMINI*
first_layer_bed_temperature = 100
filament_retract_layer_change = nil
[filament:Ultrafuse ASA]
inherits = Ultrafuse ABS Fusion+
filament_density = 1.07
filament_colour = #FFF4CA
first_layer_temperature = 275
temperature = 275
first_layer_bed_temperature = 110
bed_temperature = 105
filament_type = ASA
min_fan_speed = 25
max_fan_speed = 50
bridge_fan_speed = 100
disable_fan_first_layers = 4
filament_max_volumetric_speed = 5
filament_notes = "Material Description\nUltrafuse ASA is a high-performance thermoplastic with similar mechanical properties as ABS. ASA offers additional benefits such as high outdoor weather resistance. The UV resistance, toughness, and rigidity make it an ideal material to 3D-print outdoor fixtures and appliances without losing its properties or color. When also taking into account the high heat resistance and high chemical resistance, this filament is a good choice for many types of applications.\n\nPrinting Recommendations:\nApply Magigoo PC, 3D lac or Dimafix to a clean build plate to improve adhesion."
[filament:Ultrafuse ASA @MINI]
inherits = Ultrafuse ASA; *ABSMINI*
filament_type = ASA
[filament:Ultrafuse HIPS]
inherits = Ultrafuse ABS
temperature = 250
filament_density = 1.02
filament_type = HIPS
min_fan_speed = 20
max_fan_speed = 20
filament_soluble = 1
filament_notes = "Material Description\nUltrafuse HIPS is a high-quality engineering thermoplastic, which is well known in the 3D-printing industry as a support material for ABS. But this material has additional properties to offer like good impact resistance, good dimensional stability, and easy post-processing. HiPS is a great material to use as a support for ABS because there is a good compatibility between the two materials, and HIPS is an easy breakaway support. Now you have the opportunity to create ABS models with complex geometry. HIPS is easy to post process with glue or with sanding paper."
[filament:Ultrafuse HIPS @MINI]
inherits = Ultrafuse HIPS; *ABSMINI*
filament_type = HIPS
min_fan_speed = 20
max_fan_speed = 20
[filament:Ultrafuse PA]
inherits = Fillamentum Nylon FX256
filament_vendor = BASF
filament_density = 1.12
filament_colour = #ECFAFF
first_layer_temperature = 240
temperature = 240
first_layer_bed_temperature = 80
bed_temperature = 70
min_fan_speed = 0
max_fan_speed = 0
bridge_fan_speed = 0
fan_below_layer_time = 30
slowdown_below_layer_time = 20
min_print_speed = 15
filament_max_volumetric_speed = 11
filament_retract_length = 1
filament_retract_lift = 0
filament_retract_before_travel = 2
filament_retract_layer_change = 0
filament_cost = 0
filament_spool_weight = 0
compatible_printers_condition = printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
filament_notes = "Material Description\nThe key features of Ultrafuse PA are the high strength and high modulus. Furthermore, Ultrafuse PA shows a good thermal distortion stability.\n\nPrinting Recommendations:\nApply PVA glue, Kapton tape or PA adhesive to a clean buildplate to improve adhesion."
[filament:Ultrafuse PA6 GF30]
inherits = Ultrafuse PA
filament_density = 1.17
first_layer_temperature = 270
temperature = 270
first_layer_bed_temperature = 100
bed_temperature = 100
filament_colour = #404040
fan_always_on = 1
min_fan_speed = 0
max_fan_speed = 50
bridge_fan_speed = 100
disable_fan_first_layers = 1
full_fan_speed_layer = 3
slowdown_below_layer_time = 15
filament_max_volumetric_speed = 10
filament_retract_length = 1.2
filament_retract_speed = 40
filament_deretract_speed = 30
filament_retract_lift = nil
filament_wipe = 0
filament_notes = "Material Description\nUltrafuse® PA6 GF30 is a unique compound specifically developed for FFF printing. Due to the glass fiber content of 30%, parts tend to warp less. In addition the excellent layer adhesion and its compatibility with the water soluble support Ultrafuse® BVOH make this material the perfect solution to develop industrial applications on an FFF printer.\n\nWith its high wear and chemical resistance, high stiffness and strength, Ultrafuse® PA6 GF30 is perfect for a wide variety of applications in automotive, electronics or transportation.\n\nUltrafuse PA6 GF30 is designed for functional prototyping and demanding applications such as industrial tooling, transportation, electronics, small appliances, sports & leisure\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PA6 GF30 can be printed directly onto a clean build plate. For challenging prints, use Magigoo PA gluestick to improve adhesion."
compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Ultrafuse PAHT-CF15]
inherits = Ultrafuse PA6 GF30
filament_density = 1.23
filament_notes = "Material Description\nPAHT CF15 is a high-performance 3D printing filament that opens new application fields in FFF printing. In parallel to its advanced mechanical properties, dimensional stability, and chemical resistance, it has very good processability. It works in any FFF printer with a hardened nozzle. In addition to that, it is compatible with water-soluble support material and HiPS, which allow printing complex geometries that work in challenging environments. PAHT CF15 has high heat resistance up to 130 °C and low moisture absorption.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PAHT-CF can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion."
[filament:Ultrafuse PC-ABS-FR]
inherits = Ultrafuse ABS
filament_colour = #505050
filament_density = 1.17
first_layer_temperature = 275
temperature = 275
first_layer_bed_temperature = 110
bed_temperature = 105
filament_type = PC
filament_max_volumetric_speed = 8
filament_wipe = nil
min_fan_speed = 20
max_fan_speed = 20
bridge_fan_speed = 30
disable_fan_first_layers = 4
compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
filament_notes = "Material Description\nUltrafuse® PC/ABS FR Black is a V-0 flame retardant blend of Polycarbonate and ABS two of the most used thermoplastics for engineering & electrical applications. The combination of these two materials results in a premium material with a mix of the excellent mechanical properties of PC and the comparably low printing temperature of ABS. Combined with a halogen free flame retardant, parts printed with Ultrafuse® PC/ABS FR Black feature great tensile and impact strength, higher thermal resistance than ABS and can fulfill the requirements of the UL94 V-0 standard.\n\nPrinting Recommendations:\nApply Magigoo PC to a clean build plate to improve adhesion."
start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0"
[filament:Ultrafuse PET-CF15]
inherits = Ultrafuse PET
filament_density = 1.36
filament_colour = #404040
first_layer_temperature = 270
temperature = 270
first_layer_bed_temperature = 75
bed_temperature = 75
min_fan_speed = 60
max_fan_speed = 100
bridge_fan_speed = 100
disable_fan_first_layers = 1
full_fan_speed_layer = 3
slowdown_below_layer_time = 15
fan_below_layer_time = 30
filament_max_volumetric_speed = 10
filament_retract_length = 1.2
filament_retract_speed = 40
filament_deretract_speed = 30
filament_retract_lift = nil
filament_wipe = 0
start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
filament_notes = "Material Description\nPET CF15 is a Carbon Fiber reinforced PET which has precisely tuned material properties, for a wide range of technical applications. The filament is very strong and stiff and has high heat resistance. With its high dimensional stability and low abrasiveness, the filament offers an easy to print experience which allows direct printing on glass or a PEI sheet. It is compatible with HiPS for breakaway support and water soluble support and has an excellent surface finish.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PET-CF15 can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion."
compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Ultrafuse PLA]
inherits = *PLA*
filament_vendor = BASF
filament_density = 1.25
full_fan_speed_layer = 3
filament_notes = "Material Description\nPLA is one of the most used materials for 3D printing. Ultrafuse PLA is available in a wide range of colors. The glossy feel often attracts those who print display models or items for household use. Many appreciate the plant-based origin of this material. When properly cooled, PLA has a high maximum printing speed and sharp printed corners. Combining this with low warping of the print makes it a popular plastic for home printers, hobbyists, prototyping and schools.\n\nPrinting Recommendations:\nUltrafuse PLA can be printed directly onto a clean build plate."
[filament:Ultrafuse PP]
inherits = Ultrafuse ABS
filament_density = 0.91
filament_colour = #F0F0F0
first_layer_temperature = 240
temperature = 240
first_layer_bed_temperature = 80
bed_temperature = 70
min_fan_speed = 100
max_fan_speed = 100
bridge_fan_speed = 100
disable_fan_first_layers = 1
full_fan_speed_layer = 3
fan_below_layer_time = 60
slowdown_below_layer_time = 20
min_print_speed = 10
filament_type = PP
filament_max_volumetric_speed = 2.5
filament_retract_speed = 25
filament_deretract_speed = 25
filament_retract_layer_change = 0
filament_wipe = nil
filament_notes = "Material Description\nUltrafuse PP is high-performance thermoplastic with low density, high elasticity and high resistance to fatigue. The mechanical properties make it an ideal material for 3D-printing applications which have to endure high stress or strain. The filament has high chemical resistance and a high isolation value. PP is one of the most used materials in the world, due to its versatility and ability to engineer lightweight tough parts.\n\nPrinting Recommendations:\nApply PP tape or Magigoo PP adhesive to the buildplate for optimal adhesion."
compatible_printers_condition = printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Ultrafuse PP-GF30]
inherits = Ultrafuse PP
filament_density = 1.07
filament_colour = #404040
first_layer_temperature = 260
temperature = 250
first_layer_bed_temperature = 90
bed_temperature = 40
min_fan_speed = 40
max_fan_speed = 75
fan_always_on = 1
fan_below_layer_time = 30
slowdown_below_layer_time = 15
min_print_speed = 15
filament_retract_length = 1.2
filament_retract_speed = 40
filament_deretract_speed = 30
filament_retract_lift = nil
filament_wipe = 0
filament_notes = "Ultrafuse PP GF30 is polypropylene, reinforced with 30% glass fiber content. The fibers in this compound are specially designed for 3D-printing filaments and are compatible with a wide range of standard FFF 3D-printers. The extreme stiffness makes this material highly suitable for demanding applications. Other key properties of PPGF30 are high heat resistance and improved UV-resistance. All these excellent properties make this filament highly suitable in an industrial environment.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nApply PP strapping tape or PPGF adhesive to a clean build plate for optimal adhesion."
compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Ultrafuse TPC-45D]
inherits = *FLEX*
filament_vendor = BASF
extrusion_multiplier = 1
filament_density = 1.15
filament_colour = #0035EC
first_layer_temperature = 235
temperature = 235
first_layer_bed_temperature = 60
bed_temperature = 60
min_fan_speed = 10
max_fan_speed = 50
bridge_fan_speed = 80
fan_below_layer_time = 30
slowdown_below_layer_time = 15
min_print_speed = 15
fan_always_on = 1
cooling = 1
filament_max_volumetric_speed = 1.2
filament_retract_length = 1.2
filament_retract_speed = 25
filament_deretract_speed = 25
filament_retract_lift = 0
filament_wipe = nil
filament_retract_before_wipe = nil
filament_retract_before_travel = 2
filament_retract_layer_change = 0
filament_notes = "Material Description\nTPC 45D is a flexible, shore 45D, rubber-like Thermoplastic Copolyester Elastomer (TPE-C), which is derived from rapeseed oil and combines the best properties of elastomers (rubbers) and polyesters. The material delivers excellent adhesion in the Z-direction, meaning that the printed layers do not detach - even with extreme deformation.\n\nPrinting Recommendations:\nApply Magigoo Flex to a clean build plate to improve adhesion."
## [filament:Ultrafuse TPS-90A]
## inherits = Ultrafuse TPC-45D
## filament_density = 1.04
## extrusion_multiplier = 1.02
## filament_colour = #FFFFFF
## first_layer_temperature = 270
## temperature = 265
## first_layer_bed_temperature = 30
## bed_temperature = 30
## min_fan_speed = 20
## max_fan_speed = 75
## filament_notes = "Material Description\nUltrafuse® TPS 90A is an elastomer based on the raw material SEBS. The combination of durable and flexible building blocks leads to a very versatile material. Compared to other flexible 3D printing materials it shows more rubber-like soft touch haptics and better non-slip properties. Furthermore, the material shows a reduced moisture uptake, which allows for printing without pre-drying. Parts printed with Ultrafuse® TPS 90A show almost no visible layers or warpage, which makes it an excellent material choice for end-use parts. Producing multi-material parts is possible by printing it together with ABS.\n\nPrinting Recommendations:\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion."
[filament:Ultrafuse TPU-64D]
inherits = Ultrafuse TPC-45D
filament_density = 1.16
first_layer_temperature = 230
temperature = 225
first_layer_bed_temperature = 40
bed_temperature = 40
min_fan_speed = 20
max_fan_speed = 100
filament_notes = "Material Description\nUltrafuse® TPU 64D is the hardest elastomer in BASF Forward AMs flexible productline. The material shows a relatively high rigidity while maintaining a certain flexibility. This filament is the perfect match for industrial applications requiring rigid parts being resistant to impact, wear and tear. Due to its property profile, the material can be used as an alternative for parts made from ABS and rubbers. Ultrafuse® TPU 64D is easy to print on direct drive and bowden style printers and is compatible with soluble BVOH support to realize the most complex geometries.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing."
[filament:Ultrafuse TPU-85A]
inherits = Ultrafuse TPU-64D
filament_density = 1.11
first_layer_temperature = 225
temperature = 220
filament_notes = "Material Description\nUltrafuse® TPU 85A comes in its natural white color. Chemical properties (e.g. resistance against particular substances) and tolerance for solvents can be made available, if these factors are relevant for a specific application. Generally, these properties correspond to publicly available data on polyether based TPUs. This material is not FDA conform. Good flexibility at low temperature, good wear performance and good damping behavior are the key features of Ultrafuse® TPU 85A.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing."
[filament:Ultrafuse TPU-95A]
inherits = Ultrafuse TPU-85A
filament_density = 1.14
first_layer_temperature = 230
temperature = 225
filament_notes = "Material Description\nUltrafuse® TPU 95A comes with a well-balanced profile of flexibility and durability. On top of that, it allows for easier and faster printing then softer TPU grades. Parts printed with Ultrafuse® TPU 95A show a high elongation, good impact resistance, excellent layer adhesion and a good resistance to oils and common industrially used chemicals. Due to its good printing behavior, Ultrafuse® TPU 95A is a good choice for starting printing flexible materials on both direct drive and bowden style printers.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing."
[filament:Ultrafuse rPET]
inherits = Ultrafuse PET
filament_density = 1.27
filament_colour = #9DC5FF
first_layer_temperature = 235
temperature = 235
first_layer_bed_temperature = 80
bed_temperature = 75
min_fan_speed = 50
max_fan_speed = 100
fan_below_layer_time = 15
filament_notes = "Material Description\nPET is mainly known by the well-known PET bottle material. This recycled has a natural transparent blueish look. It has excellent 3D printing properties and good mechanical characteristics."
filament_retract_length = 1.2
filament_retract_lift = 0.6
filament_wipe = nil
[filament:Ultrafuse Metal]
inherits = *ABSC*
@ -4629,7 +4919,7 @@ material_colour = #FF8040
inherits = *common 0.025*
exposure_time = 12
initial_exposure_time = 30
material_type = Tough
material_type = Casting
material_vendor = 3DM
material_colour = #B0B000
@ -5084,6 +5374,38 @@ material_type = Tough
material_vendor = Ameralabs
material_colour = #C0C0C0
[sla_material:PrimaCreator Tough Light Grey @0.025]
inherits = *common 0.025*
exposure_time = 6
initial_exposure_time = 35
material_type = Tough
material_vendor = PrimaCreator
material_colour = #C0C0C0
[sla_material:PrimaCreator Tough Clear @0.025]
inherits = *common 0.025*
exposure_time = 5
initial_exposure_time = 35
material_type = Tough
material_vendor = PrimaCreator
material_colour = #F8F8F8
[sla_material:PrimaCreator Tough White @0.025]
inherits = *common 0.025*
exposure_time = 5
initial_exposure_time = 35
material_type = Tough
material_vendor = PrimaCreator
material_colour = #FFFFFF
[sla_material:PrimaCreator Flex Clear @0.025]
inherits = *common 0.025*
exposure_time = 4.5
initial_exposure_time = 30
material_type = Flexible
material_vendor = PrimaCreator
material_colour = #F8F8F8
[sla_material:Siraya Tech Simple Clear @0.025]
inherits = *common 0.025*
exposure_time = 8
@ -5371,7 +5693,7 @@ inherits = *common 0.05*
exposure_time = 12
initial_exposure_time = 45
material_type = Tough
material_vendor = Monocure
material_vendor = 3DM
material_colour = #EC0000
[sla_material:Esun Bio-Photopolymer Resin White @0.05]
@ -5550,6 +5872,38 @@ material_type = Tough
material_vendor = Photocentric
material_colour = #C0C0C0
[sla_material:PrimaCreator Tough Light Grey @0.05]
inherits = *common 0.05*
exposure_time = 8.5
initial_exposure_time = 35
material_type = Tough
material_vendor = PrimaCreator
material_colour = #C0C0C0
[sla_material:PrimaCreator Tough Clear @0.05]
inherits = *common 0.05*
exposure_time = 7
initial_exposure_time = 35
material_type = Tough
material_vendor = PrimaCreator
material_colour = #F8F8F8
[sla_material:PrimaCreator Tough White @0.05]
inherits = *common 0.05*
exposure_time = 7.5
initial_exposure_time = 35
material_type = Tough
material_vendor = PrimaCreator
material_colour = #FFFFFF
[sla_material:PrimaCreator Flex Clear @0.05]
inherits = *common 0.05*
exposure_time = 6.5
initial_exposure_time = 30
material_type = Flexible
material_vendor = PrimaCreator
material_colour = #F8F8F8
[sla_material:Siraya Tech Simple Clear @0.05]
inherits = *common 0.05*
exposure_time = 10
@ -6270,6 +6624,38 @@ material_type = Tough
material_vendor = Made for Prusa
material_colour = #FF8040
[sla_material:PrimaCreator Tough Light Grey @0.1]
inherits = *common 0.1*
exposure_time = 14
initial_exposure_time = 45
material_type = Tough
material_vendor = PrimaCreator
material_colour = #C0C0C0
[sla_material:PrimaCreator Tough Clear @0.1]
inherits = *common 0.1*
exposure_time = 13
initial_exposure_time = 45
material_type = Tough
material_vendor = PrimaCreator
material_colour = #F8F8F8
[sla_material:PrimaCreator Tough White @0.1]
inherits = *common 0.1*
exposure_time = 13
initial_exposure_time = 45
material_type = Tough
material_vendor = PrimaCreator
material_colour = #FFFFFF
[sla_material:PrimaCreator Flex Clear @0.1]
inherits = *common 0.1*
exposure_time = 12
initial_exposure_time = 35
material_type = Flexible
material_vendor = PrimaCreator
material_colour = #F8F8F8
## SL1S materials ##
## 0.025 SL1S
@ -6916,6 +7302,310 @@ material_type = Tough
material_vendor = Peopoly
material_colour = #F8F8F8
[sla_material:3DM-ABS @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.6
initial_exposure_time = 25
material_type = Tough
material_vendor = 3DM
material_colour = #FF8040
[sla_material:3DM-DENT @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.3
initial_exposure_time = 36
material_type = Dental
material_vendor = 3DM
material_colour = #FFEEE6
[sla_material:3DM-HR Green @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 5
initial_exposure_time = 28
material_type = Tough
material_vendor = 3DM
material_colour = #00B900
[sla_material:3DM-HR Red Wine @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 6
initial_exposure_time = 32
material_type = Tough
material_vendor = 3DM
material_colour = #EC0000
[sla_material:3DM-Vulcan Gold @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 5
initial_exposure_time = 24
material_type = Casting
material_vendor = 3DM
material_colour = #B0B000
[sla_material:3DM-XPRO White @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3
initial_exposure_time = 28
material_type = Tough
material_vendor = 3DM
material_colour = #FFFFFF
[sla_material:Asiga Denta Model @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 5
initial_exposure_time = 24
material_type = Dental
material_vendor = Asiga
material_colour = #FFEEE6
[sla_material:Asiga PlasGRAY @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 9.7
initial_exposure_time = 48
material_type = Tough
material_vendor = Asiga
material_colour = #C0C0C0
[sla_material:BlueCast EcoGray @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.3
initial_exposure_time = 28
material_type = Tough
material_vendor = BlueCast
material_colour = #808080
[sla_material:BlueCast Phrozen Wax @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 5.3
initial_exposure_time = 40
material_type = Tough
material_vendor = BlueCast
material_colour = #007EFD
[sla_material:NextDent Model 2.0 Grey @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 4
initial_exposure_time = 28
material_type = Dental
material_vendor = NextDent
material_colour = #C0C0C0
[sla_material:NextDent Cast Purple @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3
initial_exposure_time = 16
material_type = Casting
material_vendor = NextDent
material_colour = #E800E8
[sla_material:Siraya Tech Tenacious @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.7
initial_exposure_time = 28
material_type = Tough
material_vendor = Siraya Tech
material_colour = #F8F8F8
[sla_material:Siraya Tech Blu Clear V2 @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3.3
initial_exposure_time = 24
material_type = Tough
material_vendor = Siraya Tech
material_colour = #F8F8F8
[sla_material:Siraya Tech Blu Blue @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 4
initial_exposure_time = 28
material_type = Tough
material_vendor = Siraya Tech
material_colour = #007EFD
[sla_material:Siraya Tech Fast Black @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3
initial_exposure_time = 28
material_type = Tough
material_vendor = Siraya Tech
material_colour = #595959
[sla_material:Siraya Tech Fast Grey @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3.3
initial_exposure_time = 28
material_type = Tough
material_vendor = Siraya Tech
material_colour = #C0C0C0
[sla_material:Siraya Tech Simple Clear @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3.3
initial_exposure_time = 28
material_type = Tough
material_vendor = Siraya Tech
material_colour = #F8F8F8
[sla_material:Siraya Tech Sculpt @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.7
initial_exposure_time = 28
material_type = Tough
material_vendor = Siraya Tech
material_colour = #C0C0C0
[sla_material:Harz Labs Model Resin Cherry @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 4.3
initial_exposure_time = 16
material_type = Tough
material_vendor = Harz Labs
material_colour = #EC0000
[sla_material:Harz Labs Model Resin Black @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 4.3
initial_exposure_time = 16
material_type = Tough
material_vendor = Harz Labs
material_colour = #595959
[sla_material:Harz Labs Basic Resin Red @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 4.3
initial_exposure_time = 16
material_type = Tough
material_vendor = Harz Labs
material_colour = #EC0000
[sla_material:Resinworks 3D Violet @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 5.7
initial_exposure_time = 24
material_type = Tough
material_vendor = Resinworks 3D
material_colour = #E800E8
[sla_material:FunToDo Industrial Blend Unpigmented @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 1.3
initial_exposure_time = 28
material_type = Tough
material_vendor = FunToDo
material_colour = #F8F8F8
[sla_material:FunToDo Snow White @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3.3
initial_exposure_time = 28
material_type = Tough
material_vendor = FunToDo
material_colour = #FFFFFF
[sla_material:FunToDo Ash Grey @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3
initial_exposure_time = 32
material_type = Tough
material_vendor = FunToDo
material_colour = #808080
[sla_material:Ameralabs AMD 3 LED @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 1.7
initial_exposure_time = 24
material_type = Tough
material_vendor = Ameralabs
material_colour = #808080
[sla_material:Dragon Resin Metalshine Metal Grey @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 10
initial_exposure_time = 40
material_type = Tough
material_vendor = Dragon Resin
material_colour = #808080
[sla_material:Dragon Resin Metalshine Dark Brass @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 10
initial_exposure_time = 40
material_type = Tough
material_vendor = Dragon Resin
material_colour = #B0B000
[sla_material:Dragon Resin Metalshine Brass @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 10
initial_exposure_time = 40
material_type = Tough
material_vendor = Dragon Resin
material_colour = #B0B000
[sla_material:Esun Bio-Photopolymer Resin White @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.7
initial_exposure_time = 24
material_type = Tough
material_vendor = Esun
material_colour = #FFFFFF
[sla_material:Esun Standard Resin Black @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.3
initial_exposure_time = 24
material_type = Tough
material_vendor = Esun
material_colour = #595959
[sla_material:Monocure 3D Black Rapid Resin @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2
initial_exposure_time = 28
material_type = Tough
material_vendor = Monocure
material_colour = #595959
[sla_material:Monocure 3D Blue Rapid Resin @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.3
initial_exposure_time = 28
material_type = Tough
material_vendor = Monocure
material_colour = #007EFD
[sla_material:Monocure 3D Clear Rapid Resin @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 2.7
initial_exposure_time = 32
material_type = Tough
material_vendor = Monocure
material_colour = #F8F8F8
[sla_material:Monocure 3D Grey Rapid Resin @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3.3
initial_exposure_time = 25
material_type = Tough
material_vendor = Monocure
material_colour = #C0C0C0
[sla_material:Monocure 3D White Rapid Resin @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 3.3
initial_exposure_time = 28
material_type = Tough
material_vendor = Monocure
material_colour = #FFFFFF
[sla_material:Photocentric Hard Grey @0.05 SL1S]
inherits = *0.05_sl1s*
exposure_time = 5
initial_exposure_time = 24
material_type = Tough
material_vendor = Photocentric
material_colour = #808080
## 0.1 SL1S
## Prusa Polymers 0.1

View File

@ -313,7 +313,7 @@ static std::vector<InnerBrimExPolygons> inner_brim_area(const Print
// After 7ff76d07684858fd937ef2f5d863f105a10f798e offset and shrink don't work with CW polygons (holes), so let's make it CCW.
Polygons ex_poly_holes_reversed = ex_poly.holes;
polygons_reverse(ex_poly_holes_reversed);
for (const PrintInstance &instance : object->instances()) {
for ([[maybe_unused]] const PrintInstance &instance : object->instances()) {
++polygon_idx; // Increase idx because of the contour of the ExPolygon.
if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btOuterAndInner)

View File

@ -13,6 +13,8 @@
#include <unordered_set>
#include <boost/range/adaptor/reversed.hpp>
//#define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
namespace Slic3r {
struct TravelPoint
@ -354,8 +356,6 @@ static Polyline to_polyline(const std::vector<TravelPoint> &travel)
return result;
}
// #define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
static void export_travel_to_svg(const Polygons &boundary,
const Line &original_travel,
@ -521,6 +521,25 @@ static float get_perimeter_spacing_external(const Layer &layer)
return perimeter_spacing;
}
// Returns average perimeter width calculated from all LayerRegion within the layer.
static float get_external_perimeter_width(const Layer &layer)
{
size_t regions_count = 0;
float perimeter_width = 0.f;
for (const LayerRegion *layer_region : layer.regions())
if (layer_region != nullptr && !layer_region->slices.empty()) {
perimeter_width += float(layer_region->flow(frExternalPerimeter).scaled_width());
++regions_count;
}
assert(perimeter_width >= 0.f);
if (regions_count != 0)
perimeter_width /= float(regions_count);
else
perimeter_width = get_default_perimeter_spacing(*layer.object());
return perimeter_width;
}
// Called by avoid_perimeters() and by simplify_travel_heuristics().
static size_t avoid_perimeters_inner(const AvoidCrossingPerimeters::Boundary &boundary,
const Point &start,
@ -659,22 +678,22 @@ static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary
// Check if anyone of ExPolygons contains whole travel.
// called by need_wipe() and AvoidCrossingPerimeters::travel_to()
// FIXME Lukas H.: Maybe similar approach could also be used for ExPolygon::contains()
static bool any_expolygon_contains(const ExPolygons &ex_polygons,
const std::vector<BoundingBox> &ex_polygons_bboxes,
const EdgeGrid::Grid &grid_lslice,
static bool any_expolygon_contains(const ExPolygons &lslices_offset,
const std::vector<BoundingBox> &lslices_offset_bboxes,
const EdgeGrid::Grid &grid_lslices_offset,
const Line &travel)
{
assert(ex_polygons.size() == ex_polygons_bboxes.size());
if(!grid_lslice.bbox().contains(travel.a) || !grid_lslice.bbox().contains(travel.b))
assert(lslices_offset.size() == lslices_offset_bboxes.size());
if(!grid_lslices_offset.bbox().contains(travel.a) || !grid_lslices_offset.bbox().contains(travel.b))
return false;
FirstIntersectionVisitor visitor(grid_lslice);
FirstIntersectionVisitor visitor(grid_lslices_offset);
visitor.pt_current = &travel.a;
visitor.pt_next = &travel.b;
grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
grid_lslices_offset.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
if (!visitor.intersect) {
for (const ExPolygon &ex_polygon : ex_polygons) {
const BoundingBox &bbox = ex_polygons_bboxes[&ex_polygon - &ex_polygons.front()];
for (const ExPolygon &ex_polygon : lslices_offset) {
const BoundingBox &bbox = lslices_offset_bboxes[&ex_polygon - &lslices_offset.front()];
if (bbox.contains(travel.a) && bbox.contains(travel.b) && ex_polygon.contains(travel.a))
return true;
}
@ -684,18 +703,18 @@ static bool any_expolygon_contains(const ExPolygons &ex_polygons,
// Check if anyone of ExPolygons contains whole travel.
// called by need_wipe()
static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector<BoundingBox> &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice, const Polyline &travel)
static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector<BoundingBox> &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice_offset, const Polyline &travel)
{
assert(ex_polygons.size() == ex_polygons_bboxes.size());
if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice](const Point &point) { return !grid_lslice.bbox().contains(point); }))
if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice_offset](const Point &point) { return !grid_lslice_offset.bbox().contains(point); }))
return false;
FirstIntersectionVisitor visitor(grid_lslice);
FirstIntersectionVisitor visitor(grid_lslice_offset);
bool any_intersection = false;
for (size_t line_idx = 1; line_idx < travel.size(); ++line_idx) {
visitor.pt_current = &travel.points[line_idx - 1];
visitor.pt_next = &travel.points[line_idx];
grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
grid_lslice_offset.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
any_intersection = visitor.intersect;
if (any_intersection) break;
}
@ -711,14 +730,14 @@ static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vec
return false;
}
static bool need_wipe(const GCode &gcodegen,
const EdgeGrid::Grid &grid_lslice,
const Line &original_travel,
const Polyline &result_travel,
const size_t intersection_count)
static bool need_wipe(const GCode &gcodegen,
const ExPolygons &lslices_offset,
const std::vector<BoundingBox> &lslices_offset_bboxes,
const EdgeGrid::Grid &grid_lslices_offset,
const Line &original_travel,
const Polyline &result_travel,
const size_t intersection_count)
{
const ExPolygons &lslices = gcodegen.layer()->lslices;
const std::vector<BoundingBox> &lslices_bboxes = gcodegen.layer()->lslices_bboxes;
bool z_lift_enabled = gcodegen.config().retract_lift.get_at(gcodegen.writer().extruder()->id()) > 0.;
bool wipe_needed = false;
@ -728,16 +747,16 @@ static bool need_wipe(const GCode &gcodegen,
// The original layer is intersected with defined boundaries. Then it is necessary to make a detailed test.
// If the z-lift is enabled, then a wipe is needed when the original travel leads above the holes.
if (z_lift_enabled) {
if (any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, original_travel)) {
if (any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, original_travel)) {
// Check if original_travel and result_travel are not same.
// If both are the same, then it is possible to skip testing of result_travel
wipe_needed = !(result_travel.size() > 2 && result_travel.first_point() == original_travel.a && result_travel.last_point() == original_travel.b) &&
!any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel);
!any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, result_travel);
} else {
wipe_needed = true;
}
} else {
wipe_needed = !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel);
wipe_needed = !any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, result_travel);
}
}
@ -1163,10 +1182,8 @@ Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point &
Vec2d startf = start.cast<double>();
Vec2d endf = end .cast<double>();
const ExPolygons &lslices = gcodegen.layer()->lslices;
const std::vector<BoundingBox> &lslices_bboxes = gcodegen.layer()->lslices_bboxes;
bool is_support_layer = dynamic_cast<const SupportLayer *>(gcodegen.layer()) != nullptr;
if (!use_external && (is_support_layer || (!lslices.empty() && !any_expolygon_contains(lslices, lslices_bboxes, m_grid_lslice, travel)))) {
bool is_support_layer = dynamic_cast<const SupportLayer *>(gcodegen.layer()) != nullptr;
if (!use_external && (is_support_layer || (!m_lslices_offset.empty() && !any_expolygon_contains(m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslices_offset, travel)))) {
// Initialize m_internal only when it is necessary.
if (m_internal.boundaries.empty())
init_boundary(&m_internal, to_polygons(get_boundary(*gcodegen.layer())));
@ -1216,7 +1233,7 @@ Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point &
} else if (max_detour_length_exceeded) {
*could_be_wipe_disabled = false;
} else
*could_be_wipe_disabled = !need_wipe(gcodegen, m_grid_lslice, travel, result_pl, travel_intersection_count);
*could_be_wipe_disabled = !need_wipe(gcodegen, m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslices_offset, travel, result_pl, travel_intersection_count);
return result_pl;
}
@ -1227,13 +1244,21 @@ void AvoidCrossingPerimeters::init_layer(const Layer &layer)
{
m_internal.clear();
m_external.clear();
m_lslices_offset.clear();
m_lslices_offset_bboxes.clear();
float perimeter_offset = -get_external_perimeter_width(layer) / float(2.);
m_lslices_offset = offset_ex(layer.lslices, perimeter_offset);
m_lslices_offset_bboxes.reserve(m_lslices_offset.size());
for (const ExPolygon &ex_poly : m_lslices_offset)
m_lslices_offset_bboxes.emplace_back(get_extents(ex_poly));
BoundingBox bbox_slice(get_extents(layer.lslices));
bbox_slice.offset(SCALED_EPSILON);
m_grid_lslice.set_bbox(bbox_slice);
//FIXME 1mm grid?
m_grid_lslice.create(layer.lslices, coord_t(scale_(1.)));
m_grid_lslices_offset.set_bbox(bbox_slice);
m_grid_lslices_offset.create(m_lslices_offset, coord_t(scale_(1.)));
}
#if 0

View File

@ -58,8 +58,11 @@ private:
// we enable it by default for the first travel move in print
bool m_disabled_once { true };
// Lslices offseted by half an external perimeter width. Used for detection if line or polyline is inside of any polygon.
ExPolygons m_lslices_offset;
std::vector<BoundingBox> m_lslices_offset_bboxes;
// Used for detection of line or polyline is inside of any polygon.
EdgeGrid::Grid m_grid_lslice;
EdgeGrid::Grid m_grid_lslices_offset;
// Store all needed data for travels inside object
Boundary m_internal;
// Store all needed data for travels outside object

View File

@ -203,7 +203,6 @@ set(SLIC3R_GUI_SOURCES
GUI/Mouse3DController.hpp
GUI/DoubleSlider.cpp
GUI/DoubleSlider.hpp
GUI/DoubleSlider_Utils.hpp
GUI/Notebook.cpp
GUI/Notebook.hpp
GUI/ObjectDataViewModel.cpp

View File

@ -603,10 +603,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas)
if (bottom)
glsafe(::glFrontFace(GL_CW));
unsigned int stride = m_triangles.get_vertex_data_size();
GLint position_id = shader->get_attrib_location("v_position");
GLint tex_coords_id = shader->get_attrib_location("v_tex_coords");
const unsigned int stride = m_triangles.get_vertex_data_size();
// show the temporary texture while no compressed data is available
GLuint tex_id = (GLuint)m_temp_texture.get_id();
@ -616,22 +613,16 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas)
glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id));
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id));
if (position_id != -1) {
glsafe(::glEnableVertexAttribArray(position_id));
glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_position_offset()));
}
if (tex_coords_id != -1) {
glsafe(::glEnableVertexAttribArray(tex_coords_id));
glsafe(::glVertexAttribPointer(tex_coords_id, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_tex_coords_offset()));
}
glsafe(::glVertexPointer(3, GL_FLOAT, stride, (const void*)(intptr_t)m_triangles.get_position_offset()));
glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
glsafe(::glTexCoordPointer(2, GL_FLOAT, stride, (const void*)(intptr_t)m_triangles.get_tex_coords_offset()));
glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY));
glsafe(::glDrawArrays(GL_TRIANGLES, 0, (GLsizei)m_triangles.get_vertices_count()));
if (tex_coords_id != -1)
glsafe(::glDisableVertexAttribArray(tex_coords_id));
if (position_id != -1)
glsafe(::glDisableVertexAttribArray(position_id));
glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY));
glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
glsafe(::glBindTexture(GL_TEXTURE_2D, 0));

View File

@ -122,6 +122,10 @@ Control::Control( wxWindow *parent,
this->Bind(wxEVT_KEY_UP, &Control::OnKeyUp, this);
this->Bind(wxEVT_RIGHT_DOWN, &Control::OnRightDown,this);
this->Bind(wxEVT_RIGHT_UP, &Control::OnRightUp, this);
this->Bind(wxEVT_SIZE, [this](wxSizeEvent& event) {
m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
event.Skip();
});
// control's view variables
SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit();
@ -137,8 +141,14 @@ Control::Control( wxWindow *parent,
m_line_pens = { &DARK_GREY_PEN, &GREY_PEN, &LIGHT_GREY_PEN };
m_segm_pens = { &DARK_ORANGE_PEN, &ORANGE_PEN, &LIGHT_ORANGE_PEN };
FOCUS_RECT_PEN = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT);
FOCUS_RECT_BRUSH = wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT);
m_font = GetFont();
this->SetMinSize(get_min_size());
if (style == wxSL_VERTICAL)
m_ruler.set_parent(this->GetParent());
}
void Control::msw_rescale()
@ -170,6 +180,9 @@ void Control::msw_rescale()
SetMinSize(get_min_size());
GetParent()->Layout();
m_ruler.update_dpi();
m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
}
void Control::sys_color_changed()
@ -266,7 +279,11 @@ void Control::SetMaxValue(const int max_value)
void Control::SetSliderValues(const std::vector<double>& values)
{
m_values = values;
m_ruler.init(m_values);
m_ruler.init(m_values, get_scroll_step());
// When "No sparce layer" is enabled, use m_layers_values for ruler update.
// Because of m_values has duplicate values in this case.
// m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
}
void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos)
@ -426,9 +443,12 @@ void Control::SetLayersTimes(const std::vector<float>& layers_times, float total
if (m_layers_values.size() != m_layers_times.size())
for (size_t i = m_layers_times.size(); i < m_layers_values.size(); i++)
m_layers_times.push_back(total_time);
m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
Refresh();
Update();
}
else
m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
}
void Control::SetLayersTimes(const std::vector<double>& layers_times)
@ -494,15 +514,17 @@ void Control::get_lower_and_higher_position(int& lower_pos, int& higher_pos)
}
}
void Control::draw_focus_rect()
void Control::draw_focus_rect(wxDC& dc)
{
if (!m_is_focused)
return;
const wxSize sz = GetSize();
wxPaintDC dc(this);
const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT);
dc.SetPen(pen);
dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT));
// wxPaintDC dc(this);
//const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT);
//dc.SetPen(pen);
//dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT));
dc.SetPen(FOCUS_RECT_PEN);
dc.SetBrush(FOCUS_RECT_BRUSH);
dc.DrawRectangle(1, 1, sz.x - 2, sz.y - 2);
}
@ -513,11 +535,12 @@ void Control::render()
#else
SetBackgroundColour(GetParent()->GetBackgroundColour());
#endif // _WIN32
draw_focus_rect();
wxPaintDC dc(this);
dc.SetFont(m_font);
draw_focus_rect(dc);
const wxCoord lower_pos = get_position_from_value(m_lower_value);
const wxCoord higher_pos = get_position_from_value(m_higher_value);
@ -807,7 +830,7 @@ void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, LabelType l
}
wxColour old_clr = dc.GetTextForeground();
const wxPen& pen = is_wipe_tower_layer(tick) && (tick == m_lower_value || tick == m_higher_value) ? DARK_ORANGE_PEN : wxPen(old_clr);
const wxPen& pen = is_wipe_tower_layer(tick) && (tick == m_lower_value || tick == m_higher_value) ? DARK_ORANGE_PEN : /*wxPen(old_clr)*/GREY_PEN;
dc.SetPen(pen);
dc.SetTextForeground(pen.GetColour());
@ -1028,8 +1051,10 @@ void Control::draw_colored_band(wxDC& dc)
}
}
void Control::Ruler::init(const std::vector<double>& values)
void Control::Ruler::init(const std::vector<double>& values, double scroll_step)
{
if (!m_parent)
return;
max_values.clear();
max_values.reserve(std::count(values.begin(), values.end(), values.front()));
@ -1039,14 +1064,35 @@ void Control::Ruler::init(const std::vector<double>& values)
it = std::find(it + 1, values.end(), values.front());
}
max_values.push_back(*(it - 1));
update(values, scroll_step);
}
void Control::Ruler::update(wxWindow* win, const std::vector<double>& values, double scroll_step)
void Control::Ruler::set_parent(wxWindow* parent)
{
if (values.empty())
m_parent = parent;
update_dpi();
}
void Control::Ruler::update_dpi()
{
if (m_parent)
m_DPI = GUI::get_dpi_for_window(m_parent);
}
void Control::Ruler::update(const std::vector<double>& values, double scroll_step)
{
if (!m_parent || values.empty() ||
// check if need to update ruler in respect to input values
values.front() == m_min_val && values.back() == m_max_val && m_scroll_step == scroll_step && max_values.size() == m_max_values_cnt)
return;
int DPI = GUI::get_dpi_for_window(win);
int pixels_per_sm = lround((double)(DPI) * 5.0/25.4);
m_min_val = values.front();
m_max_val = values.back();
m_scroll_step = scroll_step;
m_max_values_cnt = max_values.size();
int pixels_per_sm = lround((double)(m_DPI) * 5.0/25.4);
if (lround(scroll_step) > pixels_per_sm) {
long_step = -1.0;
@ -1091,11 +1137,11 @@ void Control::Ruler::update(wxWindow* win, const std::vector<double>& values, do
void Control::draw_ruler(wxDC& dc)
{
if (m_values.empty())
if (m_values.empty() || !m_ruler.can_draw())
return;
// When "No sparce layer" is enabled, use m_layers_values for ruler update.
// Because of m_values has duplicate values in this case.
m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
// m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step());
int height, width;
get_size(&width, &height);

View File

@ -303,7 +303,7 @@ public:
protected:
void render();
void draw_focus_rect();
void draw_focus_rect(wxDC& dc);
void draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end);
void draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos);
void draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection);
@ -438,19 +438,36 @@ private:
wxPen GREY_PEN;
wxPen LIGHT_GREY_PEN;
wxPen FOCUS_RECT_PEN;
wxBrush FOCUS_RECT_BRUSH;
std::vector<wxPen*> m_line_pens;
std::vector<wxPen*> m_segm_pens;
struct Ruler {
class Ruler {
wxWindow* m_parent{nullptr}; // m_parent is nullptr for Unused ruler
// in this case we will not init/update/render it
// values to check if ruler has to be updated
double m_min_val;
double m_max_val;
double m_scroll_step;
size_t m_max_values_cnt;
int m_DPI;
public:
double long_step;
double short_step;
std::vector<double> max_values;// max value for each object/instance in sequence print
// > 1 for sequential print
void init(const std::vector<double>& values);
void update(wxWindow* win, const std::vector<double>& values, double scroll_step);
void set_parent(wxWindow* parent);
void update_dpi();
void init(const std::vector<double>& values, double scroll_step);
void update(const std::vector<double>& values, double scroll_step);
bool is_ok() { return long_step > 0 && short_step > 0; }
size_t count() { return max_values.size(); }
bool can_draw() { return m_parent != nullptr; }
} m_ruler;
};

View File

@ -1,8 +0,0 @@
#ifndef slic3r_GUI_DoubleSlider_Utils_hpp_
#define slic3r_GUI_DoubleSlider_Utils_hpp_
#include <stdio.h>
#include <random>
#endif // slic3r_GUI_DoubleSlider_Utils_hpp_

View File

@ -998,7 +998,7 @@ void GLModel::render(const std::pair<size_t, size_t>& range)
shader->set_uniform("uniform_color", data.color);
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id));
glsafe(::glDrawElements(mode, range.second - range.first + 1, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format))));
glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format))));
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
if (tex_coord)

View File

@ -170,11 +170,9 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking)
q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast<double>());
Eigen::AngleAxisd aa(q);
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z()));
glsafe(::glPushMatrix());
glsafe(::glTranslated(0., 0., -drain_hole.height));
glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength));
m_cylinder.render();
glsafe(::glPopMatrix());
if (vol->is_left_handed())
glFrontFace(GL_CCW);

View File

@ -192,7 +192,7 @@ void GLGizmoPainterBase::render_cursor_circle()
GLModel::Geometry init_data;
static const unsigned int StepsCount = 32;
static const float StepSize = 2.0f * float(PI) / float(StepsCount);
init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT };
init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2, GLModel::Geometry::EIndexType::USHORT };
init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f };
init_data.reserve_vertices(StepsCount);
init_data.reserve_indices(StepsCount);
@ -200,7 +200,7 @@ void GLGizmoPainterBase::render_cursor_circle()
// vertices + indices
for (unsigned short i = 0; i < StepsCount; ++i) {
const float angle = float(i * StepSize);
init_data.add_vertex(Vec3f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius, 0.0f));
init_data.add_vertex(Vec2f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius));
init_data.add_ushort_index(i);
}
@ -1195,11 +1195,11 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui)
m_varrays[i].init_from(std::move(varrays_data[i]));
}
#else
for (auto* iva : { &m_iva_enforcers, &m_iva_blockers })
iva->finalize_geometry(true);
for (auto& iva : m_iva_seed_fills)
iva.finalize_geometry(true);
// for (auto* iva : { &m_iva_enforcers, &m_iva_blockers })
// iva->finalize_geometry(true);
//
// for (auto& iva : m_iva_seed_fills)
// iva.finalize_geometry(true);
#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL
#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL

View File

@ -527,22 +527,26 @@ void GLGizmoRotate::render_angle() const
const float ex_radius = m_radius * (1.0f + GrabberOffset);
#if ENABLE_GLBEGIN_GLEND_REMOVAL
if (!m_angle_arc.is_initialized() || radius_changed) {
const bool angle_changed = std::abs(m_old_angle - m_angle) > EPSILON;
m_old_angle = m_angle;
if (!m_angle_arc.is_initialized() || radius_changed || angle_changed) {
m_angle_arc.reset();
if (m_angle > 0.0f) {
GLModel::Geometry init_data;
init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT };
init_data.reserve_vertices(1 + AngleResolution);
init_data.reserve_indices(1 + AngleResolution);
GLModel::Geometry init_data;
init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT };
init_data.vertices.reserve((1 + AngleResolution) * GLModel::Geometry::vertex_stride_floats(init_data.format));
init_data.indices.reserve((1 + AngleResolution) * GLModel::Geometry::index_stride_bytes(init_data.format));
// vertices + indices
for (unsigned short i = 0; i <= AngleResolution; ++i) {
const float angle = float(i) * step_angle;
init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f));
init_data.add_ushort_index(i);
}
// vertices + indices
for (unsigned short i = 0; i <= AngleResolution; ++i) {
const float angle = float(i) * step_angle;
init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f));
init_data.add_ushort_index(i);
m_angle_arc.init_from(std::move(init_data));
}
m_angle_arc.init_from(std::move(init_data));
}
m_angle_arc.set_color(color);

View File

@ -54,6 +54,7 @@ private:
GrabberConnection m_grabber_connection;
float m_old_radius{ 0.0f };
float m_old_hover_radius{ 0.0f };
float m_old_angle{ 0.0f };
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL
ColorRGBA m_drag_color;

View File

@ -120,10 +120,10 @@ void GLGizmoSlaSupports::on_render_for_picking()
void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
{
size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size();
const size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size();
bool has_points = (cache_size != 0);
bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh()
const bool has_points = (cache_size != 0);
const bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh()
&& ! m_c->selection_info()->model_object()->sla_drain_holes.empty());
if (! has_points && ! has_holes)
@ -147,9 +147,9 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix();
float z_shift = m_c->selection_info()->get_sla_shift();
const float z_shift = m_c->selection_info()->get_sla_shift();
glsafe(::glPushMatrix());
glsafe(::glTranslated(0.0, 0.0, z_shift));
@ -158,7 +158,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
ColorRGBA render_color;
for (size_t i = 0; i < cache_size; ++i) {
const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i];
const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false;
const bool point_selected = m_editing_mode ? m_editing_cache[i].selected : false;
if (is_mesh_point_clipped(support_point.pos.cast<double>()))
continue;
@ -198,7 +198,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
// Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
glsafe(::glPushMatrix());
glsafe(::glTranslatef(support_point.pos(0), support_point.pos(1), support_point.pos(2)));
glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z()));
glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data()));
if (vol->is_left_handed())
@ -213,27 +213,21 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
Eigen::Quaterniond q;
q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast<double>());
Eigen::AngleAxisd aa(q);
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)));
const Eigen::AngleAxisd aa(q);
glsafe(::glPushMatrix());
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z()));
const double cone_radius = 0.25; // mm
const double cone_height = 0.75;
glsafe(::glPushMatrix());
glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale));
glsafe(::glPushMatrix());
glsafe(::glRotated(180., 1., 0., 0.));
glsafe(::glScaled(cone_radius, cone_radius, cone_height));
m_cone.render();
glsafe(::glPopMatrix());
glsafe(::glTranslatef(0.f, 0.f, cone_height));
glsafe(::glPopMatrix());
}
glsafe(::glPushMatrix());
double radius = (double)support_point.head_front_radius * RenderPointScale;
const double radius = (double)support_point.head_front_radius * RenderPointScale;
glsafe(::glScaled(radius, radius, radius));
m_sphere.render();
glsafe(::glPopMatrix());
if (vol->is_left_handed())
glFrontFace(GL_CCW);
@ -248,7 +242,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
m_cylinder.set_color(render_color);
#else
m_cylinder.set_color(-1, render_color);
if (shader != nu)
if (shader != nullptr)
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL
shader->set_uniform("emission_factor", 0.5f);
for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) {
@ -257,7 +251,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
// Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
glsafe(::glPushMatrix());
glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2)));
glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z()));
glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data()));
if (vol->is_left_handed())
@ -267,13 +261,11 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
Eigen::Quaterniond q;
q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast<double>());
Eigen::AngleAxisd aa(q);
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)));
glsafe(::glPushMatrix());
const Eigen::AngleAxisd aa(q);
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z()));
glsafe(::glTranslated(0., 0., -drain_hole.height));
glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength));
m_cylinder.render();
glsafe(::glPopMatrix());
if (vol->is_left_handed())
glFrontFace(GL_CCW);

View File

@ -916,6 +916,10 @@ void GLGizmosManager::update_hover_state(const EType &type)
m_tooltip = hovered_gizmo.get_name();
}
// Activate given gizmo. Returns true if successful, false in case that current
// gizmo vetoed its deactivation.
bool GLGizmosManager::activate_gizmo(EType type)
{
assert(!m_gizmos.empty());