Merge remote-tracking branch 'PRIVATE/master' into ys_cut

This commit is contained in:
YuSanka 2022-09-23 13:32:32 +02:00
commit b2d5fd72e9
22 changed files with 306 additions and 162 deletions

View File

@ -1,4 +1,5 @@
min_slic3r_version = 2.5.0-alpha0 min_slic3r_version = 2.5.0-alpha0
0.2.2 General improvements.
0.2.1 Added Ender 3 Neo and Ender 3 S1 Plus. Various updates. 0.2.1 Added Ender 3 Neo and Ender 3 S1 Plus. Various updates.
0.2.0 Added alternative nozzle support 0.2.0 Added alternative nozzle support
0.1.5 Added Ender-3 S1 Pro 0.1.5 Added Ender-3 S1 Pro

View File

@ -5,7 +5,7 @@
name = Creality name = Creality
# 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 = 0.2.1 config_version = 0.2.2
# 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/Creality/ config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/
# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
@ -131,6 +131,15 @@ bed_model = ender3_bed.stl
bed_texture = ender3.svg bed_texture = ender3.svg
default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
#[printer_model:ENDER5PRO]
#name = Creality Ender-5 Pro
#variants = 0.4; 0.3; 0.5; 0.6
#technology = FFF
#family = ENDER
#bed_model = ender3_bed.stl
#bed_texture = ender3.svg
#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY
[printer_model:ENDER5PLUS] [printer_model:ENDER5PLUS]
name = Creality Ender-5 Plus name = Creality Ender-5 Plus
variants = 0.4; 0.3; 0.5; 0.6 variants = 0.4; 0.3; 0.5; 0.6
@ -1085,10 +1094,21 @@ bed_temperature = 60
first_layer_temperature = 205 first_layer_temperature = 205
first_layer_bed_temperature = 60 first_layer_bed_temperature = 60
filament_cost = 26.99 filament_cost = 26.99
filament_density = 1.36 filament_density = 1.37
filament_colour = #FF4640 filament_colour = #FF4640
filament_spool_weight = 180 filament_spool_weight = 180
[filament:VOXELPLA PLA Plus @CREALITY]
inherits = *PLA*
filament_vendor = VOXELPLA
temperature = 200
bed_temperature = 60
first_layer_temperature = 200
first_layer_bed_temperature = 60
filament_cost = 16.99
filament_density = 1.24
filament_colour = #2862C4
# Common printer preset # Common printer preset
@ -1106,6 +1126,7 @@ remaining_times = 0
machine_max_acceleration_e = 5000 machine_max_acceleration_e = 5000
machine_max_acceleration_extruding = 500 machine_max_acceleration_extruding = 500
machine_max_acceleration_retracting = 1000 machine_max_acceleration_retracting = 1000
machine_max_acceleration_travel = 500
machine_max_acceleration_x = 500 machine_max_acceleration_x = 500
machine_max_acceleration_y = 500 machine_max_acceleration_y = 500
machine_max_acceleration_z = 100 machine_max_acceleration_z = 100
@ -1119,6 +1140,7 @@ machine_max_jerk_y = 8
machine_max_jerk_z = 0.4 machine_max_jerk_z = 0.4
machine_min_extruding_rate = 0 machine_min_extruding_rate = 0
machine_min_travel_rate = 0 machine_min_travel_rate = 0
machine_limits_usage = emit_to_gcode
layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z} layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z}
max_print_height = 250 max_print_height = 250
printer_notes = printer_notes =
@ -1144,7 +1166,11 @@ z_offset = 0
printer_model = printer_model =
default_filament_profile = "Generic PLA @CREALITY" default_filament_profile = "Generic PLA @CREALITY"
start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0
end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.85} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors
# Intended for printers that have exclusively shipped with a 32bit mainboard
[printer:*32bitmainboard*]
gcode_flavor = marlin2
# Intended for printers equipped with a strain gauge mechanism, like the CR-6 series # Intended for printers equipped with a strain gauge mechanism, like the CR-6 series
[printer:*straingauge*] [printer:*straingauge*]
@ -1158,6 +1184,10 @@ start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140
[printer:*slowabl*] [printer:*slowabl*]
start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0
# intended for printers that have RESTORE_LEVELING_AFTER_G28 enabled in firmware
[printer:*storedabl*]
start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis and restore leveling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0
# Intended for printers with vendor official firmware verified to support M25 # Intended for printers with vendor official firmware verified to support M25
[printer:*pauseprint*] [printer:*pauseprint*]
pause_print_gcode = M25 ; pause print pause_print_gcode = M25 ; pause print
@ -1166,16 +1196,31 @@ pause_print_gcode = M25 ; pause print
[printer:*descendingz*] [printer:*descendingz*]
end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; move print head out of the way\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed close to the bottom\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; move print head out of the way\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed close to the bottom\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors
# Intended for printers with a much larger bed, like the CR-10 S4/S5 series
[printer:*largebedinertia*]
machine_max_acceleration_x = 300
machine_max_acceleration_y = 300
machine_max_feedrate_x = 300
machine_max_feedrate_y = 300
[printer:*bowdencapricorn*] [printer:*bowdencapricorn*]
#max_volumetric_extrusion_rate_slope_negative = 7
retract_length = 4
[printer:*bowdenshort*]
#max_volumetric_extrusion_rate_slope_negative = 7
retract_length = 4 retract_length = 4
[printer:*bowden*] [printer:*bowden*]
#max_volumetric_extrusion_rate_slope_negative = 6
retract_length = 5 retract_length = 5
[printer:*bowdenlong*] [printer:*bowdenlong*]
#max_volumetric_extrusion_rate_slope_negative = 5
retract_length = 6 retract_length = 6
[printer:*bowdenallmetalhotend*] [printer:*bowdenallmetalhotend*]
#max_volumetric_extrusion_rate_slope_negative = 6
retract_length = 3 retract_length = 3
[printer:*directdriveextruder*] [printer:*directdriveextruder*]
@ -1247,8 +1292,11 @@ inherits = *ENDER3*; *0.6nozzle*
[printer:*ENDER3BLTOUCH*] [printer:*ENDER3BLTOUCH*]
inherits = *ENDER3*; *fastabl* inherits = *common*; *bowden*; *fastabl*
bed_shape = 3x3,228x3,228x228,3x228
max_print_height = 250
printer_model = ENDER3BLTOUCH printer_model = ENDER3BLTOUCH
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3BLTOUCH\nPRINTER_HAS_BOWDEN
[printer:Creality Ender-3 BLTouch (0.3 mm nozzle)] [printer:Creality Ender-3 BLTouch (0.3 mm nozzle)]
inherits = *ENDER3BLTOUCH*; *0.3nozzle* inherits = *ENDER3BLTOUCH*; *0.3nozzle*
@ -1267,7 +1315,9 @@ inherits = *ENDER3BLTOUCH*; *0.6nozzle*
[printer:*ENDER3PRO*] [printer:*ENDER3PRO*]
inherits = *ENDER3*; *pauseprint* inherits = *common*; *bowden*; *pauseprint*
bed_shape = 3x3,228x3,228x228,3x228
max_print_height = 250
printer_model = ENDER3PRO printer_model = ENDER3PRO
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3PRO\nPRINTER_HAS_BOWDEN printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3PRO\nPRINTER_HAS_BOWDEN
@ -1276,7 +1326,7 @@ inherits = *ENDER3PRO*; *0.3nozzle*
[printer:Creality Ender-3 Pro (0.4 mm nozzle)] [printer:Creality Ender-3 Pro (0.4 mm nozzle)]
inherits = *ENDER3PRO*; *0.4nozzle* inherits = *ENDER3PRO*; *0.4nozzle*
renamed_From = "Creality Ender-3 Pro" renamed_from = "Creality Ender-3 Pro"
[printer:Creality Ender-3 Pro (0.5 mm nozzle)] [printer:Creality Ender-3 Pro (0.5 mm nozzle)]
inherits = *ENDER3PRO*; *0.5nozzle* inherits = *ENDER3PRO*; *0.5nozzle*
@ -1287,7 +1337,9 @@ inherits = *ENDER3PRO*; *0.6nozzle*
[printer:*ENDER3NEO*] [printer:*ENDER3NEO*]
inherits = *ENDER3*; *fastabl* inherits = *common*; *bowden*; *fastabl*; *32bitmainboard*
bed_shape = 3x3,228x3,228x228,3x228
max_print_height = 250
printer_model = ENDER3NEO printer_model = ENDER3NEO
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3NEO\nPRINTER_HAS_BOWDEN printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3NEO\nPRINTER_HAS_BOWDEN
@ -1317,7 +1369,7 @@ inherits = *ENDER3V2*; *0.3nozzle*
[printer:Creality Ender-3 V2 (0.4 mm nozzle)] [printer:Creality Ender-3 V2 (0.4 mm nozzle)]
inherits = *ENDER3V2*; *0.4nozzle* inherits = *ENDER3V2*; *0.4nozzle*
renamed_From = "Creality Ender-3 V2"; "Creality Ender-3V2" renamed_from = "Creality Ender-3 V2"; "Creality Ender-3V2"
[printer:Creality Ender-3 V2 (0.5 mm nozzle)] [printer:Creality Ender-3 V2 (0.5 mm nozzle)]
inherits = *ENDER3V2*; *0.5nozzle* inherits = *ENDER3V2*; *0.5nozzle*
@ -1328,7 +1380,7 @@ inherits = *ENDER3V2*; *0.6nozzle*
[printer:*ENDER3V2NEO*] [printer:*ENDER3V2NEO*]
inherits = *common*; *bowden*; *fastabl* inherits = *common*; *bowden*; *fastabl*; *32bitmainboard*
bed_shape = 5x0,215x0,215x220,5x220 bed_shape = 5x0,215x0,215x220,5x220
max_print_height = 250 max_print_height = 250
printer_model = ENDER3V2NEO printer_model = ENDER3V2NEO
@ -1349,7 +1401,7 @@ inherits = *ENDER3V2NEO*; *0.6nozzle*
[printer:*ENDER3S1*] [printer:*ENDER3S1*]
inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint* inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint*
bed_shape = 5x0,215x0,215x220,5x220 bed_shape = 5x0,215x0,215x220,5x220
max_print_height = 270 max_print_height = 270
printer_model = ENDER3S1 printer_model = ENDER3S1
@ -1360,7 +1412,7 @@ inherits = *ENDER3S1*; *0.3nozzle*
[printer:Creality Ender-3 S1 (0.4 mm nozzle)] [printer:Creality Ender-3 S1 (0.4 mm nozzle)]
inherits = *ENDER3S1*; *0.4nozzle* inherits = *ENDER3S1*; *0.4nozzle*
renamed_From = "Creality Ender-3 S1" renamed_from = "Creality Ender-3 S1"
[printer:Creality Ender-3 S1 (0.5 mm nozzle)] [printer:Creality Ender-3 S1 (0.5 mm nozzle)]
inherits = *ENDER3S1*; *0.5nozzle* inherits = *ENDER3S1*; *0.5nozzle*
@ -1371,7 +1423,7 @@ inherits = *ENDER3S1*; *0.6nozzle*
[printer:*ENDER3S1PRO*] [printer:*ENDER3S1PRO*]
inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint* inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint*
bed_shape = 5x0,215x0,215x220,5x220 bed_shape = 5x0,215x0,215x220,5x220
max_print_height = 270 max_print_height = 270
printer_model = ENDER3S1PRO printer_model = ENDER3S1PRO
@ -1382,7 +1434,7 @@ inherits = *ENDER3S1PRO*; *0.3nozzle*
[printer:Creality Ender-3 S1 Pro (0.4 mm nozzle)] [printer:Creality Ender-3 S1 Pro (0.4 mm nozzle)]
inherits = *ENDER3S1PRO*; *0.4nozzle* inherits = *ENDER3S1PRO*; *0.4nozzle*
renamed_From = "Creality Ender-3 S1 Pro" renamed_from = "Creality Ender-3 S1 Pro"
[printer:Creality Ender-3 S1 Pro (0.5 mm nozzle)] [printer:Creality Ender-3 S1 Pro (0.5 mm nozzle)]
inherits = *ENDER3S1PRO*; *0.5nozzle* inherits = *ENDER3S1PRO*; *0.5nozzle*
@ -1393,7 +1445,7 @@ inherits = *ENDER3S1PRO*; *0.6nozzle*
[printer:*ENDER3S1PLUS*] [printer:*ENDER3S1PLUS*]
inherits = *common*; *slowabl*; *spriteextruder*; *pauseprint* inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint*
bed_shape = 5x5,295x5,295x295,5x295 bed_shape = 5x5,295x5,295x295,5x295
max_print_height = 300 max_print_height = 300
printer_model = ENDER3S1PLUS printer_model = ENDER3S1PLUS
@ -1425,7 +1477,7 @@ inherits = *ENDER3MAX*; *0.3nozzle*
[printer:Creality Ender-3 Max (0.4 mm nozzle)] [printer:Creality Ender-3 Max (0.4 mm nozzle)]
inherits = *ENDER3MAX*; *0.4nozzle* inherits = *ENDER3MAX*; *0.4nozzle*
renamed_From = "Creality Ender-3 Max" renamed_from = "Creality Ender-3 Max"
[printer:Creality Ender-3 Max (0.5 mm nozzle)] [printer:Creality Ender-3 Max (0.5 mm nozzle)]
inherits = *ENDER3MAX*; *0.5nozzle* inherits = *ENDER3MAX*; *0.5nozzle*
@ -1436,7 +1488,7 @@ inherits = *ENDER3MAX*; *0.6nozzle*
[printer:*ENDER3MAXNEO*] [printer:*ENDER3MAXNEO*]
inherits = *common*; *bowdenlong*; *slowabl* inherits = *common*; *bowdenlong*; *slowabl*; *32bitmainboard*
bed_shape = 5x5,295x5,295x295,5x295 bed_shape = 5x5,295x5,295x295,5x295
max_print_height = 320 max_print_height = 320
printer_model = ENDER3MAXNEO printer_model = ENDER3MAXNEO
@ -1468,7 +1520,7 @@ inherits = *ENDER4*; *0.3nozzle*
[printer:Creality Ender-4 (0.4 mm nozzle)] [printer:Creality Ender-4 (0.4 mm nozzle)]
inherits = *ENDER4*; *0.4nozzle* inherits = *ENDER4*; *0.4nozzle*
renamed_From = "Creality Ender-4" renamed_from = "Creality Ender-4"
[printer:Creality Ender-4 (0.5 mm nozzle)] [printer:Creality Ender-4 (0.5 mm nozzle)]
inherits = *ENDER4*; *0.5nozzle* inherits = *ENDER4*; *0.5nozzle*
@ -1492,7 +1544,7 @@ inherits = *ENDER5*; *0.3nozzle*
[printer:Creality Ender-5 (0.4 mm nozzle)] [printer:Creality Ender-5 (0.4 mm nozzle)]
inherits = *ENDER5*; *0.4nozzle* inherits = *ENDER5*; *0.4nozzle*
renamed_From = "Creality Ender-5" renamed_from = "Creality Ender-5"
[printer:Creality Ender-5 (0.5 mm nozzle)] [printer:Creality Ender-5 (0.5 mm nozzle)]
inherits = *ENDER5*; *0.5nozzle* inherits = *ENDER5*; *0.5nozzle*
@ -1502,6 +1554,29 @@ inherits = *ENDER5*; *0.6nozzle*
#[printer:*ENDER5PRO*]
#inherits = *common*; *bowdencapricorn*; *descendingz*
#bed_shape = 5x2.5,225x2.5,225x222.5,5x222.5
#max_print_height = 300
#printer_model = ENDER5PRO
#printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER5PRO\nPRINTER_HAS_BOWDEN
#machine_max_acceleration_e = 1000
#machine_max_feedrate_z = 5
#
#[printer:Creality Ender-5 Pro (0.3 mm nozzle)]
#inherits = *ENDER5PRO*; *0.3nozzle*
#
#[printer:Creality Ender-5 Pro (0.4 mm nozzle)]
#inherits = *ENDER5PRO*; *0.4nozzle*
#
#[printer:Creality Ender-5 Pro (0.5 mm nozzle)]
#inherits = *ENDER5PRO*; *0.5nozzle*
#
#[printer:Creality Ender-5 Pro (0.6 mm nozzle)]
#inherits = *ENDER5PRO*; *0.6nozzle*
[printer:*ENDER5PLUS*] [printer:*ENDER5PLUS*]
inherits = *common*; *bowdenlong*; *slowabl*; *descendingz* inherits = *common*; *bowdenlong*; *slowabl*; *descendingz*
bed_shape = 5x5,355x5,355x355,5x355 bed_shape = 5x5,355x5,355x355,5x355
@ -1518,7 +1593,7 @@ inherits = *ENDER5PLUS*; *0.3nozzle*
[printer:Creality Ender-5 Plus (0.4 mm nozzle)] [printer:Creality Ender-5 Plus (0.4 mm nozzle)]
inherits = *ENDER5PLUS*; *0.4nozzle* inherits = *ENDER5PLUS*; *0.4nozzle*
renamed_From = "Creality Ender-5 Plus" renamed_from = "Creality Ender-5 Plus"
[printer:Creality Ender-5 Plus (0.5 mm nozzle)] [printer:Creality Ender-5 Plus (0.5 mm nozzle)]
inherits = *ENDER5PLUS*; *0.5nozzle* inherits = *ENDER5PLUS*; *0.5nozzle*
@ -1540,7 +1615,7 @@ inherits = *ENDER6*; *0.3nozzle*
[printer:Creality Ender-6 (0.4 mm nozzle)] [printer:Creality Ender-6 (0.4 mm nozzle)]
inherits = *ENDER6*; *0.4nozzle* inherits = *ENDER6*; *0.4nozzle*
renamed_From = "Creality Ender-6" renamed_from = "Creality Ender-6"
[printer:Creality Ender-6 (0.5 mm nozzle)] [printer:Creality Ender-6 (0.5 mm nozzle)]
inherits = *ENDER6*; *0.5nozzle* inherits = *ENDER6*; *0.5nozzle*
@ -1562,7 +1637,7 @@ inherits = *ENDER7*; *0.3nozzle*
[printer:Creality Ender-7 (0.4 mm nozzle)] [printer:Creality Ender-7 (0.4 mm nozzle)]
inherits = *ENDER7*; *0.4nozzle* inherits = *ENDER7*; *0.4nozzle*
renamed_From = "Creality Ender-7" renamed_from = "Creality Ender-7"
[printer:Creality Ender-7 (0.5 mm nozzle)] [printer:Creality Ender-7 (0.5 mm nozzle)]
inherits = *ENDER7*; *0.5nozzle* inherits = *ENDER7*; *0.5nozzle*
@ -1573,7 +1648,7 @@ inherits = *ENDER7*; *0.6nozzle*
[printer:*ENDER2*] [printer:*ENDER2*]
inherits = *common*; *bowden* inherits = *common*; *bowdenshort*
bed_shape = 0x0,150x0,150x150,0x150 bed_shape = 0x0,150x0,150x150,0x150
max_print_height = 200 max_print_height = 200
printer_model = ENDER2 printer_model = ENDER2
@ -1584,7 +1659,7 @@ inherits = *ENDER2*; *0.3nozzle*
[printer:Creality Ender-2 (0.4 mm nozzle)] [printer:Creality Ender-2 (0.4 mm nozzle)]
inherits = *ENDER2*; *0.4nozzle* inherits = *ENDER2*; *0.4nozzle*
renamed_From = "Creality Ender-2"; "Creality ENDER-2" renamed_from = "Creality Ender-2"; "Creality ENDER-2"
[printer:Creality Ender-2 (0.5 mm nozzle)] [printer:Creality Ender-2 (0.5 mm nozzle)]
inherits = *ENDER2*; *0.5nozzle* inherits = *ENDER2*; *0.5nozzle*
@ -1595,7 +1670,7 @@ inherits = *ENDER2*; *0.6nozzle*
[printer:*ENDER2PRO*] [printer:*ENDER2PRO*]
inherits = *common*; *bowden* inherits = *common*; *bowdenshort*
bed_shape = 2.5x2.5,160x2.5,160x160,2.5x160 bed_shape = 2.5x2.5,160x2.5,160x160,2.5x160
max_print_height = 180 max_print_height = 180
printer_model = ENDER2PRO printer_model = ENDER2PRO
@ -1606,7 +1681,7 @@ inherits = *ENDER2PRO*; *0.3nozzle*
[printer:Creality Ender-2 Pro (0.4 mm nozzle)] [printer:Creality Ender-2 Pro (0.4 mm nozzle)]
inherits = *ENDER2PRO*; *0.4nozzle* inherits = *ENDER2PRO*; *0.4nozzle*
renamed_From = "Creality Ender-2 Pro"; "Creality ENDER-2 Pro" renamed_from = "Creality Ender-2 Pro"; "Creality ENDER-2 Pro"
[printer:Creality Ender-2 Pro (0.5 mm nozzle)] [printer:Creality Ender-2 Pro (0.5 mm nozzle)]
inherits = *ENDER2PRO*; *0.5nozzle* inherits = *ENDER2PRO*; *0.5nozzle*
@ -1628,7 +1703,7 @@ inherits = *CR5PRO*; *0.3nozzle*
[printer:Creality CR-5 Pro (0.4 mm nozzle)] [printer:Creality CR-5 Pro (0.4 mm nozzle)]
inherits = *CR5PRO*; *0.4nozzle* inherits = *CR5PRO*; *0.4nozzle*
renamed_From = "Creality CR-5 Pro" renamed_from = "Creality CR-5 Pro"
[printer:Creality CR-5 Pro (0.5 mm nozzle)] [printer:Creality CR-5 Pro (0.5 mm nozzle)]
inherits = *CR5PRO*; *0.5nozzle* inherits = *CR5PRO*; *0.5nozzle*
@ -1650,7 +1725,7 @@ inherits = *CR5PROH*; *0.3nozzle*
[printer:Creality CR-5 Pro H (0.4 mm nozzle)] [printer:Creality CR-5 Pro H (0.4 mm nozzle)]
inherits = *CR5PROH*; *0.4nozzle* inherits = *CR5PROH*; *0.4nozzle*
renamed_From = "Creality CR-5 Pro H" renamed_from = "Creality CR-5 Pro H"
[printer:Creality CR-5 Pro H (0.5 mm nozzle)] [printer:Creality CR-5 Pro H (0.5 mm nozzle)]
inherits = *CR5PROH*; *0.5nozzle* inherits = *CR5PROH*; *0.5nozzle*
@ -1671,7 +1746,7 @@ inherits = *CR6SE*; *0.3nozzle*
[printer:Creality CR-6 SE (0.4 mm nozzle)] [printer:Creality CR-6 SE (0.4 mm nozzle)]
inherits = *CR6SE*; *0.4nozzle* inherits = *CR6SE*; *0.4nozzle*
renamed_From = "Creality CR-6 SE" renamed_from = "Creality CR-6 SE"
[printer:Creality CR-6 SE (0.5 mm nozzle)] [printer:Creality CR-6 SE (0.5 mm nozzle)]
inherits = *CR6SE*; *0.5nozzle* inherits = *CR6SE*; *0.5nozzle*
@ -1693,7 +1768,7 @@ inherits = *CR6MAX*; *0.3nozzle*
[printer:Creality CR-6 Max (0.4 mm nozzle)] [printer:Creality CR-6 Max (0.4 mm nozzle)]
inherits = *CR6MAX*; *0.4nozzle* inherits = *CR6MAX*; *0.4nozzle*
renamed_From = "Creality CR-6 Max" renamed_from = "Creality CR-6 Max"
[printer:Creality CR-6 Max (0.5 mm nozzle)] [printer:Creality CR-6 Max (0.5 mm nozzle)]
inherits = *CR6MAX*; *0.5nozzle* inherits = *CR6MAX*; *0.5nozzle*
@ -1715,7 +1790,7 @@ inherits = *CR10SMART*; *0.3nozzle*
[printer:Creality CR-10 SMART (0.4 mm nozzle)] [printer:Creality CR-10 SMART (0.4 mm nozzle)]
inherits = *CR10SMART*; *0.4nozzle* inherits = *CR10SMART*; *0.4nozzle*
renamed_From = "Creality CR-10 SMART" renamed_from = "Creality CR-10 SMART"
[printer:Creality CR-10 SMART (0.5 mm nozzle)] [printer:Creality CR-10 SMART (0.5 mm nozzle)]
inherits = *CR10SMART*; *0.5nozzle* inherits = *CR10SMART*; *0.5nozzle*
@ -1758,7 +1833,7 @@ inherits = *CR10MINI*; *0.3nozzle*
[printer:Creality CR-10 Mini (0.4 mm nozzle)] [printer:Creality CR-10 Mini (0.4 mm nozzle)]
inherits = *CR10MINI*; *0.4nozzle* inherits = *CR10MINI*; *0.4nozzle*
renamed_From = "Creality CR-10 Mini" renamed_from = "Creality CR-10 Mini"
[printer:Creality CR-10 Mini (0.5 mm nozzle)] [printer:Creality CR-10 Mini (0.5 mm nozzle)]
inherits = *CR10MINI*; *0.5nozzle* inherits = *CR10MINI*; *0.5nozzle*
@ -1780,7 +1855,7 @@ inherits = *CR10MAX*; *0.3nozzle*
[printer:Creality CR-10 Max (0.4 mm nozzle)] [printer:Creality CR-10 Max (0.4 mm nozzle)]
inherits = *CR10MAX*; *0.4nozzle* inherits = *CR10MAX*; *0.4nozzle*
renamed_From = "Creality CR-10 Max" renamed_from = "Creality CR-10 Max"
[printer:Creality CR-10 Max (0.5 mm nozzle)] [printer:Creality CR-10 Max (0.5 mm nozzle)]
inherits = *CR10MAX*; *0.5nozzle* inherits = *CR10MAX*; *0.5nozzle*
@ -1802,7 +1877,7 @@ inherits = *CR10*; *0.3nozzle*
[printer:Creality CR-10 (0.4 mm nozzle)] [printer:Creality CR-10 (0.4 mm nozzle)]
inherits = *CR10*; *0.4nozzle* inherits = *CR10*; *0.4nozzle*
renamed_From = "Creality CR-10" renamed_from = "Creality CR-10"
[printer:Creality CR-10 (0.5 mm nozzle)] [printer:Creality CR-10 (0.5 mm nozzle)]
inherits = *CR10*; *0.5nozzle* inherits = *CR10*; *0.5nozzle*
@ -1824,7 +1899,7 @@ inherits = *CR10V2*; *0.3nozzle*
[printer:Creality CR-10 V2 (0.4 mm nozzle)] [printer:Creality CR-10 V2 (0.4 mm nozzle)]
inherits = *CR10V2*; *0.4nozzle* inherits = *CR10V2*; *0.4nozzle*
renamed_From = "Creality CR-10 V2" renamed_from = "Creality CR-10 V2"
[printer:Creality CR-10 V2 (0.5 mm nozzle)] [printer:Creality CR-10 V2 (0.5 mm nozzle)]
inherits = *CR10V2*; *0.5nozzle* inherits = *CR10V2*; *0.5nozzle*
@ -1846,7 +1921,7 @@ inherits = *CR10V3*; *0.3nozzle*
[printer:Creality CR-10 V3 (0.4 mm nozzle)] [printer:Creality CR-10 V3 (0.4 mm nozzle)]
inherits = *CR10V3*; *0.4nozzle* inherits = *CR10V3*; *0.4nozzle*
renamed_From = "Creality CR-10 V3" renamed_from = "Creality CR-10 V3"
[printer:Creality CR-10 V3 (0.5 mm nozzle)] [printer:Creality CR-10 V3 (0.5 mm nozzle)]
inherits = *CR10V3*; *0.5nozzle* inherits = *CR10V3*; *0.5nozzle*
@ -1868,7 +1943,7 @@ inherits = *CR10S*; *0.3nozzle*
[printer:Creality CR-10 S (0.4 mm nozzle)] [printer:Creality CR-10 S (0.4 mm nozzle)]
inherits = *CR10S*; *0.4nozzle* inherits = *CR10S*; *0.4nozzle*
renamed_From = "Creality CR-10 S" renamed_from = "Creality CR-10 S"
[printer:Creality CR-10 S (0.5 mm nozzle)] [printer:Creality CR-10 S (0.5 mm nozzle)]
inherits = *CR10S*; *0.5nozzle* inherits = *CR10S*; *0.5nozzle*
@ -1890,7 +1965,7 @@ inherits = *CR10SPRO*; *0.3nozzle*
[printer:Creality CR-10 S Pro (0.4 mm nozzle)] [printer:Creality CR-10 S Pro (0.4 mm nozzle)]
inherits = *CR10SPRO*; *0.4nozzle* inherits = *CR10SPRO*; *0.4nozzle*
renamed_From = "Creality CR-10 S Pro" renamed_from = "Creality CR-10 S Pro"
[printer:Creality CR-10 S Pro (0.5 mm nozzle)] [printer:Creality CR-10 S Pro (0.5 mm nozzle)]
inherits = *CR10SPRO*; *0.5nozzle* inherits = *CR10SPRO*; *0.5nozzle*
@ -1912,7 +1987,7 @@ inherits = *CR10SPROV2*; *0.3nozzle*
[printer:Creality CR-10 S Pro V2 (0.4 mm nozzle)] [printer:Creality CR-10 S Pro V2 (0.4 mm nozzle)]
inherits = *CR10SPROV2*; *0.4nozzle* inherits = *CR10SPROV2*; *0.4nozzle*
renamed_From = "Creality CR-10 S Pro V2" renamed_from = "Creality CR-10 S Pro V2"
[printer:Creality CR-10 S Pro V2 (0.5 mm nozzle)] [printer:Creality CR-10 S Pro V2 (0.5 mm nozzle)]
inherits = *CR10SPROV2*; *0.5nozzle* inherits = *CR10SPROV2*; *0.5nozzle*
@ -1923,7 +1998,7 @@ inherits = *CR10SPROV2*; *0.6nozzle*
[printer:*CR10S4*] [printer:*CR10S4*]
inherits = *common*; *bowdenlong* inherits = *common*; *bowdenlong*; *largebedinertia*
bed_shape = 5x5,395x5,395x395,5x395 bed_shape = 5x5,395x5,395x395,5x395
max_print_height = 400 max_print_height = 400
printer_model = CR10S4 printer_model = CR10S4
@ -1934,7 +2009,7 @@ inherits = *CR10S4*; *0.3nozzle*
[printer:Creality CR-10 S4 (0.4 mm nozzle)] [printer:Creality CR-10 S4 (0.4 mm nozzle)]
inherits = *CR10S4*; *0.4nozzle* inherits = *CR10S4*; *0.4nozzle*
renamed_From = "Creality CR-10 S4" renamed_from = "Creality CR-10 S4"
[printer:Creality CR-10 S4 (0.5 mm nozzle)] [printer:Creality CR-10 S4 (0.5 mm nozzle)]
inherits = *CR10S4*; *0.5nozzle* inherits = *CR10S4*; *0.5nozzle*
@ -1945,7 +2020,7 @@ inherits = *CR10S4*; *0.6nozzle*
[printer:*CR10S5*] [printer:*CR10S5*]
inherits = *common*; *bowdenlong* inherits = *common*; *bowdenlong*; *largebedinertia*
bed_shape = 5x5,505x5,505x505,5x505 bed_shape = 5x5,505x5,505x505,5x505
max_print_height = 500 max_print_height = 500
printer_model = CR10S5 printer_model = CR10S5
@ -1956,7 +2031,7 @@ inherits = *CR10S5*; *0.3nozzle*
[printer:Creality CR-10 S5 (0.4 mm nozzle)] [printer:Creality CR-10 S5 (0.4 mm nozzle)]
inherits = *CR10S5*; *0.4nozzle* inherits = *CR10S5*; *0.4nozzle*
renamed_From = "Creality CR-10 S5" renamed_from = "Creality CR-10 S5"
[printer:Creality CR-10 S5 (0.5 mm nozzle)] [printer:Creality CR-10 S5 (0.5 mm nozzle)]
inherits = *CR10S5*; *0.5nozzle* inherits = *CR10S5*; *0.5nozzle*
@ -1976,7 +2051,7 @@ inherits = *CR20*; *0.3nozzle*
[printer:Creality CR-20 (0.4 mm nozzle)] [printer:Creality CR-20 (0.4 mm nozzle)]
inherits = *CR20*; *0.4nozzle* inherits = *CR20*; *0.4nozzle*
renamed_From = "Creality CR-20" renamed_from = "Creality CR-20"
[printer:Creality CR-20 (0.5 mm nozzle)] [printer:Creality CR-20 (0.5 mm nozzle)]
inherits = *CR20*; *0.5nozzle* inherits = *CR20*; *0.5nozzle*
@ -1996,7 +2071,7 @@ inherits = *CR20PRO*; *0.3nozzle*
[printer:Creality CR-20 Pro (0.4 mm nozzle)] [printer:Creality CR-20 Pro (0.4 mm nozzle)]
inherits = *CR20PRO*; *0.4nozzle* inherits = *CR20PRO*; *0.4nozzle*
renamed_From = "Creality CR-20 Pro" renamed_from = "Creality CR-20 Pro"
[printer:Creality CR-20 Pro (0.5 mm nozzle)] [printer:Creality CR-20 Pro (0.5 mm nozzle)]
inherits = *CR20PRO*; *0.5nozzle* inherits = *CR20PRO*; *0.5nozzle*
@ -2018,7 +2093,7 @@ inherits = *CR200B*; *0.3nozzle*
[printer:Creality CR-200B (0.4 mm nozzle)] [printer:Creality CR-200B (0.4 mm nozzle)]
inherits = *CR200B*; *0.4nozzle* inherits = *CR200B*; *0.4nozzle*
renamed_From = "Creality CR-200B" renamed_from = "Creality CR-200B"
[printer:Creality CR-200B (0.5 mm nozzle)] [printer:Creality CR-200B (0.5 mm nozzle)]
inherits = *CR200B*; *0.5nozzle* inherits = *CR200B*; *0.5nozzle*
@ -2040,7 +2115,7 @@ inherits = *CR8*; *0.3nozzle*
[printer:Creality CR-8 (0.4 mm nozzle)] [printer:Creality CR-8 (0.4 mm nozzle)]
inherits = *CR8*; *0.4nozzle* inherits = *CR8*; *0.4nozzle*
renamed_From = "Creality CR-8" renamed_from = "Creality CR-8"
[printer:Creality CR-8 (0.5 mm nozzle)] [printer:Creality CR-8 (0.5 mm nozzle)]
inherits = *CR8*; *0.5nozzle* inherits = *CR8*; *0.5nozzle*
@ -2062,7 +2137,7 @@ inherits = *SERMOOND1*; *0.3nozzle*
[printer:Creality Sermoon-D1 (0.4 mm nozzle)] [printer:Creality Sermoon-D1 (0.4 mm nozzle)]
inherits = *SERMOOND1*; *0.4nozzle* inherits = *SERMOOND1*; *0.4nozzle*
renamed_From = "Creality Sermoon-D1" renamed_from = "Creality Sermoon-D1"
[printer:Creality Sermoon-D1 (0.5 mm nozzle)] [printer:Creality Sermoon-D1 (0.5 mm nozzle)]
inherits = *SERMOOND1*; *0.5nozzle* inherits = *SERMOOND1*; *0.5nozzle*

View File

@ -200,7 +200,9 @@ public:
template<class Unit = TCompute<P>> template<class Unit = TCompute<P>>
inline Unit area() const BP2D_NOEXCEPT { inline Unit area() const BP2D_NOEXCEPT {
return Unit(width())*height(); constexpr TCoord<P> Zero{0};
Unit s = width() < Zero || height() < Zero ? Unit(-1) : Unit(1);
return s * libnest2d::abs(Unit(width()) * height());
} }
static inline _Box infinite(const P &center = {TCoord<P>(0), TCoord<P>(0)}); static inline _Box infinite(const P &center = {TCoord<P>(0), TCoord<P>(0)});

View File

@ -509,28 +509,24 @@ public:
return diff; return diff;
} }
template<class Range = ConstItemRange<typename Base::DefaultIter>>
PackResult trypack(Item& item,
const Range& remaining = Range()) {
auto result = _trypack(item, remaining);
// Experimental
// if(!result) repack(item, result);
return result;
}
~_NofitPolyPlacer() { ~_NofitPolyPlacer() {
clearItems(); clearItems();
} }
inline void clearItems() { inline void clearItems() {
finalAlign(bin_); finalAlign(bin_);
merged_pile_ = {};
Base::clearItems(); Base::clearItems();
} }
void preload(const ItemGroup& packeditems) { void preload(const ItemGroup& packeditems) {
Base::preload(packeditems); Base::preload(packeditems);
for (const Item& itm : packeditems)
merged_pile_.emplace_back(itm.transformedShape());
nfp::merge(merged_pile_);
if (config_.on_preload) if (config_.on_preload)
config_.on_preload(packeditems, config_); config_.on_preload(packeditems, config_);
} }
@ -606,8 +602,9 @@ private:
using Edges = EdgeCache<RawShape>; using Edges = EdgeCache<RawShape>;
public:
template<class Range = ConstItemRange<typename Base::DefaultIter>> template<class Range = ConstItemRange<typename Base::DefaultIter>>
PackResult _trypack( PackResult trypack(
Item& item, Item& item,
const Range& remaining = Range()) { const Range& remaining = Range()) {
@ -897,6 +894,7 @@ private:
return ret; return ret;
} }
private:
inline void finalAlign(const RawShape& pbin) { inline void finalAlign(const RawShape& pbin) {
auto bbin = sl::boundingBox(pbin); auto bbin = sl::boundingBox(pbin);
finalAlign(bbin); finalAlign(bbin);

View File

@ -528,7 +528,13 @@ void _arrange(
} }
} }
if (sl::area(corrected_bin) > 0)
arranger(inp.begin(), inp.end()); arranger(inp.begin(), inp.end());
else {
for (Item &itm : inp)
itm.binId(BIN_ID_UNSET);
}
for (Item &itm : inp) itm.inflate(-infl); for (Item &itm : inp) itm.inflate(-infl);
} }

View File

@ -1,7 +1,7 @@
#include "SeamPlacer.hpp" #include "SeamPlacer.hpp"
#include "Point.hpp" #include "Color.hpp"
#include "libslic3r.h" #include "PrintConfig.hpp"
#include "tbb/parallel_for.h" #include "tbb/parallel_for.h"
#include "tbb/blocked_range.h" #include "tbb/blocked_range.h"
#include "tbb/parallel_reduce.h" #include "tbb/parallel_reduce.h"
@ -731,9 +731,8 @@ void gather_enforcers_blockers(GlobalModelInfo &result, const PrintObject *po) {
struct SeamComparator { struct SeamComparator {
SeamPosition setup; SeamPosition setup;
float angle_importance; float angle_importance;
Vec2f rear_attractor; explicit SeamComparator(SeamPosition setup) :
explicit SeamComparator(SeamPosition setup, const Vec2f& rear_attractor = Vec2f::Zero()) : setup(setup) {
setup(setup), rear_attractor(rear_attractor) {
angle_importance = angle_importance =
setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned; setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned;
} }
@ -764,9 +763,8 @@ struct SeamComparator {
return false; return false;
} }
if (setup == SeamPosition::spRear) { if (setup == SeamPosition::spRear && a.position.y() != b.position.y()) {
return (a.position.head<2>() - rear_attractor).squaredNorm() < return a.position.y() > b.position.y();
(b.position.head<2>() - rear_attractor).squaredNorm();
} }
float distance_penalty_a = 0.0f; float distance_penalty_a = 0.0f;
@ -828,8 +826,7 @@ struct SeamComparator {
} }
if (setup == SeamPosition::spRear) { if (setup == SeamPosition::spRear) {
return (a.position.head<2>() - rear_attractor).squaredNorm() - a.perimeter.flow_width < return a.position.y() + SeamPlacer::seam_align_score_tolerance * 5.0f > b.position.y();
(b.position.head<2>() - rear_attractor).squaredNorm();
} }
float penalty_a = a.overhang + a.visibility float penalty_a = a.overhang + a.visibility
@ -1382,15 +1379,19 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl::
observations[index] = current.position.head<2>(); observations[index] = current.position.head<2>();
observation_points[index] = current.position.z(); observation_points[index] = current.position.z();
weights[index] = angle_weight(current.local_ccw_angle); weights[index] = angle_weight(current.local_ccw_angle);
float sign = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f; float curling_influence = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f;
if (current.type == EnforcedBlockedSeamPoint::Enforced) { if (current.type == EnforcedBlockedSeamPoint::Enforced) {
sign = 1.0f; curling_influence = 1.0f;
weights[index] += 3.0f; weights[index] += 3.0f;
} }
total_length += sign * (last_point_pos - current.position).norm(); total_length += curling_influence * (last_point_pos - current.position).norm();
last_point_pos = current.position; last_point_pos = current.position;
} }
if (comparator.setup == spRear) {
total_length *= 0.3f;
}
// Curve Fitting // Curve Fitting
size_t number_of_segments = std::max(size_t(1), size_t number_of_segments = std::max(size_t(1),
size_t(std::max(0.0f,total_length) / SeamPlacer::seam_align_mm_per_segment)); size_t(std::max(0.0f,total_length) / SeamPlacer::seam_align_mm_per_segment));
@ -1457,9 +1458,7 @@ void SeamPlacer::init(const Print &print, std::function<void(void)> throw_if_can
for (const PrintObject *po : print.objects()) { for (const PrintObject *po : print.objects()) {
throw_if_canceled_func(); throw_if_canceled_func();
SeamPosition configured_seam_preference = po->config().seam_position.value; SeamPosition configured_seam_preference = po->config().seam_position.value;
Vec2f rear_attractor = unscaled(po->bounding_box().center()).cast<float>() + SeamComparator comparator { configured_seam_preference };
1.5f * Vec2f(0.0f, unscale<float>(po->bounding_box().max.y()));
SeamComparator comparator{configured_seam_preference, rear_attractor};
{ {
GlobalModelInfo global_model_info { }; GlobalModelInfo global_model_info { };

View File

@ -374,46 +374,17 @@ Transform3d scale_transform(const Vec3d& scale)
return transform; return transform;
} }
Vec3d extract_euler_angles(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>& rotation_matrix) Vec3d extract_rotation(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>& rotation_matrix)
{ {
// reference: http://eecs.qmul.ac.uk/~gslabaugh/publications/euler.pdf // The extracted "rotation" is a triplet of numbers such that Geometry::rotation_transform
Vec3d angles1 = Vec3d::Zero(); // returns the original transform. Because of the chosen order of rotations, the triplet
Vec3d angles2 = Vec3d::Zero(); // is not equivalent to Euler angles in the usual sense.
if (std::abs(std::abs(rotation_matrix(2, 0)) - 1.0) < 1e-5) { Vec3d angles = rotation_matrix.eulerAngles(2,1,0);
angles1.z() = 0.0; std::swap(angles(0), angles(2));
if (rotation_matrix(2, 0) < 0.0) { // == -1.0 return angles;
angles1.y() = 0.5 * double(PI);
angles1.x() = angles1.z() + ::atan2(rotation_matrix(0, 1), rotation_matrix(0, 2));
}
else { // == 1.0
angles1.y() = - 0.5 * double(PI);
angles1.x() = - angles1.y() + ::atan2(- rotation_matrix(0, 1), - rotation_matrix(0, 2));
}
angles2 = angles1;
}
else {
angles1.y() = -::asin(rotation_matrix(2, 0));
const double inv_cos1 = 1.0 / ::cos(angles1.y());
angles1.x() = ::atan2(rotation_matrix(2, 1) * inv_cos1, rotation_matrix(2, 2) * inv_cos1);
angles1.z() = ::atan2(rotation_matrix(1, 0) * inv_cos1, rotation_matrix(0, 0) * inv_cos1);
angles2.y() = double(PI) - angles1.y();
const double inv_cos2 = 1.0 / ::cos(angles2.y());
angles2.x() = ::atan2(rotation_matrix(2, 1) * inv_cos2, rotation_matrix(2, 2) * inv_cos2);
angles2.z() = ::atan2(rotation_matrix(1, 0) * inv_cos2, rotation_matrix(0, 0) * inv_cos2);
}
// The following euristic is the best found up to now (in the sense that it works fine with the greatest number of edge use-cases)
// but there are other use-cases were it does not
// We need to improve it
const double min_1 = angles1.cwiseAbs().minCoeff();
const double min_2 = angles2.cwiseAbs().minCoeff();
const bool use_1 = (min_1 < min_2) || (is_approx(min_1, min_2) && (angles1.norm() <= angles2.norm()));
return use_1 ? angles1 : angles2;
} }
Vec3d extract_euler_angles(const Transform3d& transform) Vec3d extract_rotation(const Transform3d& transform)
{ {
// use only the non-translational part of the transform // use only the non-translational part of the transform
Eigen::Matrix<double, 3, 3, Eigen::DontAlign> m = transform.matrix().block(0, 0, 3, 3); Eigen::Matrix<double, 3, 3, Eigen::DontAlign> m = transform.matrix().block(0, 0, 3, 3);
@ -421,7 +392,7 @@ Vec3d extract_euler_angles(const Transform3d& transform)
m.col(0).normalize(); m.col(0).normalize();
m.col(1).normalize(); m.col(1).normalize();
m.col(2).normalize(); m.col(2).normalize();
return extract_euler_angles(m); return extract_rotation(m);
} }
#if ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE
@ -430,7 +401,7 @@ Transform3d Transformation::get_offset_matrix() const
return assemble_transform(get_offset()); return assemble_transform(get_offset());
} }
static Transform3d extract_rotation(const Transform3d& trafo) static Transform3d extract_rotation_matrix(const Transform3d& trafo)
{ {
Matrix3d rotation; Matrix3d rotation;
Matrix3d scale; Matrix3d scale;
@ -464,12 +435,12 @@ static bool contains_skew(const Transform3d& trafo)
Vec3d Transformation::get_rotation() const Vec3d Transformation::get_rotation() const
{ {
return extract_euler_angles(extract_rotation(m_matrix)); return extract_rotation(extract_rotation_matrix(m_matrix));
} }
Transform3d Transformation::get_rotation_matrix() const Transform3d Transformation::get_rotation_matrix() const
{ {
return extract_rotation(m_matrix); return extract_rotation_matrix(m_matrix);
} }
#else #else
bool Transformation::Flags::needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const bool Transformation::Flags::needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const
@ -532,7 +503,7 @@ void Transformation::set_rotation(Axis axis, double rotation)
#if ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE
auto [curr_rotation, scale] = extract_rotation_scale(m_matrix); auto [curr_rotation, scale] = extract_rotation_scale(m_matrix);
Vec3d angles = extract_euler_angles(curr_rotation); Vec3d angles = extract_rotation(curr_rotation);
angles[axis] = rotation; angles[axis] = rotation;
const Vec3d offset = get_offset(); const Vec3d offset = get_offset();
@ -569,7 +540,7 @@ void Transformation::set_scaling_factor(const Vec3d& scaling_factor)
assert(scaling_factor.x() > 0.0 && scaling_factor.y() > 0.0 && scaling_factor.z() > 0.0); assert(scaling_factor.x() > 0.0 && scaling_factor.y() > 0.0 && scaling_factor.z() > 0.0);
const Vec3d offset = get_offset(); const Vec3d offset = get_offset();
m_matrix = extract_rotation(m_matrix) * scale_transform(scaling_factor); m_matrix = extract_rotation_matrix(m_matrix) * scale_transform(scaling_factor);
m_matrix.translation() = offset; m_matrix.translation() = offset;
#else #else
set_scaling_factor(X, scaling_factor.x()); set_scaling_factor(X, scaling_factor.x());
@ -704,7 +675,7 @@ void Transformation::set_from_transform(const Transform3d& transform)
m3x3.col(2).normalize(); m3x3.col(2).normalize();
// rotation // rotation
set_rotation(extract_euler_angles(m3x3)); set_rotation(extract_rotation(m3x3));
// forces matrix recalculation matrix // forces matrix recalculation matrix
m_matrix = get_matrix(); m_matrix = get_matrix();
@ -833,7 +804,7 @@ Transformation Transformation::volume_to_bed_transformation(const Transformation
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
scale(i) = pts.col(i).dot(qs.col(i)) / pts.col(i).dot(pts.col(i)); scale(i) = pts.col(i).dot(qs.col(i)) / pts.col(i).dot(pts.col(i));
out.set_rotation(Geometry::extract_euler_angles(volume_rotation_trafo)); out.set_rotation(Geometry::extract_rotation(volume_rotation_trafo));
out.set_scaling_factor(Vec3d(std::abs(scale.x()), std::abs(scale.y()), std::abs(scale.z()))); out.set_scaling_factor(Vec3d(std::abs(scale.x()), std::abs(scale.y()), std::abs(scale.z())));
out.set_mirror(Vec3d(scale.x() > 0 ? 1. : -1, scale.y() > 0 ? 1. : -1, scale.z() > 0 ? 1. : -1)); out.set_mirror(Vec3d(scale.x() > 0 ? 1. : -1, scale.y() > 0 ? 1. : -1, scale.z() > 0 ? 1. : -1));
} }

View File

@ -375,11 +375,11 @@ Transform3d scale_transform(const Vec3d& scale);
// Returns the euler angles extracted from the given rotation matrix // Returns the euler angles extracted from the given rotation matrix
// Warning -> The matrix should not contain any scale or shear !!! // Warning -> The matrix should not contain any scale or shear !!!
Vec3d extract_euler_angles(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>& rotation_matrix); Vec3d extract_rotation(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>& rotation_matrix);
// Returns the euler angles extracted from the given affine transform // Returns the euler angles extracted from the given affine transform
// Warning -> The transform should not contain any shear !!! // Warning -> The transform should not contain any shear !!!
Vec3d extract_euler_angles(const Transform3d& transform); Vec3d extract_rotation(const Transform3d& transform);
class Transformation class Transformation
{ {

View File

@ -24,6 +24,7 @@ Vec3d get_normal(const AABBMesh &mesh,
Vec3d p; Vec3d p;
mesh.squared_distance(picking_point, faceid, p); mesh.squared_distance(picking_point, faceid, p);
assert(int(faceid) < int(mesh.get_triangle_mesh()->indices.size()));
auto trindex = mesh.indices(faceid); auto trindex = mesh.indices(faceid);
@ -89,10 +90,11 @@ Vec3d get_normal(const AABBMesh &mesh,
} }
} else if (edge_idx >= 0) { // the point is on and edge } else if (edge_idx >= 0) { // the point is on and edge
size_t neighbor_face = mesh.face_neighbor_index()[faceid](edge_idx); size_t neighbor_face = mesh.face_neighbor_index()[faceid](edge_idx);
if (neighbor_face < mesh.indices().size()) {
neigh.emplace_back(mesh.normal_by_face_id(faceid)); neigh.emplace_back(mesh.normal_by_face_id(faceid));
neigh.emplace_back(mesh.normal_by_face_id(neighbor_face)); neigh.emplace_back(mesh.normal_by_face_id(neighbor_face));
} }
}
if (!neigh.empty()) { // there were neighbors to count with if (!neigh.empty()) { // there were neighbors to count with
// sum up the normals and then normalize the result again. // sum up the normals and then normalize the result again.

View File

@ -2311,7 +2311,7 @@ void ModelVolume::rotate(double angle, Axis axis)
void ModelVolume::rotate(double angle, const Vec3d& axis) void ModelVolume::rotate(double angle, const Vec3d& axis)
{ {
set_rotation(get_rotation() + Geometry::extract_euler_angles(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix())); set_rotation(get_rotation() + Geometry::extract_rotation(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix()));
} }
void ModelVolume::mirror(Axis axis) void ModelVolume::mirror(Axis axis)

View File

@ -517,6 +517,7 @@ bool optimize_pinhead_placement(Ex policy,
Head &head) Head &head)
{ {
Vec3d n = get_normal(m.emesh, head.pos); Vec3d n = get_normal(m.emesh, head.pos);
assert(std::abs(n.norm() - 1.0) < EPSILON);
// for all normals the spherical coordinates are generated and // for all normals the spherical coordinates are generated and
// the polar angle is saturated to 45 degrees from the bottom then // the polar angle is saturated to 45 degrees from the bottom then

View File

@ -1111,12 +1111,21 @@ void GLCanvas3D::load_arrange_settings()
std::string dist_fff_str = std::string dist_fff_str =
wxGetApp().app_config->get("arrange", "min_object_distance_fff"); wxGetApp().app_config->get("arrange", "min_object_distance_fff");
std::string dist_bed_fff_str =
wxGetApp().app_config->get("arrange", "min_bed_distance_fff");
std::string dist_fff_seq_print_str = std::string dist_fff_seq_print_str =
wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print"); wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print");
std::string dist_bed_fff_seq_print_str =
wxGetApp().app_config->get("arrange", "min_bed_distance_fff_seq_print");
std::string dist_sla_str = std::string dist_sla_str =
wxGetApp().app_config->get("arrange", "min_object_distance_sla"); wxGetApp().app_config->get("arrange", "min_object_distance_sla");
std::string dist_bed_sla_str =
wxGetApp().app_config->get("arrange", "min_bed_distance_sla");
std::string en_rot_fff_str = std::string en_rot_fff_str =
wxGetApp().app_config->get("arrange", "enable_rotation_fff"); wxGetApp().app_config->get("arrange", "enable_rotation_fff");
@ -1129,12 +1138,21 @@ void GLCanvas3D::load_arrange_settings()
if (!dist_fff_str.empty()) if (!dist_fff_str.empty())
m_arrange_settings_fff.distance = string_to_float_decimal_point(dist_fff_str); m_arrange_settings_fff.distance = string_to_float_decimal_point(dist_fff_str);
if (!dist_bed_fff_str.empty())
m_arrange_settings_fff.distance_from_bed = string_to_float_decimal_point(dist_bed_fff_str);
if (!dist_fff_seq_print_str.empty()) if (!dist_fff_seq_print_str.empty())
m_arrange_settings_fff_seq_print.distance = string_to_float_decimal_point(dist_fff_seq_print_str); m_arrange_settings_fff_seq_print.distance = string_to_float_decimal_point(dist_fff_seq_print_str);
if (!dist_bed_fff_seq_print_str.empty())
m_arrange_settings_fff_seq_print.distance_from_bed = string_to_float_decimal_point(dist_bed_fff_seq_print_str);
if (!dist_sla_str.empty()) if (!dist_sla_str.empty())
m_arrange_settings_sla.distance = string_to_float_decimal_point(dist_sla_str); m_arrange_settings_sla.distance = string_to_float_decimal_point(dist_sla_str);
if (!dist_bed_sla_str.empty())
m_arrange_settings_sla.distance_from_bed = string_to_float_decimal_point(dist_bed_sla_str);
if (!en_rot_fff_str.empty()) if (!en_rot_fff_str.empty())
m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes"); m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes");
@ -2394,10 +2412,25 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
const bool partlyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Partly_Outside); const bool partlyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Partly_Outside);
const bool fullyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Fully_Outside); const bool fullyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Fully_Outside);
if (printer_technology != ptSLA) {
_set_warning_notification(EWarning::ObjectClashed, partlyOut); _set_warning_notification(EWarning::ObjectClashed, partlyOut);
_set_warning_notification(EWarning::ObjectOutside, fullyOut); _set_warning_notification(EWarning::ObjectOutside, fullyOut);
if (printer_technology != ptSLA || !contained_min_one)
_set_warning_notification(EWarning::SlaSupportsOutside, false); _set_warning_notification(EWarning::SlaSupportsOutside, false);
}
else {
const auto [res, volume] = _is_any_volume_outside();
const bool is_support = volume != nullptr && volume->is_sla_support();
if (is_support) {
_set_warning_notification(EWarning::ObjectClashed, false);
_set_warning_notification(EWarning::ObjectOutside, false);
_set_warning_notification(EWarning::SlaSupportsOutside, partlyOut || fullyOut);
}
else {
_set_warning_notification(EWarning::ObjectClashed, partlyOut);
_set_warning_notification(EWarning::ObjectOutside, fullyOut);
_set_warning_notification(EWarning::SlaSupportsOutside, false);
}
}
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS,
contained_min_one && !m_model->objects.empty() && !partlyOut)); contained_min_one && !m_model->objects.empty() && !partlyOut));
@ -2504,6 +2537,7 @@ void GLCanvas3D::load_sla_preview()
reset_volumes(); reset_volumes();
_load_sla_shells(); _load_sla_shells();
_update_sla_shells_outside_state(); _update_sla_shells_outside_state();
_set_warning_notification_if_needed(EWarning::ObjectClashed);
_set_warning_notification_if_needed(EWarning::SlaSupportsOutside); _set_warning_notification_if_needed(EWarning::SlaSupportsOutside);
} }
} }
@ -4537,11 +4571,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
bool settings_changed = false; bool settings_changed = false;
float dist_min = 0.f; float dist_min = 0.f;
std::string dist_key = "min_object_distance", rot_key = "enable_rotation"; float dist_bed_min = 0.f;
std::string dist_key = "min_object_distance";
std::string dist_bed_key = "min_bed_distance";
std::string rot_key = "enable_rotation";
std::string postfix; std::string postfix;
if (ptech == ptSLA) { if (ptech == ptSLA) {
dist_min = 0.f;
postfix = "_sla"; postfix = "_sla";
} else if (ptech == ptFFF) { } else if (ptech == ptFFF) {
auto co_opt = m_config->option<ConfigOptionBool>("complete_objects"); auto co_opt = m_config->option<ConfigOptionBool>("complete_objects");
@ -4555,6 +4591,7 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
} }
dist_key += postfix; dist_key += postfix;
dist_bed_key += postfix;
rot_key += postfix; rot_key += postfix;
imgui->text(GUI::format_wxstr(_L("Press %1%left mouse button to enter the exact value"), shortkey_ctrl_prefix())); imgui->text(GUI::format_wxstr(_L("Press %1%left mouse button to enter the exact value"), shortkey_ctrl_prefix()));
@ -4566,6 +4603,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
settings_changed = true; settings_changed = true;
} }
if (imgui->slider_float(_L("Spacing from bed"), &settings.distance_from_bed, dist_bed_min, 100.0f, "%5.2f") || dist_bed_min > settings.distance_from_bed) {
settings.distance_from_bed = std::max(dist_bed_min, settings.distance_from_bed);
settings_out.distance_from_bed = settings.distance_from_bed;
appcfg->set("arrange", dist_bed_key.c_str(), float_to_string_decimal_point(settings_out.distance_from_bed));
settings_changed = true;
}
if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) { if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) {
settings_out.enable_rotation = settings.enable_rotation; settings_out.enable_rotation = settings.enable_rotation;
appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0");
@ -4578,6 +4622,7 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
settings_out = ArrangeSettings{}; settings_out = ArrangeSettings{};
settings_out.distance = std::max(dist_min, settings_out.distance); settings_out.distance = std::max(dist_min, settings_out.distance);
appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance)); appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance));
appcfg->set("arrange", dist_bed_key.c_str(), float_to_string_decimal_point(settings_out.distance_from_bed));
appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0");
settings_changed = true; settings_changed = true;
} }
@ -5838,7 +5883,7 @@ void GLCanvas3D::_render_background()
(current_printer_technology() != ptSLA || !m_volumes.empty()); (current_printer_technology() != ptSLA || !m_volumes.empty());
if (!m_volumes.empty()) if (!m_volumes.empty())
use_error_color &= _is_any_volume_outside(); use_error_color &= _is_any_volume_outside().first;
else else
use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed();
} }
@ -7633,8 +7678,19 @@ void GLCanvas3D::_set_warning_notification_if_needed(EWarning warning)
{ {
_set_current(); _set_current();
bool show = false; bool show = false;
if (!m_volumes.empty()) if (!m_volumes.empty()) {
show = _is_any_volume_outside(); if (current_printer_technology() == ptSLA) {
const auto [res, volume] = _is_any_volume_outside();
if (res) {
if (warning == EWarning::ObjectClashed)
show = !volume->is_sla_support();
else if (warning == EWarning::SlaSupportsOutside)
show = volume->is_sla_support();
}
}
else
show = _is_any_volume_outside().first;
}
else { else {
if (wxGetApp().is_editor()) { if (wxGetApp().is_editor()) {
if (current_printer_technology() != ptSLA) if (current_printer_technology() != ptSLA)
@ -7691,14 +7747,14 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
} }
} }
bool GLCanvas3D::_is_any_volume_outside() const std::pair<bool, const GLVolume*> GLCanvas3D::_is_any_volume_outside() const
{ {
for (const GLVolume* volume : m_volumes.volumes) { for (const GLVolume* volume : m_volumes.volumes) {
if (volume != nullptr && volume->is_outside) if (volume != nullptr && volume->is_outside)
return true; return std::make_pair(true, volume);
} }
return false; return std::make_pair(false, nullptr);
} }
void GLCanvas3D::_update_selection_from_hover() void GLCanvas3D::_update_selection_from_hover()

View File

@ -1075,7 +1075,7 @@ private:
// generates a warning notification containing the given message // generates a warning notification containing the given message
void _set_warning_notification(EWarning warning, bool state); void _set_warning_notification(EWarning warning, bool state);
bool _is_any_volume_outside() const; std::pair<bool, const GLVolume*> _is_any_volume_outside() const;
// updates the selection from the content of m_hover_volume_idxs // updates the selection from the content of m_hover_volume_idxs
void _update_selection_from_hover(); void _update_selection_from_hover();

View File

@ -946,7 +946,7 @@ void MenuFactory::create_object_menu()
[]() { return plater()->can_split(false); }, m_parent); []() { return plater()->can_split(false); }, m_parent);
append_submenu(&m_object_menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "", append_submenu(&m_object_menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "",
[]() { return plater()->can_split(true) && wxGetApp().get_mode() > comSimple; }, m_parent); []() { return plater()->can_split(true); }, m_parent);
m_object_menu.AppendSeparator(); m_object_menu.AppendSeparator();
// "Height range Modifier" and "Add (volumes)" menu items will be added later in append_menu_items_add_volume() // "Height range Modifier" and "Add (volumes)" menu items will be added later in append_menu_items_add_volume()

View File

@ -297,7 +297,7 @@ void GLGizmoScale3D::on_render()
#else #else
m_bounding_box = v.bounding_box(); m_bounding_box = v.bounding_box();
m_transform = v.world_matrix(); m_transform = v.world_matrix();
angles = Geometry::extract_euler_angles(m_transform); angles = Geometry::extract_rotation(m_transform);
// consider rotation+mirror only components of the transform for offsets // consider rotation+mirror only components of the transform for offsets
offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v.get_instance_mirror()); offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v.get_instance_mirror());
m_offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), v.get_volume_rotation(), Vec3d::Ones(), v.get_volume_mirror()); m_offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), v.get_volume_rotation(), Vec3d::Ones(), v.get_volume_mirror());

View File

@ -1,7 +1,6 @@
#include "ArrangeJob.hpp" #include "ArrangeJob.hpp"
#include "libslic3r/BuildVolume.hpp" #include "libslic3r/BuildVolume.hpp"
#include "libslic3r/MTUtils.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Plater.hpp"
@ -167,12 +166,16 @@ void ArrangeJob::process(Ctl &ctl)
static const auto arrangestr = _u8L("Arranging"); static const auto arrangestr = _u8L("Arranging");
ctl.update_status(0, arrangestr); ctl.update_status(0, arrangestr);
ctl.call_on_main_thread([this]{ prepare(); }).wait();;
arrangement::ArrangeParams params = get_arrange_params(m_plater); arrangement::ArrangeParams params;
Points bedpts;
ctl.call_on_main_thread([this, &params, &bedpts]{
prepare();
params = get_arrange_params(m_plater);
bedpts = get_bed_shape(*m_plater->config());
}).wait();
auto count = unsigned(m_selected.size() + m_unprintable.size()); auto count = unsigned(m_selected.size() + m_unprintable.size());
Points bedpts = get_bed_shape(*m_plater->config());
params.stopcondition = [&ctl]() { return ctl.was_canceled(); }; params.stopcondition = [&ctl]() { return ctl.was_canceled(); };
@ -239,7 +242,9 @@ void ArrangeJob::finalize(bool canceled, std::exception_ptr &eptr) {
// Move the unprintable items to the last virtual bed. // Move the unprintable items to the last virtual bed.
for (ArrangePolygon &ap : m_unprintable) { for (ArrangePolygon &ap : m_unprintable) {
if (ap.bed_idx >= 0)
ap.bed_idx += beds + 1; ap.bed_idx += beds + 1;
ap.apply(); ap.apply();
} }

View File

@ -117,6 +117,7 @@ void FillBedJob::process(Ctl &ctl)
arrangement::ArrangeParams params; arrangement::ArrangeParams params;
params.allow_rotations = settings.enable_rotation; params.allow_rotations = settings.enable_rotation;
params.min_obj_distance = scaled(settings.distance); params.min_obj_distance = scaled(settings.distance);
params.min_bed_distance = scaled(settings.distance_from_bed);
bool do_stop = false; bool do_stop = false;
params.stopcondition = [&ctl, &do_stop]() { params.stopcondition = [&ctl, &do_stop]() {

View File

@ -958,7 +958,7 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_
else { else {
// extracts rotations from the composed transformation // extracts rotations from the composed transformation
const Vec3d new_rotation = transformation_type.world() ? const Vec3d new_rotation = transformation_type.world() ?
Geometry::extract_euler_angles(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) : Geometry::extract_rotation(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) :
transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation(); transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation();
if (rot_axis_max == 2 && transformation_type.joint()) { if (rot_axis_max == 2 && transformation_type.joint()) {
// Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis. // Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis.
@ -979,7 +979,7 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_
v.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation() + rotation); v.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation() + rotation);
else { else {
const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation);
const Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); const Vec3d new_rotation = Geometry::extract_rotation(m * m_cache.volumes_data[i].get_volume_rotation_matrix());
v.set_volume_rotation(new_rotation); v.set_volume_rotation(new_rotation);
} }
} }
@ -989,7 +989,7 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_
else if (m_mode == Volume) { else if (m_mode == Volume) {
// extracts rotations from the composed transformation // extracts rotations from the composed transformation
const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation);
const Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); const Vec3d new_rotation = Geometry::extract_rotation(m * m_cache.volumes_data[i].get_volume_rotation_matrix());
if (transformation_type.joint()) { if (transformation_type.joint()) {
const Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; const Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center;
const Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); const Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot);
@ -1050,7 +1050,7 @@ void Selection::flattening_rotate(const Vec3d& normal)
voldata.get_instance_scaling_factor().cwiseInverse(), voldata.get_instance_mirror()) * normal).normalized(); voldata.get_instance_scaling_factor().cwiseInverse(), voldata.get_instance_mirror()) * normal).normalized();
// Additional rotation to align tnormal with the down vector in the world coordinate space. // Additional rotation to align tnormal with the down vector in the world coordinate space.
auto extra_rotation = Eigen::Quaterniond().setFromTwoVectors(tnormal, -Vec3d::UnitZ()); auto extra_rotation = Eigen::Quaterniond().setFromTwoVectors(tnormal, -Vec3d::UnitZ());
v.set_instance_rotation(Geometry::extract_euler_angles(extra_rotation.toRotationMatrix() * m_cache.volumes_data[i].get_instance_rotation_matrix())); v.set_instance_rotation(Geometry::extract_rotation(extra_rotation.toRotationMatrix() * m_cache.volumes_data[i].get_instance_rotation_matrix()));
#endif // ENABLE_WORLD_COORDINATE #endif // ENABLE_WORLD_COORDINATE
} }

View File

@ -919,7 +919,7 @@ void Tab::update_visibility()
page->update_visibility(m_mode, page.get() == m_active_page); page->update_visibility(m_mode, page.get() == m_active_page);
rebuild_page_tree(); rebuild_page_tree();
if (m_type == Preset::TYPE_SLA_PRINT || m_type == Preset::TYPE_PRINT) if (m_type != Preset::TYPE_PRINTER)
update_description_lines(); update_description_lines();
Layout(); Layout();

View File

@ -2010,18 +2010,21 @@ void DiffPresetDialog::update_compatibility(const std::string& preset_name, Pres
} }
} }
bool DiffPresetDialog::save() bool DiffPresetDialog::is_save_confirmed()
{ {
presets_to_save.clear(); presets_to_save.clear();
std::vector<Preset::Type> types_for_save; std::vector<Preset::Type> types_for_save;
for (const Preset::Type& type : m_pr_technology == ptFFF ? std::initializer_list<Preset::Type>{Preset::TYPE_PRINTER, Preset::TYPE_PRINT, Preset::TYPE_FILAMENT} : const auto list = m_pr_technology == ptFFF ? std::initializer_list<Preset::Type>{Preset::TYPE_PRINTER, Preset::TYPE_PRINT, Preset::TYPE_FILAMENT} :
std::initializer_list<Preset::Type>{Preset::TYPE_PRINTER, Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL }) std::initializer_list<Preset::Type>{ Preset::TYPE_PRINTER, Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL };
for (const Preset::Type& type : list) {
if (!m_tree->options(type, true).empty()) { if (!m_tree->options(type, true).empty()) {
types_for_save.emplace_back(type); types_for_save.emplace_back(type);
presets_to_save.emplace_back(PresetToSave{ type, get_left_preset_name(type), get_right_preset_name(type), get_right_preset_name(type) }); presets_to_save.emplace_back(PresetToSave{ type, get_left_preset_name(type), get_right_preset_name(type), get_right_preset_name(type) });
} }
}
if (!types_for_save.empty()) { if (!types_for_save.empty()) {
SavePresetDialog save_dlg(this, types_for_save, _u8L("Modified"), m_preset_bundle_right.get()); SavePresetDialog save_dlg(this, types_for_save, _u8L("Modified"), m_preset_bundle_right.get());
@ -2056,7 +2059,7 @@ std::vector<std::string> DiffPresetDialog::get_options_to_save(Preset::Type type
void DiffPresetDialog::button_event(Action act) void DiffPresetDialog::button_event(Action act)
{ {
if (act == Action::Save) { if (act == Action::Save) {
if (save()) { if (is_save_confirmed()) {
size_t saved_cnt = 0; size_t saved_cnt = 0;
for (const auto& preset : presets_to_save) for (const auto& preset : presets_to_save)
if (wxGetApp().preset_bundle->transfer_and_save(preset.type, preset.from_name, preset.to_name, preset.new_name, get_options_to_save(preset.type))) if (wxGetApp().preset_bundle->transfer_and_save(preset.type, preset.from_name, preset.to_name, preset.new_name, get_options_to_save(preset.type)))

View File

@ -379,7 +379,7 @@ class DiffPresetDialog : public DPIDialog
std::vector<std::string> get_options_to_save(Preset::Type type); std::vector<std::string> get_options_to_save(Preset::Type type);
void button_event(Action act); void button_event(Action act);
bool save(); bool is_save_confirmed();
struct DiffPresets struct DiffPresets
{ {

View File

@ -764,3 +764,27 @@ TEST_CASE("Convex polygon intersection test prusa polygons", "[Geometry][Rotcali
REQUIRE(res == ref); REQUIRE(res == ref);
} }
} }
TEST_CASE("Euler angles roundtrip", "[Geometry]") {
std::vector<Vec3d> euler_angles_vec = {{M_PI/2., -M_PI, 0.},
{M_PI, -M_PI, 0.},
{M_PI, -M_PI, 2*M_PI},
{0., 0., M_PI},
{M_PI, M_PI/2., 0.},
{0.2, 0.3, -0.5}};
// Also include all combinations of zero and +-pi/2:
for (double x : {0., M_PI/2., -M_PI/2.})
for (double y : {0., M_PI/2., -M_PI/2.})
for (double z : {0., M_PI/2., -M_PI/2.})
euler_angles_vec.emplace_back(x, y, z);
for (Vec3d& euler_angles : euler_angles_vec) {
Transform3d trafo1 = Geometry::rotation_transform(euler_angles);
euler_angles = Geometry::extract_rotation(trafo1);
Transform3d trafo2 = Geometry::rotation_transform(euler_angles);
REQUIRE(trafo1.isApprox(trafo2));
}
}