Merge remote-tracking branch 'PRIVATE/master' into ys_cut
This commit is contained in:
commit
b2d5fd72e9
@ -1,4 +1,5 @@
|
||||
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.0 Added alternative nozzle support
|
||||
0.1.5 Added Ender-3 S1 Pro
|
||||
|
@ -5,7 +5,7 @@
|
||||
name = Creality
|
||||
# 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 = 0.2.1
|
||||
config_version = 0.2.2
|
||||
# Where to get the updates from?
|
||||
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%
|
||||
@ -131,6 +131,15 @@ 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: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]
|
||||
name = Creality Ender-5 Plus
|
||||
variants = 0.4; 0.3; 0.5; 0.6
|
||||
@ -1085,10 +1094,21 @@ bed_temperature = 60
|
||||
first_layer_temperature = 205
|
||||
first_layer_bed_temperature = 60
|
||||
filament_cost = 26.99
|
||||
filament_density = 1.36
|
||||
filament_density = 1.37
|
||||
filament_colour = #FF4640
|
||||
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
|
||||
@ -1106,6 +1126,7 @@ remaining_times = 0
|
||||
machine_max_acceleration_e = 5000
|
||||
machine_max_acceleration_extruding = 500
|
||||
machine_max_acceleration_retracting = 1000
|
||||
machine_max_acceleration_travel = 500
|
||||
machine_max_acceleration_x = 500
|
||||
machine_max_acceleration_y = 500
|
||||
machine_max_acceleration_z = 100
|
||||
@ -1119,6 +1140,7 @@ machine_max_jerk_y = 8
|
||||
machine_max_jerk_z = 0.4
|
||||
machine_min_extruding_rate = 0
|
||||
machine_min_travel_rate = 0
|
||||
machine_limits_usage = emit_to_gcode
|
||||
layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z}
|
||||
max_print_height = 250
|
||||
printer_notes =
|
||||
@ -1144,7 +1166,11 @@ z_offset = 0
|
||||
printer_model =
|
||||
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
|
||||
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
|
||||
[printer:*straingauge*]
|
||||
@ -1158,6 +1184,10 @@ start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140
|
||||
[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
|
||||
|
||||
# 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
|
||||
[printer:*pauseprint*]
|
||||
pause_print_gcode = M25 ; pause print
|
||||
@ -1166,16 +1196,31 @@ pause_print_gcode = M25 ; pause print
|
||||
[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
|
||||
|
||||
# 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*]
|
||||
#max_volumetric_extrusion_rate_slope_negative = 7
|
||||
retract_length = 4
|
||||
|
||||
[printer:*bowdenshort*]
|
||||
#max_volumetric_extrusion_rate_slope_negative = 7
|
||||
retract_length = 4
|
||||
|
||||
[printer:*bowden*]
|
||||
#max_volumetric_extrusion_rate_slope_negative = 6
|
||||
retract_length = 5
|
||||
|
||||
[printer:*bowdenlong*]
|
||||
#max_volumetric_extrusion_rate_slope_negative = 5
|
||||
retract_length = 6
|
||||
|
||||
[printer:*bowdenallmetalhotend*]
|
||||
#max_volumetric_extrusion_rate_slope_negative = 6
|
||||
retract_length = 3
|
||||
|
||||
[printer:*directdriveextruder*]
|
||||
@ -1247,8 +1292,11 @@ inherits = *ENDER3*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3BLTOUCH*]
|
||||
inherits = *ENDER3*; *fastabl*
|
||||
inherits = *common*; *bowden*; *fastabl*
|
||||
bed_shape = 3x3,228x3,228x228,3x228
|
||||
max_print_height = 250
|
||||
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)]
|
||||
inherits = *ENDER3BLTOUCH*; *0.3nozzle*
|
||||
@ -1267,7 +1315,9 @@ inherits = *ENDER3BLTOUCH*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3PRO*]
|
||||
inherits = *ENDER3*; *pauseprint*
|
||||
inherits = *common*; *bowden*; *pauseprint*
|
||||
bed_shape = 3x3,228x3,228x228,3x228
|
||||
max_print_height = 250
|
||||
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
|
||||
|
||||
@ -1276,7 +1326,7 @@ inherits = *ENDER3PRO*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-3 Pro (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER3PRO*; *0.5nozzle*
|
||||
@ -1287,7 +1337,9 @@ inherits = *ENDER3PRO*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3NEO*]
|
||||
inherits = *ENDER3*; *fastabl*
|
||||
inherits = *common*; *bowden*; *fastabl*; *32bitmainboard*
|
||||
bed_shape = 3x3,228x3,228x228,3x228
|
||||
max_print_height = 250
|
||||
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
|
||||
|
||||
@ -1317,7 +1369,7 @@ inherits = *ENDER3V2*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-3 V2 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER3V2*; *0.5nozzle*
|
||||
@ -1328,7 +1380,7 @@ inherits = *ENDER3V2*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3V2NEO*]
|
||||
inherits = *common*; *bowden*; *fastabl*
|
||||
inherits = *common*; *bowden*; *fastabl*; *32bitmainboard*
|
||||
bed_shape = 5x0,215x0,215x220,5x220
|
||||
max_print_height = 250
|
||||
printer_model = ENDER3V2NEO
|
||||
@ -1349,7 +1401,7 @@ inherits = *ENDER3V2NEO*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3S1*]
|
||||
inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint*
|
||||
inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint*
|
||||
bed_shape = 5x0,215x0,215x220,5x220
|
||||
max_print_height = 270
|
||||
printer_model = ENDER3S1
|
||||
@ -1360,7 +1412,7 @@ inherits = *ENDER3S1*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-3 S1 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER3S1*; *0.5nozzle*
|
||||
@ -1371,7 +1423,7 @@ inherits = *ENDER3S1*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3S1PRO*]
|
||||
inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint*
|
||||
inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint*
|
||||
bed_shape = 5x0,215x0,215x220,5x220
|
||||
max_print_height = 270
|
||||
printer_model = ENDER3S1PRO
|
||||
@ -1382,7 +1434,7 @@ inherits = *ENDER3S1PRO*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-3 S1 Pro (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER3S1PRO*; *0.5nozzle*
|
||||
@ -1393,7 +1445,7 @@ inherits = *ENDER3S1PRO*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3S1PLUS*]
|
||||
inherits = *common*; *slowabl*; *spriteextruder*; *pauseprint*
|
||||
inherits = *common*; *storedabl*; *spriteextruder*; *pauseprint*
|
||||
bed_shape = 5x5,295x5,295x295,5x295
|
||||
max_print_height = 300
|
||||
printer_model = ENDER3S1PLUS
|
||||
@ -1425,7 +1477,7 @@ inherits = *ENDER3MAX*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-3 Max (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER3MAX*; *0.5nozzle*
|
||||
@ -1436,7 +1488,7 @@ inherits = *ENDER3MAX*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER3MAXNEO*]
|
||||
inherits = *common*; *bowdenlong*; *slowabl*
|
||||
inherits = *common*; *bowdenlong*; *slowabl*; *32bitmainboard*
|
||||
bed_shape = 5x5,295x5,295x295,5x295
|
||||
max_print_height = 320
|
||||
printer_model = ENDER3MAXNEO
|
||||
@ -1468,7 +1520,7 @@ inherits = *ENDER4*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-4 (0.4 mm nozzle)]
|
||||
inherits = *ENDER4*; *0.4nozzle*
|
||||
renamed_From = "Creality Ender-4"
|
||||
renamed_from = "Creality Ender-4"
|
||||
|
||||
[printer:Creality Ender-4 (0.5 mm nozzle)]
|
||||
inherits = *ENDER4*; *0.5nozzle*
|
||||
@ -1492,7 +1544,7 @@ inherits = *ENDER5*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-5 (0.4 mm nozzle)]
|
||||
inherits = *ENDER5*; *0.4nozzle*
|
||||
renamed_From = "Creality Ender-5"
|
||||
renamed_from = "Creality Ender-5"
|
||||
|
||||
[printer:Creality Ender-5 (0.5 mm nozzle)]
|
||||
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*]
|
||||
inherits = *common*; *bowdenlong*; *slowabl*; *descendingz*
|
||||
bed_shape = 5x5,355x5,355x355,5x355
|
||||
@ -1518,7 +1593,7 @@ inherits = *ENDER5PLUS*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-5 Plus (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER5PLUS*; *0.5nozzle*
|
||||
@ -1540,7 +1615,7 @@ inherits = *ENDER6*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-6 (0.4 mm nozzle)]
|
||||
inherits = *ENDER6*; *0.4nozzle*
|
||||
renamed_From = "Creality Ender-6"
|
||||
renamed_from = "Creality Ender-6"
|
||||
|
||||
[printer:Creality Ender-6 (0.5 mm nozzle)]
|
||||
inherits = *ENDER6*; *0.5nozzle*
|
||||
@ -1562,7 +1637,7 @@ inherits = *ENDER7*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-7 (0.4 mm nozzle)]
|
||||
inherits = *ENDER7*; *0.4nozzle*
|
||||
renamed_From = "Creality Ender-7"
|
||||
renamed_from = "Creality Ender-7"
|
||||
|
||||
[printer:Creality Ender-7 (0.5 mm nozzle)]
|
||||
inherits = *ENDER7*; *0.5nozzle*
|
||||
@ -1573,7 +1648,7 @@ inherits = *ENDER7*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER2*]
|
||||
inherits = *common*; *bowden*
|
||||
inherits = *common*; *bowdenshort*
|
||||
bed_shape = 0x0,150x0,150x150,0x150
|
||||
max_print_height = 200
|
||||
printer_model = ENDER2
|
||||
@ -1584,7 +1659,7 @@ inherits = *ENDER2*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-2 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER2*; *0.5nozzle*
|
||||
@ -1595,7 +1670,7 @@ inherits = *ENDER2*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*ENDER2PRO*]
|
||||
inherits = *common*; *bowden*
|
||||
inherits = *common*; *bowdenshort*
|
||||
bed_shape = 2.5x2.5,160x2.5,160x160,2.5x160
|
||||
max_print_height = 180
|
||||
printer_model = ENDER2PRO
|
||||
@ -1606,7 +1681,7 @@ inherits = *ENDER2PRO*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Ender-2 Pro (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *ENDER2PRO*; *0.5nozzle*
|
||||
@ -1628,7 +1703,7 @@ inherits = *CR5PRO*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-5 Pro (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR5PRO*; *0.5nozzle*
|
||||
@ -1650,7 +1725,7 @@ inherits = *CR5PROH*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-5 Pro H (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR5PROH*; *0.5nozzle*
|
||||
@ -1671,7 +1746,7 @@ inherits = *CR6SE*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-6 SE (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR6SE*; *0.5nozzle*
|
||||
@ -1693,7 +1768,7 @@ inherits = *CR6MAX*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-6 Max (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR6MAX*; *0.5nozzle*
|
||||
@ -1715,7 +1790,7 @@ inherits = *CR10SMART*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 SMART (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10SMART*; *0.5nozzle*
|
||||
@ -1758,7 +1833,7 @@ inherits = *CR10MINI*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 Mini (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10MINI*; *0.5nozzle*
|
||||
@ -1780,7 +1855,7 @@ inherits = *CR10MAX*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 Max (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10MAX*; *0.5nozzle*
|
||||
@ -1802,7 +1877,7 @@ inherits = *CR10*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 (0.4 mm nozzle)]
|
||||
inherits = *CR10*; *0.4nozzle*
|
||||
renamed_From = "Creality CR-10"
|
||||
renamed_from = "Creality CR-10"
|
||||
|
||||
[printer:Creality CR-10 (0.5 mm nozzle)]
|
||||
inherits = *CR10*; *0.5nozzle*
|
||||
@ -1824,7 +1899,7 @@ inherits = *CR10V2*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 V2 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10V2*; *0.5nozzle*
|
||||
@ -1846,7 +1921,7 @@ inherits = *CR10V3*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 V3 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10V3*; *0.5nozzle*
|
||||
@ -1868,7 +1943,7 @@ inherits = *CR10S*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 S (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10S*; *0.5nozzle*
|
||||
@ -1890,7 +1965,7 @@ inherits = *CR10SPRO*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 S Pro (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10SPRO*; *0.5nozzle*
|
||||
@ -1912,7 +1987,7 @@ inherits = *CR10SPROV2*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 S Pro V2 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10SPROV2*; *0.5nozzle*
|
||||
@ -1923,7 +1998,7 @@ inherits = *CR10SPROV2*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*CR10S4*]
|
||||
inherits = *common*; *bowdenlong*
|
||||
inherits = *common*; *bowdenlong*; *largebedinertia*
|
||||
bed_shape = 5x5,395x5,395x395,5x395
|
||||
max_print_height = 400
|
||||
printer_model = CR10S4
|
||||
@ -1934,7 +2009,7 @@ inherits = *CR10S4*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 S4 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10S4*; *0.5nozzle*
|
||||
@ -1945,7 +2020,7 @@ inherits = *CR10S4*; *0.6nozzle*
|
||||
|
||||
|
||||
[printer:*CR10S5*]
|
||||
inherits = *common*; *bowdenlong*
|
||||
inherits = *common*; *bowdenlong*; *largebedinertia*
|
||||
bed_shape = 5x5,505x5,505x505,5x505
|
||||
max_print_height = 500
|
||||
printer_model = CR10S5
|
||||
@ -1956,7 +2031,7 @@ inherits = *CR10S5*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-10 S5 (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR10S5*; *0.5nozzle*
|
||||
@ -1976,7 +2051,7 @@ inherits = *CR20*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-20 (0.4 mm nozzle)]
|
||||
inherits = *CR20*; *0.4nozzle*
|
||||
renamed_From = "Creality CR-20"
|
||||
renamed_from = "Creality CR-20"
|
||||
|
||||
[printer:Creality CR-20 (0.5 mm nozzle)]
|
||||
inherits = *CR20*; *0.5nozzle*
|
||||
@ -1996,7 +2071,7 @@ inherits = *CR20PRO*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-20 Pro (0.4 mm nozzle)]
|
||||
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)]
|
||||
inherits = *CR20PRO*; *0.5nozzle*
|
||||
@ -2018,7 +2093,7 @@ inherits = *CR200B*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-200B (0.4 mm nozzle)]
|
||||
inherits = *CR200B*; *0.4nozzle*
|
||||
renamed_From = "Creality CR-200B"
|
||||
renamed_from = "Creality CR-200B"
|
||||
|
||||
[printer:Creality CR-200B (0.5 mm nozzle)]
|
||||
inherits = *CR200B*; *0.5nozzle*
|
||||
@ -2040,7 +2115,7 @@ inherits = *CR8*; *0.3nozzle*
|
||||
|
||||
[printer:Creality CR-8 (0.4 mm nozzle)]
|
||||
inherits = *CR8*; *0.4nozzle*
|
||||
renamed_From = "Creality CR-8"
|
||||
renamed_from = "Creality CR-8"
|
||||
|
||||
[printer:Creality CR-8 (0.5 mm nozzle)]
|
||||
inherits = *CR8*; *0.5nozzle*
|
||||
@ -2062,7 +2137,7 @@ inherits = *SERMOOND1*; *0.3nozzle*
|
||||
|
||||
[printer:Creality Sermoon-D1 (0.4 mm nozzle)]
|
||||
inherits = *SERMOOND1*; *0.4nozzle*
|
||||
renamed_From = "Creality Sermoon-D1"
|
||||
renamed_from = "Creality Sermoon-D1"
|
||||
|
||||
[printer:Creality Sermoon-D1 (0.5 mm nozzle)]
|
||||
inherits = *SERMOOND1*; *0.5nozzle*
|
||||
|
@ -198,9 +198,11 @@ public:
|
||||
|
||||
inline P center() const BP2D_NOEXCEPT;
|
||||
|
||||
template<class Unit = TCompute<P>>
|
||||
template<class Unit = TCompute<P>>
|
||||
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 ¢er = {TCoord<P>(0), TCoord<P>(0)});
|
||||
|
@ -509,28 +509,24 @@ public:
|
||||
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() {
|
||||
clearItems();
|
||||
}
|
||||
|
||||
inline void clearItems() {
|
||||
finalAlign(bin_);
|
||||
merged_pile_ = {};
|
||||
Base::clearItems();
|
||||
}
|
||||
|
||||
void preload(const ItemGroup& packeditems) {
|
||||
Base::preload(packeditems);
|
||||
|
||||
for (const Item& itm : packeditems)
|
||||
merged_pile_.emplace_back(itm.transformedShape());
|
||||
|
||||
nfp::merge(merged_pile_);
|
||||
|
||||
if (config_.on_preload)
|
||||
config_.on_preload(packeditems, config_);
|
||||
}
|
||||
@ -606,8 +602,9 @@ private:
|
||||
|
||||
using Edges = EdgeCache<RawShape>;
|
||||
|
||||
public:
|
||||
template<class Range = ConstItemRange<typename Base::DefaultIter>>
|
||||
PackResult _trypack(
|
||||
PackResult trypack(
|
||||
Item& item,
|
||||
const Range& remaining = Range()) {
|
||||
|
||||
@ -897,6 +894,7 @@ private:
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
inline void finalAlign(const RawShape& pbin) {
|
||||
auto bbin = sl::boundingBox(pbin);
|
||||
finalAlign(bbin);
|
||||
|
@ -497,11 +497,11 @@ void _arrange(
|
||||
mod_params.min_obj_distance = 0;
|
||||
|
||||
AutoArranger<BinT> arranger{corrected_bin, mod_params, progressfn, stopfn};
|
||||
|
||||
|
||||
auto infl = coord_t(std::ceil(params.min_obj_distance / 2.0));
|
||||
for (Item& itm : shapes) itm.inflate(infl);
|
||||
for (Item& itm : excludes) itm.inflate(infl);
|
||||
|
||||
|
||||
remove_large_items(excludes, corrected_bin);
|
||||
|
||||
// If there is something on the plate
|
||||
@ -511,7 +511,7 @@ void _arrange(
|
||||
inp.reserve(shapes.size() + excludes.size());
|
||||
for (auto &itm : shapes ) inp.emplace_back(itm);
|
||||
for (auto &itm : excludes) inp.emplace_back(itm);
|
||||
|
||||
|
||||
// Use the minimum bounding box rotation as a starting point.
|
||||
// TODO: This only works for convex hull. If we ever switch to concave
|
||||
// polygon nesting, a convex hull needs to be calculated.
|
||||
@ -528,7 +528,13 @@ void _arrange(
|
||||
}
|
||||
}
|
||||
|
||||
arranger(inp.begin(), inp.end());
|
||||
if (sl::area(corrected_bin) > 0)
|
||||
arranger(inp.begin(), inp.end());
|
||||
else {
|
||||
for (Item &itm : inp)
|
||||
itm.binId(BIN_ID_UNSET);
|
||||
}
|
||||
|
||||
for (Item &itm : inp) itm.inflate(-infl);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include "SeamPlacer.hpp"
|
||||
|
||||
#include "Point.hpp"
|
||||
#include "libslic3r.h"
|
||||
#include "Color.hpp"
|
||||
#include "PrintConfig.hpp"
|
||||
#include "tbb/parallel_for.h"
|
||||
#include "tbb/blocked_range.h"
|
||||
#include "tbb/parallel_reduce.h"
|
||||
@ -731,9 +731,8 @@ void gather_enforcers_blockers(GlobalModelInfo &result, const PrintObject *po) {
|
||||
struct SeamComparator {
|
||||
SeamPosition setup;
|
||||
float angle_importance;
|
||||
Vec2f rear_attractor;
|
||||
explicit SeamComparator(SeamPosition setup, const Vec2f& rear_attractor = Vec2f::Zero()) :
|
||||
setup(setup), rear_attractor(rear_attractor) {
|
||||
explicit SeamComparator(SeamPosition setup) :
|
||||
setup(setup) {
|
||||
angle_importance =
|
||||
setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned;
|
||||
}
|
||||
@ -764,9 +763,8 @@ struct SeamComparator {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (setup == SeamPosition::spRear) {
|
||||
return (a.position.head<2>() - rear_attractor).squaredNorm() <
|
||||
(b.position.head<2>() - rear_attractor).squaredNorm();
|
||||
if (setup == SeamPosition::spRear && a.position.y() != b.position.y()) {
|
||||
return a.position.y() > b.position.y();
|
||||
}
|
||||
|
||||
float distance_penalty_a = 0.0f;
|
||||
@ -828,8 +826,7 @@ struct SeamComparator {
|
||||
}
|
||||
|
||||
if (setup == SeamPosition::spRear) {
|
||||
return (a.position.head<2>() - rear_attractor).squaredNorm() - a.perimeter.flow_width <
|
||||
(b.position.head<2>() - rear_attractor).squaredNorm();
|
||||
return a.position.y() + SeamPlacer::seam_align_score_tolerance * 5.0f > b.position.y();
|
||||
}
|
||||
|
||||
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>();
|
||||
observation_points[index] = current.position.z();
|
||||
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) {
|
||||
sign = 1.0f;
|
||||
curling_influence = 1.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;
|
||||
}
|
||||
|
||||
if (comparator.setup == spRear) {
|
||||
total_length *= 0.3f;
|
||||
}
|
||||
|
||||
// Curve Fitting
|
||||
size_t number_of_segments = std::max(size_t(1),
|
||||
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()) {
|
||||
throw_if_canceled_func();
|
||||
SeamPosition configured_seam_preference = po->config().seam_position.value;
|
||||
Vec2f rear_attractor = unscaled(po->bounding_box().center()).cast<float>() +
|
||||
1.5f * Vec2f(0.0f, unscale<float>(po->bounding_box().max.y()));
|
||||
SeamComparator comparator{configured_seam_preference, rear_attractor};
|
||||
SeamComparator comparator { configured_seam_preference };
|
||||
|
||||
{
|
||||
GlobalModelInfo global_model_info { };
|
||||
|
@ -374,46 +374,17 @@ Transform3d scale_transform(const Vec3d& scale)
|
||||
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
|
||||
Vec3d angles1 = Vec3d::Zero();
|
||||
Vec3d angles2 = Vec3d::Zero();
|
||||
if (std::abs(std::abs(rotation_matrix(2, 0)) - 1.0) < 1e-5) {
|
||||
angles1.z() = 0.0;
|
||||
if (rotation_matrix(2, 0) < 0.0) { // == -1.0
|
||||
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;
|
||||
// The extracted "rotation" is a triplet of numbers such that Geometry::rotation_transform
|
||||
// returns the original transform. Because of the chosen order of rotations, the triplet
|
||||
// is not equivalent to Euler angles in the usual sense.
|
||||
Vec3d angles = rotation_matrix.eulerAngles(2,1,0);
|
||||
std::swap(angles(0), angles(2));
|
||||
return angles;
|
||||
}
|
||||
|
||||
Vec3d extract_euler_angles(const Transform3d& transform)
|
||||
Vec3d extract_rotation(const Transform3d& 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);
|
||||
@ -421,7 +392,7 @@ Vec3d extract_euler_angles(const Transform3d& transform)
|
||||
m.col(0).normalize();
|
||||
m.col(1).normalize();
|
||||
m.col(2).normalize();
|
||||
return extract_euler_angles(m);
|
||||
return extract_rotation(m);
|
||||
}
|
||||
|
||||
#if ENABLE_WORLD_COORDINATE
|
||||
@ -430,7 +401,7 @@ Transform3d Transformation::get_offset_matrix() const
|
||||
return assemble_transform(get_offset());
|
||||
}
|
||||
|
||||
static Transform3d extract_rotation(const Transform3d& trafo)
|
||||
static Transform3d extract_rotation_matrix(const Transform3d& trafo)
|
||||
{
|
||||
Matrix3d rotation;
|
||||
Matrix3d scale;
|
||||
@ -464,12 +435,12 @@ static bool contains_skew(const Transform3d& trafo)
|
||||
|
||||
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
|
||||
{
|
||||
return extract_rotation(m_matrix);
|
||||
return extract_rotation_matrix(m_matrix);
|
||||
}
|
||||
#else
|
||||
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
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
#else
|
||||
set_scaling_factor(X, scaling_factor.x());
|
||||
@ -704,7 +675,7 @@ void Transformation::set_from_transform(const Transform3d& transform)
|
||||
m3x3.col(2).normalize();
|
||||
|
||||
// rotation
|
||||
set_rotation(extract_euler_angles(m3x3));
|
||||
set_rotation(extract_rotation(m3x3));
|
||||
|
||||
// forces matrix recalculation matrix
|
||||
m_matrix = get_matrix();
|
||||
@ -833,7 +804,7 @@ Transformation Transformation::volume_to_bed_transformation(const Transformation
|
||||
for (int i = 0; i < 3; ++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_mirror(Vec3d(scale.x() > 0 ? 1. : -1, scale.y() > 0 ? 1. : -1, scale.z() > 0 ? 1. : -1));
|
||||
}
|
||||
|
@ -375,11 +375,11 @@ Transform3d scale_transform(const Vec3d& scale);
|
||||
|
||||
// Returns the euler angles extracted from the given rotation matrix
|
||||
// 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
|
||||
// Warning -> The transform should not contain any shear !!!
|
||||
Vec3d extract_euler_angles(const Transform3d& transform);
|
||||
Vec3d extract_rotation(const Transform3d& transform);
|
||||
|
||||
class Transformation
|
||||
{
|
||||
|
@ -24,6 +24,7 @@ Vec3d get_normal(const AABBMesh &mesh,
|
||||
Vec3d p;
|
||||
|
||||
mesh.squared_distance(picking_point, faceid, p);
|
||||
assert(int(faceid) < int(mesh.get_triangle_mesh()->indices.size()));
|
||||
|
||||
auto trindex = mesh.indices(faceid);
|
||||
|
||||
@ -89,9 +90,10 @@ Vec3d get_normal(const AABBMesh &mesh,
|
||||
}
|
||||
} else if (edge_idx >= 0) { // the point is on and edge
|
||||
size_t neighbor_face = mesh.face_neighbor_index()[faceid](edge_idx);
|
||||
|
||||
neigh.emplace_back(mesh.normal_by_face_id(faceid));
|
||||
neigh.emplace_back(mesh.normal_by_face_id(neighbor_face));
|
||||
if (neighbor_face < mesh.indices().size()) {
|
||||
neigh.emplace_back(mesh.normal_by_face_id(faceid));
|
||||
neigh.emplace_back(mesh.normal_by_face_id(neighbor_face));
|
||||
}
|
||||
}
|
||||
|
||||
if (!neigh.empty()) { // there were neighbors to count with
|
||||
|
@ -2311,7 +2311,7 @@ void ModelVolume::rotate(double angle, Axis 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)
|
||||
|
@ -517,6 +517,7 @@ bool optimize_pinhead_placement(Ex policy,
|
||||
Head &head)
|
||||
{
|
||||
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
|
||||
// the polar angle is saturated to 45 degrees from the bottom then
|
||||
|
@ -1111,12 +1111,21 @@ void GLCanvas3D::load_arrange_settings()
|
||||
std::string dist_fff_str =
|
||||
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 =
|
||||
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 =
|
||||
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 =
|
||||
wxGetApp().app_config->get("arrange", "enable_rotation_fff");
|
||||
|
||||
@ -1129,12 +1138,21 @@ void GLCanvas3D::load_arrange_settings()
|
||||
if (!dist_fff_str.empty())
|
||||
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())
|
||||
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())
|
||||
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())
|
||||
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 fullyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Fully_Outside);
|
||||
|
||||
_set_warning_notification(EWarning::ObjectClashed, partlyOut);
|
||||
_set_warning_notification(EWarning::ObjectOutside, fullyOut);
|
||||
if (printer_technology != ptSLA || !contained_min_one)
|
||||
if (printer_technology != ptSLA) {
|
||||
_set_warning_notification(EWarning::ObjectClashed, partlyOut);
|
||||
_set_warning_notification(EWarning::ObjectOutside, fullyOut);
|
||||
_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,
|
||||
contained_min_one && !m_model->objects.empty() && !partlyOut));
|
||||
@ -2504,6 +2537,7 @@ void GLCanvas3D::load_sla_preview()
|
||||
reset_volumes();
|
||||
_load_sla_shells();
|
||||
_update_sla_shells_outside_state();
|
||||
_set_warning_notification_if_needed(EWarning::ObjectClashed);
|
||||
_set_warning_notification_if_needed(EWarning::SlaSupportsOutside);
|
||||
}
|
||||
}
|
||||
@ -4537,11 +4571,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
|
||||
|
||||
bool settings_changed = false;
|
||||
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;
|
||||
|
||||
if (ptech == ptSLA) {
|
||||
dist_min = 0.f;
|
||||
postfix = "_sla";
|
||||
} else if (ptech == ptFFF) {
|
||||
auto co_opt = m_config->option<ConfigOptionBool>("complete_objects");
|
||||
@ -4555,7 +4591,8 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
|
||||
}
|
||||
|
||||
dist_key += postfix;
|
||||
rot_key += postfix;
|
||||
dist_bed_key += postfix;
|
||||
rot_key += postfix;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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)) {
|
||||
settings_out.enable_rotation = settings.enable_rotation;
|
||||
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.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_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");
|
||||
settings_changed = true;
|
||||
}
|
||||
@ -5838,7 +5883,7 @@ void GLCanvas3D::_render_background()
|
||||
(current_printer_technology() != ptSLA || !m_volumes.empty());
|
||||
|
||||
if (!m_volumes.empty())
|
||||
use_error_color &= _is_any_volume_outside();
|
||||
use_error_color &= _is_any_volume_outside().first;
|
||||
else
|
||||
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();
|
||||
bool show = false;
|
||||
if (!m_volumes.empty())
|
||||
show = _is_any_volume_outside();
|
||||
if (!m_volumes.empty()) {
|
||||
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 {
|
||||
if (wxGetApp().is_editor()) {
|
||||
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) {
|
||||
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()
|
||||
|
@ -1075,7 +1075,7 @@ private:
|
||||
// generates a warning notification containing the given message
|
||||
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
|
||||
void _update_selection_from_hover();
|
||||
|
@ -946,7 +946,7 @@ void MenuFactory::create_object_menu()
|
||||
[]() { return plater()->can_split(false); }, m_parent);
|
||||
|
||||
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();
|
||||
|
||||
// "Height range Modifier" and "Add (volumes)" menu items will be added later in append_menu_items_add_volume()
|
||||
|
@ -297,7 +297,7 @@ void GLGizmoScale3D::on_render()
|
||||
#else
|
||||
m_bounding_box = v.bounding_box();
|
||||
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
|
||||
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());
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "ArrangeJob.hpp"
|
||||
|
||||
#include "libslic3r/BuildVolume.hpp"
|
||||
#include "libslic3r/MTUtils.hpp"
|
||||
#include "libslic3r/Model.hpp"
|
||||
|
||||
#include "slic3r/GUI/Plater.hpp"
|
||||
@ -167,12 +166,16 @@ void ArrangeJob::process(Ctl &ctl)
|
||||
static const auto arrangestr = _u8L("Arranging");
|
||||
|
||||
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, ¶ms, &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());
|
||||
Points bedpts = get_bed_shape(*m_plater->config());
|
||||
|
||||
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.
|
||||
for (ArrangePolygon &ap : m_unprintable) {
|
||||
ap.bed_idx += beds + 1;
|
||||
if (ap.bed_idx >= 0)
|
||||
ap.bed_idx += beds + 1;
|
||||
|
||||
ap.apply();
|
||||
}
|
||||
|
||||
|
@ -117,6 +117,7 @@ void FillBedJob::process(Ctl &ctl)
|
||||
arrangement::ArrangeParams params;
|
||||
params.allow_rotations = settings.enable_rotation;
|
||||
params.min_obj_distance = scaled(settings.distance);
|
||||
params.min_bed_distance = scaled(settings.distance_from_bed);
|
||||
|
||||
bool do_stop = false;
|
||||
params.stopcondition = [&ctl, &do_stop]() {
|
||||
|
@ -958,7 +958,7 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_
|
||||
else {
|
||||
// extracts rotations from the composed transformation
|
||||
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();
|
||||
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.
|
||||
@ -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);
|
||||
else {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -989,7 +989,7 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_
|
||||
else if (m_mode == Volume) {
|
||||
// extracts rotations from the composed transformation
|
||||
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()) {
|
||||
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);
|
||||
@ -1050,7 +1050,7 @@ void Selection::flattening_rotate(const Vec3d& normal)
|
||||
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.
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -919,7 +919,7 @@ void Tab::update_visibility()
|
||||
page->update_visibility(m_mode, page.get() == m_active_page);
|
||||
rebuild_page_tree();
|
||||
|
||||
if (m_type == Preset::TYPE_SLA_PRINT || m_type == Preset::TYPE_PRINT)
|
||||
if (m_type != Preset::TYPE_PRINTER)
|
||||
update_description_lines();
|
||||
|
||||
Layout();
|
||||
|
@ -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();
|
||||
|
||||
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} :
|
||||
std::initializer_list<Preset::Type>{Preset::TYPE_PRINTER, Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL })
|
||||
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 };
|
||||
|
||||
for (const Preset::Type& type : list) {
|
||||
if (!m_tree->options(type, true).empty()) {
|
||||
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) });
|
||||
}
|
||||
}
|
||||
|
||||
if (!types_for_save.empty()) {
|
||||
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)
|
||||
{
|
||||
if (act == Action::Save) {
|
||||
if (save()) {
|
||||
if (is_save_confirmed()) {
|
||||
size_t saved_cnt = 0;
|
||||
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)))
|
||||
|
@ -379,7 +379,7 @@ class DiffPresetDialog : public DPIDialog
|
||||
|
||||
std::vector<std::string> get_options_to_save(Preset::Type type);
|
||||
void button_event(Action act);
|
||||
bool save();
|
||||
bool is_save_confirmed();
|
||||
|
||||
struct DiffPresets
|
||||
{
|
||||
|
@ -764,3 +764,27 @@ TEST_CASE("Convex polygon intersection test prusa polygons", "[Geometry][Rotcali
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user