Merge branch 'fs_dir_per_glyph_SPE-1597' into fs_svg

This commit is contained in:
Filip Sykala - NTB T15p 2023-06-07 11:26:54 +02:00
commit 3e0cd9a872
20 changed files with 656 additions and 111 deletions

View File

@ -5091,7 +5091,7 @@ msgstr "Äußere Perimeter"
#: src/libslic3r/PrintConfig.cpp:861 #: src/libslic3r/PrintConfig.cpp:861
msgid "External perimeters first" msgid "External perimeters first"
msgstr "ßere Perimeter zuerst drucken" msgstr "Äußere Perimeter zuerst drucken"
#: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294 #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:294
msgid "Extra high" msgid "Extra high"

View File

@ -1,4 +1,5 @@
min_slic3r_version = 2.6.0-beta2 min_slic3r_version = 2.6.0-beta2
1.9.0-beta3 Updated start g-code for MK4 (modified purge line and nozzle cleaning).
1.9.0-beta2 Added profiles for Original Prusa MK4 Input Shaper (Alpha). 1.9.0-beta2 Added profiles for Original Prusa MK4 Input Shaper (Alpha).
min_slic3r_version = 2.6.0-beta0 min_slic3r_version = 2.6.0-beta0
1.9.0-beta1 Updated cooling settings for some ASA filaments to increase interlayer adhesion (XL/MK4). 1.9.0-beta1 Updated cooling settings for some ASA filaments to increase interlayer adhesion (XL/MK4).
@ -17,6 +18,7 @@ min_slic3r_version = 2.6.0-alpha1
1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA. 1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA.
1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds. 1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds.
min_slic3r_version = 2.5.2-rc0 min_slic3r_version = 2.5.2-rc0
1.7.6 Updated start g-code for MK4 (modified purge line and nozzle cleaning).
1.7.5 Updated cooling settings for some ASA filaments to increase interlayer adhesion (XL/MK4). Updated LA values (XL/MK4). 1.7.5 Updated cooling settings for some ASA filaments to increase interlayer adhesion (XL/MK4). Updated LA values (XL/MK4).
1.7.4 Updated start g-code script for MK4/XL (fixed pre-print temperature for PA filaments). 1.7.4 Updated start g-code script for MK4/XL (fixed pre-print temperature for PA filaments).
1.7.3 Updated XL and MK4 profiles. Updated PC Blend Carbon Fiber density. 1.7.3 Updated XL and MK4 profiles. Updated PC Blend Carbon Fiber density.
@ -24,6 +26,7 @@ min_slic3r_version = 2.5.2-rc0
1.7.1 Added SLA materials. Updated MK4 and XL profiles. 1.7.1 Added SLA materials. Updated MK4 and XL profiles.
1.7.0 Added profiles for Original Prusa MK4. 1.7.0 Added profiles for Original Prusa MK4.
min_slic3r_version = 2.5.1-rc0 min_slic3r_version = 2.5.1-rc0
1.6.7 Updated Prusament PETG Carbon Fiber profile (XL 0.4 nozzle).
1.6.6 Updated cooling settings for some ASA filaments to increase interlayer adhesion (XL/MK4). 1.6.6 Updated cooling settings for some ASA filaments to increase interlayer adhesion (XL/MK4).
1.6.5 Updated start g-code script for MK4/XL (fixed pre-print temperature for PA filaments). 1.6.5 Updated start g-code script for MK4/XL (fixed pre-print temperature for PA filaments).
1.6.4 Fixed compatibility condition for MMU1 filaments. 1.6.4 Fixed compatibility condition for MMU1 filaments.

View File

@ -5,7 +5,7 @@
name = Prusa Research name = Prusa Research
# Configuration version of this file. Config file will only be installed, if the config_version differs. # 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. # This means, the server may force the PrusaSlicer configuration to be downgraded.
config_version = 1.9.0-beta2 config_version = 1.9.0-beta3
# Where to get the updates from? # Where to get the updates from?
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ 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% changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
@ -8474,7 +8474,7 @@ filament_colour = #BBBBBB
compatible_printers_condition = nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and printer_notes!~/.*PG.*/ and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) compatible_printers_condition = nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and printer_notes!~/.*PG.*/ and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Prusament PETG Carbon Fiber @PG] [filament:Prusament PETG Carbon Fiber @PG]
inherits = Prusament PETG; *PETPG*; *04PLUSPG* inherits = Prusament PETG Carbon Fiber; *PETPG*; *04PLUSPG*
[filament:Prusament PETG Carbon Fiber @PG 0.6] [filament:Prusament PETG Carbon Fiber @PG 0.6]
inherits = Prusament PETG Carbon Fiber @PG; *PET06PG* inherits = Prusament PETG Carbon Fiber @PG; *PET06PG*
@ -16127,7 +16127,7 @@ retract_before_travel = 1.5
retract_before_wipe = 80% retract_before_wipe = 80%
retract_layer_change = 1 retract_layer_change = 1
retract_length = 0.8 retract_length = 0.8
start_gcode = M17 ; enable steppers\nM862.3 P "[printer_model]" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nM140 S[first_layer_bed_temperature] ; set bed temp\n{if filament_type[initial_tool]=="PC" or filament_type[initial_tool]=="PA"}\nM104 S{first_layer_temperature[initial_tool]-25} ; set extruder temp for bed leveling\nM109 R{first_layer_temperature[initial_tool]-25} ; wait for temp\n{elsif filament_type[initial_tool]=="FLEX"}\nM104 S210 ; set extruder temp for bed leveling\nM109 R210 ; wait for temp\n{else}\nM104 S170 ; set extruder temp for bed leveling\nM109 R170 ; wait for temp\n{endif}\n\nM84 E ; turn off E motor\n\nG28 ; home all without mesh bed level\n\n; probe to clean the nozzle\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)+32} Y{((first_layer_print_min[1]) - 4)} Z{5} F4800\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]=="FLEX"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\nG29 P9 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{32} H{4}\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}\n\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} Z{40} F10000\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nM107\n\n;\n; MBL\n;\nM84 E ; turn off E motor\nG29 ; mesh bed leveling\nM104 S[first_layer_temperature] ; set extruder temp\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5} Z{30} F4800\n\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.2 F720\nG92 E0\n\nM569 S0 E ; set spreadcycle mode for extruder\n\n;\n; Extrude purge line\n;\n{if filament_type[initial_tool]=="FLEX"}\nG1 E4 F2400 ; deretraction\n{else}\nG1 E2 F2400 ; deretraction\n{endif}\n\n; move right\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) + 32} E{32 * 0.15} F1000\n; move down\nG1 Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5 - 1.5} E{1.5 * 0.15} F1000\n; move left\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} E{32 * 0.30} F800\n\nG92 E0\nM221 S100 ; set flow to 100% start_gcode = M17 ; enable steppers\nM862.3 P "[printer_model]" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nM140 S[first_layer_bed_temperature] ; set bed temp\n{if filament_type[initial_tool]=="PC" or filament_type[initial_tool]=="PA"}\nM104 S{first_layer_temperature[initial_tool]-25} ; set extruder temp for bed leveling\nM109 R{first_layer_temperature[initial_tool]-25} ; wait for temp\n{elsif filament_type[initial_tool]=="FLEX"}\nM104 S210 ; set extruder temp for bed leveling\nM109 R210 ; wait for temp\n{else}\nM104 S170 ; set extruder temp for bed leveling\nM109 R170 ; wait for temp\n{endif}\n\nM84 E ; turn off E motor\n\nG28 ; home all without mesh bed level\n\nG1 X{10 + 32} Y-4 Z5 F4800\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]=="FLEX"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\nG29 P9 X10 Y-4 W32 H4\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}\n\nG0 Z40 F10000\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nM107\n\n;\n; MBL\n;\nM84 E ; turn off E motor\nG29 P1 ; invalidate mbl & probe print area\nG29 P1 X0 Y0 W50 H20 C ; probe near purge place\nG29 P3.2 ; interpolate mbl probes\nG29 P3.13 ; extrapolate mbl outside probe area\nG29 A ; activate mbl\n\n; prepare for purge\nM104 S{first_layer_temperature[0]}\nG0 X0 Y-4 Z15 F4800 ; move away and ready for the purge\nM109 S{first_layer_temperature[0]}\n\nG92 E0\nM569 S0 E ; set spreadcycle mode for extruder\n\n;\n; Extrude purge line\n;\nG92 E0 ; reset extruder position\nG1 E{(filament_type[0] == "FLEX" ? 4 : 2)} F2400 ; deretraction after the initial one before nozzle cleaning\nG0 E7 X15 Z0.2 F500 ; purge\nG0 X25 E4 F500 ; purge\nG0 X35 E4 F650 ; purge\nG0 X45 E4 F800 ; purge\nG0 X{45 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{45 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\n\nG92 E0\nM221 S100 ; set flow to 100%
default_print_profile = 0.20mm QUALITY @MK4 0.4 default_print_profile = 0.20mm QUALITY @MK4 0.4
default_filament_profile = "Prusament PLA @PG" default_filament_profile = "Prusament PLA @PG"
thumbnails = 16x16,313x173,440x240 thumbnails = 16x16,313x173,440x240
@ -16222,7 +16222,7 @@ retract_length = 0.7
wipe = 0 wipe = 0
retract_speed = 35 retract_speed = 35
deretract_speed = 0 deretract_speed = 0
start_gcode = M17 ; enable steppers\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM862.3 P "MK4" ; printer model check\nM862.5 P2 ; g-code level check\nM862.6 P"Input shaper" ; firmware feature check\n\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nM140 S[first_layer_bed_temperature] ; set bed temp\n{if filament_type[initial_tool]=="PC" or filament_type[initial_tool]=="PA"}\nM104 S{first_layer_temperature[initial_tool]-25} ; set extruder temp for bed leveling\nM109 R{first_layer_temperature[initial_tool]-25} ; wait for temp\n{elsif filament_type[initial_tool]=="FLEX"}\nM104 S210 ; set extruder temp for bed leveling\nM109 R210 ; wait for temp\n{else}\nM104 S170 ; set extruder temp for bed leveling\nM109 R170 ; wait for temp\n{endif}\n\nM84 E ; turn off E motor\n\nG28 ; home all without mesh bed level\n\n; probe to clean the nozzle\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)+32} Y{((first_layer_print_min[1]) - 4)} Z{5} F4800\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]=="FLEX"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\nG29 P9 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{32} H{4}\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}\n\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} Z{40} F10000\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nM107\n\n;\n; MBL\n;\nM84 E ; turn off E motor\nG29 ; mesh bed leveling\nM104 S[first_layer_temperature] ; set extruder temp\nG0 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5} Z{30} F4800\n\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.2 F720\nG92 E0\n\nM569 S0 E ; set spreadcycle mode for extruder\n\n;\n; Extrude purge line\n;\n{if filament_type[initial_tool]=="FLEX"}\nG1 E4 F2400 ; deretraction\n{else}\nG1 E2 F2400 ; deretraction\n{endif}\n\n; move right\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) + 32} E{32 * 0.15} F1000\n; move down\nG1 Y{(max(0, first_layer_print_min[1]) - 4) + 4 - 4.5 - 1.5} E{1.5 * 0.15} F1000\n; move left\nG1 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} E{32 * 0.30} F800\n\nG92 E0\nM221 S100 ; set flow to 100%\n\nM593 X T2 F50.7\nM593 Y T2 F40.6 start_gcode = M17 ; enable steppers\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM862.3 P "MK4" ; printer model check\nM862.5 P2 ; g-code level check\nM862.6 P"Input shaper" ; firmware feature check\n\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nM140 S[first_layer_bed_temperature] ; set bed temp\n{if filament_type[initial_tool]=="PC" or filament_type[initial_tool]=="PA"}\nM104 S{first_layer_temperature[initial_tool]-25} ; set extruder temp for bed leveling\nM109 R{first_layer_temperature[initial_tool]-25} ; wait for temp\n{elsif filament_type[initial_tool]=="FLEX"}\nM104 S210 ; set extruder temp for bed leveling\nM109 R210 ; wait for temp\n{else}\nM104 S170 ; set extruder temp for bed leveling\nM109 R170 ; wait for temp\n{endif}\n\nM84 E ; turn off E motor\n\nG28 ; home all without mesh bed level\n\nG1 X{10 + 32} Y-4 Z5 F4800\n\nM302 S160 ; lower cold extrusion limit to 160C\n\n{if filament_type[initial_tool]=="FLEX"}\nG1 E-4 F2400 ; retraction\n{else}\nG1 E-2 F2400 ; retraction\n{endif}\n\nM84 E ; turn off E motor\n\nG29 P9 X10 Y-4 W32 H4\n\n{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif}\n\nG0 Z40 F10000\n\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nM107\n\n;\n; MBL\n;\nM84 E ; turn off E motor\nG29 P1 ; invalidate mbl & probe print area\nG29 P1 X0 Y0 W50 H20 C ; probe near purge place\nG29 P3.2 ; interpolate mbl probes\nG29 P3.13 ; extrapolate mbl outside probe area\nG29 A ; activate mbl\n\n; prepare for purge\nM104 S{first_layer_temperature[0]}\nG0 X0 Y-4 Z15 F4800 ; move away and ready for the purge\nM109 S{first_layer_temperature[0]}\n\nG92 E0\nM569 S0 E ; set spreadcycle mode for extruder\n\n;\n; Extrude purge line\n;\nG92 E0 ; reset extruder position\nG1 E{(filament_type[0] == "FLEX" ? 4 : 2)} F2400 ; deretraction after the initial one before nozzle cleaning\nG0 E7 X15 Z0.2 F500 ; purge\nG0 X25 E4 F500 ; purge\nG0 X35 E4 F650 ; purge\nG0 X45 E4 F800 ; purge\nG0 X{45 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{45 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\n\nG92 E0\nM221 S100 ; set flow to 100%\n\nM593 X T2 F50.7\nM593 Y T2 F40.6
end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+1, max_print_height)} F720 ; Move print head up{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X241 Y170 F3600 ; park\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+23, max_print_height)} F300 ; Move print head up{endif}\nG4 ; wait\nM572 S0 ; reset PA\nM593 X T2 F0 ; disable IS\nM593 Y T2 F0 ; disable IS\nM84 X Y E ; disable motors\n; max_layer_z = [max_layer_z] end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+1, max_print_height)} F720 ; Move print head up{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X241 Y170 F3600 ; park\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+23, max_print_height)} F300 ; Move print head up{endif}\nG4 ; wait\nM572 S0 ; reset PA\nM593 X T2 F0 ; disable IS\nM593 Y T2 F0 ; disable IS\nM84 X Y E ; disable motors\n; max_layer_z = [max_layer_z]
before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\nM593 Y T2 F{interpolate_table(extruded_weight_total, (0,40), (300,30), (800,20), (10000,20)) }\nM201 X{interpolate_table(extruded_weight_total, (0,4000), (1400,2500), (10000,2500))} Y{interpolate_table(extruded_weight_total, (0,4000), (1400,2500), (10000,2500))}\nM74 W[extruded_weight_total] before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\nM593 Y T2 F{interpolate_table(extruded_weight_total, (0,40), (300,30), (800,20), (10000,20)) }\nM201 X{interpolate_table(extruded_weight_total, (0,4000), (1400,2500), (10000,2500))} Y{interpolate_table(extruded_weight_total, (0,4000), (1400,2500), (10000,2500))}\nM74 W[extruded_weight_total]
default_print_profile = 0.20mm Input Shaper @MK4IS 0.4 default_print_profile = 0.20mm Input Shaper @MK4IS 0.4

View File

@ -0,0 +1,2 @@
min_slic3r_version = 2.6.0-beta2
1.0.0 Initial version

View File

@ -0,0 +1,376 @@
# Print profiles for the Trimaker printers.
[vendor]
# Vendor name will be shown by the Config Wizard.
name = Trimaker
# 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.0.0
# Where to get the updates from?
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Trimaker/
# changelog_url =
# The printer models will be shown by the Configuration Wizard in this order,
# also the first model installed & the first nozzle installed will be activated after install.
# Printer model name will be shown by the installation wizard.
[printer_model:Trimaker Nebula Cloud]
name = Trimaker Nebula Cloud
family = Nebula
variants = 0.4
technology = FFF
bed_model = NebulaCloud_bed.stl
bed_texture = NebulaCloud.svg
thumbnail = NPC_thumbnail.png
default_materials = Generic PLA @Trimaker Nebula Cloud
[printer_model:Trimaker Cosmos II]
name = Trimaker Cosmos II
family = Cosmos
variants = 0.4
technology = FFF
bed_model = CosmosII_bed.stl
bed_texture = NebulaCosmosII.svg
thumbnail = Cosmos_II_thumbnail.png
default_materials = Generic PLA @Trimaker Nebula Cloud
[printer_model:Trimaker Nebula ]
name = Trimaker Nebula
family = Nebula
variants = 0.4
technology = FFF
bed_model = NebulaCloud_bed.stl
bed_texture = NebulaCloud.svg
thumbnail = Nebula_thumbnail.png
default_materials = Generic PLA @Trimaker Nebula Cloud
# All presets starting with asterisk, for example *common*, are intermediate and they will
# not make it into the user interface.
# Common print preset
[print:*common*]
avoid_crossing_perimeters = 0
avoid_crossing_perimeters_max_detour = 0
bridge_angle = 0
bridge_flow_ratio = 0.95
bridge_speed = 25
brim_width = 0
clip_multipart_objects = 1
compatible_printers =
complete_objects = 0
default_acceleration = 1000
dont_support_bridges = 1
elefant_foot_compensation = 0
ensure_vertical_shell_thickness = 1
external_fill_pattern = rectilinear
external_perimeters_first = 0
external_perimeter_extrusion_width = 0.45
extra_perimeters = 0
extruder_clearance_height = 25
extruder_clearance_radius = 45
fill_angle = 45
fill_density = 15%
fill_pattern = gyroid
first_layer_extrusion_width = 0.42
first_layer_speed = 20
first_layer_acceleration = 1000
first_layer_acceleration_over_raft = 0
fuzzy_skin = none
fuzzy_skin_point_dist = 0.8
fuzzy_skin_thickness = 0.3
gap_fill_enabled = 1
gap_fill_speed = 30
gcode_comments = 0
gcode_label_objects = 1
infill_anchor = 2.5
infill_anchor_max = 12
infill_every_layers = 1
infill_extruder = 1
infill_extrusion_width = 0.45
infill_first = 0
infill_only_where_needed = 0
infill_overlap = 25%
interface_shells = 0
max_print_speed = 150
max_volumetric_extrusion_rate_slope_negative = 0
max_volumetric_extrusion_rate_slope_positive = 0
max_volumetric_speed = 0
min_skirt_length = 4
notes =
overhangs = 1
only_retract_when_crossing_perimeters = 0
ooze_prevention = 0
output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{print_time}.gcode
perimeters = 3
perimeter_extruder = 1
perimeter_extrusion_width = 0.45
perimeter_generator = arachne
post_process =
print_settings_id =
raft_layers = 0
resolution = 0
top_fill_pattern = monotonic
bottom_fill_pattern = monotonic
seam_position = aligned
single_extruder_multi_material_priming = 1
skirts = 1
skirt_distance = 2
skirt_height = 2
small_perimeter_speed = 25
solid_infill_below_area = 0
solid_infill_every_layers = 0
solid_infill_extruder = 1
spiral_vase = 0
standby_temperature_delta = -5
auto_generated_supports = 0
support_material = 1
support_material_auto = 1
support_material_style = snug
support_material_extruder = 0
support_material_extrusion_width = 0
support_material_interface_extruder = 0
support_material_angle = 0
support_material_buildplate_only = 0
support_material_enforce_layers = 0
support_material_contact_distance = 0.22
support_material_interface_contact_loops = 0
support_material_interface_layers = 2
support_material_interface_pattern = rectilinear
support_material_interface_spacing = 0.3
support_material_interface_speed = 80%
support_material_pattern = rectilinear
support_material_spacing = 2
support_material_speed = 50
support_material_synchronize_layers = 0
support_material_threshold = 50
support_material_with_sheath = 1
support_material_xy_spacing = 0.5
support_material_bottom_contact_distance = 0
raft_first_layer_expansion = 0
support_material_bottom_interface_layers = -1
raft_contact_distance = 0.2
thin_walls = 0
top_infill_extrusion_width = 0.45
travel_speed = 100
wipe_tower = 0
wipe_tower_bridging = 10
wipe_tower_rotation_angle = 0
wipe_tower_width = 60
wipe_tower_x = 170
wipe_tower_y = 140
xy_size_compensation = 0
infill_acceleration = 1000
external_perimeter_speed = 30
perimeter_speed = 45
solid_infill_speed = 40
top_solid_infill_speed = 30
infill_speed = 50
#///////////////////////////////////////////////////////#
#---------------# LAYER HEIGHT SETTINGS #---------------#
#///////////////////////////////////////////////////////#
[print:*0.10mm*]
inherits = *common*
layer_height = 0.1
first_layer_height = 0.15
bottom_solid_layers = 4
top_solid_layers = 9
perimeters = 5
bridge_flow_ratio = 0.6
infill_acceleration = 1500
max_print_speed = 200
bridge_speed = 30
support_material_contact_distance = 0.10
support_material_interface_layers = 2
support_material_threshold = 55
[print:*0.20mm*]
inherits = *common*
layer_height = 0.2
first_layer_height = 0.3
bottom_solid_layers = 4
top_solid_layers = 4
bridge_flow_ratio = 0.8
support_material_contact_distance = 0.20
[print:*0.30mm*]
inherits = *common*
layer_height = 0.3
first_layer_height = 0.35
bottom_solid_layers = 3
top_solid_layers = 4
bridge_flow_ratio = 0.9
support_material_contact_distance = 0.25
infill_extrusion_width = 0.61
#////////////////////////////////////////////////#
#---------------# PRINT SETTINGS #---------------#
#////////////////////////////////////////////////#
#-----------# 0,4 NOZZLE #-----------#
[print:0.1 Layer - 0,4 Nozzle]
inherits = *0.10mm*
# alias = 0.10mm DETAIL 0,4
compatible_printers_condition = nozzle_diameter[0]==0.4
[print:0.2 Layer - 0,4 Nozzle]
inherits = *0.20mm*
# alias = 0.20mm NORMAL 0,4
compatible_printers_condition = nozzle_diameter[0]==0.4
[print:0.3 Layer - 0,4 Nozzle]
inherits = *0.30mm*
# alias = 0.30mm DRAFT 0,4
compatible_printers_condition = nozzle_diameter[0]==0.4
#///////////////////////////////////////////////////#
#---------------# FILAMENT SETTINGS #---------------#
#///////////////////////////////////////////////////#
[filament:*common*]
cooling = 0
compatible_printers =
extrusion_multiplier = 1
filament_cost = 0
filament_density = 0
filament_diameter = 1.75
filament_notes = ""
filament_settings_id = ""
filament_soluble = 0
min_print_speed = 15
slowdown_below_layer_time = 20
[filament:*PLA*]
inherits = *common*
bed_temperature = 60
fan_below_layer_time = 100
filament_max_volumetric_speed = 15
filament_type = PLA
filament_density = 1.24
filament_cost = 20
first_layer_bed_temperature = 60
first_layer_temperature = 200
fan_always_on = 1
cooling = 1
max_fan_speed = 100
min_fan_speed = 100
bridge_fan_speed = 100
disable_fan_first_layers = 1
temperature = 200
[filament:Generic PLA @Trimaker Nebula Cloud]
inherits = *PLA*
filament_vendor = Generic
#//////////////////////////////////////////////#
#---------------# Nozzle sizes #---------------#
#//////////////////////////////////////////////#
[printer:*0.40nozzle*]
nozzle_diameter = 0.40
max_layer_height = 0.35
min_layer_height = 0.1
retract_lift_above = 0.2
printer_variant = 0.4
#//////////////////////////////////////////////////#
#---------------# PRINTER PROFILES #---------------#
#//////////////////////////////////////////////////#
[printer:*common*]
printer_technology = FFF
before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n
between_objects_gcode =
deretract_speed = 0
extruder_colour = #FFFF00
extruder_offset = 0x0
gcode_flavor = marlin2
silent_mode = 0
remaining_times = 0
machine_max_acceleration_e = 5000,5000
machine_max_acceleration_extruding = 1250,12500
machine_max_acceleration_retracting = 1250,1250
machine_max_acceleration_x = 1000,960
machine_max_acceleration_y = 1000,960
machine_max_acceleration_z = 200,200
machine_max_feedrate_e = 120,120
machine_max_feedrate_x = 200,100
machine_max_feedrate_y = 200,100
machine_max_feedrate_z = 12,12
machine_max_jerk_e = 4.5,4.5
machine_max_jerk_x = 8,8
machine_max_jerk_y = 8,8
machine_max_jerk_z = 0.4,0.4
machine_min_extruding_rate = 0
machine_min_travel_rate = 0
layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
max_layer_height = 0.5
min_layer_height = 0.07
octoprint_apikey =
octoprint_host =
printer_notes =
printer_settings_id =
retract_before_travel = 1
retract_before_wipe = 0%
retract_layer_change = 1
retract_length = 1
retract_length_toolchange = 1
retract_lift = 0
retract_lift_above = 0
retract_lift_below = 0
retract_restart_extra = 0
retract_restart_extra_toolchange = 0
retract_speed = 35
serial_port =
serial_speed = 250000
single_extruder_multi_material = 0
start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG92 E0.0\nG29 ; bed leveling\nM500\nG1 Z0.15 F2400\nG1 F2000 X0.5 Y0.5 Z0.300\nG1 F900 X0.5 Y51.5 E2.56436 ; intro line\nG92 E0.0
end_gcode =;Trimaker Nebula End Code\n M107; Apagamos fan\n G90\n G92 E0\n G1 X0 Y200\n G91\n G1 Z5\n G92 E0\n M140 S0; Enfriamos\n M104 S0; Enfriamos\n M84\n G90\n M117 Impresion finalizada\n M300 S440 P700\n
toolchange_gcode =
use_firmware_retraction = 0
use_relative_e_distances = 1
use_volumetric_e = 0
variable_layer_height = 1
z_offset = 0
cooling_tube_length = 5
cooling_tube_retraction = 91.5
[printer:*Trimaker Nebula Cloud*]
inherits = *common*
bed_shape = 0x0,230x0,230x230,0x230
max_print_height = 260
printer_model = Trimaker Nebula Cloud
[printer:*Trimaker Nebula*]
inherits = *common*
bed_shape = 0x0,230x0,230x230,0x230
max_print_height = 260
start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG92 E0.0\nG1 Z0.15 F2400\nG1 F200 X0.5 Y0.5 Z0.300\n G1 F900 X0.5 Y51.5 E2.56436 ; intro line\nG92 E0.0
printer_model = Trimaker Nebula
[printer:*Trimaker Cosmos II*]
inherits = *common*
bed_shape = 0x0,200x0,200x200,0x200
max_print_height = 200
printer_model = Trimaker Cosmos II
#//////////////////////////////////////////////////#
#----------------# PRINTER MODELS #----------------#
#//////////////////////////////////////////////////#
[printer:Trimaker Nebula Cloud 0.4 nozzle]
inherits = *Trimaker Nebula Cloud*; *0.40nozzle*
default_print_profile = 0.2 Layer - 0,4 Nozzle
[printer:Trimaker Nebula 0.4 nozzle]
inherits = *Trimaker Nebula*; *0.40nozzle*
default_print_profile = 0.2 Layer - 0,4 Nozzle
[printer:Trimaker Cosmos II 0.4 nozzle]
inherits = *Trimaker Cosmos II*; *0.40nozzle*
default_print_profile = 0.2 Layer - 0,4 Nozzle

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,4 +1,5 @@
#include "ExPolygon.hpp" #include "ExPolygon.hpp"
#include "Flow.hpp"
#include "Layer.hpp" #include "Layer.hpp"
#include "BridgeDetector.hpp" #include "BridgeDetector.hpp"
#include "ClipperUtils.hpp" #include "ClipperUtils.hpp"
@ -169,7 +170,8 @@ static ExPolygons fill_surfaces_extract_expolygons(Surfaces &surfaces, std::init
Surfaces expand_bridges_detect_orientations( Surfaces expand_bridges_detect_orientations(
Surfaces &surfaces, Surfaces &surfaces,
ExPolygons &shells, ExPolygons &shells,
const Algorithm::RegionExpansionParameters &expansion_params) const Algorithm::RegionExpansionParameters &expansion_params,
const float closing_radius)
{ {
using namespace Slic3r::Algorithm; using namespace Slic3r::Algorithm;
@ -309,8 +311,13 @@ Surfaces expand_bridges_detect_orientations(
} }
//FIXME try to be smart and pick the best bridging angle for all? //FIXME try to be smart and pick the best bridging angle for all?
templ.bridge_angle = bridges[bridge_id].angle; templ.bridge_angle = bridges[bridge_id].angle;
//NOTE: The current regularization of the shells can create small unasigned regions in the object (E.G. benchy)
// without the following closing operation, those regions will stay unfilled and cause small holes in the expanded surface.
// look for narrow_ensure_vertical_wall_thickness_region_radius filter.
ExPolygons final = closing_ex(acc, closing_radius);
// without safety offset, artifacts are generated (GH #2494) // without safety offset, artifacts are generated (GH #2494)
for (ExPolygon &ex : union_safety_offset_ex(acc)) // union_safety_offset_ex(acc)
for (ExPolygon &ex : final)
out.emplace_back(templ, std::move(ex)); out.emplace_back(templ, std::move(ex));
} }
} }
@ -327,6 +334,7 @@ static Surfaces expand_merge_surfaces(
SurfaceType surface_type, SurfaceType surface_type,
ExPolygons &shells, ExPolygons &shells,
const Algorithm::RegionExpansionParameters &params, const Algorithm::RegionExpansionParameters &params,
const float closing_radius,
const double bridge_angle = -1.) const double bridge_angle = -1.)
{ {
double thickness; double thickness;
@ -335,6 +343,10 @@ static Surfaces expand_merge_surfaces(
return {}; return {};
std::vector<ExPolygon> expanded = expand_merge_expolygons(std::move(src), shells, params); std::vector<ExPolygon> expanded = expand_merge_expolygons(std::move(src), shells, params);
//NOTE: The current regularization of the shells can create small unasigned regions in the object (E.G. benchy)
// without the following closing operation, those regions will stay unfilled and cause small holes in the expanded surface.
// look for narrow_ensure_vertical_wall_thickness_region_radius filter.
expanded = closing_ex(expanded, closing_radius);
// Trim the shells by the expanded expolygons. // Trim the shells by the expanded expolygons.
shells = diff_ex(shells, expanded); shells = diff_ex(shells, expanded);
@ -373,6 +385,8 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
static constexpr const float expansion_step = scaled<float>(0.1); static constexpr const float expansion_step = scaled<float>(0.1);
// Don't take more than max_nr_steps for small expansion_step. // Don't take more than max_nr_steps for small expansion_step.
static constexpr const size_t max_nr_expansion_steps = 5; static constexpr const size_t max_nr_expansion_steps = 5;
// Radius (with added epsilon) to absorb empty regions emering from regularization of ensuring, viz const float narrow_ensure_vertical_wall_thickness_region_radius = 0.5f * 0.65f * min_perimeter_infill_spacing;
const float closing_radius = 0.55f * 0.65f * 1.05f * this->flow(frSolidInfill).scaled_spacing();
// Expand the top / bottom / bridge surfaces into the shell thickness solid infills. // Expand the top / bottom / bridge surfaces into the shell thickness solid infills.
double layer_thickness; double layer_thickness;
@ -384,8 +398,8 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
const double custom_angle = this->region().config().bridge_angle.value; const double custom_angle = this->region().config().bridge_angle.value;
const auto params = Algorithm::RegionExpansionParameters::build(expansion_bottom_bridge, expansion_step, max_nr_expansion_steps); const auto params = Algorithm::RegionExpansionParameters::build(expansion_bottom_bridge, expansion_step, max_nr_expansion_steps);
bridges.surfaces = custom_angle > 0 ? bridges.surfaces = custom_angle > 0 ?
expand_merge_surfaces(m_fill_surfaces.surfaces, stBottomBridge, shells, params, Geometry::deg2rad(custom_angle)) : expand_merge_surfaces(m_fill_surfaces.surfaces, stBottomBridge, shells, params, closing_radius, Geometry::deg2rad(custom_angle)) :
expand_bridges_detect_orientations(m_fill_surfaces.surfaces, shells, params); expand_bridges_detect_orientations(m_fill_surfaces.surfaces, shells, params, closing_radius);
BOOST_LOG_TRIVIAL(trace) << "Processing external surface, detecting bridges - done"; BOOST_LOG_TRIVIAL(trace) << "Processing external surface, detecting bridges - done";
#if 0 #if 0
{ {
@ -396,9 +410,9 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
} }
Surfaces bottoms = expand_merge_surfaces(m_fill_surfaces.surfaces, stBottom, shells, Surfaces bottoms = expand_merge_surfaces(m_fill_surfaces.surfaces, stBottom, shells,
Algorithm::RegionExpansionParameters::build(expansion_bottom, expansion_step, max_nr_expansion_steps)); Algorithm::RegionExpansionParameters::build(expansion_bottom, expansion_step, max_nr_expansion_steps), closing_radius);
Surfaces tops = expand_merge_surfaces(m_fill_surfaces.surfaces, stTop, shells, Surfaces tops = expand_merge_surfaces(m_fill_surfaces.surfaces, stTop, shells,
Algorithm::RegionExpansionParameters::build(expansion_top, expansion_step, max_nr_expansion_steps)); Algorithm::RegionExpansionParameters::build(expansion_top, expansion_step, max_nr_expansion_steps), closing_radius);
m_fill_surfaces.remove_types({ stBottomBridge, stBottom, stTop, stInternalSolid }); m_fill_surfaces.remove_types({ stBottomBridge, stBottom, stTop, stInternalSolid });
reserve_more(m_fill_surfaces.surfaces, shells.size() + bridges.size() + bottoms.size() + tops.size()); reserve_more(m_fill_surfaces.surfaces, shells.size() + bridges.size() + bottoms.size() + tops.size());

View File

@ -10,6 +10,7 @@
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/nowide/convert.hpp> #include <boost/nowide/convert.hpp>
#include <boost/dll/runtime_symbol_info.hpp> #include <boost/dll/runtime_symbol_info.hpp>
@ -1162,7 +1163,7 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat
// in alphabetical order // in alphabetical order
std::vector<std::reference_wrapper<const std::string>> prusa_profiles; std::vector<std::reference_wrapper<const std::string>> prusa_profiles;
std::vector<std::reference_wrapper<const std::string>> other_profiles; std::vector<std::pair<std::wstring ,std::reference_wrapper<const std::string>>> other_profiles; // first is lower case id for sorting
bool add_TEMPLATES_item = false; bool add_TEMPLATES_item = false;
for (int i = 0 ; i < list->size(); ++i) { for (int i = 0 ; i < list->size(); ++i) {
const std::string& data = list->get_data(i); const std::string& data = list->get_data(i);
@ -1175,7 +1176,7 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat
if (!material_type_ordering && data.find("Prusa") != std::string::npos) if (!material_type_ordering && data.find("Prusa") != std::string::npos)
prusa_profiles.push_back(data); prusa_profiles.push_back(data);
else else
other_profiles.push_back(data); other_profiles.emplace_back(boost::algorithm::to_lower_copy(boost::nowide::widen(data)),data);
} }
if (material_type_ordering) { if (material_type_ordering) {
@ -1185,10 +1186,10 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat
for (size_t profs = end_of_sorted; profs < other_profiles.size(); profs++) for (size_t profs = end_of_sorted; profs < other_profiles.size(); profs++)
{ {
// find instead compare because PET vs PETG // find instead compare because PET vs PETG
if (other_profiles[profs].get().find(value) != std::string::npos) { if (other_profiles[profs].second.get().find(value) != std::string::npos) {
//swap //swap
if(profs != end_of_sorted) { if(profs != end_of_sorted) {
std::reference_wrapper<const std::string> aux = other_profiles[end_of_sorted]; std::pair<std::wstring, std::reference_wrapper<const std::string>> aux = other_profiles[end_of_sorted];
other_profiles[end_of_sorted] = other_profiles[profs]; other_profiles[end_of_sorted] = other_profiles[profs];
other_profiles[profs] = aux; other_profiles[profs] = aux;
} }
@ -1201,8 +1202,8 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat
std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](std::reference_wrapper<const std::string> a, std::reference_wrapper<const std::string> b) { std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](std::reference_wrapper<const std::string> a, std::reference_wrapper<const std::string> b) {
return a.get() < b.get(); return a.get() < b.get();
}); });
std::sort(other_profiles.begin(), other_profiles.end(), [](std::reference_wrapper<const std::string> a, std::reference_wrapper<const std::string> b) { std::sort(other_profiles.begin(), other_profiles.end(), [](const std::pair<std::wstring, std::reference_wrapper<const std::string>>& a, const std::pair<std::wstring, std::reference_wrapper<const std::string>>& b) {
return a.get() < b.get(); return a.first <b.first;
}); });
} }
@ -1214,7 +1215,7 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat
for (const auto& item : prusa_profiles) for (const auto& item : prusa_profiles)
list->append(item, &const_cast<std::string&>(item.get())); list->append(item, &const_cast<std::string&>(item.get()));
for (const auto& item : other_profiles) for (const auto& item : other_profiles)
list->append(item, &const_cast<std::string&>(item.get())); list->append(item.second, &const_cast<std::string&>(item.second.get()));
} }
@ -1225,20 +1226,19 @@ void PageMaterials::sort_list_data(PresetList* list, const std::vector<ProfilePr
// then the rest // then the rest
// in alphabetical order // in alphabetical order
std::vector<ProfilePrintData> prusa_profiles; std::vector<ProfilePrintData> prusa_profiles;
std::vector<ProfilePrintData> other_profiles; std::vector<std::pair<std::wstring, ProfilePrintData>> other_profiles; // first is lower case id for sorting
//for (int i = 0; i < data.size(); ++i) {
for (const auto& item : data) { for (const auto& item : data) {
const std::string& name = item.name; const std::string& name = item.name;
if (name.find("Prusa") != std::string::npos) if (name.find("Prusa") != std::string::npos)
prusa_profiles.emplace_back(item); prusa_profiles.emplace_back(item);
else else
other_profiles.emplace_back(item); other_profiles.emplace_back(boost::algorithm::to_lower_copy(boost::nowide::widen(name)), item);
} }
std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](ProfilePrintData a, ProfilePrintData b) { std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](ProfilePrintData a, ProfilePrintData b) {
return a.name.get() < b.name.get(); return a.name.get() < b.name.get();
}); });
std::sort(other_profiles.begin(), other_profiles.end(), [](ProfilePrintData a, ProfilePrintData b) { std::sort(other_profiles.begin(), other_profiles.end(), [](const std::pair<std::wstring, ProfilePrintData>& a, const std::pair<std::wstring, ProfilePrintData>& b) {
return a.name.get() < b.name.get(); return a.first < b.first;
}); });
list->Clear(); list->Clear();
for (size_t i = 0; i < prusa_profiles.size(); ++i) { for (size_t i = 0; i < prusa_profiles.size(); ++i) {
@ -1246,8 +1246,8 @@ void PageMaterials::sort_list_data(PresetList* list, const std::vector<ProfilePr
list->Check(i, prusa_profiles[i].checked); list->Check(i, prusa_profiles[i].checked);
} }
for (size_t i = 0; i < other_profiles.size(); ++i) { for (size_t i = 0; i < other_profiles.size(); ++i) {
list->append(std::string(other_profiles[i].name) + (other_profiles[i].omnipresent || template_shown ? "" : " *"), &const_cast<std::string&>(other_profiles[i].name.get())); list->append(std::string(other_profiles[i].second.name) + (other_profiles[i].second.omnipresent || template_shown ? "" : " *"), &const_cast<std::string&>(other_profiles[i].second.name.get()));
list->Check(i + prusa_profiles.size(), other_profiles[i].checked); list->Check(i + prusa_profiles.size(), other_profiles[i].second.checked);
} }
} }
@ -1670,9 +1670,17 @@ PageVendors::PageVendors(ConfigWizard *parent)
auto boldfont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); auto boldfont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
boldfont.SetWeight(wxFONTWEIGHT_BOLD); boldfont.SetWeight(wxFONTWEIGHT_BOLD);
// Copy vendors from bundle map to vector, so we can sort it without case sensitivity
std::vector<std::pair<std::wstring, const VendorProfile*>> vendors;
for (const auto& pair : wizard_p()->bundles) { for (const auto& pair : wizard_p()->bundles) {
const VendorProfile *vendor = pair.second.vendor_profile; vendors.emplace_back(boost::algorithm::to_lower_copy(boost::nowide::widen(pair.second.vendor_profile->name)),pair.second.vendor_profile);
}
std::sort(vendors.begin(), vendors.end(), [](const std::pair<std::wstring, const VendorProfile*>& a, const std::pair<std::wstring, const VendorProfile*>& b) {
return a.first < b.first;
});
for (const std::pair<std::wstring, const VendorProfile*>& v : vendors) {
const VendorProfile* vendor = v.second;
if (vendor->id == PresetBundle::PRUSA_BUNDLE) { continue; } if (vendor->id == PresetBundle::PRUSA_BUNDLE) { continue; }
if (vendor && vendor->templates_profile) if (vendor && vendor->templates_profile)
continue; continue;
@ -1682,8 +1690,8 @@ PageVendors::PageVendors(ConfigWizard *parent)
wizard_p()->on_3rdparty_install(vendor, cbox->IsChecked()); wizard_p()->on_3rdparty_install(vendor, cbox->IsChecked());
}); });
const auto &vendors = appconfig.vendors(); const auto &acvendors = appconfig.vendors();
const bool enabled = vendors.find(pair.first) != vendors.end(); const bool enabled = acvendors.find(vendor->id) != acvendors.end();
if (enabled) { if (enabled) {
cbox->SetValue(true); cbox->SetValue(true);
@ -2316,8 +2324,21 @@ void ConfigWizard::priv::load_pages()
index->add_page(page_msla); index->add_page(page_msla);
if (!only_sla_mode) { if (!only_sla_mode) {
index->add_page(page_vendors); index->add_page(page_vendors);
// Copy pages names from map to vector, so we can sort it without case sensitivity
std::vector<std::pair<std::wstring, std::string>> sorted_vendors;
for (const auto& pages : pages_3rdparty) { for (const auto& pages : pages_3rdparty) {
for ( PagePrinters* page : { pages.second.first, pages.second.second }) sorted_vendors.emplace_back(boost::algorithm::to_lower_copy(boost::nowide::widen(pages.first)), pages.first);
}
std::sort(sorted_vendors.begin(), sorted_vendors.end(), [](const std::pair<std::wstring, std::string>& a, const std::pair<std::wstring, std::string>& b) {
return a.first < b.first;
});
for (const std::pair<std::wstring, std::string> v : sorted_vendors) {
const auto& pages = pages_3rdparty.find(v.second);
if (pages == pages_3rdparty.end())
continue; // Should not happen
for ( PagePrinters* page : { pages->second.first, pages->second.second })
if (page && page->install) if (page && page->install)
index->add_page(page); index->add_page(page);
} }

View File

@ -1685,6 +1685,8 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo
const Vec3d offset = Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - instance_offset; const Vec3d offset = Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - instance_offset;
new_volume->set_offset(inv_inst_transform * offset); new_volume->set_offset(inv_inst_transform * offset);
} }
else
new_volume->set_offset(new_volume->source.mesh_offset - model_object.volumes.front()->source.mesh_offset);
added_volumes.push_back(new_volume); added_volumes.push_back(new_volume);
} }

View File

@ -1323,6 +1323,10 @@ namespace {
bool is_text_empty(std::string_view text) { return text.empty() || text.find_first_not_of(" \n\t\r") == std::string::npos; } bool is_text_empty(std::string_view text) { return text.empty() || text.find_first_not_of(" \n\t\r") == std::string::npos; }
} // namespace } // namespace
namespace priv {
static bool is_text_empty(const std::string &text) { return text.empty() || text.find_first_not_of(" \n\t\r") == std::string::npos; }
} // namespace priv
bool GLGizmoEmboss::process() bool GLGizmoEmboss::process()
{ {
// no volume is selected -> selection from right panel // no volume is selected -> selection from right panel

View File

@ -177,7 +177,7 @@ void ImGuiWrapper::set_language(const std::string &language)
m_font_cjk = false; m_font_cjk = false;
if (lang == "cs" || lang == "pl" || lang == "hu") { if (lang == "cs" || lang == "pl" || lang == "hu") {
ranges = ranges_latin2; ranges = ranges_latin2;
} else if (lang == "ru" || lang == "uk") { } else if (lang == "ru" || lang == "uk" || lang == "be") {
ranges = ImGui::GetIO().Fonts->GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters ranges = ImGui::GetIO().Fonts->GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters
} else if (lang == "tr") { } else if (lang == "tr") {
ranges = ranges_turkish; ranges = ranges_turkish;

View File

@ -246,8 +246,15 @@ void PresetComboBox::update(std::string select_preset_name)
const std::deque<Preset>& presets = m_collection->get_presets(); const std::deque<Preset>& presets = m_collection->get_presets();
std::map<wxString, std::pair<wxBitmapBundle*, bool>> nonsys_presets; struct PresetData {
std::map<wxString, wxBitmapBundle*> incomp_presets; wxString name;
wxString lower_name;
wxBitmapBundle* bitmap;
bool enabled; // not used in incomp_presets
};
std::vector<PresetData> system_presets;
std::vector<PresetData> nonsys_presets;
std::vector<PresetData> incomp_presets;
wxString selected = ""; wxString selected = "";
if (!presets.front().is_visible) if (!presets.front().is_visible)
@ -276,28 +283,31 @@ void PresetComboBox::update(std::string select_preset_name)
assert(bmp); assert(bmp);
if (!is_enabled) { if (!is_enabled) {
incomp_presets.emplace(get_preset_name(preset), bmp); incomp_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp, false});
if (preset.is_dirty && m_show_modif_preset_separately) if (preset.is_dirty && m_show_modif_preset_separately)
incomp_presets.emplace(get_preset_name_with_suffix(preset), bmp); incomp_presets.push_back({get_preset_name_with_suffix(preset), get_preset_name_with_suffix(preset).Lower(), bmp, false});
} }
else if (preset.is_default || preset.is_system) else if (preset.is_default || preset.is_system)
{ {
Append(get_preset_name(preset), *bmp); system_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp, is_enabled});
validate_selection(preset.name == select_preset_name); if (preset.name == select_preset_name)
selected = preset.name;
if (preset.is_dirty && m_show_modif_preset_separately) { if (preset.is_dirty && m_show_modif_preset_separately) {
wxString preset_name = get_preset_name_with_suffix(preset); wxString preset_name = get_preset_name_with_suffix(preset);
Append(preset_name, *bmp); system_presets.push_back({preset_name, preset_name.Lower(), bmp, is_enabled});
validate_selection(into_u8(preset_name) == select_preset_name); if (into_u8(preset_name) == select_preset_name)
selected = preset_name;
} }
} }
else else
{ {
nonsys_presets.emplace(get_preset_name(preset), std::pair<wxBitmapBundle*, bool>(bmp, is_enabled)); nonsys_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp, is_enabled});
if (preset.name == select_preset_name || (select_preset_name.empty() && is_enabled)) if (preset.name == select_preset_name || (select_preset_name.empty() && is_enabled))
selected = get_preset_name(preset); selected = get_preset_name(preset);
if (preset.is_dirty && m_show_modif_preset_separately) { if (preset.is_dirty && m_show_modif_preset_separately) {
wxString preset_name = get_preset_name_with_suffix(preset); wxString preset_name = get_preset_name_with_suffix(preset);
nonsys_presets.emplace(preset_name, std::pair<wxBitmapBundle*, bool>(bmp, is_enabled)); nonsys_presets.push_back({preset_name, preset_name.Lower(), bmp, is_enabled});
if (preset_name == select_preset_name || (select_preset_name.empty() && is_enabled)) if (preset_name == select_preset_name || (select_preset_name.empty() && is_enabled))
selected = preset_name; selected = preset_name;
} }
@ -305,22 +315,43 @@ void PresetComboBox::update(std::string select_preset_name)
if (i + 1 == m_collection->num_default_presets()) if (i + 1 == m_collection->num_default_presets())
set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("System presets")), NullBitmapBndl()));
} }
if (!system_presets.empty())
{
std::sort(system_presets.begin(), system_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
for (std::vector<PresetData>::iterator it = system_presets.begin(); it != system_presets.end(); ++it) {
int item_id = Append(it->name, *it->bitmap);
if (!it->enabled)
set_label_marker(item_id, LABEL_ITEM_DISABLED);
validate_selection(it->name == selected);
}
}
if (!nonsys_presets.empty()) if (!nonsys_presets.empty())
{ {
std::sort(nonsys_presets.begin(), nonsys_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
set_label_marker(Append(separator(L("User presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("User presets")), NullBitmapBndl()));
for (std::map<wxString, std::pair<wxBitmapBundle*, bool>>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { for (std::vector<PresetData>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
int item_id = Append(it->first, *it->second.first); int item_id = Append(it->name, *it->bitmap);
bool is_enabled = it->second.second; if (!it->enabled)
if (!is_enabled)
set_label_marker(item_id, LABEL_ITEM_DISABLED); set_label_marker(item_id, LABEL_ITEM_DISABLED);
validate_selection(it->first == selected); validate_selection(it->name == selected);
} }
} }
if (!incomp_presets.empty()) if (!incomp_presets.empty())
{ {
std::sort(incomp_presets.begin(), incomp_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
set_label_marker(Append(separator(L("Incompatible presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("Incompatible presets")), NullBitmapBndl()));
for (std::map<wxString, wxBitmapBundle*>::iterator it = incomp_presets.begin(); it != incomp_presets.end(); ++it) { for (std::vector<PresetData> ::iterator it = incomp_presets.begin(); it != incomp_presets.end(); ++it) {
set_label_marker(Append(it->first, *it->second), LABEL_ITEM_DISABLED); set_label_marker(Append(it->name, *it->bitmap), LABEL_ITEM_DISABLED);
} }
} }
@ -833,8 +864,14 @@ void PlaterPresetComboBox::update()
null_icon_width = (wide_icons ? 3 : 2) * norm_icon_width + thin_space_icon_width + wide_space_icon_width; null_icon_width = (wide_icons ? 3 : 2) * norm_icon_width + thin_space_icon_width + wide_space_icon_width;
std::map<wxString, wxBitmapBundle*> nonsys_presets; struct PresetData {
std::map<wxString, wxBitmapBundle*> template_presets; wxString name;
wxString lower_name;
wxBitmapBundle* bitmap;
};
std::vector<PresetData> system_presets;
std::vector<PresetData> nonsys_presets;
std::vector<PresetData> template_presets;
const bool allow_templates = !wxGetApp().app_config->get_bool("no_templates"); const bool allow_templates = !wxGetApp().app_config->get_bool("no_templates");
@ -888,22 +925,23 @@ void PlaterPresetComboBox::update()
if (preset.is_default || preset.is_system) { if (preset.is_default || preset.is_system) {
if (preset.vendor && preset.vendor->templates_profile) { if (preset.vendor && preset.vendor->templates_profile) {
if (allow_templates) { if (allow_templates) {
template_presets.emplace(get_preset_name(preset), bmp); template_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp});
if (is_selected) { if (is_selected) {
selected_user_preset = get_preset_name(preset); selected_user_preset = get_preset_name(preset);
tooltip = from_u8(preset.name); tooltip = from_u8(preset.name);
} }
} }
} else { } else {
Append(get_preset_name(preset), *bmp); system_presets.push_back({ get_preset_name(preset), get_preset_name(preset).Lower(), bmp });
validate_selection(is_selected); if (is_selected) {
if (is_selected) selected_user_preset = get_preset_name(preset);
tooltip = from_u8(preset.name); tooltip = from_u8(preset.name);
} }
} }
}
else else
{ {
nonsys_presets.emplace(get_preset_name(preset), bmp); nonsys_presets.push_back({ get_preset_name(preset), get_preset_name(preset).Lower(), bmp });
if (is_selected) { if (is_selected) {
selected_user_preset = get_preset_name(preset); selected_user_preset = get_preset_name(preset);
tooltip = from_u8(preset.name); tooltip = from_u8(preset.name);
@ -913,21 +951,40 @@ void PlaterPresetComboBox::update()
set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("System presets")), NullBitmapBndl()));
} }
if(!system_presets.empty())
{
std::sort(system_presets.begin(), system_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
for (std::vector<PresetData>::iterator it = system_presets.begin(); it != system_presets.end(); ++it) {
Append(it->name, *it->bitmap);
validate_selection(it->name == selected_user_preset);
}
}
if (!nonsys_presets.empty()) if (!nonsys_presets.empty())
{ {
std::sort(nonsys_presets.begin(), nonsys_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
set_label_marker(Append(separator(L("User presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("User presets")), NullBitmapBndl()));
for (std::map<wxString, wxBitmapBundle*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { for (std::vector<PresetData>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
Append(it->first, *it->second); Append(it->name, *it->bitmap);
validate_selection(it->first == selected_user_preset); validate_selection(it->name == selected_user_preset);
} }
} }
if (!template_presets.empty()) { if (!template_presets.empty()) {
std::sort(template_presets.begin(), template_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
set_label_marker(Append(separator(L("Template presets")), wxNullBitmap)); set_label_marker(Append(separator(L("Template presets")), wxNullBitmap));
for (std::map<wxString, wxBitmapBundle*>::iterator it = template_presets.begin(); it != template_presets.end(); ++it) { for (std::vector<PresetData>::iterator it = template_presets.begin(); it != template_presets.end(); ++it) {
Append(it->first, *it->second); Append(it->name, *it->bitmap);
validate_selection(it->first == selected_user_preset); validate_selection(it->name == selected_user_preset);
} }
} }
@ -938,18 +995,36 @@ void PlaterPresetComboBox::update()
set_label_marker(Append(separator(L("Physical printers")), NullBitmapBndl())); set_label_marker(Append(separator(L("Physical printers")), NullBitmapBndl()));
const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers;
// Sort Physical printers in preset_data vector and than Append it in correct order
struct PhysicalPrinterPresetData
{
wxString lower_name; // just for sorting
std::string name; // preset_name
std::string fullname; // full name
bool selected; // is selected
};
std::vector<PhysicalPrinterPresetData> preset_data;
for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) {
for (const std::string& preset_name : it->get_preset_names()) { for (const std::string& preset_name : it->get_preset_names()) {
Preset* preset = m_collection->find_preset(preset_name); preset_data.push_back({ wxString::FromUTF8(it->get_full_name(preset_name)).Lower(), preset_name, it->get_full_name(preset_name), ph_printers.is_selected(it, preset_name) });
}
}
std::sort(preset_data.begin(), preset_data.end(), [](const PhysicalPrinterPresetData& a, const PhysicalPrinterPresetData& b) {
return a.lower_name < b.lower_name;
});
for (const PhysicalPrinterPresetData& data : preset_data)
{
Preset* preset = m_collection->find_preset(data.name);
if (!preset || !preset->is_visible) if (!preset || !preset->is_visible)
continue; continue;
std::string main_icon_name, bitmap_key = main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; std::string main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
auto bmp = get_bmp(main_icon_name, wide_icons, main_icon_name);
auto bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false);
assert(bmp); assert(bmp);
set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); set_label_marker(Append(from_u8(data.fullname + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER);
validate_selection(ph_printers.is_selected(it, preset_name)); validate_selection(data.selected);
}
} }
} }
} }
@ -1070,11 +1145,17 @@ void TabPresetComboBox::update()
const std::deque<Preset>& presets = m_collection->get_presets(); const std::deque<Preset>& presets = m_collection->get_presets();
std::map<wxString, std::pair<wxBitmapBundle*, bool>> nonsys_presets; struct PresetData {
std::map<wxString, std::pair<wxBitmapBundle*, bool>> template_presets; wxString name;
wxString lower_name;
wxBitmapBundle* bitmap;
bool enabled;
};
std::vector<PresetData> system_presets;
std::vector<PresetData> nonsys_presets;
std::vector<PresetData> template_presets;
const bool allow_templates = !wxGetApp().app_config->get_bool("no_templates"); const bool allow_templates = !wxGetApp().app_config->get_bool("no_templates");
wxString selected = ""; wxString selected = "";
if (!presets.front().is_visible) if (!presets.front().is_visible)
set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("System presets")), NullBitmapBndl()));
@ -1113,23 +1194,20 @@ void TabPresetComboBox::update()
if (preset.is_default || preset.is_system) { if (preset.is_default || preset.is_system) {
if (preset.vendor && preset.vendor->templates_profile) { if (preset.vendor && preset.vendor->templates_profile) {
if (allow_templates) { if (allow_templates) {
template_presets.emplace(get_preset_name(preset), std::pair<wxBitmapBundle*, bool>(bmp, is_enabled)); template_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp, is_enabled});
if (i == idx_selected) if (i == idx_selected)
selected = get_preset_name(preset); selected = get_preset_name(preset);
} }
} else { } else {
int item_id = Append(get_preset_name(preset), *bmp); system_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp, is_enabled});
if (!is_enabled) if (i == idx_selected)
set_label_marker(item_id, LABEL_ITEM_DISABLED); selected = get_preset_name(preset);
validate_selection(i == idx_selected);
} }
} }
else else
{ {
std::pair<wxBitmapBundle*, bool> pair(bmp, is_enabled); std::pair<wxBitmapBundle*, bool> pair(bmp, is_enabled);
nonsys_presets.emplace(get_preset_name(preset), std::pair<wxBitmapBundle*, bool>(bmp, is_enabled)); nonsys_presets.push_back({get_preset_name(preset), get_preset_name(preset).Lower(), bmp, is_enabled});
if (i == idx_selected) if (i == idx_selected)
selected = get_preset_name(preset); selected = get_preset_name(preset);
} }
@ -1137,26 +1215,47 @@ void TabPresetComboBox::update()
set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); set_label_marker(Append(separator(L("System presets")), NullBitmapBndl()));
} }
if (!nonsys_presets.empty()) if (!system_presets.empty())
{ {
set_label_marker(Append(separator(L("User presets")), NullBitmapBndl())); std::sort(system_presets.begin(), system_presets.end(), [](const PresetData& a, const PresetData& b) {
for (std::map<wxString, std::pair<wxBitmapBundle*, bool>>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { return a.lower_name < b.lower_name;
int item_id = Append(it->first, *it->second.first); });
bool is_enabled = it->second.second;
if (!is_enabled) for (std::vector<PresetData>::iterator it = system_presets.begin(); it != system_presets.end(); ++it) {
int item_id = Append(it->name, *it->bitmap);
if (!it->enabled)
set_label_marker(item_id, LABEL_ITEM_DISABLED); set_label_marker(item_id, LABEL_ITEM_DISABLED);
validate_selection(it->first == selected); validate_selection(it->name == selected);
} }
} }
if (!template_presets.empty()) { if (!nonsys_presets.empty())
set_label_marker(Append(separator(L("Template presets")), wxNullBitmap)); {
for (std::map<wxString, std::pair<wxBitmapBundle*, bool>>::iterator it = template_presets.begin(); it != template_presets.end(); ++it) { std::sort(nonsys_presets.begin(), nonsys_presets.end(), [](const PresetData& a, const PresetData& b) {
int item_id = Append(it->first, *it->second.first); return a.lower_name < b.lower_name;
bool is_enabled = it->second.second; });
if (!is_enabled)
set_label_marker(Append(separator(L("User presets")), NullBitmapBndl()));
for (std::vector<PresetData>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
int item_id = Append(it->name, *it->bitmap);
if (!it->enabled)
set_label_marker(item_id, LABEL_ITEM_DISABLED); set_label_marker(item_id, LABEL_ITEM_DISABLED);
validate_selection(it->first == selected); validate_selection(it->name == selected);
}
}
if (!template_presets.empty())
{
std::sort(template_presets.begin(), template_presets.end(), [](const PresetData& a, const PresetData& b) {
return a.lower_name < b.lower_name;
});
set_label_marker(Append(separator(L("Template presets")), wxNullBitmap));
for (std::vector<PresetData>::iterator it = template_presets.begin(); it != template_presets.end(); ++it) {
int item_id = Append(it->name, *it->bitmap);
if (!it->enabled)
set_label_marker(item_id, LABEL_ITEM_DISABLED);
validate_selection(it->name == selected);
} }
} }
@ -1167,9 +1266,26 @@ void TabPresetComboBox::update()
set_label_marker(Append(separator(L("Physical printers")), NullBitmapBndl())); set_label_marker(Append(separator(L("Physical printers")), NullBitmapBndl()));
const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers;
// Sort Physical printers in preset_data vector and than Append it in correct order
struct PhysicalPrinterPresetData
{
wxString lower_name; // just for sorting
std::string name; // preset_name
std::string fullname; // full name
bool selected; // is selected
};
std::vector<PhysicalPrinterPresetData> preset_data;
for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) {
for (const std::string& preset_name : it->get_preset_names()) { for (const std::string& preset_name : it->get_preset_names()) {
Preset* preset = m_collection->find_preset(preset_name); preset_data.push_back({wxString::FromUTF8(it->get_full_name(preset_name)).Lower(), preset_name, it->get_full_name(preset_name), ph_printers.is_selected(it, preset_name)});
}
}
std::sort(preset_data.begin(), preset_data.end(), [](const PhysicalPrinterPresetData& a, const PhysicalPrinterPresetData& b) {
return a.lower_name < b.lower_name;
});
for (const PhysicalPrinterPresetData& data : preset_data)
{
Preset* preset = m_collection->find_preset(data.name);
if (!preset || !preset->is_visible) if (!preset || !preset->is_visible)
continue; continue;
std::string main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; std::string main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
@ -1177,9 +1293,8 @@ void TabPresetComboBox::update()
auto bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false); auto bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false);
assert(bmp); assert(bmp);
set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); set_label_marker(Append(from_u8(data.fullname + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER);
validate_selection(ph_printers.is_selected(it, preset_name)); validate_selection(data.selected);
}
} }
} }

View File

@ -32,6 +32,7 @@ namespace pt = boost::property_tree;
namespace Slic3r { namespace Slic3r {
namespace { namespace {
#ifdef WIN32
std::string get_host_from_url(const std::string& url_in) std::string get_host_from_url(const std::string& url_in)
{ {
std::string url = url_in; std::string url = url_in;
@ -63,7 +64,7 @@ std::string get_host_from_url(const std::string& url_in)
BOOST_LOG_TRIVIAL(error) << "OctoPrint get_host_from_url: failed to allocate curl_url"; BOOST_LOG_TRIVIAL(error) << "OctoPrint get_host_from_url: failed to allocate curl_url";
return out; return out;
} }
#ifdef WIN32
// Workaround for Windows 10/11 mDNS resolve issue, where two mDNS resolves in succession fail. // Workaround for Windows 10/11 mDNS resolve issue, where two mDNS resolves in succession fail.
std::string substitute_host(const std::string& orig_addr, std::string sub_addr) std::string substitute_host(const std::string& orig_addr, std::string sub_addr)
{ {
@ -470,15 +471,17 @@ bool OctoPrint::upload_inner_with_host(PrintHostUpload upload_data, ProgressFn p
% upload_parent_path.string() % upload_parent_path.string()
% (upload_data.post_action == PrintHostPostUploadAction::StartPrint ? "true" : "false"); % (upload_data.post_action == PrintHostPostUploadAction::StartPrint ? "true" : "false");
std::string host = get_host_from_url(m_host);
auto http = Http::post(std::move(url)); auto http = Http::post(std::move(url));
#ifdef WIN32
// "Host" header is necessary here. In the workaround above (two mDNS..) we have got IP address from test connection and subsituted it into "url" variable. // "Host" header is necessary here. In the workaround above (two mDNS..) we have got IP address from test connection and subsituted it into "url" variable.
// And when creating Http object above, libcurl automatically includes "Host" header from address it got. // And when creating Http object above, libcurl automatically includes "Host" header from address it got.
// Thus "Host" is set to the resolved IP instead of host filled by user. We need to change it back. // Thus "Host" is set to the resolved IP instead of host filled by user. We need to change it back.
// Not changing the host would work on the most cases (where there is 1 service on 1 hostname) but would break when f.e. reverse proxy is used (issue #9734). // Not changing the host would work on the most cases (where there is 1 service on 1 hostname) but would break when f.e. reverse proxy is used (issue #9734).
// Also when allow_ip_resolve = 0, this is not needed, but it should not break anything if it stays. // Also when allow_ip_resolve = 0, this is not needed, but it should not break anything if it stays.
// https://www.rfc-editor.org/rfc/rfc7230#section-5.4 // https://www.rfc-editor.org/rfc/rfc7230#section-5.4
std::string host = get_host_from_url(m_host);
http.header("Host", host); http.header("Host", host);
#endif // _WIN32
set_auth(http); set_auth(http);
http.form_add("print", upload_data.post_action == PrintHostPostUploadAction::StartPrint ? "true" : "false") http.form_add("print", upload_data.post_action == PrintHostPostUploadAction::StartPrint ? "true" : "false")
.form_add("path", upload_parent_path.string()) // XXX: slashes on windows ??? .form_add("path", upload_parent_path.string()) // XXX: slashes on windows ???
@ -1036,14 +1039,16 @@ bool PrusaLink::put_inner(PrintHostUpload upload_data, std::string url, const st
bool res = true; bool res = true;
// Percent escape all filenames in on path and add it to the url. This is different from POST. // Percent escape all filenames in on path and add it to the url. This is different from POST.
url += "/" + escape_path_by_element(upload_data.upload_path); url += "/" + escape_path_by_element(upload_data.upload_path);
std::string host = get_host_from_url(m_host);
Http http = Http::put(std::move(url)); Http http = Http::put(std::move(url));
#ifdef WIN32
// "Host" header is necessary here. We have resolved IP address and subsituted it into "url" variable. // "Host" header is necessary here. We have resolved IP address and subsituted it into "url" variable.
// And when creating Http object above, libcurl automatically includes "Host" header from address it got. // And when creating Http object above, libcurl automatically includes "Host" header from address it got.
// Thus "Host" is set to the resolved IP instead of host filled by user. We need to change it back. // Thus "Host" is set to the resolved IP instead of host filled by user. We need to change it back.
// Not changing the host would work on the most cases (where there is 1 service on 1 hostname) but would break when f.e. reverse proxy is used (issue #9734). // Not changing the host would work on the most cases (where there is 1 service on 1 hostname) but would break when f.e. reverse proxy is used (issue #9734).
// https://www.rfc-editor.org/rfc/rfc7230#section-5.4 // https://www.rfc-editor.org/rfc/rfc7230#section-5.4
std::string host = get_host_from_url(m_host);
http.header("Host", host); http.header("Host", host);
#endif // _WIN32
set_auth(http); set_auth(http);
// This is ugly, but works. There was an error at PrusaLink side that accepts any string at Print-After-Upload as true, thus False was also triggering print after upload. // This is ugly, but works. There was an error at PrusaLink side that accepts any string at Print-After-Upload as true, thus False was also triggering print after upload.
if (upload_data.post_action == PrintHostPostUploadAction::StartPrint) if (upload_data.post_action == PrintHostPostUploadAction::StartPrint)
@ -1083,15 +1088,17 @@ bool PrusaLink::post_inner(PrintHostUpload upload_data, std::string url, const s
bool res = true; bool res = true;
const auto upload_filename = upload_data.upload_path.filename(); const auto upload_filename = upload_data.upload_path.filename();
const auto upload_parent_path = upload_data.upload_path.parent_path(); const auto upload_parent_path = upload_data.upload_path.parent_path();
std::string host = get_host_from_url(m_host);
Http http = Http::post(std::move(url)); Http http = Http::post(std::move(url));
#ifdef WIN32
// "Host" header is necessary here. We have resolved IP address and subsituted it into "url" variable. // "Host" header is necessary here. We have resolved IP address and subsituted it into "url" variable.
// And when creating Http object above, libcurl automatically includes "Host" header from address it got. // And when creating Http object above, libcurl automatically includes "Host" header from address it got.
// Thus "Host" is set to the resolved IP instead of host filled by user. We need to change it back. // Thus "Host" is set to the resolved IP instead of host filled by user. We need to change it back.
// Not changing the host would work on the most cases (where there is 1 service on 1 hostname) but would break when f.e. reverse proxy is used (issue #9734). // Not changing the host would work on the most cases (where there is 1 service on 1 hostname) but would break when f.e. reverse proxy is used (issue #9734).
// https://www.rfc-editor.org/rfc/rfc7230#section-5.4 // https://www.rfc-editor.org/rfc/rfc7230#section-5.4
std::string host = get_host_from_url(m_host);
http.header("Host", host); http.header("Host", host);
#endif // _WIN32
set_auth(http); set_auth(http);
set_http_post_header_args(http, upload_data.post_action); set_http_post_header_args(http, upload_data.post_action);
http.form_add("path", upload_parent_path.string()) // XXX: slashes on windows ??? http.form_add("path", upload_parent_path.string()) // XXX: slashes on windows ???

View File

@ -3,7 +3,7 @@
set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_NAME "PrusaSlicer")
set(SLIC3R_APP_KEY "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer")
set(SLIC3R_VERSION "2.6.0-beta3") set(SLIC3R_VERSION "2.6.0-beta4")
set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN")
set(SLIC3R_RC_VERSION "2,6,0,0") set(SLIC3R_RC_VERSION "2,6,0,0")
set(SLIC3R_RC_VERSION_DOTS "2.6.0.0") set(SLIC3R_RC_VERSION_DOTS "2.6.0.0")