From 1ac3dfb0d3991a5d3c832290f268c03bb7b4b698 Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Wed, 10 Apr 2024 18:33:00 +0800 Subject: [PATCH 01/74] FIX: redo prepare_infill when change infill dir As title jira:NEW Signed-off-by: xun.zhang Change-Id: I1f59ea5ab44835ea14e690d836e76b5c1ef7340e --- src/libslic3r/PrintObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 56214eaa0e..aa99d3a0c8 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -831,6 +831,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "sparse_infill_filament" || opt_key == "solid_infill_filament" || opt_key == "sparse_infill_line_width" + || opt_key == "infill_direction" || opt_key == "ensure_vertical_shell_thickness" || opt_key == "bridge_angle" //BBS @@ -841,7 +842,6 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "bottom_surface_pattern" || opt_key == "internal_solid_infill_pattern" || opt_key == "external_fill_link_max_length" - || opt_key == "infill_direction" || opt_key == "sparse_infill_anchor" || opt_key == "sparse_infill_anchor_max" || opt_key == "top_surface_line_width" From ea212e50732b2910fb26d6c9e04f74f63d0b9194 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 10 Apr 2024 17:37:00 +0800 Subject: [PATCH 02/74] FIX: auto-arranging incorrect with rotation enabled auto-arranging incorrect with rotation enabled and the objects already have been rotated. jira: STUDIO-6022 Change-Id: I349d663efb1fc71367c8a77aa8ed5047a0bf2017 (cherry picked from commit 75fe40257a274ed83886e1ee20ce8dedd0de48f6) --- src/libslic3r/Arrange.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index 637b47837c..c8bf3c8dd5 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -988,7 +988,7 @@ void _arrange( // polygon nesting, a convex hull needs to be calculated. if (params.allow_rotations) { for (auto &itm : shapes) { - itm.rotation(min_area_boundingbox_rotation(itm.rawShape())); + itm.rotation(min_area_boundingbox_rotation(itm.transformedShape())); // If the item is too big, try to find a rotation that makes it fit if constexpr (std::is_same_v) { From 71c558a4e4a0e5c2bbfc6b90fe3e4c35978eed1e Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Wed, 10 Apr 2024 19:52:01 +0800 Subject: [PATCH 03/74] ENH: update X1C & X1E start gcode 1.Fix fan problem jira:NEW Signed-off-by: xun.zhang Change-Id: I68ee5be78e142e8a2a210a1a70f5663893390610 --- .../profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json | 2 +- .../profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json | 2 +- .../profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json | 2 +- .../profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json | 2 +- resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json | 2 +- resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json | 2 +- resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json | 2 +- resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json index 115fab918a..795cbb741f 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json @@ -31,5 +31,5 @@ "Bambu Lab X1E 0.2 nozzle", "Bambu Lab A1 0.2 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json index d64d979208..b56c45b13e 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json @@ -35,7 +35,7 @@ "Bambu Lab X1E 0.4 nozzle", "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4", + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4", "machine_end_gcode": ";===== date: 20240402 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM960 S5 P0 ; turn off logo lamp\n\n", "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nM620.11 S0\n{endif}\nM400\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM628 S1\nG92 E0\nG1 E{retraction_distances_when_cut[previous_extruder]} F[old_filament_e_feedrate]\nM400\nM629 S1\n{else}\nM620.11 S0\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json index 0ed084037f..b93fbd1013 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1E 0.6 nozzle", "Bambu Lab A1 0.6 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json index 46ab176b0d..468a7fcbb2 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1E 0.8 nozzle", "Bambu Lab A1 0.8 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json index 1799d2773a..fcb0cb21cf 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json @@ -31,5 +31,5 @@ "Bambu Lab X1 Carbon 0.2 nozzle", "Bambu Lab A1 0.2 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json index 99f878f4fc..83fd375a6e 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json @@ -37,7 +37,7 @@ "Bambu Lab X1 Carbon 0.4 nozzle", "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4\n\n", + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4\n\n", "machine_end_gcode": ";===== date: 20240402 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM141 S0 ; turn off chamber \nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM960 S5 P0 ; turn off logo lamp\n\n", "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E-[retraction_distance_when_cut] F200\nM400\n{endif}\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E{retraction_distance_when_cut - 2} F200\nG1 E2 F20\nM400\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json index 6e116866e5..920dad2ed4 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1 Carbon 0.6 nozzle", "Bambu Lab A1 0.6 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json index eea8eab1a0..a3e4c8089d 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1 Carbon 0.8 nozzle", "Bambu Lab A1 0.8 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file From 5bf5b632f3f1b47852a8ec22094af1e0032e60eb Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Wed, 10 Apr 2024 20:04:58 +0800 Subject: [PATCH 04/74] ENH: update A series gcode 1. Update A1 series start gcode and change filament gcode 2. Add G2814 command 3. Add multi-filament extrusion compensation and vibration suppression jira:NEW Signed-off-by: xun.zhang Change-Id: I57d2bc8e98d3e547881dc1369c1fb31413c6205d --- resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json | 4 ++-- .../profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json index 078e12ae45..eaec24c483 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json @@ -61,9 +61,9 @@ "255" ], "scan_first_layer": "0", - "machine_start_gcode": ";===== machine: A1 =========================\n;===== date: 20240311 =====================\nG392 S0\n;M400\n;M73 P1.717\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\n\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B10 L100 C37 D10 M60 E37 F10 N60\nM1006 A0 B10 L100 C41 D10 M60 E41 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A43 B10 L100 C46 D10 M70 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C43 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C41 D10 M80 E41 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E44 F10 N80\nM1006 A0 B10 L100 C49 D10 M80 E49 F10 N80\nM1006 A0 B10 L100 C0 D10 M80 E0 F10 N80\nM1006 A44 B10 L100 C48 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A43 B10 L100 C46 D10 M60 E39 F10 N80\nM1006 W\nM18 \n;=====start printer sound ===================\n\n;=====avoid end stop =================\nG91\nG380 S2 Z40 F1200\nG380 S3 Z-15 F1200\nG90\n\n;===== reset machine status =================\n;M290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.65 Y1.2 Z0.6 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;M211 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\n\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\nM1002 gcode_claim_action : 13\n\nG28 X\nG91\nG1 Z5 F1200\nG90\nG0 X128 F30000\nG0 Y254 F3000\nG91\nG1 Z-5 F1200\n\nM109 S25 H140\n\nM17 E0.3\nM83\nG1 E10 F1200\nG1 E-0.5 F30\nM17 D\n\nG28 Z P0 T140; home z with low precision,permit 300deg temperature\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\n\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n G90\n G1 Z5 F1200\nM623\n\n;M400\n;M73 P1.717\n\n;===== prepare print temperature and material ==========\nM1002 gcode_claim_action : 24\n\nM400\n;G392 S1\nM211 X0 Y0 Z0 ;turn off soft endstop\nM975 S1 ; turn on\n\nG90\nG1 X-28.5 F30000\nG1 X-48.2 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-48.2 F3000\n M400\n\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM621 S[initial_no_support_extruder]A\n\nM109 S{nozzle_temperature_range_high[initial_no_support_extruder]} H300\nG92 E0\nG1 E50 F200 ; lower extrusion speed to avoid clog\nM400\nM106 P1 S178\nG92 E0\nG1 E5 F200\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG92 E0\nG1 E-0.5 F300\n\nG1 X-28.5 F30000\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\n\n;G392 S0\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n;M400\n;M73 P1.717\n\n;===== auto extrude cali start =========================\nM975 S1\n;G392 S1\n\nG90\nM83\nT1000\nG1 X-48.2 Y0 Z10 F10000\nM400\nM1002 set_filament_type:UNKNOWN\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\n\nM622 J1\n M1002 gcode_claim_action : 8\n\n M109 S{nozzle_temperature[initial_extruder]}\n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-48.2 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;G392 S0\n;===== auto extrude cali end ========================\n\n;M400\n;M73 P1.717\n\nM104 S170 ; prepare to wipe nozzle\nM106 S255 ; turn on fan\n\n;===== mech mode fast check start =====================\nM1002 gcode_claim_action : 3\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q1 A5 K0 O3\nM974 Q1 S2 P0\n\nM970.2 Q1 K1 W58 Z0.11\nM974 S2\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q0 A10 K0 O1\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X0 Y5\nG28 X ; re-home XY\n\nG1 Z4 F1200\n\n;===== mech mode fast check end =======================\n\n;M400\n;M73 P1.717\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\n\nM975 S1\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\n;===== remove waste by touching start =====\n\nM104 S170 ; set temp down to heatbed acceptable\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nG0 X108 Y-0.5 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X110 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X112 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X114 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X116 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X118 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X120 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X122 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X124 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X126 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X128 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X130 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X132 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X134 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X136 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X138 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X140 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X142 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X144 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X146 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X148 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;===== remove waste by touching end =====\n\nG1 Z10 F1200\nG0 X118 Y261 F30000\nG1 Z5 F1200\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-50}\n\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S140 ; prepare to abl\nG0 Z5 F20000\n\nG0 X128 Y261 F20000 ; move to exposed steel surface\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z10 F1200\n\n;===== brush material wipe nozzle =====\n\nG90\nG1 Y250 F30000\nG1 X55\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X-35 F30000\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Z5.000 F1200\n\nG90\nG1 X30 Y250.000 F30000\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X35 F30000\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Z10.000 F1200\n\n;===== brush material wipe nozzle end =====\n\nG90\n;G0 X128 Y261 F20000 ; move to exposed steel surface\nG1 Y250 F30000\nG1 X138\nG1 Y261\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nM109 S140\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM211 R; pop softend status\n\n;===== wipe nozzle end ================================\n\n;M400\n;M73 P1.717\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\n\nG90\nG1 Z5 F1200\nG1 X0 Y0 F30000\nG29.2 S1 ; turn on ABL\n\nM190 S[bed_temperature_initial_layer_single]; ensure bed temp\nM109 S140\nM106 S0 ; turn off fan , too noisy\n\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n\n;===== home after wipe mouth end =======================\n\n;M400\n;M73 P1.717\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; prepare to print\n\n;===== nozzle load line ===============================\n;G90\n;M83\n;G1 Z5 F1200\n;G1 X88 Y-0.5 F20000\n;G1 Z0.3 F1200\n\n;M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n\n;G1 E2 F300\n;G1 X168 E4.989 F6000\n;G1 Z1 F1200\n;===== nozzle load line end ===========================\n\n;===== extrude cali test ===============================\n\nM400\n M900 S\n\n M900 C\n G90\n M83\n G1 X78.000 Y-0.500 F30000\n G1 Z0.300 F1200\n\n M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n G1 E3 F300\n\n G1 X83.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X88.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X93.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X98.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X103.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X108.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X113.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X118.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X123.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X128.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X133.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X138.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X143.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X148.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X153.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X158.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X163.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X168.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X173.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X178.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X179 Z0\n G1 X183\n G1 Z1\n M400\n\n M900 R\n G90\n M83\n G1 X78.000 Y1.000 F30000\n G1 Z0.300 F1200\n G1 E0.5 F300\n G1 X83.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X88.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X93.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X98.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X103.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X108.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X113.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X118.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X123.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X128.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X133.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X138.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X143.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X148.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X153.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X158.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X163.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X168.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X173.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X178.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X179 Z0\n G1 X183\n G1 Z1\n M400\n\nG1 Z0.2\n\n;M400\n;M73 P1.717\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\n;G392 S1 ; turn on clog detection\nM1007 S1 ; turn on mass estimation\nG29.4\n", + "machine_start_gcode": ";===== machine: A1 =========================\n;===== date: 20240410 =====================\nG392 S0\nM9833.2\n;M400\n;M73 P1.717\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\n\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B10 L100 C37 D10 M60 E37 F10 N60\nM1006 A0 B10 L100 C41 D10 M60 E41 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A43 B10 L100 C46 D10 M70 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C43 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C41 D10 M80 E41 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E44 F10 N80\nM1006 A0 B10 L100 C49 D10 M80 E49 F10 N80\nM1006 A0 B10 L100 C0 D10 M80 E0 F10 N80\nM1006 A44 B10 L100 C48 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A43 B10 L100 C46 D10 M60 E39 F10 N80\nM1006 W\nM18 \n;=====start printer sound ===================\n\n;=====avoid end stop =================\nG91\nG380 S2 Z40 F1200\nG380 S3 Z-15 F1200\nG90\n\n;===== reset machine status =================\n;M290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.65 Y1.2 Z0.6 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;M211 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\n\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\nM1002 gcode_claim_action : 13\n\nG28 X\nG91\nG1 Z5 F1200\nG90\nG0 X128 F30000\nG0 Y254 F3000\nG91\nG1 Z-5 F1200\n\nM109 S25 H140\n\nM17 E0.3\nM83\nG1 E10 F1200\nG1 E-0.5 F30\nM17 D\n\nG28 Z P0 T140; home z with low precision,permit 300deg temperature\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\n\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n G90\n G1 Z5 F1200\nM623\n\n;M400\n;M73 P1.717\n\n;===== prepare print temperature and material ==========\nM1002 gcode_claim_action : 24\n\nM400\n;G392 S1\nM211 X0 Y0 Z0 ;turn off soft endstop\nM975 S1 ; turn on\n\nG90\nG1 X-28.5 F30000\nG1 X-48.2 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-48.2 F3000\n M400\n\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM621 S[initial_no_support_extruder]A\n\nM109 S{nozzle_temperature_range_high[initial_no_support_extruder]} H300\nG92 E0\nG1 E50 F200 ; lower extrusion speed to avoid clog\nM400\nM106 P1 S178\nG92 E0\nG1 E5 F200\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG92 E0\nG1 E-0.5 F300\n\nG1 X-28.5 F30000\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\n\n;G392 S0\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n;M400\n;M73 P1.717\n\n;===== auto extrude cali start =========================\nM975 S1\n;G392 S1\n\nG90\nM83\nT1000\nG1 X-48.2 Y0 Z10 F10000\nM400\nM1002 set_filament_type:UNKNOWN\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\n\nM622 J1\n M1002 gcode_claim_action : 8\n\n M109 S{nozzle_temperature[initial_extruder]}\n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-48.2 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;G392 S0\n;===== auto extrude cali end ========================\n\n;M400\n;M73 P1.717\n\nM104 S170 ; prepare to wipe nozzle\nM106 S255 ; turn on fan\n\n;===== mech mode fast check start =====================\nM1002 gcode_claim_action : 3\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q1 A5 K0 O3\nM974 Q1 S2 P0\n\nM970.2 Q1 K1 W58 Z0.1\nM974 S2\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q0 A10 K0 O1\nM974 Q0 S2 P0\n\nM970.2 Q0 K1 W78 Z0.1\nM974 S2\n\nM975 S1\nG1 F30000\nG1 X0 Y5\nG28 X ; re-home XY\n\nG1 Z4 F1200\n\n;===== mech mode fast check end =======================\n\n;M400\n;M73 P1.717\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\n\nM975 S1\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\n;===== remove waste by touching start =====\n\nM104 S170 ; set temp down to heatbed acceptable\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nG0 X108 Y-0.5 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X110 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X112 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X114 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X116 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X118 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X120 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X122 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X124 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X126 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X128 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X130 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X132 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X134 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X136 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X138 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X140 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X142 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X144 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X146 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X148 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;===== remove waste by touching end =====\n\nG1 Z10 F1200\nG0 X118 Y261 F30000\nG1 Z5 F1200\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-50}\n\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S140 ; prepare to abl\nG0 Z5 F20000\n\nG0 X128 Y261 F20000 ; move to exposed steel surface\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z10 F1200\n\n;===== brush material wipe nozzle =====\n\nG90\nG1 Y250 F30000\nG1 X55\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X-35 F30000\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Z5.000 F1200\n\nG90\nG1 X30 Y250.000 F30000\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X35 F30000\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Z10.000 F1200\n\n;===== brush material wipe nozzle end =====\n\nG90\n;G0 X128 Y261 F20000 ; move to exposed steel surface\nG1 Y250 F30000\nG1 X138\nG1 Y261\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nM109 S140\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM211 R; pop softend status\n\n;===== wipe nozzle end ================================\n\n;M400\n;M73 P1.717\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\n\nG90\nG1 Z5 F1200\nG1 X0 Y0 F30000\nG29.2 S1 ; turn on ABL\n\nM190 S[bed_temperature_initial_layer_single]; ensure bed temp\nM109 S140\nM106 S0 ; turn off fan , too noisy\n\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A1 X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n\n;===== home after wipe mouth end =======================\n\n;M400\n;M73 P1.717\n\nG1 X108.000 Y-0.500 F30000\nG1 Z0.300 F1200\nM400\nG2814 Z0.32\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; prepare to print\n\n;===== nozzle load line ===============================\n;G90\n;M83\n;G1 Z5 F1200\n;G1 X88 Y-0.5 F20000\n;G1 Z0.3 F1200\n\n;M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n\n;G1 E2 F300\n;G1 X168 E4.989 F6000\n;G1 Z1 F1200\n;===== nozzle load line end ===========================\n\n;===== extrude cali test ===============================\n\nM400\n M900 S\n\n M900 C\n G90\n M83\n\n M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n G0 X128 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X133 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X138 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X143 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X148 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X153 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G91\n G1 X1 Z-0.300\n G1 X4\n G1 Z1 F1200\n G90\n M400\n\n M900 R\n G90\n G1 X108.000 Y1.000 F30000\n G91\n G1 Z-0.700 F1200\n G90\n M83\n G0 X128 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X133 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X138 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X143 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X148 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X153 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G91\n G1 X1 Z-0.300\n G1 X4\n G1 Z1 F1200\n G90\n M400\n\nG1 Z0.2\n\n;M400\n;M73 P1.717\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\n;G392 S1 ; turn on clog detection\nM1007 S1 ; turn on mass estimation\nG29.4\n", "machine_end_gcode": ";===== date: 20231229 =====================\nG392 S0 ;turn off nozzle clog detect\n\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\n{if !spiral_mode && print_sequence != \"by object\"}\nM1002 judge_flag timelapse_record_flag\nM622 J1\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM991 S0 P-1 ;end timelapse at safe pos\nM623\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X267 F15000\nT255\nG1 X-28.5 F18000\nG1 X-48.2 F3000\nG1 X-28.5 F18000\nG1 X-48.2 F3000\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 256}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z256 F600\n G1 Z256\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-48 Y180 F3600\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M40 E42 F20 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C46 D10 M80 E46 F10 N80\nM1006 A44 B20 L100 C39 D20 M60 E48 F20 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C39 D10 M60 E39 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C39 D10 M60 E39 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C48 D10 M60 E44 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A44 B20 L100 C49 D20 M80 E41 F20 N80\nM1006 A0 B20 L100 C0 D20 M60 E0 F20 N80\nM1006 A0 B20 L100 C37 D20 M30 E37 F20 N60\nM1006 W\n;=====printer finish sound=========\n\n;M17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM400\nM18 X Y Z\n\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", "time_lapse_gcode": ";===================== date: 20231215 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-48.2 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nM623\n\nM622.1 S1\nM1002 judge_flag g39_detection_flag\nM622 J1 \n ; enable nozzle clog detect at 3rd layer\n {if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X261 Y250 F20000\n M400 P200\n G39 S1\n G0 Z2 F4000\n {endif}\n\n {if !in_head_wrap_detect_zone}\n M622.1 S0\n M1002 judge_flag g39_mass_exceed_flag\n M622 J1\n {if layer_num > 2}\n G392 S0\n M400\n G90\n M83\n M204 S5000\n G0 Z{max_layer_z + 0.4} F4000\n G39.3 S1\n G0 Z{max_layer_z + 0.4} F4000\n G392 S0\n {endif}\n M623\n {endif}\nM623\n{endif}\n", - "change_filament_gcode": ";===== machine: A1 =========================\n;===== date: 20231225 =======================\nM1007 S0 ; turn off mass estimation\nG392 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X267 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y128 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E6 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S0\n\nM1007 S1\n" + "change_filament_gcode": ";===== machine: A1 =========================\n;===== date: 20240410 =======================\nM1007 S0 ; turn off mass estimation\nG392 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X267 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y128 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E6 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\n\nM622.1 S0\nM9833 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\nM1002 judge_flag filament_need_cali_flag\nM622 J1\n M106 P1 S178\n M400 S4\n G1 X-38.2 F18000\n G1 X-48.2 F3000\n G1 X-38.2 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-38.2 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0 \nM623\n\nM621 S[next_extruder]A\nG392 S0\n\nM1007 S1\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json index 8478b5c818..6124a937d0 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json @@ -67,9 +67,9 @@ "Bambu Lab X1E 0.4 nozzle", "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: A1 mini =========================\n;===== date: 20240204 =====================\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S170\nM140 S[bed_temperature_initial_layer_single]\nG392 S0 ;turn off clog detect\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B0 L100 C37 D10 M100 E37 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E43 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C49 D10 M100 E49 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C39 D10 M100 E48 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 W\nM18\n;=====avoid end stop =================\nG91\nG380 S2 Z30 F1200\nG380 S3 Z-20 F1200\nG1 Z5 F1200\nG90\n\n;===== reset machine status =================\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.7 Y0.9 Z0.5 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM83\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\n;===== prepare print temperature and material ==========\nM400\nM18\nM109 S100 H170\nM104 S170\nM400\nM17\nM400\nG28 X\n\nM211 X0 Y0 Z0 ;turn off soft endstop ; turn off soft endstop to prevent protential logic problem\n\nM975 S1 ; turn on\n\nG1 X0.0 F30000\nG1 X-13.5 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n G392 S0 ;turn on clog detect\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-13.5 F3000\n M400\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n M104 S{nozzle_temperature_range_high[initial_no_support_extruder]}\n G92 E0\n G1 E50 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M400\n M106 P1 S178\n G92 E0\n G1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G92 E0\n G1 E-0.5 F300\n\n G1 X0 F30000\n G1 X-13.5 F3000\n G1 X0 F30000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X0 F30000\n G1 X-13.5 F3000\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G392 S0 ;turn off clog detect\nM621 S[initial_no_support_extruder]A\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== mech mode fast check============================\nM1002 gcode_claim_action : 3\nG0 X25 Y175 F20000 ; find a soft place to home\n;M104 S0\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S170\n\n; build plate detect\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n M400\nM623\n\nG1 Z5 F3000\nG1 X90 Y-1 F30000\nM400 P200\nM970.3 Q1 A7 K0 O2\nM974 Q1 S2 P0\n\nG1 X90 Y0 Z5 F30000\nM400 P200\nM970 Q0 A10 B50 C90 H15 K0 M20 O3\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X-1 Y10\nG28 X ; re-home XY\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\n\nM104 S170 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nM104 S140\nG0 X90 Y-4 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X91 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X92 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X93 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X94 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X95 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X96 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X97 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X98 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5 F3000\nG0 X50 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG0 X85 Y185 F10000 ;move to exposed steel surface and stop the nozzle\nG0 Z-1.01 F10000\nG91\n\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z5 F30000\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5\nG0 X55 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG1 Z10\nG1 X85 Y185\nG1 Z-1.01\nG1 X95\nG1 X90\n\nM211 R; pop softend status\n\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== wait heatbed ====================\nM1002 gcode_claim_action : 2\nM104 S0\nM190 S[bed_temperature_initial_layer_single];set bed temp\nM109 S140\n\nG1 Z5 F3000\nG29.2 S1\nG1 X10 Y10 F20000\n\n;===== bed leveling ==================================\n;M1002 set_flag g29_before_print_flag=1\nM1002 judge_flag g29_before_print_flag\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28 T145\n\nM623\n\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\n\nG1 X-13.5 Y0 Z10 F10000\nG1 E1.2 F500\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{nozzle_temperature[initial_extruder]}\nM400\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\n\nG392 S0 ;turn on clog detect\n\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\nM622 J1\n M1002 gcode_claim_action : 8\n \n M400\n M900 K0.0 L1000.0 M1.0\n G90\n M83\n G0 X68 Y-4 F30000\n G0 Z0.2 F18000 ;Move to start position\n M400\n G0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 Y0 Z0 F20000\n M400\n \n G1 X-13.5 Y0 Z10 F10000\n M400\n \n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-13.5 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;===== extrude cali test ===============================\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\nG90\nM83\nG0 X68 Y-2.5 F30000\nG0 Z0.2 F18000 ;Move to start position\nG0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X115 Z0 F20000\nG0 Z5\nM400\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\n\nM400 ; wait all motion done before implement the emprical L parameters\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\nM1007 S1\n\n\n\n", + "machine_start_gcode": ";===== machine: A1 mini =========================\n;===== date: 20240410 =====================\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S170\nM140 S[bed_temperature_initial_layer_single]\nG392 S0 ;turn off clog detect\nM9833.2\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B0 L100 C37 D10 M100 E37 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E43 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C49 D10 M100 E49 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C39 D10 M100 E48 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 W\nM18\n;=====avoid end stop =================\nG91\nG380 S2 Z30 F1200\nG380 S3 Z-20 F1200\nG1 Z5 F1200\nG90\n\n;===== reset machine status =================\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.7 Y0.9 Z0.5 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM83\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\n;===== prepare print temperature and material ==========\nM400\nM18\nM109 S100 H170\nM104 S170\nM400\nM17\nM400\nG28 X\n\nM211 X0 Y0 Z0 ;turn off soft endstop ; turn off soft endstop to prevent protential logic problem\n\nM975 S1 ; turn on\n\nG1 X0.0 F30000\nG1 X-13.5 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n G392 S0 ;turn on clog detect\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-13.5 F3000\n M400\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n M104 S{nozzle_temperature_range_high[initial_no_support_extruder]}\n G92 E0\n G1 E50 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M400\n M106 P1 S178\n G92 E0\n G1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G92 E0\n G1 E-0.5 F300\n\n G1 X0 F30000\n G1 X-13.5 F3000\n G1 X0 F30000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X0 F30000\n G1 X-13.5 F3000\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G392 S0 ;turn off clog detect\nM621 S[initial_no_support_extruder]A\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== mech mode fast check============================\nM1002 gcode_claim_action : 3\nG0 X25 Y175 F20000 ; find a soft place to home\n;M104 S0\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S170\n\n; build plate detect\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n M400\nM623\n\nG1 Z5 F3000\nG1 X90 Y-1 F30000\nM400 P200\nM970.3 Q1 A7 K0 O2\nM974 Q1 S2 P0\n\nG1 X90 Y0 Z5 F30000\nM400 P200\nM970 Q0 A10 B50 C90 H15 K0 M20 O3\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X-1 Y10\nG28 X ; re-home XY\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\n\nM104 S170 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nM104 S140\nG0 X90 Y-4 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X91 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X92 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X93 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X94 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X95 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X96 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X97 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X98 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5 F3000\nG0 X50 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG0 X85 Y185 F10000 ;move to exposed steel surface and stop the nozzle\nG0 Z-1.01 F10000\nG91\n\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z5 F30000\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5\nG0 X55 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG1 Z10\nG1 X85 Y185\nG1 Z-1.01\nG1 X95\nG1 X90\n\nM211 R; pop softend status\n\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== wait heatbed ====================\nM1002 gcode_claim_action : 2\nM104 S0\nM190 S[bed_temperature_initial_layer_single];set bed temp\nM109 S140\n\nG1 Z5 F3000\nG29.2 S1\nG1 X10 Y10 F20000\n\n;===== bed leveling ==================================\n;M1002 set_flag g29_before_print_flag=1\nM1002 judge_flag g29_before_print_flag\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A1 X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28 T145\n\nM623\n\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\n\nG1 X-13.5 Y0 Z10 F10000\nG1 E1.2 F500\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{nozzle_temperature[initial_extruder]}\nM400\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\n\nG392 S0 ;turn on clog detect\n\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\nM622 J1\n M1002 gcode_claim_action : 8\n \n M400\n M900 K0.0 L1000.0 M1.0\n G90\n M83\n G0 X68 Y-4 F30000\n G0 Z0.3 F18000 ;Move to start position\n M400\n G0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 Y0 Z0 F20000\n M400\n \n G1 X-13.5 Y0 Z10 F10000\n M400\n \n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-13.5 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;===== extrude cali test ===============================\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\nG90\nM83\nG0 X68 Y-2.5 F30000\nG0 Z0.3 F18000 ;Move to start position\nG0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X115 Z0 F20000\nG0 Z5\nM400\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\n\nM400 ; wait all motion done before implement the emprical L parameters\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\nM1007 S1\n\n\n\n", "machine_end_gcode": ";===== date: 20231229 =====================\n;turn off nozzle clog detect\nG392 S0\n\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\n{if !spiral_mode && print_sequence != \"by object\"}\nM1002 judge_flag timelapse_record_flag\nM622 J1\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM991 S0 P-1 ;end timelapse at safe pos\nM623\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X181 F12000\nT255\nG1 X0 F18000\nG1 X-13.0 F3000\nG1 X0 F18000 ; wipe\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 180}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z180 F600\n G1 Z180\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-13 Y180 F3600\n\nG91\nG1 Z-1 F600\nG90\nM83\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M100 E42 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C46 D10 M100 E46 F10 N100\nM1006 A44 B20 L100 C39 D20 M100 E48 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C0 D10 M100 E48 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B20 L100 C41 D20 M100 E49 F20 N100\nM1006 A0 B20 L100 C0 D20 M100 E0 F20 N100\nM1006 A0 B20 L100 C37 D20 M100 E37 F20 N100\nM1006 W\n;=====printer finish sound=========\nM400 S1\nM18 X Y Z\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change\n", "time_lapse_gcode": ";===================== date: 202312028 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nM623\n\nM622.1 S1\nM1002 judge_flag g39_detection_flag\nM622 J1\n ; enable nozzle clog detect at 3rd layer\n {if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X-6 Y170 F20000\n G39 S1 X-6 Y170\n G0 Z2 F4000\n G0 X90 Y90 F30000\n {endif}\n\n\n {if !in_head_wrap_detect_zone}\n M622.1 S0\n M1002 judge_flag g39_mass_exceed_flag\n M622 J1\n {if layer_num > 2}\n G392 S0\n M400\n G90\n M83\n M204 S5000\n G0 Z{max_layer_z + 0.4} F4000\n G39.3 S1\n G0 Z{max_layer_z + 0.4} F4000\n G392 S0\n {endif}\n M623\n {endif}\nM623\n{endif}\n", - "change_filament_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231225 =======================\nG392 S0\nM1007 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X180 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y90 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E5 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S0\nM1007 S1\n" + "change_filament_gcode": ";===== machine: A1 mini =========================\n;===== date: 20240410 =======================\nG392 S0\nM1007 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X180 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y90 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E5 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n\nM622.1 S0\nM9833 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\nM1002 judge_flag filament_need_cali_flag\nM622 J1\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0 \nM623\n\nG392 S0\nM1007 S1\n\n" } \ No newline at end of file From 7e881fd67c446957cbad8eb94d6de121f83f3fe9 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Thu, 11 Apr 2024 17:57:43 +0800 Subject: [PATCH 05/74] FIX: active_inst is -1 cause crashed by "return" button jira: none Change-Id: I3ce1725b671c3dc5e7321385010b219b3af99e6f --- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index 13d1cff545..56d2511706 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -468,8 +468,10 @@ void ObjectClipper::set_position(double pos, bool keep_normal) const ModelObject *mo = get_pool()->selection_info()->model_object(); int active_inst = get_pool()->selection_info()->get_active_instance(); double z_shift = get_pool()->selection_info()->get_sla_shift(); - - Vec3d normal = (keep_normal && m_clp) ? m_clp->get_normal() : -wxGetApp().plater()->get_camera().get_dir_forward(); + if (active_inst < 0) { + return; + } + Vec3d normal = (keep_normal && m_clp) ? m_clp->get_normal() : -wxGetApp().plater()->get_camera().get_dir_forward(); Vec3d center; if (get_pool()->get_canvas()->get_canvas_type() == GLCanvas3D::CanvasAssembleView) { const SelectionInfo *sel_info = get_pool()->selection_info(); From f2b03e30cca26ec85ffd4eab1ce56cdf37a45827 Mon Sep 17 00:00:00 2001 From: "zorro.zhang" Date: Thu, 11 Apr 2024 12:23:14 +0800 Subject: [PATCH 06/74] FIX: Error msg when click makerlab JIRA: STUDIO-6784 Change-Id: I0ace74fd0a84232972b18d09dfc7110516dd4569 --- resources/web/homepage3/css/home.css | 11 +++++++++++ resources/web/homepage3/home.html | 12 ++++++------ resources/web/homepage3/js/home.js | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/resources/web/homepage3/css/home.css b/resources/web/homepage3/css/home.css index fb6d588f69..0c1dc25983 100644 --- a/resources/web/homepage3/css/home.css +++ b/resources/web/homepage3/css/home.css @@ -24,6 +24,17 @@ body } +.MakerlabItem +{ + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + word-break: break-all; + position: relative; + cursor: pointer; + border-radius: 8px; +} + .MakerlabImg img { width: 100%; diff --git a/resources/web/homepage3/home.html b/resources/web/homepage3/home.html index 485229280d..b7ef1317da 100644 --- a/resources/web/homepage3/home.html +++ b/resources/web/homepage3/home.html @@ -256,7 +256,7 @@
MORE >
-I9$_~dSxLs7kY#3^&jPn1UN`)zn(rRs#ilR7wh+1m zbhS8o{m;QFL$`t$HAXNAhO~qP|BXI_1Rv-(@kv6#OX(#uvC3C={<#1hxVXRYb{ zvE50`s`&Rr{#3#3`g3)mqQ?mT+d8w21FXPJjB8@Bhd_P=ip%z%h4szpC5%Lzz1R<> z=fW;@i%%gb$*}?9GIp;ide3nJlt+-oj3Zd(6OAL`1QN&M4DS*&GC|zTvteI_aVz>* z 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 U=J2+`7u?!Sw;d`H`1g(f17-q86aWAK delta 54947 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

WxkQbxgjkcif`vLWsx{OM~q#Sixg2JeJJ?AH= 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 diff --git a/resources/i18n/zh_cn/BambuStudio.mo b/resources/i18n/zh_cn/BambuStudio.mo index 7b6d82d4b729edf0053c46c4c7f099472fa69c2f..f16230b97c6e5d654294e00e3f32c14fc107c111 100644 GIT binary patch delta 71875 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

K^2cUNT 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 Nd=Wbz_~cLazW|H|1tI_d delta 69428 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%0D2H;lF><)MPx0%il2XV&MP(@39ix@Xn0c$vv11 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 Date: Thu, 18 Apr 2024 11:45:53 +0800 Subject: [PATCH 38/74] ENH: abnormal gap infill width gcodecheck Jira: none Signed-off-by: qing.zhang Change-Id: I96e269becf540a77fd10fb8c8b25a699e89eaf3f --- .../bbs_gcode_checker/GCodeChecker.cpp | 27 ++++++++++++++++--- .../bbs_gcode_checker/GCodeChecker.h | 2 ++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/bbs_test_tools/bbs_gcode_checker/GCodeChecker.cpp b/bbs_test_tools/bbs_gcode_checker/GCodeChecker.cpp index aad8a1a576..ebf369d837 100644 --- a/bbs_test_tools/bbs_gcode_checker/GCodeChecker.cpp +++ b/bbs_test_tools/bbs_gcode_checker/GCodeChecker.cpp @@ -24,6 +24,7 @@ const std::string nozzle_temperature_Tag = " nozzle_temperature ="; const std::string nozzle_temperature_initial_layer_Tag = " nozzle_temperature_initial_layer"; const std::string Z_HEIGHT_TAG = " Z_HEIGHT: "; const std::string Initial_Layer_Ptint_Height_Tag = " initial_layer_print_height ="; +const std::string Line_Width_Tag = " line_width ="; GCodeCheckResult GCodeChecker::parse_file(const std::string& path) { @@ -110,8 +111,8 @@ GCodeCheckResult GCodeChecker::parse_comment(GCodeLine& line) // extrusion role tag if (starts_with(comment, Extrusion_Role_Tag)) { m_role = string_to_role(comment.substr(Extrusion_Role_Tag.length())); + check_gap_infill_width = false; if (m_role == erExternalPerimeter) { - if (z_height == initial_layer_height && nozzle_temp != nozzle_temperature_initial_layer[filament_id]) { std::cout << "invalid filament nozzle initial layer temperature comment with invalid value!" << std::endl; return GCodeCheckResult::ParseFailed; @@ -121,9 +122,11 @@ GCodeCheckResult GCodeChecker::parse_comment(GCodeLine& line) std::cout << "invalid filament nozzle temperature comment with invalid value!" << std::endl; return GCodeCheckResult::ParseFailed; } + } else if (m_role == erGapFill) { + check_gap_infill_width = true; } - } else if (starts_with(comment, Wipe_Start_Tag)) { + }else if (starts_with(comment, Wipe_Start_Tag)) { m_wiping = true; } else if (starts_with(comment, Wipe_End_Tag)) { m_wiping = false; @@ -139,6 +142,15 @@ GCodeCheckResult GCodeChecker::parse_comment(GCodeLine& line) std::cout << "invalid width comment with invalid value!" << std::endl; return GCodeCheckResult::ParseFailed; } + + //check gap infill line width + if( check_gap_infill_width ) { + if (m_width > max_gap_infill_width) { + std::cout << "gap infill width has invalid value!" << std::endl; + std::cout << "allowed max gap width: " << max_gap_infill_width << std::endl; + return GCodeCheckResult::ParseFailed; + } + } } else if (starts_with(comment, Layer_Change_Tag)) { m_layer_num++; } else if (starts_with(comment, filament_flow_ratio_tag)) @@ -175,8 +187,15 @@ GCodeCheckResult GCodeChecker::parse_comment(GCodeLine& line) std::cout << "invalid initial layer height comment with invalid value!" << std::endl; return GCodeCheckResult::ParseFailed; } - } - + } else if (starts_with(comment, Line_Width_Tag)) { + std::string str = comment.substr(Line_Width_Tag.size()); + double default_line_width = 0.0f; + if (!parse_double_from_str(str, default_line_width)) { + std::cout << "invalid initial layer height comment with invalid value!" << std::endl; + return GCodeCheckResult::ParseFailed; + } + max_gap_infill_width = 3 * default_line_width; + } return GCodeCheckResult::Success; } diff --git a/bbs_test_tools/bbs_gcode_checker/GCodeChecker.h b/bbs_test_tools/bbs_gcode_checker/GCodeChecker.h index f908ebfb89..31bfe259c9 100644 --- a/bbs_test_tools/bbs_gcode_checker/GCodeChecker.h +++ b/bbs_test_tools/bbs_gcode_checker/GCodeChecker.h @@ -209,6 +209,8 @@ class GCodeChecker { double m_width = 0.0; double z_height=0.0f; double initial_layer_height=0.0f; + double max_gap_infill_width = 0.0f; + bool check_gap_infill_width = false; int filament_id; double flow_ratio = 0; double nozzle_temp = 0.0f; From c094604915f36754cfca24f4828c940a16b1de7e Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Thu, 18 Apr 2024 20:50:54 +0800 Subject: [PATCH 39/74] ENH: add long retraction for P series jira:NEW Signed-off-by: xun.zhang Change-Id: I6890695b67e674fc5cdc2a208e89bd9e41404213 --- resources/profiles/BBL.json | 2 +- .../filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json | 6 ++++++ .../profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json | 6 ++++++ .../profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json | 4 ++-- .../profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json | 4 ++-- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 8395eb2238..5cbf02aeb8 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "01.09.00.05", + "version": "01.09.00.06", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ diff --git a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json index 815cca5839..bca893a5dc 100644 --- a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json @@ -11,6 +11,12 @@ "fan_min_speed": [ "50" ], + "filament_long_retractions_when_cut": [ + "1" + ], + "filament_retraction_distances_when_cut": [ + "18" + ], "filament_max_volumetric_speed": [ "2" ], diff --git a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json index d64ab7e7d1..a54e7bea5d 100644 --- a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json +++ b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json @@ -8,6 +8,12 @@ "fan_cooling_layer_time": [ "80" ], + "filament_long_retractions_when_cut": [ + "1" + ], + "filament_retraction_distances_when_cut": [ + "18" + ], "fan_min_speed": [ "50" ], diff --git a/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json index dd4c128892..c9046ad060 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json @@ -21,7 +21,7 @@ "Bambu PLA Basic @BBL X1" ], "default_print_profile": "0.20mm Standard @BBL P1P", - "enable_long_retraction_when_cut" : "2", + "enable_long_retraction_when_cut": "2", "extruder_offset": [ "0x2" ], @@ -40,5 +40,5 @@ "machine_start_gcode": ";===== machine: P1P ========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression", "machine_end_gcode": ";===== date: 20230428 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n{if timelapse_type == 0} ; timelapse without wipe tower\nM971 S11 C10 O0\n{elsif timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 X65 Y245 F20000 ; move to safe pos\nG17\nG2 Z{layer_z} I0.86 J0.86 P1 F20000\nG1 Y265 F3000\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255 F20000\n{endif}\nM623\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", - "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E-[retraction_distance_when_cut] F200\nM400\n{endif}\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E{retraction_distance_when_cut - 2} F200\nG1 E2 F20\nM400\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" + "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nM620.11 S0\n{endif}\nM400\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM628 S1\nG92 E0\nG1 E{retraction_distances_when_cut[previous_extruder]} F[old_filament_e_feedrate]\nM400\nM629 S1\n{else}\nM620.11 S0\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json index 814f8d71b9..3dc5e2b6d9 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json @@ -20,7 +20,7 @@ "Bambu PLA Basic @BBL X1C" ], "default_print_profile": "0.20mm Standard @BBL X1C", - "enable_long_retraction_when_cut" : "2", + "enable_long_retraction_when_cut": "2", "extruder_offset": [ "0x2" ], @@ -39,5 +39,5 @@ "machine_start_gcode": ";===== machine: P1S ========================\n;===== date: 20231107 =====================\n;===== turn on the HB fan & MC board fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\nM710 A1 S255 ;turn on MC fan by default(P1S)\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\n", "machine_end_gcode": ";===== date: 20230428 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n{if timelapse_type == 0} ; timelapse without wipe tower\nM971 S11 C10 O0\n{elsif timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 X65 Y245 F20000 ; move to safe pos\nG17\nG2 Z{layer_z} I0.86 J0.86 P1 F20000\nG1 Y265 F3000\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255 F20000\n{endif}\nM623\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", - "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E-[retraction_distance_when_cut] F200\nM400\n{endif}\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E{retraction_distance_when_cut - 2} F200\nG1 E2 F20\nM400\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" + "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nM620.11 S0\n{endif}\nM400\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM628 S1\nG92 E0\nG1 E{retraction_distances_when_cut[previous_extruder]} F[old_filament_e_feedrate]\nM400\nM629 S1\n{else}\nM620.11 S0\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file From b2f1c8a06e1cde9804fb6203dafe8969bd94fed2 Mon Sep 17 00:00:00 2001 From: "zorro.zhang" Date: Fri, 19 Apr 2024 16:01:44 +0800 Subject: [PATCH 40/74] FIX: Resume Get Makerlab function JIRA: none Change-Id: Ifcde937d7c9a192984ee884a6cf77c5b2fd6ea38 --- src/slic3r/GUI/GUI_App.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index f909d4cac9..46d113cdff 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4061,7 +4061,7 @@ std::string GUI_App::handle_web_request(std::string cmd) if (root.get_child_optional("data") != boost::none) { pt::ptree data_node = root.get_child("data"); boost::optional id = data_node.get_optional("id"); - if (id.has_value() && mainframe->m_webview) { + if (id.has_value() && mainframe && mainframe->m_webview) { mainframe->m_webview->OpenModelDetail(id.value(), m_agent); } } @@ -4171,7 +4171,7 @@ std::string GUI_App::handle_web_request(std::string cmd) int nRefresh = root.get_child_optional("refresh") == boost::none ? 0 : root.get_optional("refresh").value(); CallAfter([this,strMenu, nRefresh] { - if (mainframe->m_webview) + if (mainframe && mainframe->m_webview) { mainframe->m_webview->SwitchWebContent(strMenu, nRefresh); } @@ -4183,17 +4183,17 @@ std::string GUI_App::handle_web_request(std::string cmd) if (root.get_child_optional("menu") != boost::none) { std::string strMenu = root.get_optional("menu").value(); - if (mainframe->m_webview) { mainframe->m_webview->SwitchLeftMenu(strMenu); } + if (mainframe && mainframe->m_webview) { mainframe->m_webview->SwitchLeftMenu(strMenu); } } } else if (command_str.compare("homepage_makerlab_get") == 0) { - //if (mainframe->m_webview) { mainframe->m_webview->SendMakerlabList(); } + if (mainframe && mainframe->m_webview) { mainframe->m_webview->SendMakerlabList(); } } else if (command_str.compare("homepage_makerlab_open") == 0) { if (root.get_child_optional("url") != boost::none) { std::string strUrl = root.get_optional("url").value(); - if (mainframe->m_webview) { mainframe->m_webview->OpenOneMakerlab(strUrl); } + if (mainframe && mainframe->m_webview) { mainframe->m_webview->OpenOneMakerlab(strUrl); } } } else if (command_str.compare("makerworld_model_open") == 0) From 3d80237af22a8aafd97c9f93187bbcadebb7949b Mon Sep 17 00:00:00 2001 From: "liz.li" Date: Fri, 19 Apr 2024 15:54:33 +0800 Subject: [PATCH 41/74] FIX: all plates stats data missing issue jira: new Change-Id: I137a2b6d69ad08791f5a9a9788653621960dc63f --- src/slic3r/GUI/GCodeViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 13ce703d47..f287dc4a5e 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4290,7 +4290,7 @@ void GCodeViewer::render_all_plates_stats(const std::vector Date: Fri, 19 Apr 2024 15:05:38 +0800 Subject: [PATCH 42/74] ENH:update pre print options jira:[for multi] Change-Id: I2e9bb8a09436a71749af98a0bad94e9922f95c81 --- src/slic3r/GUI/SendMultiMachinePage.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index 71e2aba345..84e370021a 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -401,9 +401,9 @@ BBL::PrintParams SendMultiMachinePage::request_params(MachineObject* obj) BBL::PrintParams params; //get all setting - bool bed_leveling = app_config->get("bed_leveling") == "1" ? true : false; - bool flow_cali = app_config->get("flow_cali") == "1" ? true : false; - bool timelapse = app_config->get("timelapse") == "1" ? true : false; + bool bed_leveling = app_config->get("print", "bed_leveling") == "1" ? true : false; + bool flow_cali = app_config->get("print", "flow_cali") == "1" ? true : false; + bool timelapse = app_config->get("print", "timelapse") == "1" ? true : false; auto use_ams = false; AmsRadioSelectorList::Node* node = m_radio_group.GetFirst(); From ad968ff50eb14d858f0ffec9fcdd463ebdb61ffc Mon Sep 17 00:00:00 2001 From: tao wang Date: Fri, 19 Apr 2024 17:40:03 +0800 Subject: [PATCH 43/74] FIX:fixed can't popup pinbind win on macos jira:[STUDIO-6895] Change-Id: I664bba78cf27420d736b586df19e3c09c6f8ed21 --- src/slic3r/GUI/BindDialog.cpp | 17 +-- src/slic3r/GUI/GUI_App.cpp | 1 + src/slic3r/GUI/MultiMachineManagerPage.hpp | 2 +- src/slic3r/GUI/SelectMachine.cpp | 118 ++++++++++++++++----- src/slic3r/GUI/SelectMachine.hpp | 22 ++++ src/slic3r/GUI/UserManager.cpp | 2 +- 6 files changed, 119 insertions(+), 43 deletions(-) diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index 66fb56f74c..6678cde767 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -91,14 +91,14 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) request_bind_panel->SetBackgroundColour(*wxWHITE); binding_panel->SetBackgroundColour(*wxWHITE); - m_status_text = new Label(request_bind_panel, _L("Please Find the ping code in Account page on printer screen,\n and type in the ping code below.")); + m_status_text = new Label(request_bind_panel, _L("Please Find the Pin Code in Account page on printer screen,\n and type in the Pin Code below.")); m_status_text->SetBackgroundColour(*wxWHITE); m_status_text->SetFont(Label::Body_14); m_status_text->SetMaxSize(wxSize(FromDIP(440), -1)); m_status_text->Wrap(FromDIP(440)); m_status_text->SetForegroundColour(wxColour(38, 46, 48)); - m_link_show_ping_code_wiki = new wxStaticText(request_bind_panel, wxID_ANY, _L("Can't find pin code?")); + m_link_show_ping_code_wiki = new wxStaticText(request_bind_panel, wxID_ANY, _L("Can't find Pin Code?")); m_link_show_ping_code_wiki->SetFont(Label::Body_14); m_link_show_ping_code_wiki->SetBackgroundColour(*wxWHITE); m_link_show_ping_code_wiki->SetForegroundColour(wxColour(31, 142, 234)); @@ -203,14 +203,6 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) m_button_close->SetCornerRadius(FromDIP(12)); m_sizer_binding_button->Add(m_button_close, 0, wxALIGN_CENTER, 0); - m_button_close->Bind(wxEVT_BUTTON, [this](auto& e) { - wxGetApp().remove_ping_bind_dialog(); - }); - - this->Bind(wxEVT_CLOSE_WINDOW, [this](auto& e) { - wxGetApp().remove_ping_bind_dialog(); - }); - auto sizer_binding = new wxBoxSizer(wxVERTICAL); sizer_binding->Add(0, 0, 0, wxTOP, FromDIP(80)); sizer_binding->Add(m_loading_txt, 0, wxALIGN_CENTER, 0); @@ -292,7 +284,7 @@ void PingCodeBindDialog::on_bind_printer(wxCommandEvent& event) auto result = agent->ping_bind(ping_code.ToStdString()); if(result < 0){ - MessageDialog msg_wingow(nullptr, _L("Log in failed. Please check the pin code."), "", wxAPPLY | wxOK); + MessageDialog msg_wingow(nullptr, _L("Log in failed. Please check the Pin Code."), "", wxAPPLY | wxOK); msg_wingow.ShowModal(); return; } @@ -302,7 +294,7 @@ void PingCodeBindDialog::on_bind_printer(wxCommandEvent& event) void PingCodeBindDialog::on_cancel(wxCommandEvent& event) { - wxGetApp().remove_ping_bind_dialog(); + EndModal(wxCLOSE); } void PingCodeBindDialog::on_dpi_changed(const wxRect& suggested_rect) @@ -312,6 +304,7 @@ void PingCodeBindDialog::on_dpi_changed(const wxRect& suggested_rect) Refresh(); } + PingCodeBindDialog::~PingCodeBindDialog() { m_button_bind->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_bind_printer), NULL, this); m_button_cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 46d113cdff..8ba43db35d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -6346,6 +6346,7 @@ void GUI_App::popup_ping_bind_dialog() if (m_ping_code_binding_dialog == nullptr) { m_ping_code_binding_dialog = new PingCodeBindDialog(); m_ping_code_binding_dialog->ShowModal(); + remove_ping_bind_dialog(); } } diff --git a/src/slic3r/GUI/MultiMachineManagerPage.hpp b/src/slic3r/GUI/MultiMachineManagerPage.hpp index 9c8798aac6..4ddc69ab04 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.hpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.hpp @@ -10,7 +10,7 @@ namespace GUI { #define DEVICE_LEFT_PADDING_LEFT 15 #define DEVICE_LEFT_DEV_NAME 180 #define DEVICE_LEFT_PRO_NAME 180 -#define DEVICE_LEFT_PRO_INFO 250 +#define DEVICE_LEFT_PRO_INFO 280 class MultiMachineItem : public DeviceItem { diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 6e29070017..d382ea6ee8 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -395,38 +395,11 @@ SelectMachinePopup::SelectMachinePopup(wxWindow *parent) m_sizer_other_devices = new wxBoxSizer(wxVERTICAL); - wxWindow* m_panel_ping_code = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE, wxTAB_TRAVERSAL); - m_panel_ping_code->SetBackgroundColour(*wxWHITE); - - wxBoxSizer* sizer_ping_code = new wxBoxSizer(wxHORIZONTAL); - - m_img_ping_code = new wxStaticBitmap(m_panel_ping_code, wxID_ANY, create_scaled_bitmap("bind_device_ping_code", this, 10), wxDefaultPosition, wxSize(FromDIP(10), FromDIP(10)), 0); - m_img_ping_code->SetBackgroundColour(*wxWHITE); - - m_ping_code_text = new Label(m_panel_ping_code, _L("Bind with Pin Code")); - m_ping_code_text->SetFont(::Label::Head_13); - m_ping_code_text->SetForegroundColour(wxColour(38, 46, 48)); - m_ping_code_text->SetBackgroundColour(*wxWHITE); - - m_panel_ping_code->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - wxGetApp().popup_ping_bind_dialog(); - }); - - m_ping_code_text->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - wxGetApp().popup_ping_bind_dialog(); - }); - - - sizer_ping_code->Add(m_img_ping_code, 0, wxEXPAND, 0); - sizer_ping_code->Add(0, 0, 0, wxLEFT, FromDIP(7)); - sizer_ping_code->Add(m_ping_code_text, 0, wxALIGN_CENTER, 0); - - m_panel_ping_code->SetSizer(sizer_ping_code); - m_panel_ping_code->Layout(); + m_panel_ping_code = new PinCodePanel(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE); m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0); - m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND | wxLEFT, FromDIP(8)); + m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND, 0); m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0); @@ -898,6 +871,17 @@ void SelectMachinePopup::OnLeftUp(wxMouseEvent &event) } } + //pin code + auto pc_rect = m_panel_ping_code->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > pc_rect.x && mouse_pos.y > pc_rect.y && mouse_pos.x < (pc_rect.x + m_panel_ping_code->GetSize().x) && mouse_pos.y < (pc_rect.y + m_panel_ping_code->GetSize().y)) { + /*wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = m_panel_ping_code->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(m_panel_ping_code); + wxPostEvent(m_panel_ping_code, event);*/ + wxGetApp().popup_ping_bind_dialog(); + } + //hyper link auto h_rect = m_hyperlink->ClientToScreen(wxPoint(0, 0)); if (mouse_pos.x > h_rect.x && mouse_pos.y > h_rect.y && mouse_pos.x < (h_rect.x + m_hyperlink->GetSize().x) && mouse_pos.y < (h_rect.y + m_hyperlink->GetSize().y)) { @@ -4617,4 +4601,80 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) ThumbnailPanel::~ThumbnailPanel() {} + PinCodePanel::PinCodePanel(wxWindow* parent, wxWindowID winid /*= wxID_ANY*/, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/) + { + wxPanel::Create(parent, winid, pos, SELECT_MACHINE_ITEM_SIZE); + Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this); + SetSize(SELECT_MACHINE_ITEM_SIZE); + SetMaxSize(SELECT_MACHINE_ITEM_SIZE); + SetMinSize(SELECT_MACHINE_ITEM_SIZE); + + m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); + + this->Bind(wxEVT_ENTER_WINDOW, &PinCodePanel::on_mouse_enter, this); + this->Bind(wxEVT_LEAVE_WINDOW, &PinCodePanel::on_mouse_leave, this); + this->Bind(wxEVT_LEFT_UP, &PinCodePanel::on_mouse_left_up, this); + } + + void PinCodePanel::OnPaint(wxPaintEvent& event) + { + wxPaintDC dc(this); + render(dc); + } + + void PinCodePanel::render(wxDC& dc) + { +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif + } + + void PinCodePanel::doRender(wxDC& dc) + { + auto size = GetSize(); + dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(20), (size.y - m_bitmap.GetBmpSize().y) / 2)); + dc.SetFont(::Label::Head_13); + dc.SetTextForeground(wxColour(38, 46, 48)); + wxString txt = _L("Bind with Pin Code"); + auto txt_size = dc.GetTextExtent(txt); + dc.DrawText(txt, wxPoint(FromDIP(40), (size.y - txt_size.y) / 2)); + + if (m_hover) { + dc.SetPen(SELECT_MACHINE_BRAND); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + } + } + + void PinCodePanel::on_mouse_enter(wxMouseEvent& evt) + { + m_hover = true; + Refresh(); + } + + void PinCodePanel::on_mouse_leave(wxMouseEvent& evt) + { + m_hover = false; + Refresh(); + } + + void PinCodePanel::on_mouse_left_up(wxMouseEvent& evt) + { + wxGetApp().popup_ping_bind_dialog(); + } + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 564e02ee51..280f89b511 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -208,6 +208,27 @@ class MachinePanel MachineObjectPanel *mPanel; }; +class PinCodePanel : public wxPanel +{ +public: + PinCodePanel(wxWindow* parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize); + ~PinCodePanel() {}; + + ScalableBitmap m_bitmap; + bool m_hover{false}; + + void OnPaint(wxPaintEvent& event); + void render(wxDC& dc); + void doRender(wxDC& dc); + + void on_mouse_enter(wxMouseEvent& evt); + void on_mouse_leave(wxMouseEvent& evt); + void on_mouse_left_up(wxMouseEvent& evt); +}; + class ThumbnailPanel; @@ -230,6 +251,7 @@ class SelectMachinePopup : public PopupWindow private: int m_my_devices_count{0}; int m_other_devices_count{0}; + PinCodePanel* m_panel_ping_code{nullptr}; wxWindow* m_placeholder_panel{nullptr}; wxHyperlinkCtrl* m_hyperlink{nullptr}; Label* m_ping_code_text{nullptr}; diff --git a/src/slic3r/GUI/UserManager.cpp b/src/slic3r/GUI/UserManager.cpp index a4cfa80b14..29f5f2d137 100644 --- a/src/slic3r/GUI/UserManager.cpp +++ b/src/slic3r/GUI/UserManager.cpp @@ -56,9 +56,9 @@ int UserManager::parse_json(std::string payload) if (!dev) {return -1;} if (GUI::wxGetApp().m_ping_code_binding_dialog && GUI::wxGetApp().m_ping_code_binding_dialog->IsShown()) { + GUI::wxGetApp().m_ping_code_binding_dialog->EndModal(wxCLOSE); GUI::MessageDialog msgdialog(nullptr, _L("Log in successful."), "", wxAPPLY | wxOK); msgdialog.ShowModal(); - GUI::wxGetApp().remove_ping_bind_dialog(); } dev->update_user_machine_list_info(); dev->set_selected_machine(dev_id); From bd17422492f0b221f10cfa5b059d65c47eb559bf Mon Sep 17 00:00:00 2001 From: tao wang Date: Sat, 20 Apr 2024 14:35:20 +0800 Subject: [PATCH 44/74] FIX:fixed the task of padding cannot be cancelled Change-Id: I401a22118c14ca7601be7a925cfd8e4796dfc1e9 --- src/slic3r/GUI/MultiTaskManagerPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp index fe8c0c0789..dc1b0b9552 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.cpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -256,7 +256,7 @@ void MultiTaskItem::OnLeftDown(wxMouseEvent& evt) mouse_pos.y > item.y && mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { - if (m_task_type == 0 && state_local_task == 1) { + if (m_task_type == 0 && state_local_task <= 1) { post_event(wxCommandEvent(EVT_MULTI_DEVICE_SELECTED)); } else if (m_task_type == 1 && state_cloud_task == 0) { From f7bfb2c3111b54b287c28f6ec279777414cf0e06 Mon Sep 17 00:00:00 2001 From: tao wang Date: Sat, 20 Apr 2024 14:58:27 +0800 Subject: [PATCH 45/74] ENH:Play video after redirecting to device page jira:[STUDIO-6884] Change-Id: Ia5e2ac84e3d71baacfcf941b782dab2325f35d54 --- src/slic3r/GUI/MultiMachineManagerPage.cpp | 3 +++ src/slic3r/GUI/StatusPanel.hpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/slic3r/GUI/MultiMachineManagerPage.cpp b/src/slic3r/GUI/MultiMachineManagerPage.cpp index 6e63858d95..bcb648d95f 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.cpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.cpp @@ -19,6 +19,9 @@ MultiMachineItem::MultiMachineItem(wxWindow* parent, MachineObject* obj) Bind(wxEVT_MOTION, &MultiMachineItem::OnMove, this); Bind(EVT_MULTI_DEVICE_VIEW, [this, obj](auto& e) { wxGetApp().mainframe->jump_to_monitor(obj->dev_id); + if (wxGetApp().mainframe->m_monitor->get_status_panel()->get_media_play_ctrl()) { + wxGetApp().mainframe->m_monitor->get_status_panel()->get_media_play_ctrl()->jump_to_play(); + } }); wxGetApp().UpdateDarkUIWin(this); } diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 921d91e6b5..796a300b0e 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -441,6 +441,7 @@ class StatusBasePanel : public wxScrolledWindow wxBoxSizer *create_settings_group(wxWindow *parent); void show_ams_group(bool show = true); + MediaPlayCtrl* get_media_play_ctrl() {return m_media_play_ctrl;}; }; From a9f0a0fa34b9313dda91672f82e469fb74aa300e Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Fri, 19 Apr 2024 19:40:47 +0800 Subject: [PATCH 46/74] FIX: fix ui bug in send multi machine page for mac JIRA: STUDIO-6882 Incorrect background color when renaming during multi machine printing Change-Id: I6c551f5023ffe747e7a7e2f5703b0707c9505922 --- src/slic3r/GUI/SendMultiMachinePage.cpp | 9 +++++++-- src/slic3r/GUI/SendMultiMachinePage.hpp | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index 84e370021a..ced9fb397d 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -992,12 +992,17 @@ wxPanel* SendMultiMachinePage::create_page() m_text_sizer = new wxBoxSizer(wxVERTICAL); m_text_sizer->Add(m_rename_switch_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); - m_thumbnail_panel = new ThumbnailPanel(m_title_panel); + m_panel_image = new wxPanel(m_title_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_image_sizer = new wxBoxSizer(wxHORIZONTAL); + m_thumbnail_panel = new ThumbnailPanel(m_panel_image); m_thumbnail_panel->SetSize(wxSize(THUMBNAIL_SIZE, THUMBNAIL_SIZE)); m_thumbnail_panel->SetMinSize(wxSize(THUMBNAIL_SIZE, THUMBNAIL_SIZE)); m_thumbnail_panel->SetMaxSize(wxSize(THUMBNAIL_SIZE, THUMBNAIL_SIZE)); m_thumbnail_panel->SetBackgroundColour(*wxRED); - m_title_sizer->Add(m_thumbnail_panel, 0, wxLEFT, 0); + m_image_sizer->Add(m_thumbnail_panel, 0, wxALIGN_CENTER, 0); + m_panel_image->SetSizer(m_image_sizer); + m_panel_image->Layout(); + m_title_sizer->Add(m_panel_image, 0, wxLEFT, 0); wxBoxSizer* m_sizer_basic = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* m_sizer_basic_time = new wxBoxSizer(wxHORIZONTAL); diff --git a/src/slic3r/GUI/SendMultiMachinePage.hpp b/src/slic3r/GUI/SendMultiMachinePage.hpp index 5935076bc4..381190f1bc 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.hpp +++ b/src/slic3r/GUI/SendMultiMachinePage.hpp @@ -154,6 +154,8 @@ class SendMultiMachinePage : public DPIDialog ScalableBitmap* print_weight{ nullptr }; wxBoxSizer* m_thumbnail_sizer{ nullptr }; ThumbnailPanel* m_thumbnail_panel{nullptr}; + wxPanel* m_panel_image{ nullptr }; + wxBoxSizer* m_image_sizer{ nullptr }; // tip when no device wxStaticText* m_tip_text{ nullptr }; From 737aba9dbf3a34ada40b0896f8610809d921aa86 Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Fri, 19 Apr 2024 10:02:17 +0800 Subject: [PATCH 47/74] FIX: Fix some bugs in maintaining the selected status of local tasks JIRA: STUDIO-6824 Change-Id: I12c4da3fc56ac5077b3ccd7e89a4b57c3675eaf5 --- src/slic3r/GUI/MultiMachineManagerPage.cpp | 2 +- src/slic3r/GUI/MultiTaskManagerPage.cpp | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/MultiMachineManagerPage.cpp b/src/slic3r/GUI/MultiMachineManagerPage.cpp index bcb648d95f..7527f62565 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.cpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.cpp @@ -441,7 +441,7 @@ MultiMachineManagerPage::MultiMachineManagerPage(wxWindow* parent) m_page_num_enter->SetMaxSize(wxSize(FromDIP(25), FromDIP(25))); m_page_num_enter->SetBackgroundColor(ctrl_bg); m_page_num_enter->SetCornerRadius(FromDIP(5)); - m_page_num_enter->Bind(wxEVT_LEFT_DOWN, [&](wxMouseEvent& evt) { + m_page_num_enter->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](auto& evt) { page_num_enter_evt(); }); diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp index dc1b0b9552..3cdb5b3cee 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.cpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -785,7 +785,8 @@ void LocalTaskManagerPage::refresh_user_device(bool clear) if (m_task_items.find(it->first) != m_task_items.end()) { MultiTaskItem* item = m_task_items[it->first]; - mtitem->state_selected = item->state_selected; + if (item->state_selected == 1 && mtitem->state_local_task < 2) + mtitem->state_selected = item->state_selected; item->Destroy(); } @@ -838,7 +839,7 @@ bool LocalTaskManagerPage::Show(bool show) void LocalTaskManagerPage::cancel_all(wxCommandEvent& evt) { for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { - if (it->second->m_button_cancel->IsShown() && (it->second->get_state_selected() == 1)) { + if (it->second->m_button_cancel->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_local_task < 2) { it->second->onCancel(); } } @@ -1064,7 +1065,7 @@ CloudTaskManagerPage::CloudTaskManagerPage(wxWindow* parent) start_timer(); m_current_page++; if (m_current_page > m_total_page - 1) - m_current_page = m_total_count - 1; + m_current_page = m_total_page - 1; refresh_user_device(); update_page_number(); /*m_sizer_task_list->Clear(false); @@ -1087,7 +1088,7 @@ CloudTaskManagerPage::CloudTaskManagerPage(wxWindow* parent) m_page_num_enter->SetMaxSize(wxSize(FromDIP(25), FromDIP(25))); m_page_num_enter->SetBackgroundColor(ctrl_bg); m_page_num_enter->SetCornerRadius(FromDIP(5)); - m_page_num_enter->Bind(wxEVT_LEFT_DOWN, [&](wxMouseEvent& evt) { + m_page_num_enter->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](auto& evt) { page_num_enter_evt(); }); @@ -1209,7 +1210,8 @@ void CloudTaskManagerPage::refresh_user_device(bool clear) if (m_task_items.find(it->first) != m_task_items.end()) { MultiTaskItem* item = m_task_items[it->first]; - mtitem->state_selected = item->state_selected; + if (item->state_selected == 1 && mtitem->state_cloud_task == 0) + mtitem->state_selected = item->state_selected; item->Destroy(); } @@ -1351,7 +1353,7 @@ void CloudTaskManagerPage::on_timer(wxTimerEvent& event) void CloudTaskManagerPage::pause_all(wxCommandEvent& evt) { for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { - if (it->second->m_button_pause->IsShown() && (it->second->get_state_selected() == 1)) { + if (it->second->m_button_pause->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_cloud_task == 0) { it->second->onPause(); } } @@ -1360,7 +1362,7 @@ void CloudTaskManagerPage::pause_all(wxCommandEvent& evt) void CloudTaskManagerPage::resume_all(wxCommandEvent& evt) { for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { - if (it->second->m_button_resume->IsShown() && (it->second->get_state_selected() == 1)) { + if (it->second->m_button_resume->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_cloud_task == 0) { it->second->onResume(); } } @@ -1369,7 +1371,7 @@ void CloudTaskManagerPage::resume_all(wxCommandEvent& evt) void CloudTaskManagerPage::stop_all(wxCommandEvent& evt) { for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { - if (it->second->m_button_stop->IsShown() && (it->second->get_state_selected() == 1)) { + if (it->second->m_button_stop->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_cloud_task == 0) { it->second->onStop(); } } From 5ec4a0b06fd579e6e1db812efb35b6f242e6fe96 Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Fri, 19 Apr 2024 18:52:25 +0800 Subject: [PATCH 48/74] ENH: local task sort by send time by default JIRA: STUDIO-6885 Change-Id: I03b5881a39ab2e90c5b9cf46052ba465ee707ccc --- src/slic3r/GUI/MultiMachine.cpp | 3 +++ src/slic3r/GUI/MultiTaskManagerPage.cpp | 7 +++---- src/slic3r/GUI/MultiTaskManagerPage.hpp | 2 +- src/slic3r/GUI/SendMultiMachinePage.cpp | 4 ++-- src/slic3r/GUI/TaskManager.cpp | 6 +++--- src/slic3r/GUI/TaskManager.hpp | 2 +- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/MultiMachine.cpp b/src/slic3r/GUI/MultiMachine.cpp index 7be604ec06..f22994e795 100644 --- a/src/slic3r/GUI/MultiMachine.cpp +++ b/src/slic3r/GUI/MultiMachine.cpp @@ -216,6 +216,9 @@ std::vector selected_machines(const std::vector& dev_i SortItem::SortItem() { + sort_map.emplace(std::make_pair(SortRule::SR_None, [this](const DeviceItem* d1, const DeviceItem* d2) { + return d1->state_dev_name > d2->state_dev_name; + })); sort_map.emplace(std::make_pair(SortRule::SR_DEV_NAME, [this](const DeviceItem* d1, const DeviceItem* d2) { return this->big ? d1->state_dev_name > d2->state_dev_name : d1->state_dev_name < d2->state_dev_name; })); diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp index 3cdb5b3cee..cc24655d40 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.cpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -553,7 +553,6 @@ LocalTaskManagerPage::LocalTaskManagerPage(wxWindow* parent) m_select_checkbox = new CheckBox(m_table_head_panel, wxID_ANY); m_select_checkbox->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRINTABLE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); m_select_checkbox->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRINTABLE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); - m_table_head_sizer->AddSpacer(FromDIP(TASK_LEFT_PADDING_LEFT)); m_table_head_sizer->Add(m_select_checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); m_select_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& e) { @@ -756,8 +755,8 @@ void LocalTaskManagerPage::refresh_user_device(bool clear) auto task_manager = wxGetApp().getTaskManager(); if (task_manager) { auto m_task_obj_list = task_manager->get_local_task_list(); - - for (auto it = m_task_obj_list.begin(); it != m_task_obj_list.end(); it++) { + + for (auto it = m_task_obj_list.rbegin(); it != m_task_obj_list.rend(); ++it) { TaskStateInfo* task_state_info = it->second; @@ -794,7 +793,7 @@ void LocalTaskManagerPage::refresh_user_device(bool clear) task_temps.push_back(mtitem); } - if (m_sort.rule != SortItem::SortRule::SR_None) { + if (m_sort.rule != SortItem::SortRule::SR_None && m_sort.rule != SortItem::SortRule::SR_SEND_TIME) { std::sort(task_temps.begin(), task_temps.end(), m_sort.get_call_back()); } diff --git a/src/slic3r/GUI/MultiTaskManagerPage.hpp b/src/slic3r/GUI/MultiTaskManagerPage.hpp index b463f048e9..40341560ed 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.hpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.hpp @@ -88,7 +88,7 @@ class LocalTaskManagerPage : public wxPanel private: SortItem m_sort; - std::map m_task_items; + std::map m_task_items; bool device_name_big{ true }; bool device_state_big{ true }; bool device_send_time{ true }; diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index ced9fb397d..6cb719dbdf 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -1230,8 +1230,8 @@ wxPanel* SendMultiMachinePage::create_page() // add send option wxBoxSizer* title_send_option = create_item_title(_L("Send Options"), main_page, ""); - wxBoxSizer* max_printer_send = create_item_input(_L("Send"), _L("printers at the same time"), main_page, "", "max_send"); - wxBoxSizer* delay_time = create_item_input(_L("Wait"), _L("minute each batch"), main_page, "", "sending_interval"); + wxBoxSizer* max_printer_send = create_item_input(_L("Send"), _L("printers at the same time.(It depends on how many devices can undergo heating at the same time.)"), main_page, "", "max_send"); + wxBoxSizer* delay_time = create_item_input(_L("Wait"), _L("minute each batch.(It depends on how long it takes to complete the heating.)"), main_page, "", "sending_interval"); sizer->Add(title_send_option, 0, wxEXPAND, 0); sizer->Add(max_printer_send, 0, wxLEFT, FromDIP(20)); sizer->AddSpacer(FromDIP(3)); diff --git a/src/slic3r/GUI/TaskManager.cpp b/src/slic3r/GUI/TaskManager.cpp index 0de31566ab..f011e10cef 100644 --- a/src/slic3r/GUI/TaskManager.cpp +++ b/src/slic3r/GUI/TaskManager.cpp @@ -284,9 +284,9 @@ void TaskManager::stop() m_scedule_thread.join(); } -std::map TaskManager::get_local_task_list() +std::map TaskManager::get_local_task_list() { - std::map out; + std::map out; m_map_mutex.lock(); for (auto it = m_cache_map.begin(); it != m_cache_map.end(); it++) { for (auto iter = (*it).tasks.begin(); iter != (*it).tasks.end(); iter++) { @@ -295,7 +295,7 @@ std::map TaskManager::get_local_task_list() || (*iter)->state() == TaskState::TS_SEND_CANCELED || (*iter)->state() == TaskState::TS_SEND_COMPLETED || (*iter)->state() == TaskState::TS_SEND_FAILED) { - out.insert(std::make_pair(std::to_string((*iter)->task_info_id), *iter)); + out.insert(std::make_pair((*iter)->task_info_id, *iter)); } } } diff --git a/src/slic3r/GUI/TaskManager.hpp b/src/slic3r/GUI/TaskManager.hpp index caaae368f0..e4aa8627e9 100644 --- a/src/slic3r/GUI/TaskManager.hpp +++ b/src/slic3r/GUI/TaskManager.hpp @@ -150,7 +150,7 @@ class TaskManager void start(); void stop(); - std::map get_local_task_list(); + std::map get_local_task_list(); /* curr_page is start with 0 */ std::map get_task_list(int curr_page, int page_count, int& total); From f87fabffcd1e5c5e63df39cc2876ea0b4c0a9ff3 Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Fri, 19 Apr 2024 17:03:54 +0800 Subject: [PATCH 49/74] FIX: Clicking to continue printing does not take effect in error code JIRA: STUDIO-6830 Detected an incomplete printing task error pop-up when power outage occurred. Clicking to continue printing did not take effect Change-Id: Ie85a1602093dabac861cd1f41ea21e1c312c83e9 --- src/slic3r/GUI/ReleaseNote.cpp | 44 ++++++++++++++-------------------- src/slic3r/GUI/StatusPanel.cpp | 8 ++----- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 600498a9f6..af7ec9a47d 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -964,7 +964,6 @@ void PrintErrorDialog::update_text_image(wxString text, wxString image_url) m_staticText_release_note->SetMaxSize(wxSize(FromDIP(300), -1)); m_staticText_release_note->SetMinSize(wxSize(FromDIP(300), -1)); m_staticText_release_note->SetLabelText(text); - //m_staticText_release_note->SetForegroundColour(wxColour("#5C5C5C")); m_vebview_release_note->Layout(); auto text_size = m_staticText_release_note->GetBestSize(); @@ -1049,67 +1048,60 @@ void PrintErrorDialog::init_button_list() { init_button(RESUME_PRINTING, _L("Resume Printing")); m_button_list[RESUME_PRINTING]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { - wxCommandEvent evt(EVT_SECONDARY_CHECK_RETRY, GetId()); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); - this->on_hide(); - }); + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); init_button(RESUME_PRINTING_DEFECTS, _L("Resume Printing(defects acceptable)")); m_button_list[RESUME_PRINTING_DEFECTS]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { - wxCommandEvent evt(EVT_SECONDARY_CHECK_RETRY, GetId()); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); - this->on_hide(); - }); + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); init_button(RESUME_PRINTING_PROBELM_SOLVED, _L("Resume Printing(problem solved)")); m_button_list[RESUME_PRINTING_PROBELM_SOLVED]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { - //load filament and resume printing - wxCommandEvent evt(EVT_SECONDARY_CHECK_RETRY, GetId()); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); - this->on_hide(); - }); + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); init_button(STOP_PRINTING, _L("Stop Printing")); m_button_list[STOP_PRINTING]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { post_event(wxCommandEvent(EVT_PRINT_ERROR_STOP)); e.Skip(); - }); + }); init_button(CHECK_ASSISTANT, _L("Check Assistant")); m_button_list[CHECK_ASSISTANT]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { post_event(wxCommandEvent(EVT_JUMP_TO_HMS)); this->on_hide(); - }); + }); init_button(FILAMENT_EXTRUDED, _L("Filament Extruded, Continue")); m_button_list[FILAMENT_EXTRUDED]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { post_event(wxCommandEvent(EVT_SECONDARY_CHECK_DONE)); e.Skip(); - }); + }); - init_button(RETRY_FILAMENT_EXTRUDED, _L("Not Extruded Yet,Retry")); + init_button(RETRY_FILAMENT_EXTRUDED, _L("Not Extruded Yet, Retry")); m_button_list[RETRY_FILAMENT_EXTRUDED]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { wxCommandEvent evt(EVT_SECONDARY_CHECK_RETRY, GetId()); e.SetEventObject(this); GetEventHandler()->ProcessEvent(evt); this->on_hide(); - }); + }); init_button(CONTINUE, _L("Finished, Continue")); m_button_list[CONTINUE]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { post_event(wxCommandEvent(EVT_SECONDARY_CHECK_DONE)); e.Skip(); - }); - + }); + init_button(LOAD_VIRTUAL_TRAY, _L("Load Filament")); m_button_list[LOAD_VIRTUAL_TRAY]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { post_event(wxCommandEvent(EVT_LOAD_VAMS_TRAY)); e.Skip(); - }); + }); init_button(OK_BUTTON, _L("OK")); m_button_list[OK_BUTTON]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { @@ -1117,7 +1109,7 @@ void PrintErrorDialog::init_button_list() { e.SetEventObject(this); GetEventHandler()->ProcessEvent(evt); this->on_hide(); - }); + }); init_button(FILAMENT_LOAD_RESUME, _L("Filament Loaded, Resume")); m_button_list[FILAMENT_LOAD_RESUME]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 3a75498a54..27eef0f281 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -2187,12 +2187,8 @@ void StatusPanel::update_error_message() used_button.emplace_back(PrintErrorDialog::PrintErrorButton::JUMP_TO_LIVEVIEW); if (!error_msg.IsEmpty()) { wxDateTime now = wxDateTime::Now(); - wxString show_time; -#if !BBL_RELEASE_TO_PUBLIC - show_time = now.Format("%Y-%m-%d %H:%M:%S"); -#else - show_time = now.Format("%H:%M:%S"); -#endif + wxString show_time = wxString::Format("%d%02d%02d", now.GetDay(), now.GetHour(), now.GetMinute()); + error_msg = wxString::Format("%s\n[%s %s]", error_msg, print_error_str, show_time); From accbce3d23a4f1666d84ad14e21b7aac13a0ce2c Mon Sep 17 00:00:00 2001 From: Stone Li Date: Fri, 19 Apr 2024 17:58:16 +0800 Subject: [PATCH 50/74] ENH: use designTitle when designId > 0 JIRA: STUDIO-6072 Change-Id: I8342df053edeab16f930522e099e2eef91e5c5a4 Signed-off-by: Stone Li --- src/slic3r/GUI/TaskManager.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/TaskManager.cpp b/src/slic3r/GUI/TaskManager.cpp index f011e10cef..6f962634d4 100644 --- a/src/slic3r/GUI/TaskManager.cpp +++ b/src/slic3r/GUI/TaskManager.cpp @@ -325,8 +325,16 @@ std::map TaskManager::get_task_list(int curr_page, i BOOST_LOG_TRIVIAL(trace) << "task_manager: get_task_list task count =" << j["hits"].size(); for (auto& hit : j["hits"]) { TaskStateInfo task_info; - if (hit.contains("title")) - task_info.set_task_name(hit["title"].get()); + int64_t design_id = 0; + if (hit.contains("designId")) { + design_id = hit["designId"].get(); + } + if (design_id > 0 && hit.contains("designTitle")) { + task_info.set_task_name(hit["designTitle"].get()); + } else { + if (hit.contains("title")) + task_info.set_task_name(hit["title"].get()); + } if (hit.contains("deviceName")) task_info.set_device_name(hit["deviceName"].get()); if (hit.contains("deviceId")) From 1d7f4da41a4c1ecaf1cf9b78b575e02d357da738 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Wed, 17 Apr 2024 17:33:19 +0800 Subject: [PATCH 51/74] NEW:import vertex and mtl color from obj file Jira: STUDIO-6805 Change-Id: Iaacb13ee2451effdb83e5aba4b7fe1637b7fc95f --- src/BambuStudio.cpp | 3 +- src/libslic3r/CMakeLists.txt | 3 + src/libslic3r/Color.cpp | 10 +- src/libslic3r/Color.hpp | 9 +- src/libslic3r/Format/OBJ.cpp | 118 +++- src/libslic3r/Format/OBJ.hpp | 20 +- src/libslic3r/Format/objparser.cpp | 285 +++++++++- src/libslic3r/Format/objparser.hpp | 46 +- src/libslic3r/Model.cpp | 215 +++++++- src/libslic3r/Model.hpp | 11 +- src/libslic3r/ObjColorUtils.hpp | 187 +++++++ src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/ObjColorDialog.cpp | 824 ++++++++++++++++++++++++++++ src/slic3r/GUI/ObjColorDialog.hpp | 113 ++++ src/slic3r/GUI/Plater.cpp | 45 +- src/slic3r/GUI/Plater.hpp | 3 + src/slic3r/GUI/Widgets/ComboBox.hpp | 1 + src/slic3r/GUI/wxExtensions.cpp | 5 +- src/slic3r/GUI/wxExtensions.hpp | 3 +- 19 files changed, 1828 insertions(+), 75 deletions(-) create mode 100644 src/libslic3r/ObjColorUtils.hpp create mode 100644 src/slic3r/GUI/ObjColorDialog.cpp create mode 100644 src/slic3r/GUI/ObjColorDialog.hpp diff --git a/src/BambuStudio.cpp b/src/BambuStudio.cpp index 67a348bf0f..a6a0ccb678 100644 --- a/src/BambuStudio.cpp +++ b/src/BambuStudio.cpp @@ -791,7 +791,8 @@ static int construct_assemble_list(std::vector &assemble_ else if (boost::algorithm::iends_with(assemble_object.path, ".obj")) { std::string message; - bool result = load_obj(path_str, &mesh, message); + ObjInfo obj_info; + bool result = load_obj(path_str, &mesh, obj_info, message); if (!result) { BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": failed to read a valid mesh from obj file %1%, plate index %2%, object index %3%, error %4%") % assemble_object.path % (index + 1) % (obj_index + 1) % message; return CLI_DATA_FILE_ERROR; diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index e4d5c0c6fd..ccf30d8423 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -213,6 +213,7 @@ set(lisbslic3r_sources Arrange.cpp NormalUtils.cpp NormalUtils.hpp + ObjColorUtils.hpp Orient.hpp Orient.cpp MultiPoint.cpp @@ -432,6 +433,7 @@ set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE ON CACHE BOOL "" FORCE) cmake_policy(PUSH) cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) +find_package(OpenCV REQUIRED core) cmake_policy(POP) add_library(libslic3r_cgal STATIC MeshBoolean.cpp MeshBoolean.hpp TryCatchSignal.hpp @@ -523,6 +525,7 @@ target_link_libraries(libslic3r ${OCCT_LIBS} Clipper2 mcut + opencv_world ) if(NOT WIN32) diff --git a/src/libslic3r/Color.cpp b/src/libslic3r/Color.cpp index 7777b0e3ef..654b248b8a 100644 --- a/src/libslic3r/Color.cpp +++ b/src/libslic3r/Color.cpp @@ -6,7 +6,15 @@ static const float INV_255 = 1.0f / 255.0f; namespace Slic3r { - +bool color_is_equal(const RGBA a, const RGBA& b) +{ + for (size_t i = 0; i < 4; i++) { + if (abs(a[i] - b[i]) > 0.01) { + return false; + } + } + return true; +} // Conversion from RGB to HSV color space // The input RGB values are in the range [0, 1] // The output HSV values are in the ranges h = [0, 360], and s, v = [0, 1] diff --git a/src/libslic3r/Color.hpp b/src/libslic3r/Color.hpp index 5719d0eb91..870481d19f 100644 --- a/src/libslic3r/Color.hpp +++ b/src/libslic3r/Color.hpp @@ -5,7 +5,10 @@ #include namespace Slic3r { - +using RGB = std::array; +using RGBA = std::array; +const RGBA UNDEFINE_COLOR = {0,0,0,0}; +bool color_is_equal(const RGBA a, const RGBA &b); class ColorRGB { std::array m_data{1.0f, 1.0f, 1.0f}; @@ -81,7 +84,9 @@ class ColorRGBA ColorRGBA& operator = (const ColorRGBA& other) { m_data = other.m_data; return *this; } - bool operator == (const ColorRGBA& other) const { return m_data == other.m_data; } + bool operator==(const ColorRGBA &other) const{ + return color_is_equal(m_data, other.m_data); + } bool operator != (const ColorRGBA& other) const { return !operator==(other); } bool operator < (const ColorRGBA& other) const; bool operator > (const ColorRGBA& other) const; diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index 4e621e5f78..d208165ccf 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -21,19 +21,39 @@ namespace Slic3r { -bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) +bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::string &message) { if (meshptr == nullptr) return false; - // Parse the OBJ file. ObjParser::ObjData data; + ObjParser::MtlData mtl_data; if (! ObjParser::objparse(path, data)) { BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path; message = _L("load_obj: failed to parse"); return false; } - + bool exist_mtl = false; + if (data.mtllibs.size() > 0) { // read mtl + for (auto mtl_name : data.mtllibs) { + boost::filesystem::path full_path(path); + std::string dir = full_path.parent_path().string(); + auto mtl_file = dir + "/" + mtl_name; + boost::filesystem::path mtl_path(mtl_file); + auto _mtl_path = mtl_path.string().c_str(); + if (boost::filesystem::exists(mtl_path)) { + if (!ObjParser::mtlparse(_mtl_path, mtl_data)) { + BOOST_LOG_TRIVIAL(error) << "load_obj:load_mtl: failed to parse " << _mtl_path; + message = _L("load mtl in obj: failed to parse"); + return false; + } + } + else { + BOOST_LOG_TRIVIAL(error) << "load_obj: failed to load mtl_path:" << _mtl_path; + } + } + exist_mtl = true; + } // Count the faces and verify, that all faces are triangular. size_t num_faces = 0; size_t num_quads = 0; @@ -59,17 +79,27 @@ bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) i = j; } } - // Convert ObjData into indexed triangle set. indexed_triangle_set its; - size_t num_vertices = data.coordinates.size() / 4; + size_t num_vertices = data.coordinates.size() / OBJ_VERTEX_LENGTH; its.vertices.reserve(num_vertices); its.indices.reserve(num_faces + num_quads); + if (exist_mtl) { + obj_info.is_single_mtl = data.usemtls.size() == 1 && mtl_data.new_mtl_unmap.size() == 1; + obj_info.face_colors.reserve(num_faces + num_quads); + } + bool has_color = data.has_vertex_color; for (size_t i = 0; i < num_vertices; ++ i) { - size_t j = i << 2; + size_t j = i * OBJ_VERTEX_LENGTH; its.vertices.emplace_back(data.coordinates[j], data.coordinates[j + 1], data.coordinates[j + 2]); + if (data.has_vertex_color) { + RGBA color{std::clamp(data.coordinates[j + 3], 0.f, 1.f), std::clamp(data.coordinates[j + 4], 0.f, 1.f), std::clamp(data.coordinates[j + 5], 0.f, 1.f), + std::clamp(data.coordinates[j + 6], 0.f, 1.f)}; + obj_info.vertex_colors.emplace_back(color); + } } - int indices[4]; + int indices[ONE_FACE_SIZE]; + int uvs[ONE_FACE_SIZE]; for (size_t i = 0; i < data.vertices.size();) if (data.vertices[i].coordIdx == -1) ++ i; @@ -79,20 +109,77 @@ bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) if (const ObjParser::ObjVertex &vertex = data.vertices[i ++]; vertex.coordIdx == -1) { break; } else { - assert(cnt < 4); + assert(cnt < OBJ_VERTEX_LENGTH); if (vertex.coordIdx < 0 || vertex.coordIdx >= int(its.vertices.size())) { BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path << ". The file contains invalid vertex index."; message = _L("The file contains invalid vertex index."); return false; } - indices[cnt ++] = vertex.coordIdx; + indices[cnt] = vertex.coordIdx; + uvs[cnt] = vertex.textureCoordIdx; + cnt++; } if (cnt) { assert(cnt == 3 || cnt == 4); // Insert one or two faces (triangulate a quad). its.indices.emplace_back(indices[0], indices[1], indices[2]); - if (cnt == 4) + int face_index =its.indices.size() - 1; + RGBA face_color; + auto set_face_color = [&uvs, &data, &mtl_data, &obj_info, &face_color](int face_index, const std::string mtl_name) { + if (mtl_data.new_mtl_unmap.find(mtl_name) != mtl_data.new_mtl_unmap.end()) { + for (size_t n = 0; n < 3; n++) { + if (float(mtl_data.new_mtl_unmap[mtl_name]->Ka[n] + mtl_data.new_mtl_unmap[mtl_name]->Kd[n]) > 1.0) { + face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); + } + else { + face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Ka[n] + mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); + } + } + face_color[3] = 1.0; // default alpha + if (mtl_data.new_mtl_unmap[mtl_name]->map_Kd.size() > 0) { + auto png_name = mtl_data.new_mtl_unmap[mtl_name]->map_Kd; + obj_info.has_uv_png = true; + if (obj_info.pngs.find(png_name) == obj_info.pngs.end()) { obj_info.pngs[png_name] = false; } + obj_info.uv_map_pngs[face_index] = png_name; + } + if (data.textureCoordinates.size() > 0) { + Vec2f uv0(data.textureCoordinates[uvs[0] * 2], data.textureCoordinates[uvs[0] * 2 + 1]); + Vec2f uv1(data.textureCoordinates[uvs[1] * 2], data.textureCoordinates[uvs[1] * 2 + 1]); + Vec2f uv2(data.textureCoordinates[uvs[2] * 2], data.textureCoordinates[uvs[2] * 2 + 1]); + std::array uv_array{uv0, uv1, uv2}; + obj_info.uvs.emplace_back(uv_array); + } + obj_info.face_colors.emplace_back(face_color); + } + }; + auto set_face_color_by_mtl = [&data, &set_face_color](int face_index) { + if (data.usemtls.size() == 1) { + set_face_color(face_index, data.usemtls[0].name); + } else { + for (size_t k = 0; k < data.usemtls.size(); k++) { + auto mtl = data.usemtls[k]; + if (mtl.vertexIdxEnd == -1 && face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)) { + set_face_color(face_index, data.usemtls[k].name); + break; + } else if (mtl.vertexIdxEnd != -1 && + face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE) + && face_index < (mtl.vertexIdxEnd / ONE_FACE_SIZE)) { + set_face_color(face_index, data.usemtls[k].name); + break; + } + } + } + }; + if (exist_mtl) { + set_face_color_by_mtl(face_index); + } + if (cnt == 4) { its.indices.emplace_back(indices[0], indices[2], indices[3]); + int face_index = its.indices.size() - 1; + if (exist_mtl) { + set_face_color_by_mtl(face_index); + } + } } } @@ -107,12 +194,12 @@ bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) return true; } -bool load_obj(const char *path, Model *model, std::string &message, const char *object_name_in) +bool load_obj(const char *path, Model *model, ObjInfo& obj_info, std::string &message, const char *object_name_in) { TriangleMesh mesh; - - bool ret = load_obj(path, &mesh, message); - + + bool ret = load_obj(path, &mesh, obj_info, message); + if (ret) { std::string object_name; if (object_name_in == nullptr) { @@ -120,10 +207,9 @@ bool load_obj(const char *path, Model *model, std::string &message, const char * object_name.assign((last_slash == nullptr) ? path : last_slash + 1); } else object_name.assign(object_name_in); - model->add_object(object_name.c_str(), path, std::move(mesh)); } - + return ret; } diff --git a/src/libslic3r/Format/OBJ.hpp b/src/libslic3r/Format/OBJ.hpp index e9a3817e43..9b618bd27f 100644 --- a/src/libslic3r/Format/OBJ.hpp +++ b/src/libslic3r/Format/OBJ.hpp @@ -1,15 +1,27 @@ #ifndef slic3r_Format_OBJ_hpp_ #define slic3r_Format_OBJ_hpp_ - +#include "libslic3r/Color.hpp" +#include namespace Slic3r { class TriangleMesh; class Model; class ModelObject; - +typedef std::function &input_colors, bool is_single_color, std::vector &filament_ids, unsigned char &first_extruder_id)> ObjImportColorFn; // Load an OBJ file into a provided model. -extern bool load_obj(const char *path, TriangleMesh *mesh, std::string &message); -extern bool load_obj(const char *path, Model *model, std::string &message, const char *object_name = nullptr); +struct ObjInfo { + std::vector vertex_colors; + std::vector face_colors; + bool is_single_mtl{false}; + std::vector> uvs; + std::string obj_dircetory; + std::map pngs; + std::unordered_map uv_map_pngs; + bool has_uv_png{false}; + +}; +extern bool load_obj(const char *path, TriangleMesh *mesh, ObjInfo &vertex_colors, std::string &message); +extern bool load_obj(const char *path, Model *model, ObjInfo &vertex_colors, std::string &message, const char *object_name = nullptr); extern bool store_obj(const char *path, TriangleMesh *mesh); extern bool store_obj(const char *path, ModelObject *model); diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index 16a3f84ddb..c33ee3bfbc 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -9,16 +9,12 @@ #include "libslic3r/LocalesUtils.hpp" namespace ObjParser { - +#define EATWS() while (*line == ' ' || *line == '\t') ++line static bool obj_parseline(const char *line, ObjData &data) { -#define EATWS() while (*line == ' ' || *line == '\t') ++ line - if (*line == 0) return true; - assert(Slic3r::is_decimal_separator_point()); - // Ignore whitespaces at the beginning of the line. //FIXME is this a good idea? EATWS(); @@ -55,19 +51,19 @@ static bool obj_parseline(const char *line, ObjData &data) line = endptr; EATWS(); } - double w = 0; + /*double w = 0; if (*line != 0) { w = strtod(line, &endptr); if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; line = endptr; EATWS(); - } + }*/ if (*line != 0) return false; data.textureCoordinates.push_back((float)u); data.textureCoordinates.push_back((float)v); - data.textureCoordinates.push_back((float)w); + //data.textureCoordinates.push_back((float)w); break; } case 'n': @@ -156,23 +152,46 @@ static bool obj_parseline(const char *line, ObjData &data) return false; line = endptr; EATWS(); - double w = 1.0; - if (*line != 0) { - w = strtod(line, &endptr); - if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) - return false; - line = endptr; - EATWS(); + double color_x = 0.0, color_y = 0.0, color_z = 0.0, color_w = 0.0;//undefine color + if (*line != 0) { + if (!data.has_vertex_color) { + data.has_vertex_color = true; + } + color_x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + color_y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + color_z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + color_w = 1.0;//default define alpha = 1.0 + if (*line != 0) { + color_w = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + } } // the following check is commented out because there may be obj files containing extra data, as those generated by Meshlab, // see https://dev.prusa3d.com/browse/SPE-1019 for an example, - // and this would lead to a crash because no vertex would be stored + // and this would lead to a crash because no vertex would be stored // if (*line != 0) // return false; data.coordinates.push_back((float)x); data.coordinates.push_back((float)y); data.coordinates.push_back((float)z); - data.coordinates.push_back((float)w); + data.coordinates.push_back((float) color_x); + data.coordinates.push_back((float) color_y); + data.coordinates.push_back((float) color_z); + data.coordinates.push_back((float) color_w); break; } } @@ -263,6 +282,9 @@ static bool obj_parseline(const char *line, ObjData &data) // usemtl [material name] // printf("usemtl %s\r\n", line); EATWS(); + if (data.usemtls.size()>0) { + data.usemtls.back().vertexIdxEnd = (int) data.vertices.size(); + } ObjUseMtl usemtl; usemtl.vertexIdxFirst = (int)data.vertices.size(); usemtl.name = line; @@ -323,6 +345,191 @@ static bool obj_parseline(const char *line, ObjData &data) return true; } +static std::string cur_mtl_name = ""; +static bool mtl_parseline(const char *line, MtlData &data) +{ + if (*line == 0) return true; + assert(Slic3r::is_decimal_separator_point()); + // Ignore whitespaces at the beginning of the line. + // FIXME is this a good idea? + EATWS(); + + char c1 = *line++; + switch (c1) { + case '#': {// Comment, ignore the rest of the line. + break; + } + case 'n': { + if (*(line++) != 'e' || *(line++) != 'w' || *(line++) != 'm' || *(line++) != 't' || *(line++) != 'l') + return false; + EATWS(); + ObjNewMtl new_mtl; + cur_mtl_name = line; + data.new_mtl_unmap[cur_mtl_name] = std::make_shared(); + break; + } + case 'm': { + if (*(line++) != 'a' || *(line++) != 'p' || *(line++) != '_' || *(line++) != 'K' || *(line++) != 'd') return false; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->map_Kd = line; + } + break; + } + case 'N': { + char cur_char = *(line++); + if (cur_char == 's') { + EATWS(); + char * endptr = 0; + double ns = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ns = (float) ns; + } + } else if (cur_char == 'i') { + EATWS(); + char * endptr = 0; + double ni = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ni = (float) ni; + } + } + break; + } + case 'K': { + char cur_char = *(line++); + if (cur_char == 'a') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ka[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Ka[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Ka[2] = z; + } + } else if (cur_char == 'd') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Kd[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Kd[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Kd[2] = z; + } + } else if (cur_char == 's') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ks[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Ks[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Ks[2] = z; + } + } else if (cur_char == 'e') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ke[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Ke[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Ke[2] = z; + } + } + break; + } + case 'i': { + if (*(line++) != 'l' || *(line++) != 'l' || *(line++) != 'u' || *(line++) != 'm') + return false; + EATWS(); + char * endptr = 0; + double illum = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->illum = (float) illum; + } + break; + } + case 'd': { + EATWS(); + char * endptr = 0; + double d = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->d = (float) d; + } + break; + } + case 'T': { + if (*(line++) != 'f') + return false; + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) + return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) + return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Tf[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Tf[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Tf[2] = z; + } + break; + } + } + return true; +} bool objparse(const char *path, ObjData &data) { @@ -369,10 +576,52 @@ bool objparse(const char *path, ObjData &data) return true; } +bool mtlparse(const char *path, MtlData &data) +{ + Slic3r::CNumericLocalesSetter locales_setter; + + FILE *pFile = boost::nowide::fopen(path, "rt"); + if (pFile == 0) return false; + cur_mtl_name = ""; + try { + char buf[65536 * 2]; + size_t len = 0; + size_t lenPrev = 0; + while ((len = ::fread(buf + lenPrev, 1, 65536, pFile)) != 0) { + len += lenPrev; + size_t lastLine = 0; + for (size_t i = 0; i < len; ++i) + if (buf[i] == '\r' || buf[i] == '\n') { + buf[i] = 0; + char *c = buf + lastLine; + while (*c == ' ' || *c == '\t') ++c; + // FIXME check the return value and exit on error? + // Will it break parsing of some obj files? + mtl_parseline(c, data); + lastLine = i + 1; + } + lenPrev = len - lastLine; + if (lenPrev > 65536) { + BOOST_LOG_TRIVIAL(error) << "MtlParser: Excessive line length"; + ::fclose(pFile); + return false; + } + memmove(buf, buf + lastLine, lenPrev); + } + } catch (std::bad_alloc &) { + BOOST_LOG_TRIVIAL(error) << "MtlParser: Out of memory"; + } + ::fclose(pFile); + + // printf("vertices: %d\r\n", data.vertices.size() / 4); + // printf("coords: %d\r\n", data.coordinates.size()); + return true; +} + bool objparse(std::istream &stream, ObjData &data) { Slic3r::CNumericLocalesSetter locales_setter; - + try { char buf[65536 * 2]; size_t len = 0; diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5f3f010e4a..3d51bc1ddc 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -3,6 +3,8 @@ #include #include +#include +#include #include namespace ObjParser { @@ -16,22 +18,36 @@ struct ObjVertex inline bool operator==(const ObjVertex &v1, const ObjVertex &v2) { - return - v1.coordIdx == v2.coordIdx && - v1.textureCoordIdx == v2.textureCoordIdx && + return v1.coordIdx == v2.coordIdx && + v1.textureCoordIdx == v2.textureCoordIdx && v1.normalIdx == v2.normalIdx; } struct ObjUseMtl { int vertexIdxFirst; + int vertexIdxEnd{-1}; std::string name; }; +struct ObjNewMtl +{ + std::string name; + float Ns; + float Ni; + float d; + float illum; + std::array Tf; + std::array Ka; + std::array Kd; + std::array Ks; + std::array Ke; + std::string map_Kd;//defalut png +}; + inline bool operator==(const ObjUseMtl &v1, const ObjUseMtl &v2) { - return - v1.vertexIdxFirst == v2.vertexIdxFirst && + return v1.vertexIdxFirst == v2.vertexIdxFirst && v1.name.compare(v2.name) == 0; } @@ -56,8 +72,7 @@ struct ObjGroup inline bool operator==(const ObjGroup &v1, const ObjGroup &v2) { - return - v1.vertexIdxFirst == v2.vertexIdxFirst && + return v1.vertexIdxFirst == v2.vertexIdxFirst && v1.name.compare(v2.name) == 0; } @@ -69,17 +84,19 @@ struct ObjSmoothingGroup inline bool operator==(const ObjSmoothingGroup &v1, const ObjSmoothingGroup &v2) { - return - v1.vertexIdxFirst == v2.vertexIdxFirst && + return v1.vertexIdxFirst == v2.vertexIdxFirst && v1.smoothingGroupID == v2.smoothingGroupID; } - +#define OBJ_VERTEX_COLOR_ALPHA 6 +#define OBJ_VERTEX_LENGTH 7 // x, y, z, color_x,color_y,color_z,color_w +#define ONE_FACE_SIZE 4//ONE_FACE format: f 8/4/6 7/3/6 6/2/6 -1/-1/-1 struct ObjData { // Version of the data structure for load / store in the private binary format. int version; - // x, y, z, w + // x, y, z, color_x,color_y,color_z,color_w std::vector coordinates; + bool has_vertex_color{false}; // u, v, w std::vector textureCoordinates; // x, y, z @@ -97,7 +114,14 @@ struct ObjData { std::vector vertices; }; +struct MtlData +{ + // Version of the data structure for load / store in the private binary format. + int version; + std::unordered_map> new_mtl_unmap; +}; extern bool objparse(const char *path, ObjData &data); +extern bool mtlparse(const char *path, MtlData &data); extern bool objparse(std::istream &stream, ObjData &data); extern bool objbinsave(const char *path, const ObjData &data); diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index d4b1af8bee..69d16ba9de 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -12,9 +12,6 @@ #include "TriangleSelector.hpp" #include "Format/AMF.hpp" -#include "Format/OBJ.hpp" -#include "Format/STL.hpp" -#include "Format/STEP.hpp" #include "Format/svg.hpp" // BBS #include "FaceDetector.hpp" @@ -50,6 +47,9 @@ #define _L(s) Slic3r::I18N::translate(s) namespace Slic3r { +const std::vector CONST_FILAMENTS = { + "", "4", "8", "0C", "1C", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "AC", "BC", "CC", "DC", +}; // 5 10 15 16 // BBS initialization of static variables std::map Model::extruderParamsMap = { {0,{"",0,0}}}; GlobalSpeedMap Model::printSpeedMap{}; @@ -172,7 +172,12 @@ Model::~Model() // Loading model from a file, it may be a simple geometry file as STL or OBJ, however it may be a project file as well. Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* config, ConfigSubstitutionContext* config_substitutions, LoadStrategy options, PlateDataPtrs* plate_data, std::vector* project_presets, bool *is_xxx, Semver* file_version, Import3mfProgressFn proFn, - ImportstlProgressFn stlFn, ImportStepProgressFn stepFn, StepIsUtf8Fn stepIsUtf8Fn, BBLProject* project, int plate_id) + ImportstlProgressFn stlFn, + ImportStepProgressFn stepFn, + StepIsUtf8Fn stepIsUtf8Fn, + BBLProject * project, + int plate_id, + ObjImportColorFn objFn) { Model model; @@ -203,8 +208,49 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c result = load_stl(input_file.c_str(), &model, nullptr, stlFn); else if (boost::algorithm::iends_with(input_file, ".oltp")) result = load_stl(input_file.c_str(), &model, nullptr, stlFn,256); - else if (boost::algorithm::iends_with(input_file, ".obj")) - result = load_obj(input_file.c_str(), &model, message); + else if (boost::algorithm::iends_with(input_file, ".obj")) { + ObjInfo obj_info; + result = load_obj(input_file.c_str(), &model, obj_info, message); + if (result){ + unsigned char first_extruder_id; + if (obj_info.vertex_colors.size() > 0) { + std::vector vertex_filament_ids; + if (objFn) { // 1.result is ok and pop up a dialog + objFn(obj_info.vertex_colors, false, vertex_filament_ids, first_extruder_id); + if (vertex_filament_ids.size() > 0) { + result = obj_import_vertex_color_deal(vertex_filament_ids, first_extruder_id, & model); + } + } else { // test //todo delete + vertex_filament_ids.push_back(2); + vertex_filament_ids.push_back(3); + vertex_filament_ids.push_back(4); + vertex_filament_ids.push_back(1); // 4 + vertex_filament_ids.push_back(1); + vertex_filament_ids.push_back(1); + vertex_filament_ids.push_back(1); + vertex_filament_ids.push_back(1); // 8 + result = obj_import_vertex_color_deal(vertex_filament_ids, first_extruder_id, &model); + } + } else if (obj_info.face_colors.size() > 0 && obj_info.has_uv_png == false) { // mtl file + std::vector face_filament_ids; + if (objFn) { // 1.result is ok and pop up a dialog + objFn(obj_info.face_colors, obj_info.is_single_mtl, face_filament_ids, first_extruder_id); + if (face_filament_ids.size() > 0) { + result = obj_import_face_color_deal(face_filament_ids, first_extruder_id, &model); + } + } + } else if (obj_info.has_uv_png && obj_info.uvs.size() > 0) { + boost::filesystem::path full_path(input_file); + std::string obj_directory = full_path.parent_path().string(); + obj_info.obj_dircetory = obj_directory; + result = false; + message = _L("Importing obj with png function is developing."); + } else { + result = false; + message = _L("Importing obj occurred an unknown error."); + } + } + } else if (boost::algorithm::iends_with(input_file, ".svg")) result = load_svg(input_file.c_str(), &model, message); //BBS: remove the old .amf.xml files @@ -3394,6 +3440,163 @@ void Model::setExtruderParams(const DynamicPrintConfig& config, int extruders_co } } +static void get_real_filament_id(const unsigned char &id, std::string &result) { + if (id < CONST_FILAMENTS.size()) { + result = CONST_FILAMENTS[id]; + } else { + result = "";//error + } +}; + +bool Model::obj_import_vertex_color_deal(const std::vector &vertex_filament_ids, const unsigned char &first_extruder_id, Model *model) +{ + if (vertex_filament_ids.size() == 0) { + return false; + } + // 2.generate mmu_segmentation_facets + if (model->objects.size() == 1 ) { + auto obj = model->objects[0]; + obj->config.set("extruder", first_extruder_id); + if (obj->volumes.size() == 1) { + enum VertexColorCase { + _3_SAME_COLOR, + _3_DIFF_COLOR, + _2_SAME_1_DIFF_COLOR, + }; + auto calc_vertex_color_case = [](const unsigned char &c0, const unsigned char &c1, const unsigned char &c2, VertexColorCase &vertex_color_case, + unsigned char &iso_index) { + if (c0 == c1 && c1 == c2) { + vertex_color_case = VertexColorCase::_3_SAME_COLOR; + } else if (c0 != c1 && c1 != c2 && c0 != c2) { + vertex_color_case = VertexColorCase::_3_DIFF_COLOR; + } else if (c0 == c1) { + vertex_color_case = _2_SAME_1_DIFF_COLOR; + iso_index = 2; + } else if (c1 == c2) { + vertex_color_case = _2_SAME_1_DIFF_COLOR; + iso_index = 0; + } else if (c0 == c2) { + vertex_color_case = _2_SAME_1_DIFF_COLOR; + iso_index = 1; + } else { + std::cout << "error"; + } + }; + auto calc_tri_area = [](const Vec3f &v0, const Vec3f &v1, const Vec3f &v2) { + return std::abs((v0 - v1).cross(v0 - v2).norm()) / 2; + }; + auto volume = obj->volumes[0]; + volume->config.set("extruder", first_extruder_id); + auto face_count = volume->mesh().its.indices.size(); + volume->mmu_segmentation_facets.reserve(face_count); + if (volume->mesh().its.vertices.size() != vertex_filament_ids.size()) { + return false; + } + for (size_t i = 0; i < volume->mesh().its.indices.size(); i++) { + auto face = volume->mesh().its.indices[i]; + auto filament_id0 = vertex_filament_ids[face[0]]; + auto filament_id1 = vertex_filament_ids[face[1]]; + auto filament_id2 = vertex_filament_ids[face[2]]; + if (filament_id0 <= 1 && filament_id1 <= 1 && filament_id2 <= 2) { + continue; + } + if (i == 0) { + std::cout << ""; + } + VertexColorCase vertex_color_case; + unsigned char iso_index; + calc_vertex_color_case(filament_id0, filament_id1, filament_id2, vertex_color_case, iso_index); + switch (vertex_color_case) { + case _3_SAME_COLOR: { + std::string result; + get_real_filament_id(filament_id0, result); + volume->mmu_segmentation_facets.set_triangle_from_string(i, result); + break; + } + case _3_DIFF_COLOR: { + std::string result0, result1, result2; + get_real_filament_id(filament_id0, result0); + get_real_filament_id(filament_id1, result1); + get_real_filament_id(filament_id2, result2); + + auto v0 = volume->mesh().its.vertices[face[0]]; + auto v1 = volume->mesh().its.vertices[face[1]]; + auto v2 = volume->mesh().its.vertices[face[2]]; + auto dir_0_1 = (v1 - v0).normalized(); + auto dir_0_2 = (v2 - v0).normalized(); + float sita0 = acos(dir_0_1.dot(dir_0_2)); + auto dir_1_0 = -dir_0_1; + auto dir_1_2 = (v2 - v1).normalized(); + float sita1 = acos(dir_1_0.dot(dir_1_2)); + float sita2 = PI - sita0 - sita1; + std::array sitas = {sita0, sita1, sita2}; + float max_sita = sitas[0]; + int max_sita_vertex_index = 0; + for (size_t j = 1; j < sitas.size(); j++) { + if (sitas[j] > max_sita) { + max_sita_vertex_index = j; + max_sita = sitas[j]; + } + } + if (max_sita_vertex_index == 0) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result2 + (result1 + result2 + "5" )+ "3"); //"1C0C2C0C1C13" + } else if (max_sita_vertex_index == 1) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result2 + (result0 + result2 + "9") + "3"); + } else{// if (max_sita_vertex_index == 2) + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result2 + (result1 + result0 + "1") + "3"); + } + break; + } + case _2_SAME_1_DIFF_COLOR: { + std::string result0, result1, result2; + get_real_filament_id(filament_id0, result0); + get_real_filament_id(filament_id1, result1); + get_real_filament_id(filament_id2, result2); + if (iso_index == 0) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result1 + "2"); + } else if (iso_index == 1) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result1 + result0 + result0 + "6"); + } else if (iso_index == 2) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result2 + result0 + result0 + "A"); + } + break; + } + default: break; + } + } + return true; + } + } + return false; +} + +bool Model::obj_import_face_color_deal(const std::vector &face_filament_ids, const unsigned char &first_extruder_id, Model *model) +{ + if (face_filament_ids.size() == 0) { return false; } + // 2.generate mmu_segmentation_facets + if (model->objects.size() == 1) { + auto obj = model->objects[0]; + obj->config.set("extruder", first_extruder_id); + if (obj->volumes.size() == 1) { + auto volume = obj->volumes[0]; + volume->config.set("extruder", first_extruder_id); + auto face_count = volume->mesh().its.indices.size(); + volume->mmu_segmentation_facets.reserve(face_count); + if (volume->mesh().its.indices.size() != face_filament_ids.size()) { return false; } + for (size_t i = 0; i < volume->mesh().its.indices.size(); i++) { + auto face = volume->mesh().its.indices[i]; + auto filament_id = face_filament_ids[i]; + if (filament_id <= 1) { continue; } + std::string result; + get_real_filament_id(filament_id, result); + volume->mmu_segmentation_facets.set_triangle_from_string(i, result); + } + return true; + } + } + return false; +} + // update the maxSpeed of an object if it is different from the global configuration double Model::findMaxSpeed(const ModelObject* object) { auto objectKeys = object->config.keys(); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 7d3cc18201..e484fb024e 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -20,6 +20,7 @@ #include "Format/STEP.hpp" //BBS: add stl #include "Format/STL.hpp" +#include "Format/OBJ.hpp" #include "Calib.hpp" @@ -1569,8 +1570,16 @@ class Model final : public ObjectBase DynamicPrintConfig* config = nullptr, ConfigSubstitutionContext* config_substitutions = nullptr, LoadStrategy options = LoadStrategy::AddDefaultInstances, PlateDataPtrs* plate_data = nullptr, std::vector* project_presets = nullptr, bool* is_xxx = nullptr, Semver* file_version = nullptr, Import3mfProgressFn proFn = nullptr, - ImportstlProgressFn stlFn = nullptr, ImportStepProgressFn stepFn = nullptr, StepIsUtf8Fn stepIsUtf8Fn = nullptr, BBLProject* project = nullptr, int plate_id = 0); + ImportstlProgressFn stlFn = nullptr, + ImportStepProgressFn stepFn = nullptr, + StepIsUtf8Fn stepIsUtf8Fn = nullptr, + BBLProject * project = nullptr, + int plate_id = 0, + ObjImportColorFn objFn = nullptr + ); // BBS + static bool obj_import_vertex_color_deal(const std::vector &vertex_filament_ids, const unsigned char &first_extruder_id, Model *model); + static bool obj_import_face_color_deal(const std::vector &face_filament_ids, const unsigned char &first_extruder_id, Model *model); static double findMaxSpeed(const ModelObject* object); static double getThermalLength(const ModelVolume* modelVolumePtr); static double getThermalLength(const std::vector modelVolumePtrs); diff --git a/src/libslic3r/ObjColorUtils.hpp b/src/libslic3r/ObjColorUtils.hpp new file mode 100644 index 0000000000..2e8565e42d --- /dev/null +++ b/src/libslic3r/ObjColorUtils.hpp @@ -0,0 +1,187 @@ +#pragma once +#include +#include + +#include "opencv2/opencv.hpp" + +class QuantKMeans +{ +public: + int m_alpha_thres; + cv::Mat m_flatten_labels; + cv::Mat m_centers8UC3; + QuantKMeans(int alpha_thres = 10) : m_alpha_thres(alpha_thres) {} + void apply(cv::Mat &ori_image, cv::Mat &new_image, int num_cluster, int color_space) + { + cv::Mat image; + convert_color_space(ori_image, image, color_space); + cv::Mat flatten_image = flatten(image); + + apply(flatten_image, num_cluster, color_space); + replace_centers(ori_image, new_image); + } + void apply_aplha(cv::Mat &ori_image, cv::Mat &new_image, int num_cluster, int color_space) + { + // cout << " *** DoAlpha *** " << endl; + cv::Mat flatten_image8UC3 = flatten_alpha(ori_image); + cv::Mat image8UC3; + convert_color_space(flatten_image8UC3, image8UC3, color_space); + cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); + for (int i = 0; i < image8UC3.rows; i++) image32FC3.at(i, 0) = image8UC3.at(i, 0); + + apply(image32FC3, num_cluster, color_space); + repalce_centers_aplha(ori_image, new_image); + } + void apply(cv::Mat &flatten_image, int num_cluster, int color_space) + { + cv::Mat centers32FC3; + num_cluster = fmin(flatten_image.rows, num_cluster); + kmeans(flatten_image, num_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, + centers32FC3); + this->m_centers8UC3 = cv::Mat(num_cluster, 1, CV_8UC3); + for (int i = 0; i < num_cluster; i++) this->m_centers8UC3.at(i) = centers32FC3.at(i); + + convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true); + } + + void apply(const std::vector> &ori_colors, + std::vector> & cluster_results, + std::vector & labels, + int num_cluster = -1, + int color_space = 2) + { + // 0~255 + cv::Mat flatten_image8UC3 = flatten_vector(ori_colors); + + cv::Mat image8UC3; + convert_color_space(flatten_image8UC3, image8UC3, color_space); + + cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); + for (int i = 0; i < image8UC3.rows; i++) image32FC3.at(i, 0) = image8UC3.at(i, 0); + + int best_cluster = 1, cur_score = 0, best_score = 100; + int max_cluster = ori_colors.size(); + num_cluster = fmin(num_cluster, max_cluster); + if (num_cluster < 1) { + cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); + best_score = cur_score; + for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) { + if (cur_cluster > max_cluster) break; + cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, + cv::KMEANS_PP_CENTERS); + best_cluster = cur_score < best_score ? cur_cluster : best_cluster; + best_score = cur_score < best_score ? cur_score : best_score; + } + } else + best_cluster = num_cluster; + + cv::Mat centers32FC3; + kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, + centers32FC3); + this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3); + for (int i = 0; i < best_cluster; i++) this->m_centers8UC3.at(i) = centers32FC3.at(i); + + convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true); + + cluster_results.clear(); + labels.clear(); + for (int i = 0; i < ori_colors.size(); i++) + labels.emplace_back(this->m_flatten_labels.at(i, 0)); + for (int i = 0; i < best_cluster; i++) { + cv::Vec3f center = this->m_centers8UC3.at(i, 0); + cluster_results.emplace_back(std::array{center[0] / 255.f, center[1] / 255.f, center[2] / 255.f, 1.f}); + } + } + + void replace_centers(cv::Mat &ori_image, cv::Mat &new_image) + { + for (int i = 0; i < ori_image.rows; i++) { + for (int j = 0; j < ori_image.cols; j++) { + int idx = this->m_flatten_labels.at(i * ori_image.cols + j, 0); + cv::Vec3b pixel = this->m_centers8UC3.at(idx); + new_image.at(i, j) = pixel; + } + } + } + void repalce_centers_aplha(cv::Mat &ori_image, cv::Mat &new_image) + { + int cnt = 0; + int idx; + cv::Vec3b center; + for (int i = 0; i < ori_image.rows; i++) { + for (int j = 0; j < ori_image.cols; j++) { + cv::Vec4b pixel = ori_image.at(i, j); + if ((int) pixel[3] < this->m_alpha_thres) + new_image.at(i, j) = pixel; + else { + idx = this->m_flatten_labels.at(cnt++, 0); + center = this->m_centers8UC3.at(idx); + new_image.at(i, j) = cv::Vec4b(center[0], center[1], center[2], pixel[3]); + } + } + } + } + + void convert_color_space(cv::Mat &ori_image, cv::Mat &image, int color_space, bool reverse = false) + { + switch (color_space) { + case 0: image = ori_image; break; + case 1: + if (reverse) + cvtColor(ori_image, image, cv::COLOR_HSV2BGR); + else + cvtColor(ori_image, image, cv::COLOR_BGR2HSV); + break; + case 2: + if (reverse) + cvtColor(ori_image, image, cv::COLOR_Lab2BGR); + else + cvtColor(ori_image, image, cv::COLOR_BGR2Lab); + break; + default: break; + } + } + + cv::Mat flatten(cv::Mat &image) + { + int num_pixels = image.rows * image.cols; + cv::Mat img(num_pixels, 1, CV_32FC3); + for (int i = 0; i < image.rows; i++) { + for (int j = 0; j < image.cols; j++) { + cv::Vec3f pixel = image.at(i, j); + img.at(i * image.cols + j, 0) = pixel; + } + } + return img; + } + cv::Mat flatten_alpha(cv::Mat &image) + { + int num_pixels = image.rows * image.cols; + for (int i = 0; i < image.rows; i++) + for (int j = 0; j < image.cols; j++) { + cv::Vec4b pixel = image.at(i, j); + if ((int) pixel[3] < this->m_alpha_thres) num_pixels--; + } + + cv::Mat img(num_pixels, 1, CV_8UC3); + int cnt = 0; + for (int i = 0; i < image.rows; i++) { + for (int j = 0; j < image.cols; j++) { + cv::Vec4b pixel = image.at(i, j); + if ((int) pixel[3] >= this->m_alpha_thres) img.at(cnt++, 0) = cv::Vec3b(pixel[0], pixel[1], pixel[2]); + } + } + return img; + } + cv::Mat flatten_vector(const std::vector> &ori_colors) + { + int num_pixels = ori_colors.size(); + + cv::Mat image8UC3(num_pixels, 1, CV_8UC3); + for (int i = 0; i < num_pixels; i++) { + std::array pixel = ori_colors[i]; + image8UC3.at(i, 0) = cv::Vec3b((int) (pixel[0] * 255.f), (int) (pixel[1] * 255.f), (int) (pixel[2] * 255.f)); + } + return image8UC3; + } +}; diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index f4696cc0f7..6477434310 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -283,6 +283,8 @@ set(SLIC3R_GUI_SOURCES GUI/CameraUtils.hpp GUI/wxExtensions.cpp GUI/wxExtensions.hpp + GUI/ObjColorDialog.cpp + GUI/ObjColorDialog.hpp GUI/WipeTowerDialog.cpp GUI/WipeTowerDialog.hpp GUI/RemovableDriveManager.cpp diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp new file mode 100644 index 0000000000..25cdca57b8 --- /dev/null +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -0,0 +1,824 @@ +#include +#include +//#include "libslic3r/FlushVolCalc.hpp" +#include "ObjColorDialog.hpp" +#include "BitmapCache.hpp" +#include "GUI.hpp" +#include "I18N.hpp" +#include "GUI_App.hpp" +#include "MsgDialog.hpp" +#include "Widgets/Button.hpp" +#include "slic3r/Utils/ColorSpaceConvert.hpp" +#include "MainFrame.hpp" +#include "libslic3r/Config.hpp" +#include "BitmapComboBox.hpp" +#include "Widgets/ComboBox.hpp" +#include + +#include "libslic3r/ObjColorUtils.hpp" + +using namespace Slic3r; +using namespace Slic3r::GUI; + +int objcolor_scale(const int val) { return val * Slic3r::GUI::wxGetApp().em_unit() / 10; } +int OBJCOLOR_ITEM_WIDTH() { return objcolor_scale(30); } +static const wxColour g_text_color = wxColour(107, 107, 107, 255); +const int HEADER_BORDER = 5; +const int CONTENT_BORDER = 3; +const int PANEL_WIDTH = 320; +const int COLOR_LABEL_WIDTH = 150; +#define ICON_SIZE wxSize(FromDIP(16), FromDIP(16)) +#define MIN_OBJCOLOR_DIALOG_WIDTH FromDIP(530) +#define FIX_SCROLL_HEIGTH FromDIP(400) +#define BTN_SIZE wxSize(FromDIP(58), FromDIP(24)) +#define BTN_GAP FromDIP(20) + +static void update_ui(wxWindow* window) +{ + Slic3r::GUI::wxGetApp().UpdateDarkUI(window); +} + +static const char g_min_cluster_color = 1; +//static const char g_max_cluster_color = 15; +static const char g_max_color = 16; +const StateColor ok_btn_bg(std::pair(wxColour(27, 136, 68), StateColor::Pressed), + std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); +const StateColor ok_btn_disable_bg(std::pair(wxColour(205, 201, 201), StateColor::Pressed), + std::pair(wxColour(205, 201, 201), StateColor::Hovered), + std::pair(wxColour(205, 201, 201), StateColor::Normal)); +wxBoxSizer* ObjColorDialog::create_btn_sizer(long flags) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_sizer->AddStretchSpacer(); + + StateColor ok_btn_bd( + std::pair(wxColour(0, 174, 66), StateColor::Normal) + ); + StateColor ok_btn_text( + std::pair(wxColour(255, 255, 254), StateColor::Normal) + ); + StateColor cancel_btn_bg( + std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(wxColour(255, 255, 255), StateColor::Normal) + ); + StateColor cancel_btn_bd_( + std::pair(wxColour(38, 46, 48), StateColor::Normal) + ); + StateColor cancel_btn_text( + std::pair(wxColour(38, 46, 48), StateColor::Normal) + ); + StateColor calc_btn_bg( + std::pair(wxColour(27, 136, 68), StateColor::Pressed), + std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal) + ); + StateColor calc_btn_bd( + std::pair(wxColour(0, 174, 66), StateColor::Normal) + ); + StateColor calc_btn_text( + std::pair(wxColour(255, 255, 254), StateColor::Normal) + ); + if (flags & wxOK) { + Button* ok_btn = new Button(this, _L("OK")); + ok_btn->SetMinSize(BTN_SIZE); + ok_btn->SetCornerRadius(FromDIP(12)); + ok_btn->Enable(false); + ok_btn->SetBackgroundColor(ok_btn_disable_bg); + ok_btn->SetBorderColor(ok_btn_bd); + ok_btn->SetTextColor(ok_btn_text); + ok_btn->SetFocus(); + ok_btn->SetId(wxID_OK); + btn_sizer->Add(ok_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, BTN_GAP); + m_button_list[wxOK] = ok_btn; + } + if (flags & wxCANCEL) { + Button* cancel_btn = new Button(this, _L("Cancel")); + cancel_btn->SetMinSize(BTN_SIZE); + cancel_btn->SetCornerRadius(FromDIP(12)); + cancel_btn->SetBackgroundColor(cancel_btn_bg); + cancel_btn->SetBorderColor(cancel_btn_bd_); + cancel_btn->SetTextColor(cancel_btn_text); + cancel_btn->SetId(wxID_CANCEL); + btn_sizer->Add(cancel_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, BTN_GAP); + m_button_list[wxCANCEL] = cancel_btn; + } + return btn_sizer; +} + +void ObjColorDialog::on_dpi_changed(const wxRect &suggested_rect) +{ + for (auto button_item : m_button_list) + { + if (button_item.first == wxRESET) + { + button_item.second->SetMinSize(wxSize(FromDIP(75), FromDIP(24))); + button_item.second->SetCornerRadius(FromDIP(12)); + } + if (button_item.first == wxOK) { + button_item.second->SetMinSize(BTN_SIZE); + button_item.second->SetCornerRadius(FromDIP(12)); + } + if (button_item.first == wxCANCEL) { + button_item.second->SetMinSize(BTN_SIZE); + button_item.second->SetCornerRadius(FromDIP(12)); + } + } + m_panel_ObjColor->msw_rescale(); + this->Refresh(); +}; + +ObjColorDialog::ObjColorDialog(wxWindow * parent, + std::vector & input_colors, + bool is_single_color, + const std::vector &extruder_colours, + std::vector & filament_ids, + unsigned char & first_extruder_id) + : DPIDialog(parent ? parent : static_cast(wxGetApp().mainframe), + wxID_ANY, + _(L("Obj file Import color")), + wxDefaultPosition, + wxDefaultSize, + wxDEFAULT_DIALOG_STYLE /* | wxRESIZE_BORDER*/) + , m_filament_ids(filament_ids) + , m_first_extruder_id(first_extruder_id) +{ + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % Slic3r::resources_dir()).str(); + SetIcon(wxIcon(Slic3r::encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + + this->SetBackgroundColour(*wxWHITE); + this->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, -1)); + + m_panel_ObjColor = new ObjColorPanel(this, input_colors, is_single_color, extruder_colours, filament_ids, first_extruder_id); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + // set min sizer width according to extruders count + auto sizer_width = (int) (2.8 * OBJCOLOR_ITEM_WIDTH()); + sizer_width = sizer_width > MIN_OBJCOLOR_DIALOG_WIDTH ? sizer_width : MIN_OBJCOLOR_DIALOG_WIDTH; + main_sizer->SetMinSize(wxSize(sizer_width, -1)); + main_sizer->Add(m_panel_ObjColor, 1, wxEXPAND | wxALL, 0); + + auto btn_sizer = create_btn_sizer(wxOK | wxCANCEL); + { + m_button_list[wxOK]->Bind(wxEVT_UPDATE_UI, ([this](wxUpdateUIEvent &e) { + if (m_panel_ObjColor->is_ok() == m_button_list[wxOK]->IsEnabled()) { return; } + m_button_list[wxOK]->Enable(m_panel_ObjColor->is_ok()); + m_button_list[wxOK]->SetBackgroundColor(m_panel_ObjColor->is_ok() ? ok_btn_bg : ok_btn_disable_bg); + })); + } + main_sizer->Add(btn_sizer, 0, wxBOTTOM | wxRIGHT | wxEXPAND, BTN_GAP); + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); + + if (this->FindWindowById(wxID_OK, this)) { + this->FindWindowById(wxID_OK, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {// if OK button is clicked.. + m_panel_ObjColor->update_filament_ids(); + EndModal(wxID_OK); + }, wxID_OK); + } + if (this->FindWindowById(wxID_CANCEL, this)) { + update_ui(static_cast(this->FindWindowById(wxID_CANCEL, this))); + this->FindWindowById(wxID_CANCEL, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxCANCEL); }); + } + this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) { EndModal(wxCANCEL); }); + + wxGetApp().UpdateDlgDarkUI(this); +} +RGBA convert_to_rgba(const wxColour &color) +{ + RGBA rgba; + rgba[0] = std::clamp(color.Red() / 255.f, 0.f, 1.f); + rgba[1] = std::clamp(color.Green() / 255.f, 0.f, 1.f); + rgba[2] = std::clamp(color.Blue() / 255.f, 0.f, 1.f); + rgba[3] = std::clamp(color.Alpha() / 255.f, 0.f, 1.f); + return rgba; +} +wxColour convert_to_wxColour(const RGBA &color) +{ + auto r = std::clamp((int) (color[0] * 255.f), 0, 255); + auto g = std::clamp((int) (color[1] * 255.f), 0, 255); + auto b = std::clamp((int) (color[2] * 255.f), 0, 255); + auto a = std::clamp((int) (color[3] * 255.f), 0, 255); + wxColour wx_color(r,g,b,a); + return wx_color; +} +// This panel contains all control widgets for both simple and advanced mode (these reside in separate sizers) +ObjColorPanel::ObjColorPanel(wxWindow * parent, + std::vector& input_colors, + bool is_single_color, + const std::vector& extruder_colours, + std::vector & filament_ids, + unsigned char & first_extruder_id) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize /*,wxBORDER_RAISED*/) + , m_input_colors(input_colors) + , m_filament_ids(filament_ids) + , m_first_extruder_id(first_extruder_id) +{ + if (input_colors.size() == 0) { return; } + for (const std::string& color : extruder_colours) { + m_colours.push_back(wxColor(color)); + } + //deal input_colors + m_input_colors_size = input_colors.size(); + for (size_t i = 0; i < input_colors.size(); i++) { + if (color_is_equal(input_colors[i] , UNDEFINE_COLOR)) { // not define color range:0~1 + input_colors[i]=convert_to_rgba( m_colours[0]); + } + } + if (is_single_color && input_colors.size() >=1) { + m_cluster_colors_from_algo.emplace_back(input_colors[0]); + m_cluster_colours.emplace_back(convert_to_wxColour(input_colors[0])); + m_cluster_labels_from_algo.reserve(m_input_colors_size); + for (size_t i = 0; i < m_input_colors_size; i++) { + m_cluster_labels_from_algo.emplace_back(0); + } + m_cluster_map_filaments.resize(m_cluster_colors_from_algo.size()); + m_color_num_recommend = m_color_cluster_num_by_algo = m_cluster_colors_from_algo.size(); + } else {//cluster deal + deal_algo(-1); + } + //end first cluster + //draw ui + auto sizer_width = FromDIP(300); + // Create two switched panels with their own sizers + m_sizer_simple = new wxBoxSizer(wxVERTICAL); + m_page_simple = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_page_simple->SetSizer(m_sizer_simple); + m_page_simple->SetBackgroundColour(*wxWHITE); + + update_ui(m_page_simple); + // BBS + m_sizer_simple->AddSpacer(FromDIP(10)); + // BBS: for tunning flush volumes + { + //color cluster results + wxBoxSizer * cluster_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *color_cluster_result_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Recommend number of colors:")); + color_cluster_result_title->SetFont(Label::Head_14); + cluster_sizer->Add(color_cluster_result_title, 0, wxALIGN_CENTER | wxALL, 0); + cluster_sizer->AddSpacer(FromDIP(5)); + + wxStaticText *color_cluster_result_value = new wxStaticText(m_page_simple, wxID_ANY, std::to_string(m_color_num_recommend).c_str()); + color_cluster_result_value->SetFont(Label::Head_14); + cluster_sizer->Add(color_cluster_result_value, 0, wxALIGN_CENTER | wxALL, 0); + cluster_sizer->AddSpacer(FromDIP(20)); + + wxBoxSizer * specify_cluster_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *specify_color_cluster_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Specify number of colors:")); + specify_color_cluster_title->SetFont(Label::Head_14); + specify_cluster_sizer->Add(specify_color_cluster_title, 0, wxALIGN_CENTER | wxALL, 0); + specify_cluster_sizer->AddSpacer(FromDIP(5)); + + m_color_cluster_num_by_user_ebox = new wxTextCtrl(m_page_simple, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(25), -1), wxTE_PROCESS_ENTER); + if (m_color_num_recommend == 1) { + m_color_cluster_num_by_user_ebox->Enable(false); + } + m_color_cluster_num_by_user_ebox->SetValue(std::to_string(m_color_cluster_num_by_algo).c_str()); + {//event + auto on_apply_color_cluster_text_modify = [this](wxEvent &e) { + wxString str = m_color_cluster_num_by_user_ebox->GetValue(); + int number = wxAtoi(str); + if (number > m_color_num_recommend || number < g_min_cluster_color) { + number = number < g_min_cluster_color ? g_min_cluster_color : m_color_num_recommend; + str = wxString::Format(("%d"), number); + m_color_cluster_num_by_user_ebox->SetValue(str); + MessageDialog dlg(nullptr, wxString::Format(_L("The color count should be in range [%d, %d]."), g_min_cluster_color, m_color_num_recommend), + _L("Warning"), wxICON_WARNING | wxOK); + dlg.ShowModal(); + } + e.Skip(); + }; + m_color_cluster_num_by_user_ebox->Bind(wxEVT_TEXT_ENTER, on_apply_color_cluster_text_modify); + m_color_cluster_num_by_user_ebox->Bind(wxEVT_KILL_FOCUS, on_apply_color_cluster_text_modify); + m_color_cluster_num_by_user_ebox->Bind(wxEVT_COMMAND_TEXT_UPDATED, [this](wxCommandEvent &) { + wxString str = m_color_cluster_num_by_user_ebox->GetValue(); + int number = wxAtof(str); + if (number > m_color_num_recommend || number < g_min_cluster_color) { + number = number < g_min_cluster_color ? g_min_cluster_color : m_color_num_recommend; + str = wxString::Format(("%d"), number); + m_color_cluster_num_by_user_ebox->SetValue(str); + m_color_cluster_num_by_user_ebox->SetInsertionPointEnd(); + } + if (m_last_cluster_num != number) { + deal_algo(number, true); + Layout(); + //Fit(); + Refresh(); + Update(); + m_last_cluster_num = number; + } + }); + m_color_cluster_num_by_user_ebox->Bind(wxEVT_CHAR, [this](wxKeyEvent &e) { + int keycode = e.GetKeyCode(); + wxString input_char = wxString::Format("%c", keycode); + long value; + if (!input_char.ToLong(&value)) + return; + e.Skip(); + }); + } + specify_cluster_sizer->Add(m_color_cluster_num_by_user_ebox, 0, wxALIGN_CENTER | wxALL, 0); + + m_sizer_simple->Add(cluster_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + m_sizer_simple->Add(specify_cluster_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + //colors table + m_scrolledWindow = new wxScrolledWindow(m_page_simple,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxSB_VERTICAL); + m_sizer_simple->Add(m_scrolledWindow, 0, wxEXPAND | wxALL, FromDIP(5)); + draw_table(); + //buttons + wxBoxSizer *quick_set_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *quick_set_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Quick set:")); + quick_set_sizer->Add(quick_set_title, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + + auto calc_approximate_match_btn_sizer = create_approximate_match_btn_sizer(m_page_simple); + auto calc_add_btn_sizer = create_add_btn_sizer(m_page_simple); + auto calc_reset_btn_sizer = create_reset_btn_sizer(m_page_simple); + quick_set_sizer->Add(calc_add_btn_sizer, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + quick_set_sizer->Add(calc_approximate_match_btn_sizer, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + quick_set_sizer->Add(calc_reset_btn_sizer, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + m_sizer_simple->Add(quick_set_sizer, 0, wxEXPAND | wxLEFT, FromDIP(30)); + + wxBoxSizer *warning_sizer = new wxBoxSizer(wxHORIZONTAL); + m_warning_text = new wxStaticText(m_page_simple, wxID_ANY, ""); + warning_sizer->Add(m_warning_text, 0, wxALIGN_CENTER | wxALL, 0); + m_sizer_simple->Add(warning_sizer, 0, wxEXPAND | wxLEFT, FromDIP(30)); + + m_sizer_simple->AddSpacer(10); + } + //page_simple//page_advanced + m_sizer = new wxBoxSizer(wxVERTICAL); + m_sizer->Add(m_page_simple, 0, wxEXPAND, 0); + + m_sizer->SetSizeHints(this); + SetSizer(m_sizer); + this->Layout(); +} + +void ObjColorPanel::msw_rescale() +{ + for (unsigned int i = 0; i < m_extruder_icon_list.size(); ++i) { + auto bitmap = *get_extruder_color_icon(m_colours[i].GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(i + 1), FromDIP(16), FromDIP(16)); + m_extruder_icon_list[i]->SetBitmap(bitmap); + } + /* for (unsigned int i = 0; i < m_color_cluster_icon_list.size(); ++i) { + auto bitmap = *get_extruder_color_icon(m_cluster_colours[i].GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(i + 1), FromDIP(16), FromDIP(16)); + m_color_cluster_icon_list[i]->SetBitmap(bitmap); + }*/ +} + +bool ObjColorPanel::is_ok() { + for (auto item : m_result_icon_list) { + if (item->bitmap_combox->IsShown()) { + auto selection = item->bitmap_combox->GetSelection(); + if (selection < 1) { + return false; + } + } + } + return true; +} + +void ObjColorPanel::update_filament_ids() +{ + if (m_is_add_filament) { + for (auto c:m_new_add_colors) { + auto evt = new ColorEvent(EVT_ADD_CUSTOM_FILAMENT, c); + wxQueueEvent(wxGetApp().plater(), evt); + } + } + //deal m_filament_ids + m_filament_ids.clear(); + m_filament_ids.reserve(m_input_colors_size); + for (size_t i = 0; i < m_input_colors_size; i++) { + auto label = m_cluster_labels_from_algo[i]; + m_filament_ids.emplace_back(m_cluster_map_filaments[label]); + } + m_first_extruder_id = m_cluster_map_filaments[0]; +} + +wxBoxSizer *ObjColorPanel::create_approximate_match_btn_sizer(wxWindow *parent) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + StateColor calc_btn_bg(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor calc_btn_bd(std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); + //create btn + m_quick_approximate_match_btn = new Button(parent, _L("Approximate match")); + auto cur_btn = m_quick_approximate_match_btn; + cur_btn->SetFont(Label::Body_13); + cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); + cur_btn->SetCornerRadius(FromDIP(10)); + cur_btn->SetBackgroundColor(calc_btn_bg); + cur_btn->SetBorderColor(calc_btn_bd); + cur_btn->SetTextColor(calc_btn_text); + cur_btn->SetFocus(); + btn_sizer->Add(cur_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); + cur_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { + deal_approximate_match_btn(); + }); + return btn_sizer; +} + +wxBoxSizer *ObjColorPanel::create_add_btn_sizer(wxWindow *parent) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + StateColor calc_btn_bg(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor calc_btn_bd(std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); + // create btn + m_quick_add_btn = new Button(parent, _L("Add")); + auto cur_btn = m_quick_add_btn; + cur_btn->SetFont(Label::Body_13); + cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); + cur_btn->SetCornerRadius(FromDIP(10)); + cur_btn->SetBackgroundColor(calc_btn_bg); + cur_btn->SetBorderColor(calc_btn_bd); + cur_btn->SetTextColor(calc_btn_text); + cur_btn->SetFocus(); + btn_sizer->Add(cur_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); + cur_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { + deal_add_btn(); + }); + return btn_sizer; +} + +wxBoxSizer *ObjColorPanel::create_reset_btn_sizer(wxWindow *parent) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + StateColor calc_btn_bg(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor calc_btn_bd(std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); + // create btn + m_quick_reset_btn = new Button(parent, _L("Reset")); + auto cur_btn = m_quick_reset_btn; + cur_btn->SetFont(Label::Body_13); + cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); + cur_btn->SetCornerRadius(FromDIP(10)); + cur_btn->SetBackgroundColor(calc_btn_bg); + cur_btn->SetBorderColor(calc_btn_bd); + cur_btn->SetTextColor(calc_btn_text); + cur_btn->SetFocus(); + btn_sizer->Add(cur_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); + cur_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { + deal_reset_btn(); + }); + return btn_sizer; +} + +wxBoxSizer *ObjColorPanel::create_extruder_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour &color) +{ + auto icon_sizer = new wxBoxSizer(wxHORIZONTAL); + wxButton *icon = new wxButton(parent, wxID_ANY, {}, wxDefaultPosition, ICON_SIZE, wxBORDER_NONE | wxBU_AUTODRAW); + icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); + icon->SetCanFocus(false); + m_extruder_icon_list.emplace_back(icon); + icon_sizer->Add(icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); // wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM + icon_sizer->AddSpacer(FromDIP(10)); + + std::string message = get_color_str(color); + wxStaticText *rgba_title = new wxStaticText(parent, wxID_ANY, message.c_str()); + rgba_title->SetMinSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); + rgba_title->SetMaxSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); + icon_sizer->Add(rgba_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); + return icon_sizer; +} + +std::string ObjColorPanel::get_color_str(const wxColour &color) { + std::string str = ("R:" + std::to_string(color.Red()) + + std::string(" G:") + std::to_string(color.Green()) + + std::string(" B:") + std::to_string(color.Blue()) + + std::string(" A:") + std::to_string(color.Alpha())); + return str; +} + +ComboBox *ObjColorPanel::CreateEditorCtrl(wxWindow *parent, int id) // wxRect labelRect,, const wxVariant &value +{ + std::vector icons = get_extruder_color_icons(); + const double em = Slic3r::GUI::wxGetApp().em_unit(); + bool thin_icon = false; + const int icon_width = lround((thin_icon ? 2 : 4.4) * em); + const int icon_height = lround(2 * em); + m_combox_icon_width = icon_width; + m_combox_icon_height = icon_height; + wxColour undefined_color(0,255,0,255); + icons.insert(icons.begin(), get_extruder_color_icon(undefined_color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(-1), icon_width, icon_height)); + if (icons.empty()) + return nullptr; + + ::ComboBox *c_editor = new ::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(m_combox_width), -1), 0, nullptr, + wxCB_READONLY | CB_NO_DROP_ICON | CB_NO_TEXT); + c_editor->SetMinSize(wxSize(FromDIP(m_combox_width), -1)); + c_editor->SetMaxSize(wxSize(FromDIP(m_combox_width), -1)); + c_editor->GetDropDown().SetUseContentWidth(true); + for (size_t i = 0; i < icons.size(); i++) { + c_editor->Append(wxString::Format("%d", i), *icons[i]); + if (i == 0) { + c_editor->SetItemTooltip(i,undefined_color.GetAsString(wxC2S_HTML_SYNTAX)); + } else { + c_editor->SetItemTooltip(i, m_colours[i-1].GetAsString(wxC2S_HTML_SYNTAX)); + } + } + c_editor->SetSelection(0); + c_editor->SetName(wxString::Format("%d", id)); + c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) { + auto *com_box = static_cast(evt.GetEventObject()); + int i = atoi(com_box->GetName().c_str()); + if (i < m_cluster_map_filaments.size()) { m_cluster_map_filaments[i] = com_box->GetSelection(); } + evt.StopPropagation(); + }); + return c_editor; +} + +void ObjColorPanel::deal_approximate_match_btn() +{ + auto calc_color_distance = [](wxColour c1, wxColour c2) { + float lab[2][3]; + RGB2Lab(c1.Red(), c1.Green(), c1.Blue(), &lab[0][0], &lab[0][1], &lab[0][2]); + RGB2Lab(c2.Red(), c2.Green(), c2.Blue(), &lab[1][0], &lab[1][1], &lab[1][2]); + + return DeltaE76(lab[0][0], lab[0][1], lab[0][2], lab[1][0], lab[1][1], lab[1][2]); + }; + m_warning_text->SetLabelText(""); + if (m_result_icon_list.size() == 0) { return; } + auto map_count = m_result_icon_list[0]->bitmap_combox->GetCount() -1; + if (map_count < 1) { return; } + for (size_t i = 0; i < m_cluster_colours.size(); i++) { + auto c = m_cluster_colours[i]; + std::vector color_dists; + color_dists.resize(map_count); + for (size_t j = 0; j < map_count; j++) { + auto tip_color = m_result_icon_list[0]->bitmap_combox->GetItemTooltip(j+1); + wxColour candidate_c(tip_color); + color_dists[j].distance = calc_color_distance(c, candidate_c); + color_dists[j].id = j + 1; + } + std::sort(color_dists.begin(), color_dists.end(), [](ColorDistValue &a, ColorDistValue& b) { + return a.distance < b.distance; + }); + auto new_index= color_dists[0].id; + m_result_icon_list[i]->bitmap_combox->SetSelection(new_index); + m_cluster_map_filaments[i] = new_index; + } +} + +void ObjColorPanel::show_sizer(wxSizer *sizer, bool show) +{ + wxSizerItemList items = sizer->GetChildren(); + for (wxSizerItemList::iterator it = items.begin(); it != items.end(); ++it) { + wxSizerItem *item = *it; + if (wxWindow *window = item->GetWindow()) { + window->Show(show); + } + if (wxSizer *son_sizer = item->GetSizer()) { + show_sizer(son_sizer, show); + } + } +} + +void ObjColorPanel::redraw_part_table() { + //show all and set -1 + deal_reset_btn(); + for (size_t i = 0; i < m_row_sizer_list.size(); i++) { + show_sizer(m_row_sizer_list[i], true); + } + if (m_cluster_colours.size() < m_row_sizer_list.size()) { // show part + for (size_t i = m_cluster_colours.size(); i < m_row_sizer_list.size(); i++) { + show_sizer(m_row_sizer_list[i], false); + //m_row_panel_list[i]->Show(false); // show_sizer(m_left_color_cluster_boxsizer_list[i],false); + // m_result_icon_list[i]->bitmap_combox->Show(false); + } + } else if (m_cluster_colours.size() > m_row_sizer_list.size()) { + for (size_t i = m_row_sizer_list.size(); i < m_cluster_colours.size(); i++) { + int id = i; + wxPanel *row_panel = new wxPanel(m_scrolledWindow); + row_panel->SetBackgroundColour((i+1) % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); + auto row_sizer = new wxBoxSizer(wxHORIZONTAL); + row_panel->SetSizer(row_sizer); + + wxPanel *son_row_panel = new wxPanel(row_panel); + son_row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + son_row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + son_row_panel->SetBackgroundColour((i + 1) % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); + auto son_row_sizer = new wxGridSizer(1, 2, 1, 3); + son_row_panel->SetSizer(son_row_sizer); + + auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(son_row_panel, id, m_cluster_colours[id]); + son_row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + // result_combox + create_result_button_sizer(son_row_panel, id); + son_row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 0); + row_sizer->Add(son_row_panel, 0, wxALIGN_LEFT | wxALL, 0); + // extruder_icon + if (id < m_colours.size()) { + auto extruder_icon_sizer = create_extruder_icon_and_rgba_sizer(row_panel, id, m_colours[id]); + row_sizer->Add(extruder_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + } else { + row_sizer->Add(new wxStaticText(row_panel, wxID_ANY, ""), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + } + m_row_sizer_list.emplace_back(son_row_sizer); + m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + } + m_gridsizer->Layout(); + } + for (size_t i = 0; i < m_cluster_colours.size(); i++) { // update data + // m_color_cluster_icon_list//m_color_cluster_text_list + update_color_icon_and_rgba_sizer(i, m_cluster_colours[i]); + } + m_scrolledWindow->Refresh(); +} + +void ObjColorPanel::draw_table() +{ + auto row = std::max(m_cluster_colours.size(), m_colours.size()) + 1; + m_gridsizer = new wxGridSizer(row, 1, 3, 3); //(int rows, int cols, int vgap, int hgap ); + + m_color_cluster_icon_list.clear(); + m_extruder_icon_list.clear(); + for (size_t ii = 0; ii < row; ii++) { + wxPanel *row_panel = new wxPanel(m_scrolledWindow); + row_panel->SetBackgroundColour(ii % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); + auto row_sizer = new wxBoxSizer(wxHORIZONTAL); + row_panel->SetSizer(row_sizer); + + wxPanel *son_row_panel = new wxPanel(row_panel); + son_row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + son_row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + son_row_panel->SetBackgroundColour(ii % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); + auto son_row_sizer = new wxGridSizer(1, 2, 1, 3); + son_row_panel->SetSizer(son_row_sizer); + if (ii == 0) { + wxStaticText *colors_left_title = new wxStaticText(son_row_panel, wxID_ANY, _L("Cluster colors")); + colors_left_title->SetFont(Label::Head_14); + son_row_sizer->Add(colors_left_title, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + + wxStaticText *colors_middle_title = new wxStaticText(son_row_panel, wxID_ANY, _L("Map Filament")); + colors_middle_title->SetFont(Label::Head_14); + son_row_sizer->Add(colors_middle_title, 0, wxALIGN_CENTER | wxALL, FromDIP(HEADER_BORDER)); + row_sizer->Add(son_row_panel, 0, wxALIGN_LEFT | wxALL, 0); + + wxStaticText *colors_right_title = new wxStaticText(row_panel, wxID_ANY, _L("Current filament colors")); + colors_right_title->SetFont(Label::Head_14); + row_sizer->Add(colors_right_title, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + } else { + int id = ii - 1; + if (id < m_cluster_colours.size()) { + auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(son_row_panel, id, m_cluster_colours[id]); + son_row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + // result_combox + create_result_button_sizer(son_row_panel, id); + son_row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + } + row_sizer->Add(son_row_panel, 0, wxALIGN_LEFT | wxALL, 0); + // extruder_icon + if (id < m_colours.size()) { + auto extruder_icon_sizer = create_extruder_icon_and_rgba_sizer(row_panel, id, m_colours[id]); + row_sizer->Add(extruder_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + } else { + row_sizer->Add(new wxStaticText(row_panel, wxID_ANY, ""), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + } + } + if (ii>=1) { + m_row_sizer_list.emplace_back(son_row_sizer); + } + m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + } + m_scrolledWindow->SetSizer(m_gridsizer); + int totalHeight = m_gridsizer->GetMinSize().y; + m_scrolledWindow->SetVirtualSize(MIN_OBJCOLOR_DIALOG_WIDTH, totalHeight); + if (totalHeight > FIX_SCROLL_HEIGTH) { + m_scrolledWindow->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, FIX_SCROLL_HEIGTH)); + m_scrolledWindow->SetMaxSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, FIX_SCROLL_HEIGTH)); + } + else { + m_scrolledWindow->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, totalHeight)); + } + m_scrolledWindow->EnableScrolling(false, true); + m_scrolledWindow->ShowScrollbars(wxSHOW_SB_NEVER, wxSHOW_SB_DEFAULT);//wxSHOW_SB_ALWAYS + m_scrolledWindow->SetScrollRate(20, 20); +} + +void ObjColorPanel::deal_algo(char cluster_number, bool redraw_ui) +{ + if (m_last_cluster_number == cluster_number) { + return; + } + m_last_cluster_number = cluster_number; + QuantKMeans quant(10); + quant.apply(m_input_colors, m_cluster_colors_from_algo, m_cluster_labels_from_algo, (int)cluster_number); + m_cluster_colours.clear(); + m_cluster_colours.reserve(m_cluster_colors_from_algo.size()); + for (size_t i = 0; i < m_cluster_colors_from_algo.size(); i++) { + m_cluster_colours.emplace_back(convert_to_wxColour(m_cluster_colors_from_algo[i])); + } + if (m_cluster_colours.size() == 0) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ",m_cluster_colours.size() = 0\n"; + return; + } + m_cluster_map_filaments.resize(m_cluster_colors_from_algo.size()); + m_color_cluster_num_by_algo = m_cluster_colors_from_algo.size(); + if (cluster_number == -1) { + m_color_num_recommend = m_color_cluster_num_by_algo; + } + //redraw ui + if (redraw_ui) { + redraw_part_table(); + } +} + +void ObjColorPanel::deal_add_btn() +{ + if (m_colours.size() > g_max_color) { return; } + std::vector new_icons; + auto new_color_size = m_cluster_colors_from_algo.size(); + new_icons.reserve(new_color_size); + m_new_add_colors.clear(); + m_new_add_colors.reserve(new_color_size); + int new_index = m_colours.size() + 1; + for (size_t i = 0; i < new_color_size; i++) { + if (m_colours.size() + new_icons.size() >= g_max_color) { + m_warning_text->SetLabelText(_L("Waring:The count of newly added and current extruders exceeds 16.")); + break; + } + wxColour cur_color = convert_to_wxColour(m_cluster_colors_from_algo[i]); + m_new_add_colors.emplace_back(cur_color); + new_icons.emplace_back(get_extruder_color_icon(cur_color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), + std::to_string(new_index), m_combox_icon_width, m_combox_icon_height)); + new_index++; + } + new_index = m_colours.size() + 1; + for (size_t i = 0; i < m_result_icon_list.size(); i++) { + auto item = m_result_icon_list[i]; + for (size_t k = 0; k < new_icons.size(); k++) { + item->bitmap_combox->Append(wxString::Format("%d", item->bitmap_combox->GetCount()), *new_icons[k]); + item->bitmap_combox->SetItemTooltip(item->bitmap_combox->GetCount() -1,m_new_add_colors[k].GetAsString(wxC2S_HTML_SYNTAX)); + } + item->bitmap_combox->SetSelection(new_index); + m_cluster_map_filaments[i] = new_index; + new_index++; + } + m_is_add_filament = true; +} + +void ObjColorPanel::deal_reset_btn() +{ + for (auto item : m_result_icon_list) { + // delete redundant bitmap + while (item->bitmap_combox->GetCount() > m_colours.size()+ 1) { + item->bitmap_combox->DeleteOneItem(item->bitmap_combox->GetCount() - 1); + } + item->bitmap_combox->SetSelection(0); + } + m_is_add_filament = false; + m_new_add_colors.clear(); + m_warning_text->SetLabelText(""); +} + +void ObjColorPanel::create_result_button_sizer(wxWindow *parent, int id) +{ + for (size_t i = m_result_icon_list.size(); i < id + 1; i++) { + m_result_icon_list.emplace_back(new ButtonState()); + } + m_result_icon_list[id]->bitmap_combox = CreateEditorCtrl(parent,id); +} + +wxBoxSizer *ObjColorPanel::create_color_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color) +{ + auto icon_sizer = new wxBoxSizer(wxHORIZONTAL); + wxButton *icon = new wxButton(parent, wxID_ANY, {}, wxDefaultPosition, ICON_SIZE, wxBORDER_NONE | wxBU_AUTODRAW); + icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); + icon->SetCanFocus(false); + m_color_cluster_icon_list.emplace_back(icon); + icon_sizer->Add(icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); // wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM + icon_sizer->AddSpacer(FromDIP(10)); + + std::string message = get_color_str(color); + wxStaticText *rgba_title = new wxStaticText(parent, wxID_ANY, message.c_str()); + m_color_cluster_text_list.emplace_back(rgba_title); + rgba_title->SetMinSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); + rgba_title->SetMaxSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); + //rgba_title->SetFont(Label::Head_12); + icon_sizer->Add(rgba_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); + return icon_sizer; +} + +void ObjColorPanel::update_color_icon_and_rgba_sizer(int id, const wxColour &color) +{ + if (id < m_color_cluster_text_list.size()) { + auto icon = m_color_cluster_icon_list[id]; + icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); + std::string message = get_color_str(color); + m_color_cluster_text_list[id]->SetLabelText(message.c_str()); + } +} diff --git a/src/slic3r/GUI/ObjColorDialog.hpp b/src/slic3r/GUI/ObjColorDialog.hpp new file mode 100644 index 0000000000..137bfe3e00 --- /dev/null +++ b/src/slic3r/GUI/ObjColorDialog.hpp @@ -0,0 +1,113 @@ +#ifndef _OBJ_COLOR_DIALOG_H_ +#define _OBJ_COLOR_DIALOG_H_ + +#include "GUI_Utils.hpp" +#include "libslic3r/Color.hpp" +#include +#include +#include +#include +#include +#include +class Button; +class Label; +class ComboBox; +struct ColorDistValue +{ + int id; + float distance; +}; +class ObjColorPanel : public wxPanel +{ +public: + // BBS + ObjColorPanel(wxWindow * parent, + std::vector & input_colors,bool is_single_color, + const std::vector & extruder_colours, + std::vector & filament_ids, + unsigned char & first_extruder_id); + void msw_rescale(); + bool is_ok(); + void update_filament_ids(); + struct ButtonState + { + ComboBox* bitmap_combox{nullptr}; + bool is_map{false};//int id{0}; + }; +private: + wxBoxSizer *create_approximate_match_btn_sizer(wxWindow *parent); + wxBoxSizer *create_add_btn_sizer(wxWindow *parent); + wxBoxSizer *create_reset_btn_sizer(wxWindow *parent); + wxBoxSizer *create_extruder_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color); + std::string get_color_str(const wxColour &color); + void create_result_button_sizer(wxWindow *parent, int id); + wxBoxSizer *create_color_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color); + void update_color_icon_and_rgba_sizer(int id, const wxColour &color); + ComboBox* CreateEditorCtrl(wxWindow *parent,int id); + void draw_table(); + void show_sizer(wxSizer *sizer, bool show); + void redraw_part_table(); + void deal_approximate_match_btn(); + void deal_add_btn(); + void deal_reset_btn(); + void deal_algo(char cluster_number,bool redraw_ui =false); +private: + //view ui + wxScrolledWindow * m_scrolledWindow = nullptr; + wxPanel * m_page_simple = nullptr; + wxBoxSizer * m_sizer = nullptr; + wxBoxSizer * m_sizer_simple = nullptr; + wxTextCtrl *m_color_cluster_num_by_user_ebox{nullptr}; + wxStaticText * m_warning_text{nullptr}; + Button * m_quick_approximate_match_btn{nullptr}; + Button * m_quick_add_btn{nullptr}; + Button * m_quick_reset_btn{nullptr}; + std::vector m_extruder_icon_list; + std::vector m_color_cluster_icon_list;//need modeify + std::vector m_color_cluster_text_list;//need modeify + std::vector m_row_sizer_list; // control show or not + std::vector m_result_icon_list; + int m_last_cluster_num{-1}; + const int m_combox_width{50}; + int m_combox_icon_width; + int m_combox_icon_height; + wxGridSizer* m_gridsizer = nullptr; + wxStaticText * m_test = nullptr; + //data + char m_last_cluster_number{-2}; + std::vector& m_input_colors; + int m_color_num_recommend{0}; + int m_color_cluster_num_by_algo{0}; + int m_input_colors_size{0}; + std::vector m_colours;//from project and show right + std::vector m_cluster_map_filaments;//show middle + std::vector m_cluster_colours;//from_algo and show left + bool m_can_add_filament{true}; + std::vector m_new_add_colors; + //algo result + std::vector m_cluster_colors_from_algo; + std::vector m_cluster_labels_from_algo; + //result + bool m_is_add_filament{false}; + unsigned char& m_first_extruder_id; + std::vector &m_filament_ids; +}; + +class ObjColorDialog : public Slic3r::GUI::DPIDialog +{ +public: + ObjColorDialog(wxWindow * parent, + std::vector& input_colors, bool is_single_color, + const std::vector & extruder_colours, + std::vector& filament_ids, + unsigned char & first_extruder_id); + wxBoxSizer* create_btn_sizer(long flags); + void on_dpi_changed(const wxRect &suggested_rect) override; +private: + ObjColorPanel* m_panel_ObjColor = nullptr; + std::unordered_map m_button_list; + std::vector& m_filament_ids; + unsigned char & m_first_extruder_id; +}; + +#endif // _WIPE_TOWER_DIALOG_H_ \ No newline at end of file diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 57ebbe6f25..97d22dbab8 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -127,6 +127,7 @@ #include // Needs to be last because reasons :-/ #include "WipeTowerDialog.hpp" +#include "ObjColorDialog.hpp" #include "libslic3r/CustomGCode.hpp" #include "libslic3r/Platform.hpp" @@ -182,6 +183,7 @@ wxDEFINE_EVENT(EVT_CREATE_FILAMENT, SimpleEvent); wxDEFINE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent); wxDEFINE_EVENT(EVT_ADD_FILAMENT, SimpleEvent); wxDEFINE_EVENT(EVT_DEL_FILAMENT, SimpleEvent); +wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); bool Plater::has_illegal_filename_characters(const wxString& wxs_name) { std::string name = into_u8(wxs_name); @@ -1609,15 +1611,8 @@ void Sidebar::on_filaments_change(size_t num_filaments) void Sidebar::add_filament() { // BBS: limit filament choices to 16 if (p->combos_filament.size() >= 16) return; - - int filament_count = p->combos_filament.size() + 1; wxColour new_col = Plater::get_next_color_for_filament(); - std::string new_color = new_col.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); - wxGetApp().preset_bundle->set_num_filaments(filament_count, new_color); - wxGetApp().plater()->on_filaments_change(filament_count); - wxGetApp().get_tab(Preset::TYPE_PRINT)->update(); - wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); - auto_calc_flushing_volumes(filament_count - 1); + add_custom_filament(new_col); } void Sidebar::delete_filament() { @@ -1638,6 +1633,18 @@ void Sidebar::delete_filament() { wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); } +void Sidebar::add_custom_filament(wxColour new_col) { + if (p->combos_filament.size() >= 16) return; + + int filament_count = p->combos_filament.size() + 1; + std::string new_color = new_col.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); + wxGetApp().preset_bundle->set_num_filaments(filament_count, new_color); + wxGetApp().plater()->on_filaments_change(filament_count); + wxGetApp().get_tab(Preset::TYPE_PRINT)->update(); + wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); + auto_calc_flushing_volumes(filament_count - 1); +} + void Sidebar::on_bed_type_change(BedType bed_type) { // btDefault option is not included in global bed type setting @@ -2552,6 +2559,7 @@ struct Plater::priv void on_modify_filament(SimpleEvent &); void on_add_filament(SimpleEvent &); void on_delete_filament(SimpleEvent &); + void on_add_custom_filament(ColorEvent &); void on_object_select(SimpleEvent&); void on_plate_name_change(SimpleEvent &); @@ -2785,6 +2793,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) this->q->Bind(EVT_MODIFY_FILAMENT, &priv::on_modify_filament, this); this->q->Bind(EVT_ADD_FILAMENT, &priv::on_add_filament, this); this->q->Bind(EVT_DEL_FILAMENT, &priv::on_delete_filament, this); + this->q->Bind(EVT_ADD_CUSTOM_FILAMENT, &priv::on_add_custom_filament, this); view3D = new View3D(q, bed, &model, config, &background_process); //BBS: use partplater's gcode preview = new Preview(q, bed, &model, config, &background_process, partplate_list.get_current_slice_result(), [this]() { schedule_background_process(); }); @@ -3930,7 +3939,17 @@ std::vector Plater::priv::load_files(const std::vector& input_ std::vector project_presets; bool is_xxx; Semver file_version; - + + //ObjImportColorFn obj_color_fun=nullptr; + auto obj_color_fun = [this, &path](std::vector &input_colors, bool is_single_color, std::vector &filament_ids, + unsigned char &first_extruder_id) { + if (!boost::iends_with(path.string(), ".obj")) { return; } + const std::vector extruder_colours = wxGetApp().plater()->get_extruder_colors_from_plater_config(); + ObjColorDialog color_dlg(nullptr, input_colors, is_single_color, extruder_colours, filament_ids, first_extruder_id); + if (color_dlg.ShowModal() != wxID_OK) { + filament_ids.clear(); + } + }; model = Slic3r::Model::read_from_file( path.string(), nullptr, nullptr, strategy, &plate_data, &project_presets, &is_xxx, &file_version, nullptr, [this, &dlg, real_filename, &progress_percent, &file_percent, INPUT_FILES_RATIO, total_files, i, &designer_model_id, &designer_country_code](int current, int total, bool &cancel, std::string &mode_id, std::string &code) @@ -3960,7 +3979,8 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (!isUtf8StepFile) Slic3r::GUI::show_info(nullptr, _L("Name of components inside step file is not UTF8 format!") + "\n\n" + _L("The name may show garbage characters!"), _L("Attention!")); - }); + }, + nullptr, 0, obj_color_fun); if (designer_model_id.empty() && boost::algorithm::iends_with(path.string(), ".stl")) { @@ -8039,6 +8059,11 @@ void Plater::priv::on_delete_filament(SimpleEvent &evt) { sidebar->delete_filament(); } +void Plater::priv::on_add_custom_filament(ColorEvent &evt) +{ + sidebar->add_custom_filament(evt.data); +} + void Plater::priv::enter_gizmos_stack() { assert(m_undo_redo_stack_active == &m_undo_redo_stack_main); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 2fdd66891e..0c1d572316 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -101,6 +101,8 @@ wxDECLARE_EVENT(EVT_CREATE_FILAMENT, SimpleEvent); wxDECLARE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent); wxDECLARE_EVENT(EVT_ADD_FILAMENT, SimpleEvent); wxDECLARE_EVENT(EVT_DEL_FILAMENT, SimpleEvent); +using ColorEvent = Event; +wxDECLARE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); const wxString DEFAULT_PROJECT_NAME = "Untitled"; class Sidebar : public wxPanel @@ -136,6 +138,7 @@ class Sidebar : public wxPanel void on_filaments_change(size_t num_filaments); void add_filament(); void delete_filament(); + void add_custom_filament(wxColour new_col); // BBS void on_bed_type_change(BedType bed_type); void load_ams_list(std::string const & device, MachineObject* obj); diff --git a/src/slic3r/GUI/Widgets/ComboBox.hpp b/src/slic3r/GUI/Widgets/ComboBox.hpp index 74bebd0528..d4b74f4df7 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.hpp +++ b/src/slic3r/GUI/Widgets/ComboBox.hpp @@ -66,6 +66,7 @@ class ComboBox : public wxWindowWithItems wxBitmap GetItemBitmap(unsigned int n); void SetItemBitmap(unsigned int n, wxBitmap const &bitmap); bool is_drop_down(){return drop_down;} + void DeleteOneItem(unsigned int pos) { DoDeleteOneItem(pos); } protected: virtual int DoInsertItems(const wxArrayStringsAdapter &items, unsigned int pos, diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index b53573d019..b542723e15 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -598,10 +598,9 @@ wxBitmap *get_extruder_color_icon(std::string color, std::string label, int icon return bitmap; } - -void apply_extruder_selector(Slic3r::GUI::BitmapComboBox** ctrl, +void apply_extruder_selector(Slic3r::GUI::BitmapComboBox** ctrl, wxWindow* parent, - const std::string& first_item/* = ""*/, + const std::string& first_item/* = ""*/, wxPoint pos/* = wxDefaultPosition*/, wxSize size/* = wxDefaultSize*/, bool use_thin_icon/* = false*/) diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index e7e992e4b0..767cb3e5b8 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -57,7 +57,7 @@ wxBitmap create_menu_bitmap(const std::string& bmp_name); // BBS: support resize by fill border #if 1 -wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, +wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, const int px_cnt = 16, const bool grayscale = false, const std::string& new_color = std::string(), // color witch will used instead of orange const bool menu_bitmap = false, const bool resize = false, @@ -75,7 +75,6 @@ wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullp wxBitmap* get_default_extruder_color_icon(bool thin_icon = false); std::vector get_extruder_color_icons(bool thin_icon = false); wxBitmap * get_extruder_color_icon(std::string color, std::string label, int icon_width, int icon_height); - namespace Slic3r { namespace GUI { class BitmapComboBox; From cf91933daf82d64fca3ab87fd6f402e44a9cb1cc Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Thu, 18 Apr 2024 17:36:41 +0800 Subject: [PATCH 52/74] FIX:change the strategy of merge_ka_kd Upgrade ui, users can directly ok to proceed to the next step jira: STUDIO-6805 Change-Id: Ia81019c2eacb503666680c0b8583d026baa0134c (cherry picked from commit 38a2434753c8e3b422267283b16c75f6ad195b14) --- src/libslic3r/Format/OBJ.cpp | 13 ++- src/libslic3r/Format/objparser.cpp | 56 ++++++----- src/libslic3r/Format/objparser.hpp | 1 + src/slic3r/GUI/ObjColorDialog.cpp | 144 +++++++++++++---------------- src/slic3r/GUI/ObjColorDialog.hpp | 1 + 5 files changed, 109 insertions(+), 106 deletions(-) diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index d208165ccf..8c504a642d 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -127,15 +127,22 @@ bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::s RGBA face_color; auto set_face_color = [&uvs, &data, &mtl_data, &obj_info, &face_color](int face_index, const std::string mtl_name) { if (mtl_data.new_mtl_unmap.find(mtl_name) != mtl_data.new_mtl_unmap.end()) { + bool is_merge_ka_kd = true; for (size_t n = 0; n < 3; n++) { if (float(mtl_data.new_mtl_unmap[mtl_name]->Ka[n] + mtl_data.new_mtl_unmap[mtl_name]->Kd[n]) > 1.0) { - face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); + is_merge_ka_kd=false; + break; } - else { + } + for (size_t n = 0; n < 3; n++) { + if (is_merge_ka_kd) { face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Ka[n] + mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); } + else { + face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); + } } - face_color[3] = 1.0; // default alpha + face_color[3] = mtl_data.new_mtl_unmap[mtl_name]->Tr; // alpha if (mtl_data.new_mtl_unmap[mtl_name]->map_Kd.size() > 0) { auto png_name = mtl_data.new_mtl_unmap[mtl_name]->map_Kd; obj_info.has_uv_png = true; diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index c33ee3bfbc..917f33d41c 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -501,31 +501,37 @@ static bool mtl_parseline(const char *line, MtlData &data) break; } case 'T': { - if (*(line++) != 'f') - return false; - EATWS(); - char * endptr = 0; - double x = strtod(line, &endptr); - if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) - return false; - line = endptr; - EATWS(); - double y = strtod(line, &endptr); - if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) - return false; - line = endptr; - EATWS(); - double z = strtod(line, &endptr); - if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) - return false; - line = endptr; - EATWS(); - if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { - data.new_mtl_unmap[cur_mtl_name]->Tf[0] = x; - data.new_mtl_unmap[cur_mtl_name]->Tf[1] = y; - data.new_mtl_unmap[cur_mtl_name]->Tf[2] = z; - } - break; + char cur_char = *(line++); + if (cur_char == 'r') { + EATWS(); + char * endptr = 0; + double tr = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Tr = (float) tr; + } + break; + } else if (cur_char == 'f') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Tf[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Tf[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Tf[2] = z; + } + break; + } } } return true; diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 3d51bc1ddc..5c4a3ca2ab 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -37,6 +37,7 @@ struct ObjNewMtl float Ni; float d; float illum; + float Tr{1.0f}; // Transmission std::array Tf; std::array Ka; std::array Kd; diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp index 25cdca57b8..b468809e79 100644 --- a/src/slic3r/GUI/ObjColorDialog.cpp +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -25,11 +25,11 @@ int OBJCOLOR_ITEM_WIDTH() { return objcolor_scale(30); } static const wxColour g_text_color = wxColour(107, 107, 107, 255); const int HEADER_BORDER = 5; const int CONTENT_BORDER = 3; -const int PANEL_WIDTH = 320; -const int COLOR_LABEL_WIDTH = 150; +const int PANEL_WIDTH = 370; +const int COLOR_LABEL_WIDTH = 180; #define ICON_SIZE wxSize(FromDIP(16), FromDIP(16)) -#define MIN_OBJCOLOR_DIALOG_WIDTH FromDIP(530) -#define FIX_SCROLL_HEIGTH FromDIP(400) +#define MIN_OBJCOLOR_DIALOG_WIDTH FromDIP(400) +#define FIX_SCROLL_HEIGTH FromDIP(400) #define BTN_SIZE wxSize(FromDIP(58), FromDIP(24)) #define BTN_GAP FromDIP(20) @@ -257,22 +257,10 @@ ObjColorPanel::ObjColorPanel(wxWindow * parent, // BBS: for tunning flush volumes { //color cluster results - wxBoxSizer * cluster_sizer = new wxBoxSizer(wxHORIZONTAL); - wxStaticText *color_cluster_result_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Recommend number of colors:")); - color_cluster_result_title->SetFont(Label::Head_14); - cluster_sizer->Add(color_cluster_result_title, 0, wxALIGN_CENTER | wxALL, 0); - cluster_sizer->AddSpacer(FromDIP(5)); - - wxStaticText *color_cluster_result_value = new wxStaticText(m_page_simple, wxID_ANY, std::to_string(m_color_num_recommend).c_str()); - color_cluster_result_value->SetFont(Label::Head_14); - cluster_sizer->Add(color_cluster_result_value, 0, wxALIGN_CENTER | wxALL, 0); - cluster_sizer->AddSpacer(FromDIP(20)); - wxBoxSizer * specify_cluster_sizer = new wxBoxSizer(wxHORIZONTAL); wxStaticText *specify_color_cluster_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Specify number of colors:")); specify_color_cluster_title->SetFont(Label::Head_14); - specify_cluster_sizer->Add(specify_color_cluster_title, 0, wxALIGN_CENTER | wxALL, 0); - specify_cluster_sizer->AddSpacer(FromDIP(5)); + specify_cluster_sizer->Add(specify_color_cluster_title, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); m_color_cluster_num_by_user_ebox = new wxTextCtrl(m_page_simple, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(25), -1), wxTE_PROCESS_ENTER); if (m_color_num_recommend == 1) { @@ -322,10 +310,27 @@ ObjColorPanel::ObjColorPanel(wxWindow * parent, e.Skip(); }); } + specify_cluster_sizer->AddSpacer(FromDIP(2)); specify_cluster_sizer->Add(m_color_cluster_num_by_user_ebox, 0, wxALIGN_CENTER | wxALL, 0); + specify_cluster_sizer->AddSpacer(FromDIP(15)); + wxStaticText *recommend_color_cluster_title = new wxStaticText(m_page_simple, wxID_ANY, "(" + std::to_string(m_color_num_recommend) + " " + _L("Recommended ") + ")"); + specify_cluster_sizer->Add(recommend_color_cluster_title, 0, wxALIGN_CENTER | wxALL, 0); - m_sizer_simple->Add(cluster_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); m_sizer_simple->Add(specify_cluster_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + + wxBoxSizer * current_filaments_title_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *current_filaments_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Current filament colors:")); + current_filaments_title->SetFont(Label::Head_14); + current_filaments_title_sizer->Add(current_filaments_title, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); + m_sizer_simple->Add(current_filaments_title_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + + wxBoxSizer * current_filaments_sizer = new wxBoxSizer(wxHORIZONTAL); + current_filaments_sizer->AddSpacer(FromDIP(10)); + for (size_t i = 0; i < m_colours.size(); i++) { + auto extruder_icon_sizer = create_extruder_icon_and_rgba_sizer(m_page_simple, i, m_colours[i]); + current_filaments_sizer->Add(extruder_icon_sizer, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + } + m_sizer_simple->Add(current_filaments_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); //colors table m_scrolledWindow = new wxScrolledWindow(m_page_simple,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxSB_VERTICAL); m_sizer_simple->Add(m_scrolledWindow, 0, wxEXPAND | wxALL, FromDIP(5)); @@ -333,6 +338,7 @@ ObjColorPanel::ObjColorPanel(wxWindow * parent, //buttons wxBoxSizer *quick_set_sizer = new wxBoxSizer(wxHORIZONTAL); wxStaticText *quick_set_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Quick set:")); + quick_set_title->SetFont(Label::Head_12); quick_set_sizer->Add(quick_set_title, 0, wxALIGN_CENTER | wxALL, 0); quick_set_sizer->AddSpacer(FromDIP(10)); @@ -354,6 +360,7 @@ ObjColorPanel::ObjColorPanel(wxWindow * parent, m_sizer_simple->AddSpacer(10); } + deal_default_strategy(); //page_simple//page_advanced m_sizer = new wxBoxSizer(wxVERTICAL); m_sizer->Add(m_page_simple, 0, wxEXPAND, 0); @@ -413,7 +420,8 @@ wxBoxSizer *ObjColorPanel::create_approximate_match_btn_sizer(wxWindow *parent) StateColor calc_btn_bd(std::pair(wxColour(0, 174, 66), StateColor::Normal)); StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); //create btn - m_quick_approximate_match_btn = new Button(parent, _L("Approximate match")); + m_quick_approximate_match_btn = new Button(parent, _L("Color match")); + m_quick_approximate_match_btn->SetToolTip(_L("Approximate color matching.")); auto cur_btn = m_quick_approximate_match_btn; cur_btn->SetFont(Label::Body_13); cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); @@ -437,7 +445,8 @@ wxBoxSizer *ObjColorPanel::create_add_btn_sizer(wxWindow *parent) StateColor calc_btn_bd(std::pair(wxColour(0, 174, 66), StateColor::Normal)); StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); // create btn - m_quick_add_btn = new Button(parent, _L("Add")); + m_quick_add_btn = new Button(parent, _L("Append")); + m_quick_add_btn->SetToolTip(_L("Add consumable extruder after existing extruders.")); auto cur_btn = m_quick_add_btn; cur_btn->SetFont(Label::Body_13); cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); @@ -462,6 +471,7 @@ wxBoxSizer *ObjColorPanel::create_reset_btn_sizer(wxWindow *parent) StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); // create btn m_quick_reset_btn = new Button(parent, _L("Reset")); + m_quick_add_btn->SetToolTip(_L("Reset mapped extruders.")); auto cur_btn = m_quick_reset_btn; cur_btn->SetFont(Label::Body_13); cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); @@ -484,14 +494,9 @@ wxBoxSizer *ObjColorPanel::create_extruder_icon_and_rgba_sizer(wxWindow *parent, icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); icon->SetCanFocus(false); m_extruder_icon_list.emplace_back(icon); - icon_sizer->Add(icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); // wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM - icon_sizer->AddSpacer(FromDIP(10)); + icon_sizer->Add(icon, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(10)); // wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM - std::string message = get_color_str(color); - wxStaticText *rgba_title = new wxStaticText(parent, wxID_ANY, message.c_str()); - rgba_title->SetMinSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); - rgba_title->SetMaxSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); - icon_sizer->Add(rgba_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); + icon_sizer->AddSpacer(FromDIP(5)); return icon_sizer; } @@ -604,30 +609,19 @@ void ObjColorPanel::redraw_part_table() { int id = i; wxPanel *row_panel = new wxPanel(m_scrolledWindow); row_panel->SetBackgroundColour((i+1) % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); - auto row_sizer = new wxBoxSizer(wxHORIZONTAL); + auto row_sizer = new wxGridSizer(1, 2, 1, 3); row_panel->SetSizer(row_sizer); - wxPanel *son_row_panel = new wxPanel(row_panel); - son_row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); - son_row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); - son_row_panel->SetBackgroundColour((i + 1) % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); - auto son_row_sizer = new wxGridSizer(1, 2, 1, 3); - son_row_panel->SetSizer(son_row_sizer); + row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); - auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(son_row_panel, id, m_cluster_colours[id]); - son_row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(row_panel, id, m_cluster_colours[id]); + row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); // result_combox - create_result_button_sizer(son_row_panel, id); - son_row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 0); - row_sizer->Add(son_row_panel, 0, wxALIGN_LEFT | wxALL, 0); - // extruder_icon - if (id < m_colours.size()) { - auto extruder_icon_sizer = create_extruder_icon_and_rgba_sizer(row_panel, id, m_colours[id]); - row_sizer->Add(extruder_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); - } else { - row_sizer->Add(new wxStaticText(row_panel, wxID_ANY, ""), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); - } - m_row_sizer_list.emplace_back(son_row_sizer); + create_result_button_sizer(row_panel, id); + row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 0); + + m_row_sizer_list.emplace_back(row_sizer); m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); } m_gridsizer->Layout(); @@ -642,61 +636,47 @@ void ObjColorPanel::redraw_part_table() { void ObjColorPanel::draw_table() { auto row = std::max(m_cluster_colours.size(), m_colours.size()) + 1; - m_gridsizer = new wxGridSizer(row, 1, 3, 3); //(int rows, int cols, int vgap, int hgap ); + m_gridsizer = new wxGridSizer(row, 1, 1, 3); //(int rows, int cols, int vgap, int hgap ); m_color_cluster_icon_list.clear(); m_extruder_icon_list.clear(); + float row_height ; for (size_t ii = 0; ii < row; ii++) { wxPanel *row_panel = new wxPanel(m_scrolledWindow); row_panel->SetBackgroundColour(ii % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); - auto row_sizer = new wxBoxSizer(wxHORIZONTAL); + auto row_sizer = new wxGridSizer(1, 2, 1, 5); row_panel->SetSizer(row_sizer); - wxPanel *son_row_panel = new wxPanel(row_panel); - son_row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); - son_row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); - son_row_panel->SetBackgroundColour(ii % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); - auto son_row_sizer = new wxGridSizer(1, 2, 1, 3); - son_row_panel->SetSizer(son_row_sizer); + row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); if (ii == 0) { - wxStaticText *colors_left_title = new wxStaticText(son_row_panel, wxID_ANY, _L("Cluster colors")); + wxStaticText *colors_left_title = new wxStaticText(row_panel, wxID_ANY, _L("Cluster colors")); colors_left_title->SetFont(Label::Head_14); - son_row_sizer->Add(colors_left_title, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + row_sizer->Add(colors_left_title, 0, wxALIGN_CENTER | wxALL, FromDIP(HEADER_BORDER)); - wxStaticText *colors_middle_title = new wxStaticText(son_row_panel, wxID_ANY, _L("Map Filament")); + wxStaticText *colors_middle_title = new wxStaticText(row_panel, wxID_ANY, _L("Map Filament")); colors_middle_title->SetFont(Label::Head_14); - son_row_sizer->Add(colors_middle_title, 0, wxALIGN_CENTER | wxALL, FromDIP(HEADER_BORDER)); - row_sizer->Add(son_row_panel, 0, wxALIGN_LEFT | wxALL, 0); - - wxStaticText *colors_right_title = new wxStaticText(row_panel, wxID_ANY, _L("Current filament colors")); - colors_right_title->SetFont(Label::Head_14); - row_sizer->Add(colors_right_title, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + row_sizer->Add(colors_middle_title, 0, wxALIGN_CENTER | wxALL, FromDIP(HEADER_BORDER)); } else { int id = ii - 1; if (id < m_cluster_colours.size()) { - auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(son_row_panel, id, m_cluster_colours[id]); - son_row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(row_panel, id, m_cluster_colours[id]); + row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); // result_combox - create_result_button_sizer(son_row_panel, id); - son_row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); - } - row_sizer->Add(son_row_panel, 0, wxALIGN_LEFT | wxALL, 0); - // extruder_icon - if (id < m_colours.size()) { - auto extruder_icon_sizer = create_extruder_icon_and_rgba_sizer(row_panel, id, m_colours[id]); - row_sizer->Add(extruder_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); - } else { - row_sizer->Add(new wxStaticText(row_panel, wxID_ANY, ""), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + create_result_button_sizer(row_panel, id); + row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); } } + row_height = row_panel->GetSize().GetHeight(); if (ii>=1) { - m_row_sizer_list.emplace_back(son_row_sizer); + m_row_sizer_list.emplace_back(row_sizer); } m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); } m_scrolledWindow->SetSizer(m_gridsizer); - int totalHeight = m_gridsizer->GetMinSize().y; + int totalHeight = row_height *(row+1); m_scrolledWindow->SetVirtualSize(MIN_OBJCOLOR_DIALOG_WIDTH, totalHeight); + auto look = FIX_SCROLL_HEIGTH; if (totalHeight > FIX_SCROLL_HEIGTH) { m_scrolledWindow->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, FIX_SCROLL_HEIGTH)); m_scrolledWindow->SetMaxSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, FIX_SCROLL_HEIGTH)); @@ -737,6 +717,13 @@ void ObjColorPanel::deal_algo(char cluster_number, bool redraw_ui) } } +void ObjColorPanel::deal_default_strategy() +{ + deal_add_btn(); + deal_approximate_match_btn(); + m_warning_text->SetLabelText(_L("Note:The color has been selected, you can choose OK \n to continue or manually adjust it.")); +} + void ObjColorPanel::deal_add_btn() { if (m_colours.size() > g_max_color) { return; } @@ -796,6 +783,7 @@ void ObjColorPanel::create_result_button_sizer(wxWindow *parent, int id) wxBoxSizer *ObjColorPanel::create_color_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color) { auto icon_sizer = new wxBoxSizer(wxHORIZONTAL); + icon_sizer->AddSpacer(FromDIP(40)); wxButton *icon = new wxButton(parent, wxID_ANY, {}, wxDefaultPosition, ICON_SIZE, wxBORDER_NONE | wxBU_AUTODRAW); icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); icon->SetCanFocus(false); diff --git a/src/slic3r/GUI/ObjColorDialog.hpp b/src/slic3r/GUI/ObjColorDialog.hpp index 137bfe3e00..6019035973 100644 --- a/src/slic3r/GUI/ObjColorDialog.hpp +++ b/src/slic3r/GUI/ObjColorDialog.hpp @@ -51,6 +51,7 @@ class ObjColorPanel : public wxPanel void deal_add_btn(); void deal_reset_btn(); void deal_algo(char cluster_number,bool redraw_ui =false); + void deal_default_strategy(); private: //view ui wxScrolledWindow * m_scrolledWindow = nullptr; From 981b2cdf5283712be0885e6113ec67e32dcb3eca Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Mon, 22 Apr 2024 10:02:14 +0800 Subject: [PATCH 53/74] FIX:use default_strategy after modifed cluster number jira: STUDIO-6915 Change-Id: I4e0c3d62f5a766f73d48d1e06c4364fc6babe1ac --- src/slic3r/GUI/ObjColorDialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp index b468809e79..a9ada68aad 100644 --- a/src/slic3r/GUI/ObjColorDialog.cpp +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -714,6 +714,7 @@ void ObjColorPanel::deal_algo(char cluster_number, bool redraw_ui) //redraw ui if (redraw_ui) { redraw_part_table(); + deal_default_strategy(); } } From 1a0f23c91969ef4f7ce14d4739b60ef957a98168 Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Mon, 22 Apr 2024 09:48:29 +0800 Subject: [PATCH 54/74] FIX: the bug of incorrect button without restarting JIRA: STUDIO-6824 The bug can cause the user to not restart when opening the multi-device option, but the button of send multi-devices appears Change-Id: I0837fa79ecc1d8ab5ce98273ad134fa2f830421e --- src/slic3r/GUI/MainFrame.cpp | 26 +++++++++++++------------- src/slic3r/GUI/MainFrame.hpp | 1 + 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index aadc0b9623..b4aa8ff119 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1552,6 +1552,7 @@ bool MainFrame::can_reslice() const wxBoxSizer* MainFrame::create_side_tools() { + enable_multi_machine = wxGetApp().is_enable_multi_machine(); int em = em_unit(); wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); @@ -1735,9 +1736,6 @@ wxBoxSizer* MainFrame::create_side_tools() SideButton* export_all_sliced_file_btn = new SideButton(p, _L("Export all sliced file"), ""); export_all_sliced_file_btn->SetCornerRadius(0); - SideButton* print_multi_machine_btn = new SideButton(p, _L("Send to Multi-device"), ""); - print_multi_machine_btn->SetCornerRadius(0); - print_plate_btn->Bind(wxEVT_BUTTON, [this, p](wxCommandEvent&) { m_print_btn->SetLabel(_L("Print plate")); m_print_select = ePrintPlate; @@ -1796,23 +1794,25 @@ wxBoxSizer* MainFrame::create_side_tools() p->Dismiss(); }); - print_multi_machine_btn->Bind(wxEVT_BUTTON, [this, p](wxCommandEvent&) { - m_print_btn->SetLabel(_L("Send to Multi-device")); - m_print_select = ePrintMultiMachine; - m_print_enable = get_enable_print_status(); - m_print_btn->Enable(m_print_enable); - this->Layout(); - p->Dismiss(); - }); - p->append_button(print_plate_btn); p->append_button(print_all_btn); p->append_button(send_to_printer_btn); p->append_button(send_to_printer_all_btn); p->append_button(export_sliced_file_btn); p->append_button(export_all_sliced_file_btn); - if (wxGetApp().is_enable_multi_machine()) + if (enable_multi_machine) { + SideButton* print_multi_machine_btn = new SideButton(p, _L("Send to Multi-device"), ""); + print_multi_machine_btn->SetCornerRadius(0); + print_multi_machine_btn->Bind(wxEVT_BUTTON, [this, p](wxCommandEvent&) { + m_print_btn->SetLabel(_L("Send to Multi-device")); + m_print_select = ePrintMultiMachine; + m_print_enable = get_enable_print_status(); + m_print_btn->Enable(m_print_enable); + this->Layout(); + p->Dismiss(); + }); p->append_button(print_multi_machine_btn); + } } p->Popup(m_print_btn); diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index cb398e5301..849b269222 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -99,6 +99,7 @@ class MainFrame : public DPIFrame wxMenuBar* m_menubar{ nullptr }; //wxMenu* publishMenu{ nullptr }; wxMenu * m_calib_menu{nullptr}; + bool enable_multi_machine{ false }; #if 0 wxMenuItem* m_menu_item_repeat { nullptr }; // doesn't used now From 325878036490be80f9d7ad4e04bea66c20f6c092 Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Mon, 22 Apr 2024 10:40:58 +0800 Subject: [PATCH 55/74] FIX: wrong default value for long retraction jira:NEW Signed-off-by: xun.zhang Change-Id: Ifc2ec57a320fdb14e7ca746e5795501ed146ff32 --- resources/profiles/BBL.json | 2 +- resources/profiles/BBL/machine/fdm_machine_common.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 5cbf02aeb8..034f24f992 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "01.09.00.06", + "version": "01.09.00.07", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ diff --git a/resources/profiles/BBL/machine/fdm_machine_common.json b/resources/profiles/BBL/machine/fdm_machine_common.json index 48b564e309..c9426f5c62 100644 --- a/resources/profiles/BBL/machine/fdm_machine_common.json +++ b/resources/profiles/BBL/machine/fdm_machine_common.json @@ -22,7 +22,7 @@ "gcode_flavor": "marlin", "silent_mode": "0", "long_retractions_when_cut": [ - "1" + "0" ], "machine_max_acceleration_e": [ "5000" From 91dad2fef1af3abc4d55da919b4a9bad7295608e Mon Sep 17 00:00:00 2001 From: gerrit Date: Mon, 22 Apr 2024 10:52:45 +0800 Subject: [PATCH 56/74] ci: update build version to 01.09.01.52 Change-Id: I70764b9cffeb018d563ac6c0a255ff73c392edde --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index 35d98743cb..8eaaa4bc76 100644 --- a/version.inc +++ b/version.inc @@ -15,4 +15,4 @@ endif() # The build_version should start from 50 in master branch -set(SLIC3R_VERSION "01.09.01.51") +set(SLIC3R_VERSION "01.09.01.52") From 5694eafb161c3e8a5e0f467bb8d1cfb7f42b6b6d Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Thu, 18 Apr 2024 11:41:17 +0800 Subject: [PATCH 57/74] NEW:split measure function to measure and assembly function Jira: none Change-Id: Id88ed94251ee51b64e7a1574862b269a2ff6358b --- resources/images/toolbar_assembly.svg | 7 + resources/images/toolbar_assembly_dark.svg | 7 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/GLModel.cpp | 77 +++ src/slic3r/GUI/GLModel.hpp | 8 + src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp | 29 - src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp | 1 - src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp | 163 +++++ src/slic3r/GUI/Gizmos/GLGizmoAssembly.hpp | 43 ++ src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 29 + src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 2 + src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 687 +++++++++---------- src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp | 91 ++- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 24 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 1 + src/slic3r/GUI/ObjColorDialog.cpp | 7 +- 16 files changed, 772 insertions(+), 406 deletions(-) create mode 100644 resources/images/toolbar_assembly.svg create mode 100644 resources/images/toolbar_assembly_dark.svg create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoAssembly.hpp diff --git a/resources/images/toolbar_assembly.svg b/resources/images/toolbar_assembly.svg new file mode 100644 index 0000000000..4fba90b72c --- /dev/null +++ b/resources/images/toolbar_assembly.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/toolbar_assembly_dark.svg b/resources/images/toolbar_assembly_dark.svg new file mode 100644 index 0000000000..302b4d745c --- /dev/null +++ b/resources/images/toolbar_assembly_dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 6477434310..94964f73b1 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -139,6 +139,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoFaceDetector.hpp GUI/Gizmos/GLGizmoMeasure.cpp GUI/Gizmos/GLGizmoMeasure.hpp + GUI/Gizmos/GLGizmoAssembly.cpp + GUI/Gizmos/GLGizmoAssembly.hpp GUI/Gizmos/GLGizmoSeam.cpp GUI/Gizmos/GLGizmoSeam.hpp GUI/Gizmos/GLGizmoText.cpp diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index dd5a1efe43..c8a1674bf4 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -1400,5 +1400,82 @@ GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int sec return data; } +std::shared_ptr init_plane_data(const indexed_triangle_set &its, const std::vector &triangle_indices) +{ + GLModel::Geometry init_data; + init_data.format = {GUI::GLModel::PrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3}; + init_data.reserve_indices(3 * triangle_indices.size()); + init_data.reserve_vertices(3 * triangle_indices.size()); + unsigned int i = 0; + for (int idx : triangle_indices) { + const Vec3f &v0 = its.vertices[its.indices[idx][0]]; + const Vec3f &v1 = its.vertices[its.indices[idx][1]]; + const Vec3f &v2 = its.vertices[its.indices[idx][2]]; + + const Vec3f n = (v1 - v0).cross(v2 - v0).normalized(); + init_data.add_vertex(v0, n); + init_data.add_vertex(v1, n); + init_data.add_vertex(v2, n); + init_data.add_triangle(i, i + 1, i + 2); + i += 3; + } + std::shared_ptr gl_data = std::make_shared(); + gl_data->init_from(std::move(init_data), true); + return gl_data; +} + +std::shared_ptr init_torus_data(unsigned int primary_resolution, + unsigned int secondary_resolution, + const Vec3f & center, + float radius, + float thickness, + const Vec3f & model_axis, + const Transform3f &world_trafo) +{ + const unsigned int torus_sector_count = std::max(4, primary_resolution); + const unsigned int section_sector_count = std::max(4, secondary_resolution); + const float torus_sector_step = 2.0f * float(M_PI) / float(torus_sector_count); + const float section_sector_step = 2.0f * float(M_PI) / float(section_sector_count); + + GLModel::Geometry data; + data.format = {GLModel::PrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3}; + data.reserve_vertices(torus_sector_count * section_sector_count); + data.reserve_indices(torus_sector_count * section_sector_count * 2 * 3); + + // vertices + const Transform3f local_to_world_matrix = world_trafo * Geometry::translation_transform(center.cast()).cast() * + Eigen::Quaternion::FromTwoVectors(Vec3f::UnitZ(), model_axis); + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const float section_angle = torus_sector_step * i; + const Vec3f radius_dir(std::cos(section_angle), std::sin(section_angle), 0.0f); + const Vec3f local_section_center = radius * radius_dir; + const Vec3f world_section_center = local_to_world_matrix * local_section_center; + const Vec3f local_section_normal = local_section_center.normalized().cross(Vec3f::UnitZ()).normalized(); + const Vec3f world_section_normal = (Vec3f) (local_to_world_matrix.matrix().block(0, 0, 3, 3) * local_section_normal).normalized(); + const Vec3f base_v = thickness * radius_dir; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const Vec3f v = Eigen::AngleAxisf(section_sector_step * j, world_section_normal) * base_v; + data.add_vertex(world_section_center + v, (Vec3f) v.normalized()); + } + } + + // triangles + for (unsigned int i = 0; i < torus_sector_count; ++i) { + const unsigned int ii = i * section_sector_count; + const unsigned int ii_next = ((i + 1) % torus_sector_count) * section_sector_count; + for (unsigned int j = 0; j < section_sector_count; ++j) { + const unsigned int j_next = (j + 1) % section_sector_count; + const unsigned int i0 = ii + j; + const unsigned int i1 = ii_next + j; + const unsigned int i2 = ii_next + j_next; + const unsigned int i3 = ii + j_next; + data.add_triangle(i0, i1, i2); + data.add_triangle(i0, i2, i3); + } + } + std::shared_ptr gl_data = std::make_shared(); + gl_data->init_from(std::move(data), true); + return gl_data; +} } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 8988da3a70..1817d9d61f 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -225,6 +225,14 @@ namespace GUI { // the origin of the torus is in its center GLModel::Geometry smooth_torus(unsigned int primary_resolution, unsigned int secondary_resolution, float radius, float thickness); + std::shared_ptr init_plane_data(const indexed_triangle_set &its, const std::vector &triangle_indices); + std::shared_ptr init_torus_data(unsigned int primary_resolution, + unsigned int secondary_resolution, + const Vec3f & center, + float radius, + float thickness, + const Vec3f & model_axis, + const Transform3f &world_trafo); } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp index f5ee8d9180..57553b4102 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp @@ -2325,35 +2325,6 @@ bool GLGizmoAdvancedCut::render_connect_type_radio_button(CutConnectorType type) return false; } -bool GLGizmoAdvancedCut::render_combo(const std::string &label, const std::vector &lines, size_t &selection_idx, float label_width, float item_width) -{ - ImGui::AlignTextToFramePadding(); - m_imgui->text(label); - ImGui::SameLine(label_width); - ImGui::PushItemWidth(item_width); - - size_t selection_out = selection_idx; - - const char *selected_str = (selection_idx >= 0 && selection_idx < int(lines.size())) ? lines[selection_idx].c_str() : ""; - if (ImGui::BBLBeginCombo(("##" + label).c_str(), selected_str, 0)) { - for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) { - ImGui::PushID(int(line_idx)); - if (ImGui::Selectable("", line_idx == selection_idx)) selection_out = line_idx; - - ImGui::SameLine(); - ImGui::Text("%s", lines[line_idx].c_str()); - ImGui::PopID(); - } - - ImGui::EndCombo(); - } - - bool is_changed = selection_idx != selection_out; - selection_idx = selection_out; - - return is_changed; -} - bool GLGizmoAdvancedCut::render_slider_double_input(const std::string &label, float &value_in, float &tolerance_in) { // -------- [ ] -------- [ ] diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp index 01b16aa614..3a62d51902 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp @@ -333,7 +333,6 @@ class GLGizmoAdvancedCut : public GLGizmoRotate3D bool render_reset_button(const std::string &label_id, const std::string &tooltip) const; bool render_connect_type_radio_button(CutConnectorType type); - bool render_combo(const std::string &label, const std::vector &lines, size_t &selection_idx, float label_width, float item_width); bool render_slider_double_input(const std::string &label, float &value_in, float &tolerance_in); bool render_slider_double_input_by_format(const std::string &label, float &value_in, float value_min, float value_max, DoubleShowType show_type = DoubleShowType::Normal); bool cut_line_processing() const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp new file mode 100644 index 0000000000..c0d3f81bf5 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp @@ -0,0 +1,163 @@ +#include "GLGizmoAssembly.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/MeasureUtils.hpp" + +#include + +#include + +#include + +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +GLGizmoAssembly::GLGizmoAssembly(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : + GLGizmoMeasure(parent, icon_filename, sprite_id) +{ + m_measure_mode = EMeasureMode::ONLY_ASSEMBLY; +} + +std::string GLGizmoAssembly::on_get_name() const +{ + if (!on_is_activable() && m_state == EState::Off) { + if (wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasAssembleView) { + return _u8L("Assembly") + ":\n" + _u8L("Please confirm explosion ratio = 1 and select at least two volumes."); + } + else { + return _u8L("Assembly") + ":\n" + _u8L("Please select at least two volumes."); + } + } else { + return _u8L("Assembly"); + } +} + +bool GLGizmoAssembly::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + const int selection_volumes_count = 2; + if (wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasAssembleView) { + if (abs(m_parent.get_explosion_ratio() - 1.0f) < 1e-2 && selection.volumes_count() >= selection_volumes_count) { + return true; + } + return false; + } else { + return selection.volumes_count() >= selection_volumes_count; + } +} + +void GLGizmoAssembly::on_render_input_window(float x, float y, float bottom_limit) +{ + static std::optional last_feature; + static EMode last_mode = EMode::FeatureSelection; + static SelectedFeatures last_selected_features; + + static float last_y = 0.0f; + static float last_h = 0.0f; + + if (m_editing_distance) + return; + unsigned int current_active_id = ImGui::GetActiveID(); + // adjust window position to avoid overlap the view toolbar + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always, 0.0f, 0.0f); + if (last_h != win_h || last_y != y) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + // Orca + ImGuiWrapper::push_toolbar_style(m_parent.get_scale()); + GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); + init_render_input_window(); + + float moving_size = m_imgui->calc_text_size(_L("(Moving)")).x; + float combox_content_size = (m_imgui->calc_text_size(_L("Point and point")).x +ImGui::GetStyle().FramePadding.x * 2.0f); + float caption_size = moving_size + 2 * m_space_size; + if (render_assembly_mode_combo(caption_size + 0.5 * m_space_size, 1.8 * combox_content_size)) { + ; + } + show_selection_ui(); + + ImGui::Separator(); + show_distance_xyz_ui(); + show_face_face_assembly(); + render_input_window_warning(m_same_model_object); + ImGui::Separator(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 10.0f)); + float get_cur_y = ImGui::GetContentRegionMax().y + ImGui::GetFrameHeight() + y; + float caption_max = 0.f; + float total_text_max = 0.f; + for (const auto &t : std::array{"point_selection", "reset", "unselect"}) { + caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc[t + "_caption"]).x); + total_text_max = std::max(total_text_max, m_imgui->calc_text_size(m_desc[t]).x); + } + show_tooltip_information(caption_max, x, get_cur_y); + + float f_scale =m_parent.get_gizmos_manager().get_layout_scale(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f * f_scale)); + + ImGui::PopStyleVar(2); + + if (last_feature != m_curr_feature || last_mode != m_mode || last_selected_features != m_selected_features) { + // the dialog may have changed its size, ask for an extra frame to render it properly + last_feature = m_curr_feature; + last_mode = m_mode; + last_selected_features = m_selected_features; + m_imgui->set_requires_extra_frame(); + } + m_last_active_item_imgui = current_active_id; + GizmoImguiEnd(); + // Orca + ImGuiWrapper::pop_toolbar_style(); +} + +void GLGizmoAssembly::render_input_window_warning(bool same_model_object) +{ + if (wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasView3D) { + if (m_hit_different_volumes.size() == 2) { + if (same_model_object == false) { + m_imgui->text(_L("Warning") + ": " + _L("Due to ensuer_on_bed, assembly between \ndifferent objects may not be correct in 3D view.\n It is recommended to assemble them together.")); + } + } + } +} + +bool GLGizmoAssembly::render_assembly_mode_combo(double label_width, float item_width) +{ + ImGui::AlignTextToFramePadding(); + size_t selection_idx = int(m_assembly_mode); + std::vector modes = {_u8L("Face and face"), _u8L("Point and point")}; + bool is_changed = false; + + ImGuiWrapper::push_combo_style(m_parent.get_scale()); + if (render_combo(_u8L("Mode"), modes, selection_idx, label_width, item_width)) { + is_changed = true; + switch_to_mode((AssemblyMode) selection_idx); + } + ImGuiWrapper::pop_combo_style(); + return is_changed; +} + +void GLGizmoAssembly::switch_to_mode(AssemblyMode new_mode) +{ + m_assembly_mode = new_mode; + reset_all_feature(); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.hpp b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.hpp new file mode 100644 index 0000000000..7046337b60 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.hpp @@ -0,0 +1,43 @@ +#ifndef slic3r_GLGizmoAssembly_hpp_ +#define slic3r_GLGizmoAssembly_hpp_ + +#include "GLGizmoMeasure.hpp" + +namespace Slic3r { + +namespace GUI { +class GLGizmoAssembly : public GLGizmoMeasure +{ + +public: + GLGizmoAssembly(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + ///

+ /// Apply rotation on select plane + /// + /// Keep information about mouse click + /// Return True when use the information otherwise False. + //bool on_mouse(const wxMouseEvent &mouse_event) override; + //void data_changed(bool is_serializing) override; + //bool gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_position, bool shift_down, bool alt_down, bool control_down) override; + + bool wants_enter_leave_snapshots() const override { return true; } + std::string get_gizmo_entering_text() const override { return _u8L("Entering Assembly gizmo"); } + std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Assembly gizmo"); } +protected: + //bool on_init() override; + std::string on_get_name() const override; + bool on_is_activable() const override; + //void on_render() override; + //void on_set_state() override; + virtual void on_render_input_window(float x, float y, float bottom_limit) override; + + void render_input_window_warning(bool same_model_object) override; + bool render_assembly_mode_combo(double label_width, float item_width); + + void switch_to_mode(AssemblyMode new_mode); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoAssembly_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index d9b1abb286..f36266a966 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -190,6 +190,35 @@ bool GLGizmoBase::render_slider_double_input_by_format( return !is_approx(old_val, value_in); } +bool GLGizmoBase::render_combo(const std::string &label, const std::vector &lines, size_t &selection_idx, float label_width, float item_width) +{ + ImGui::AlignTextToFramePadding(); + m_imgui->text(label); + ImGui::SameLine(label_width); + ImGui::PushItemWidth(item_width); + + size_t selection_out = selection_idx; + + const char *selected_str = (selection_idx >= 0 && selection_idx < int(lines.size())) ? lines[selection_idx].c_str() : ""; + if (ImGui::BBLBeginCombo(("##" + label).c_str(), selected_str, 0)) { + for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) { + ImGui::PushID(int(line_idx)); + if (ImGui::Selectable("", line_idx == selection_idx)) selection_out = line_idx; + + ImGui::SameLine(); + ImGui::Text("%s", lines[line_idx].c_str()); + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + + bool is_changed = selection_idx != selection_out; + selection_idx = selection_out; + + return is_changed; +} + GLGizmoBase::GLGizmoBase(GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id) : m_parent(parent) , m_group_id(-1) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 631a76e33e..c0a9d8ad34 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -170,6 +170,8 @@ class GLGizmoBase float value_max, int keep_digit , DoubleShowType show_type = DoubleShowType::Normal); + bool render_combo(const std::string &label, const std::vector &lines, + size_t &selection_idx, float label_width, float item_width); public: GLGizmoBase(GLCanvas3D& parent, diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp index 1b030036d6..7ea699ef81 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -20,45 +20,21 @@ namespace Slic3r { namespace GUI { - -static const Slic3r::ColorRGBA SELECTED_1ST_COLOR = { 0.25f, 0.75f, 0.75f, 1.0f }; -static const Slic3r::ColorRGBA SELECTED_2ND_COLOR = { 0.75f, 0.25f, 0.75f, 1.0f }; -static const Slic3r::ColorRGBA NEUTRAL_COLOR = {0.5f, 0.5f, 0.5f, 1.0f}; -static const Slic3r::ColorRGBA HOVER_COLOR = {0.0f, 1.0f, 0.0f, 1.0f};//Green - -static const int POINT_ID = 100; -static const int EDGE_ID = 200; -static const int CIRCLE_ID = 300; -static const int PLANE_ID = 400; -static const int SEL_SPHERE_1_ID = 501; -static const int SEL_SPHERE_2_ID = 502; - -static const float TRIANGLE_BASE = 10.0f; -static const float TRIANGLE_HEIGHT = TRIANGLE_BASE * 1.618033f; - -static const std::string CTRL_STR = -#ifdef __APPLE__ -"⌘" -#else -"Ctrl" -#endif //__APPLE__ -; - -static std::string format_double(double value) +std::string GLGizmoMeasure::format_double(double value) { char buf[1024]; sprintf(buf, "%.3f", value); return std::string(buf); } -static std::string format_vec3(const Vec3d& v) +std::string GLGizmoMeasure::format_vec3(const Vec3d &v) { char buf[1024]; sprintf(buf, "X: %.3f, Y: %.3f, Z: %.3f", v.x(), v.y(), v.z()); return std::string(buf); } -static std::string surface_feature_type_as_string(Measure::SurfaceFeatureType type) +std::string GLGizmoMeasure::surface_feature_type_as_string(Measure::SurfaceFeatureType type) { switch (type) { @@ -71,7 +47,7 @@ static std::string surface_feature_type_as_string(Measure::SurfaceFeatureType ty } } -static std::string point_on_feature_type_as_string(Measure::SurfaceFeatureType type, int hover_id) +std::string GLGizmoMeasure::point_on_feature_type_as_string(Measure::SurfaceFeatureType type, int hover_id) { std::string ret; switch (type) { @@ -84,7 +60,7 @@ static std::string point_on_feature_type_as_string(Measure::SurfaceFeatureType t return ret; } -static std::string center_on_feature_type_as_string(Measure::SurfaceFeatureType type) +std::string GLGizmoMeasure::center_on_feature_type_as_string(Measure::SurfaceFeatureType type) { std::string ret; switch (type) { @@ -95,92 +71,13 @@ static std::string center_on_feature_type_as_string(Measure::SurfaceFeatureType return ret; } -static std::shared_ptr init_plane_data(const indexed_triangle_set &its, const std::vector &triangle_indices) -{ - GLModel::Geometry init_data; - init_data.format = {GUI::GLModel::PrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3}; - init_data.reserve_indices(3 * triangle_indices.size()); - init_data.reserve_vertices(3 * triangle_indices.size()); - unsigned int i = 0; - for (int idx : triangle_indices) { - const Vec3f &v0 = its.vertices[its.indices[idx][0]]; - const Vec3f &v1 = its.vertices[its.indices[idx][1]]; - const Vec3f &v2 = its.vertices[its.indices[idx][2]]; - - const Vec3f n = (v1 - v0).cross(v2 - v0).normalized(); - init_data.add_vertex(v0, n); - init_data.add_vertex(v1, n); - init_data.add_vertex(v2, n); - init_data.add_triangle(i, i + 1, i + 2); - i += 3; - } - std::shared_ptr gl_data = std::make_shared(); - gl_data->init_from(std::move(init_data),true); - return gl_data; -} - - -static std::shared_ptr init_torus_data(unsigned int primary_resolution, - unsigned int secondary_resolution, - const Vec3f & center, - float radius, - float thickness, - const Vec3f& model_axis, - const Transform3f& world_trafo) -{ - const unsigned int torus_sector_count = std::max(4, primary_resolution); - const unsigned int section_sector_count = std::max(4, secondary_resolution); - const float torus_sector_step = 2.0f * float(M_PI) / float(torus_sector_count); - const float section_sector_step = 2.0f * float(M_PI) / float(section_sector_count); - - GLModel::Geometry data; - data.format = {GLModel::PrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3}; - data.reserve_vertices(torus_sector_count * section_sector_count); - data.reserve_indices(torus_sector_count * section_sector_count * 2 * 3); - - // vertices - const Transform3f local_to_world_matrix = world_trafo * Geometry::translation_transform(center.cast()).cast() * - Eigen::Quaternion::FromTwoVectors(Vec3f::UnitZ(), model_axis); - for (unsigned int i = 0; i < torus_sector_count; ++i) { - const float section_angle = torus_sector_step * i; - const Vec3f radius_dir(std::cos(section_angle), std::sin(section_angle), 0.0f); - const Vec3f local_section_center = radius * radius_dir; - const Vec3f world_section_center = local_to_world_matrix * local_section_center; - const Vec3f local_section_normal = local_section_center.normalized().cross(Vec3f::UnitZ()).normalized(); - const Vec3f world_section_normal = (Vec3f) (local_to_world_matrix.matrix().block(0, 0, 3, 3) * local_section_normal).normalized(); - const Vec3f base_v = thickness * radius_dir; - for (unsigned int j = 0; j < section_sector_count; ++j) { - const Vec3f v = Eigen::AngleAxisf(section_sector_step * j, world_section_normal) * base_v; - data.add_vertex(world_section_center + v, (Vec3f) v.normalized()); - } - } - - // triangles - for (unsigned int i = 0; i < torus_sector_count; ++i) { - const unsigned int ii = i * section_sector_count; - const unsigned int ii_next = ((i + 1) % torus_sector_count) * section_sector_count; - for (unsigned int j = 0; j < section_sector_count; ++j) { - const unsigned int j_next = (j + 1) % section_sector_count; - const unsigned int i0 = ii + j; - const unsigned int i1 = ii_next + j; - const unsigned int i2 = ii_next + j_next; - const unsigned int i3 = ii + j_next; - data.add_triangle(i0, i1, i2); - data.add_triangle(i0, i2, i3); - } - } - std::shared_ptr gl_data = std::make_shared(); - gl_data->init_from(std::move(data), true); - return gl_data; -} - -static bool is_feature_with_center(const Measure::SurfaceFeature& feature) +bool GLGizmoMeasure::is_feature_with_center(const Measure::SurfaceFeature &feature) { const Measure::SurfaceFeatureType type = feature.get_type(); return (type == Measure::SurfaceFeatureType::Circle || (type == Measure::SurfaceFeatureType::Edge && feature.get_extra_point().has_value())); } -static Vec3d get_feature_offset(const Measure::SurfaceFeature& feature) +Vec3d GLGizmoMeasure::get_feature_offset(const Measure::SurfaceFeature &feature) { Vec3d ret; switch (feature.get_type()) @@ -208,78 +105,73 @@ static Vec3d get_feature_offset(const Measure::SurfaceFeature& feature) return ret; } -class TransformHelper -{ - struct Cache - { - std::array viewport; - Matrix4d ndc_to_ss_matrix; - Transform3d ndc_to_ss_matrix_inverse; - }; - - static Cache s_cache; - -public: - static Vec3d model_to_world(const Vec3d& model, const Transform3d& world_matrix) { - return world_matrix * model; - } +Vec3d TransformHelper::model_to_world(const Vec3d &model, const Transform3d &world_matrix) { + return world_matrix * model; +} - static Vec4d world_to_clip(const Vec3d& world, const Matrix4d& projection_view_matrix) { - return projection_view_matrix * Vec4d(world.x(), world.y(), world.z(), 1.0); - } +Vec4d TransformHelper::world_to_clip(const Vec3d &world, const Matrix4d &projection_view_matrix) +{ + return projection_view_matrix * Vec4d(world.x(), world.y(), world.z(), 1.0); +} - static Vec3d clip_to_ndc(const Vec4d& clip) { - return Vec3d(clip.x(), clip.y(), clip.z()) / clip.w(); - } +Vec3d TransformHelper::clip_to_ndc(const Vec4d &clip) { + return Vec3d(clip.x(), clip.y(), clip.z()) / clip.w(); +} - static Vec2d ndc_to_ss(const Vec3d& ndc, const std::array& viewport) { - const double half_w = 0.5 * double(viewport[2]); - const double half_h = 0.5 * double(viewport[3]); - return { half_w * ndc.x() + double(viewport[0]) + half_w, half_h * ndc.y() + double(viewport[1]) + half_h }; - }; +Vec2d TransformHelper::ndc_to_ss(const Vec3d &ndc, const std::array &viewport) +{ + const double half_w = 0.5 * double(viewport[2]); + const double half_h = 0.5 * double(viewport[3]); + return { half_w * ndc.x() + double(viewport[0]) + half_w, half_h * ndc.y() + double(viewport[1]) + half_h }; +}; - static Vec4d model_to_clip(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix) { - return world_to_clip(model_to_world(model, world_matrix), projection_view_matrix); - } +Vec4d TransformHelper::model_to_clip(const Vec3d &model, const Transform3d &world_matrix, const Matrix4d &projection_view_matrix) +{ + return world_to_clip(model_to_world(model, world_matrix), projection_view_matrix); +} - static Vec3d model_to_ndc(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix) { - return clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)); - } +Vec3d TransformHelper::model_to_ndc(const Vec3d &model, const Transform3d &world_matrix, const Matrix4d &projection_view_matrix) +{ + return clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)); +} - static Vec2d model_to_ss(const Vec3d& model, const Transform3d& world_matrix, const Matrix4d& projection_view_matrix, const std::array& viewport) { - return ndc_to_ss(clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)), viewport); - } +Vec2d TransformHelper::model_to_ss(const Vec3d &model, const Transform3d &world_matrix, const Matrix4d &projection_view_matrix, const std::array &viewport) +{ + return ndc_to_ss(clip_to_ndc(world_to_clip(model_to_world(model, world_matrix), projection_view_matrix)), viewport); +} - static Vec2d world_to_ss(const Vec3d& world, const Matrix4d& projection_view_matrix, const std::array& viewport) { - return ndc_to_ss(clip_to_ndc(world_to_clip(world, projection_view_matrix)), viewport); - } +Vec2d TransformHelper::world_to_ss(const Vec3d &world, const Matrix4d &projection_view_matrix, const std::array &viewport) +{ + return ndc_to_ss(clip_to_ndc(world_to_clip(world, projection_view_matrix)), viewport); +} - static const Matrix4d& ndc_to_ss_matrix(const std::array& viewport) { - update(viewport); - return s_cache.ndc_to_ss_matrix; - } +const Matrix4d &TransformHelper::ndc_to_ss_matrix(const std::array &viewport) +{ + update(viewport); + return s_cache.ndc_to_ss_matrix; +} - static const Transform3d ndc_to_ss_matrix_inverse(const std::array& viewport) { - update(viewport); - return s_cache.ndc_to_ss_matrix_inverse; - } +const Transform3d TransformHelper::ndc_to_ss_matrix_inverse(const std::array &viewport) +{ + update(viewport); + return s_cache.ndc_to_ss_matrix_inverse; +} -private: - static void update(const std::array& viewport) { - if (s_cache.viewport == viewport) - return; +void TransformHelper::update(const std::array &viewport) +{ + if (s_cache.viewport == viewport) + return; - const double half_w = 0.5 * double(viewport[2]); - const double half_h = 0.5 * double(viewport[3]); - s_cache.ndc_to_ss_matrix << half_w, 0.0, 0.0, double(viewport[0]) + half_w, - 0.0, half_h, 0.0, double(viewport[1]) + half_h, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0; + const double half_w = 0.5 * double(viewport[2]); + const double half_h = 0.5 * double(viewport[3]); + s_cache.ndc_to_ss_matrix << half_w, 0.0, 0.0, double(viewport[0]) + half_w, + 0.0, half_h, 0.0, double(viewport[1]) + half_h, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0; - s_cache.ndc_to_ss_matrix_inverse = s_cache.ndc_to_ss_matrix.inverse(); - s_cache.viewport = viewport; - } -}; + s_cache.ndc_to_ss_matrix_inverse = s_cache.ndc_to_ss_matrix.inverse(); + s_cache.viewport = viewport; +} TransformHelper::Cache TransformHelper::s_cache = { { 0, 0, 0, 0 }, Matrix4d::Identity(), Transform3d::Identity() }; @@ -374,6 +266,11 @@ bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event) if (m_selected_features.first.feature.has_value()) { reset_feature2_render(); const SelectedFeatures::Item item = detect_current_item(); + if (!is_pick_meet_assembly_mode(item)) { // assembly deal + m_selected_wrong_feature_waring_tip = true; + return true; + } + m_selected_wrong_feature_waring_tip = false; if (m_selected_features.first != item) { bool processed = false; if (item.is_center) { @@ -437,6 +334,11 @@ bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event) // 1st feature selection reset_feature1_render(); const SelectedFeatures::Item item = detect_current_item(); + if (!is_pick_meet_assembly_mode(item)) {//assembly deal + m_selected_wrong_feature_waring_tip = true; + return true; + } + m_selected_wrong_feature_waring_tip = false; m_selected_features.first = item; if (requires_sphere_raycaster_for_picking(item)) { auto pick = std::make_shared(m_sphere->mesh, SEL_SPHERE_1_ID); @@ -479,7 +381,7 @@ bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event) return false; } -void func() {} + void GLGizmoMeasure::data_changed(bool is_serializing) { @@ -1723,7 +1625,8 @@ void GLGizmoMeasure::render_dimensioning() const Measure::DistAndPoints& dap = m_measurement_result.distance_infinite.has_value() ? *m_measurement_result.distance_infinite : *m_measurement_result.distance_strict; - if (m_selected_features.second.feature.has_value()) { + if (m_selected_features.second.feature.has_value() && + !(m_measure_mode == EMeasureMode::ONLY_ASSEMBLY && m_assembly_mode == AssemblyMode::FACE_FACE)) { auto x_to = dap.from; x_to[0] = dap.to[0]; point_point(dap.from, x_to, x_to[0] - dap.from[0], ColorRGBA::RED().get_data(), false, false); @@ -1849,90 +1752,74 @@ void GLGizmoMeasure::on_render_for_picking() } -void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit) +void GLGizmoMeasure::show_selection_ui() { - static std::optional last_feature; - static EMode last_mode = EMode::FeatureSelection; - static SelectedFeatures last_selected_features; - - static float last_y = 0.0f; - static float last_h = 0.0f; - - if (m_editing_distance) - return; - unsigned int current_active_id = ImGui::GetActiveID(); - // adjust window position to avoid overlap the view toolbar - const float win_h = ImGui::GetWindowHeight(); - y = std::min(y, bottom_limit - win_h); - GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always, 0.0f, 0.0f); - if (last_h != win_h || last_y != y) { - // ask canvas for another frame to render the window in the correct position - m_imgui->set_requires_extra_frame(); - if (last_h != win_h) - last_h = win_h; - if (last_y != y) - last_y = y; - } - - // Orca - ImGuiWrapper::push_toolbar_style(m_parent.get_scale()); - - GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); - - float caption_max = 0.f; - float total_text_max = 0.f; - for (const auto &t : std::array{ "point_selection", "reset", "unselect"}) { - caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc[t + "_caption"]).x); - total_text_max = std::max(total_text_max, m_imgui->calc_text_size(m_desc[t]).x); - } - - const bool use_inches = wxGetApp().app_config->get("use_inches") == "1"; - const std::string units = use_inches ? " " + _u8L("in") : " " + _u8L("mm"); - const float space_size = ImGui::CalcTextSize(" ").x * 2; - float input_size_max = ImGui::CalcTextSize("-100.00").x * 1.2; + auto space_size = m_space_size; // Show selection { - auto format_item_text = [this, use_inches, &units](const SelectedFeatures::Item& item) { - if (!item.feature.has_value()) - return _u8L("None"); + auto format_item_text = [this](const SelectedFeatures::Item &item) { + if (!item.feature.has_value()) return _u8L("None"); std::string text = (item.source == item.feature) ? surface_feature_type_as_string(item.feature->get_type()) : - item.is_center ? center_on_feature_type_as_string(item.source->get_type()) : point_on_feature_type_as_string(item.source->get_type(), m_hover_id); + item.is_center ? center_on_feature_type_as_string(item.source->get_type()) : + point_on_feature_type_as_string(item.source->get_type(), m_hover_id); if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Circle) { auto [center, radius, normal] = item.feature->get_circle(); - const Vec3d on_circle = center + radius * Measure::get_orthogonal(normal, true); - radius = (on_circle - center).norm(); - if (use_inches) + const Vec3d on_circle = center + radius * Measure::get_orthogonal(normal, true); + radius = (on_circle - center).norm(); + if (m_use_inches) radius = GizmoObjectManipulation::mm_to_in * radius; - text += " (" + _u8L("Diameter") + ": " + format_double(2.0 * radius) + units + ")"; - } - else if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Edge) { + text += " (" + _u8L("Diameter") + ": " + format_double(2.0 * radius) + m_units + ")"; + } else if (item.feature.has_value() && item.feature->get_type() == Measure::SurfaceFeatureType::Edge) { auto [start, end] = item.feature->get_edge(); - double length = (end - start).norm(); - if (use_inches) + double length = (end - start).norm(); + if (m_use_inches) length = GizmoObjectManipulation::mm_to_in * length; - text += " (" + _u8L("Length") + ": " + format_double(length) + units + ")"; + text += " (" + _u8L("Length") + ": " + format_double(length) + m_units + ")"; } return text; }; - const float selection_cap_length = ImGui::CalcTextSize((_u8L("Selection") + " 1").c_str()).x * 1.2; - auto feature_first_text= format_item_text(m_selected_features.first); + float selection_cap_length; + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { + if (m_assembly_mode == AssemblyMode::FACE_FACE) { + selection_cap_length = ImGui::CalcTextSize((_u8L("Selection") + " 1" + _u8L(" (Moving)")).c_str()).x * 1.2; + } else if (m_assembly_mode == AssemblyMode::POINT_POINT) { + selection_cap_length = ImGui::CalcTextSize((_u8L("Selection") + " 1" + _u8L(" (Moving)")).c_str()).x * 1.2; + } + } + else { + selection_cap_length = ImGui::CalcTextSize((_u8L("Selection") + " 1").c_str()).x * 1.2; + } + auto feature_first_text = format_item_text(m_selected_features.first); const float feature_first_text_length = ImGui::CalcTextSize((_u8L(feature_first_text)).c_str()).x; ImGui::AlignTextToFramePadding(); + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { + if (m_assembly_mode == AssemblyMode::FACE_FACE) { + m_imgui->text(_u8L("Select 2 faces on objects and \n make the object assemble together.")); // tip + } else if (m_assembly_mode == AssemblyMode::POINT_POINT) { + m_imgui->text(_u8L("Select 2 points or circles on objects and \n specify distance between them.")); // tip + } + } ImGui::PushStyleColor(ImGuiCol_Text, ImGuiWrapper::to_ImVec4(SELECTED_1ST_COLOR)); - - m_imgui->text(_u8L("Selection") + " 1"); + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { + if (m_assembly_mode == AssemblyMode::FACE_FACE) { + m_imgui->text(_u8L("Face") + " 1" + _u8L(" (Fixed)")); + } else if (m_assembly_mode == AssemblyMode::POINT_POINT) { + m_imgui->text(_u8L("Point") + " 1" + _u8L(" (Fixed)")); + } + } + else { + m_imgui->text(_u8L("Selection") + " 1"); + } ImGui::SameLine(selection_cap_length + space_size); ImGui::PushItemWidth(feature_first_text_length); m_imgui->text(feature_first_text); if (m_selected_features.first.feature.has_value()) { ImGui::SameLine(selection_cap_length + feature_first_text_length + space_size * 2); ImGui::PushItemWidth(space_size * 2); - ImGui::PushID("Reset1");//for image_button - if (m_imgui->image_button(m_is_dark_mode ? ImGui::RevertBtn : ImGui::RevertBtn, _L("Reset"))) { - reset_feature1(); - } + ImGui::PushID("Reset1"); // for image_button + if (m_imgui->image_button(m_is_dark_mode ? ImGui::RevertBtn : ImGui::RevertBtn, _L("Reset"))) { reset_feature1(); } ImGui::PopID(); } ImGui::PopStyleColor(); @@ -1941,7 +1828,15 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit const float feature_second_text_length = ImGui::CalcTextSize((_u8L(feature_second_text)).c_str()).x; ImGui::AlignTextToFramePadding(); ImGui::PushStyleColor(ImGuiCol_Text, ImGuiWrapper::to_ImVec4(SELECTED_2ND_COLOR)); - m_imgui->text(_u8L("Selection") + " 2"); + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { + if (m_assembly_mode == AssemblyMode::FACE_FACE) { + m_imgui->text(_u8L("Face") + " 2"+ _u8L(" (Moving)")); + } else if (m_assembly_mode == AssemblyMode::POINT_POINT) { + m_imgui->text(_u8L("Point") + " 2"+ _u8L(" (Moving)")); + } + } else { + m_imgui->text(_u8L("Selection") + " 2"); + } ImGui::SameLine(selection_cap_length + space_size); ImGui::PushItemWidth(feature_second_text_length); m_imgui->text(feature_second_text); @@ -1950,26 +1845,39 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit ImGui::SameLine(selection_cap_length + feature_second_text_length + space_size * 2); ImGui::PushItemWidth(space_size * 2); ImGui::PushID("Reset2"); - if (m_imgui->image_button(m_is_dark_mode ? ImGui::RevertBtn : ImGui::RevertBtn, _L("Reset"))) { - reset_feature2(); - } + if (m_imgui->image_button(m_is_dark_mode ? ImGui::RevertBtn : ImGui::RevertBtn, _L("Reset"))) { reset_feature2(); } ImGui::PopID(); } ImGui::PopStyleColor(); } m_imgui->disabled_begin(!m_selected_features.first.feature.has_value()); - if (m_imgui->button(_L("Restart selection"))) { - reset_all_feature(); - m_imgui->set_requires_extra_frame(); - } + if (m_imgui->button(_L("Restart selection"))) { + reset_all_feature(); + m_imgui->set_requires_extra_frame(); + } m_imgui->disabled_end(); if (m_show_reset_first_tip) { m_imgui->text(_L("Feature 1 has been reset, \nfeature 2 has been feature 1")); } + if (m_selected_wrong_feature_waring_tip) { + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { + if (m_assembly_mode == AssemblyMode::FACE_FACE) { + m_imgui->text(_L("Warning:please select Plane's feature.")); + } else if (m_assembly_mode == AssemblyMode::POINT_POINT) { + m_imgui->text(_L("Warning:please select Point's or Circle's feature.")); + } + } + } +} - auto add_measure_row_to_table = [this](const std::string& col_1, const ImVec4& col_1_color, const std::string& col_2, const ImVec4& col_2_color) { +void GLGizmoMeasure::show_distance_xyz_ui() +{ + if (m_measure_mode == EMeasureMode::ONLY_MEASURE) { + m_imgui->text(_u8L("Measure")); + } + auto add_measure_row_to_table = [this](const std::string &col_1, const ImVec4 &col_1_color, const std::string &col_2, const ImVec4 &col_2_color) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); m_imgui->text_colored(col_1_color, col_1); @@ -1982,16 +1890,18 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit wxTheClipboard->Close(); } }; - bool same_model_object = is_two_volume_in_same_model_object(); - auto add_edit_distance_xyz_box = [this, &input_size_max, &same_model_object, ¤t_active_id](Vec3d &distance) { + auto add_edit_distance_xyz_box = [this](Vec3d &distance) { m_imgui->disabled_begin(m_hit_different_volumes.size() == 1); { + if (m_measure_mode == EMeasureMode::ONLY_MEASURE) { + m_can_set_xyz_distance = false; + } m_imgui->disabled_begin(!m_can_set_xyz_distance); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); m_imgui->text_colored(ImGuiWrapper::COL_RED, "X:"); ImGui::TableSetColumnIndex(1); - ImGui::PushItemWidth(input_size_max); + ImGui::PushItemWidth(m_input_size_max); ImGui::BBLInputDouble("##measure_distance_x", &m_buffered_distance[0], 0.0f, 0.0f, "%.2f"); ImGui::TableNextRow(); @@ -2001,7 +1911,7 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit ImGui::BBLInputDouble("##measure_distance_y", &m_buffered_distance[1], 0.0f, 0.0f, "%.2f"); m_imgui->disabled_end(); - m_imgui->disabled_begin(!(same_model_object && m_can_set_xyz_distance)); + m_imgui->disabled_begin(!(m_same_model_object && m_can_set_xyz_distance)); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); m_imgui->text_colored(ImGuiWrapper::COL_BLUE, "Z:"); @@ -2010,66 +1920,62 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit m_imgui->disabled_end(); } m_imgui->disabled_end(); - if (m_last_active_item_imgui != current_active_id && m_hit_different_volumes.size() == 2) { + if (m_last_active_item_imgui != m_current_active_imgui_id && m_hit_different_volumes.size() == 2) { Vec3d displacement = Vec3d::Zero(); if (std::abs(m_buffered_distance[0] - distance[0]) > EPSILON) { displacement[0] = m_buffered_distance[0] - distance[0]; - distance[0] = m_buffered_distance[0]; + distance[0] = m_buffered_distance[0]; } else if (std::abs(m_buffered_distance[1] - distance[1]) > EPSILON) { displacement[1] = m_buffered_distance[1] - distance[1]; - distance[1] = m_buffered_distance[1]; + distance[1] = m_buffered_distance[1]; } else if (std::abs(m_buffered_distance[2] - distance[2]) > EPSILON) { displacement[2] = m_buffered_distance[2] - distance[2]; distance[2] = m_buffered_distance[2]; } - if (displacement.norm() > 0.0f) { - set_distance(same_model_object, displacement); - } + if (displacement.norm() > 0.0f) { set_distance(m_same_model_object, displacement); } } }; - ImGui::Separator(); - m_imgui->text(_u8L("Measure")); - const unsigned int max_measure_row_count = 2; - unsigned int measure_row_count = 0; + unsigned int measure_row_count = 0; if (ImGui::BeginTable("Measure", 4)) { if (m_selected_features.second.feature.has_value()) { - const Measure::MeasurementResult& measure = m_measurement_result; - if (measure.angle.has_value()) { + const Measure::MeasurementResult &measure = m_measurement_result; + if (measure.angle.has_value() && m_measure_mode == EMeasureMode::ONLY_MEASURE) + { ImGui::PushID("ClipboardAngle"); add_measure_row_to_table(_u8L("Angle"), ImGuiWrapper::COL_BAMBU, format_double(Geometry::rad2deg(measure.angle->angle)) + "°", - ImGui::GetStyleColorVec4(ImGuiCol_Text)); + ImGui::GetStyleColorVec4(ImGuiCol_Text)); ++measure_row_count; ImGui::PopID(); } const bool show_strict = measure.distance_strict.has_value() && - (!measure.distance_infinite.has_value() || std::abs(measure.distance_strict->dist - measure.distance_infinite->dist) > EPSILON); + (!measure.distance_infinite.has_value() || std::abs(measure.distance_strict->dist - measure.distance_infinite->dist) > EPSILON); - if (measure.distance_infinite.has_value()) { + if (measure.distance_infinite.has_value() && m_measure_mode == EMeasureMode::ONLY_MEASURE) { double distance = measure.distance_infinite->dist; - if (use_inches) - distance = GizmoObjectManipulation::mm_to_in * distance; + if (m_use_inches) distance = GizmoObjectManipulation::mm_to_in * distance; ImGui::PushID("ClipboardDistanceInfinite"); - add_measure_row_to_table(show_strict ? _u8L("Perpendicular distance") : _u8L("Distance"), ImGuiWrapper::COL_BAMBU, format_double(distance) + units, - ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_measure_row_to_table(show_strict ? _u8L("Perpendicular distance") : _u8L("Distance"), ImGuiWrapper::COL_BAMBU, format_double(distance) + m_units, + ImGui::GetStyleColorVec4(ImGuiCol_Text)); ++measure_row_count; ImGui::PopID(); } - if (show_strict) { + if (show_strict && + (m_measure_mode == EMeasureMode::ONLY_MEASURE || + (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY && m_assembly_mode == AssemblyMode::POINT_POINT))) + { double distance = measure.distance_strict->dist; - if (use_inches) + if (m_use_inches) distance = GizmoObjectManipulation::mm_to_in * distance; ImGui::PushID("ClipboardDistanceStrict"); - add_measure_row_to_table(_u8L("Direct distance"), ImGuiWrapper::COL_BAMBU, format_double(distance) + units, - ImGui::GetStyleColorVec4(ImGuiCol_Text)); + add_measure_row_to_table(_u8L("Direct distance"), ImGuiWrapper::COL_BAMBU, format_double(distance) + m_units, ImGui::GetStyleColorVec4(ImGuiCol_Text)); ++measure_row_count; ImGui::PopID(); } - if (measure.distance_xyz.has_value()) { + if (measure.distance_xyz.has_value() && m_measure_mode == EMeasureMode::ONLY_MEASURE) { Vec3d distance = *measure.distance_xyz; - if (use_inches) - distance = GizmoObjectManipulation::mm_to_in * distance; + if (m_use_inches) distance = GizmoObjectManipulation::mm_to_in * distance; if (measure.distance_xyz->norm() > EPSILON) { ImGui::PushID("ClipboardDistanceXYZ"); add_measure_row_to_table(_u8L("Distance XYZ"), ImGuiWrapper::COL_BAMBU, format_vec3(distance), ImGui::GetStyleColorVec4(ImGuiCol_Text)); @@ -2077,9 +1983,11 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit ImGui::PopID(); } } - - if (m_distance.norm() >0.01) { - add_edit_distance_xyz_box(m_distance); + + if (m_distance.norm() > 0.01) { + if (!(m_measure_mode == EMeasureMode::ONLY_ASSEMBLY && m_assembly_mode == AssemblyMode::FACE_FACE)) { + add_edit_distance_xyz_box(m_distance); + } } } // add dummy rows to keep dialog size fixed @@ -2087,97 +1995,149 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit add_strings_row_to_table(*m_imgui, " ", ImGuiWrapper::COL_BAMBU, " ", ImGui::GetStyleColorVec4(ImGuiCol_Text)); }*/ ImGui::EndTable(); - if (m_hit_different_volumes.size() == 2 && m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Plane && - m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Plane) { - ImGui::Separator(); - auto &action = m_assembly_action; - auto set_to_parallel_size = m_imgui->calc_button_size(_L("Parallel")).x; - auto set_to_center_coincidence_size = m_imgui->calc_button_size(_L("Center coincidence")).x; - auto feature_text_size = m_imgui->calc_button_size(_L("Featue 1")).x + m_imgui->calc_button_size(":").x; - auto set_to_reverse_rotation_size = m_imgui->calc_button_size(_L("Reverse rotation")).x; - auto rotate_around_center_size = m_imgui->calc_button_size(_L("Rotate around center:")).x; - auto parallel_distance_size = m_imgui->calc_button_size(_L("Parallel_distance:")).x; - //set_feature_1 - if (action.can_set_feature_1_reverse_rotation) { - m_imgui->text(_L("Featue 1") + ":"); - { - ImGui::SameLine(feature_text_size + space_size); - ImGui::PushItemWidth(set_to_reverse_rotation_size); - if (m_imgui->button(_L("Reverse rotation"))) { - set_to_reverse_rotation(same_model_object, 0); - } - //ImGui::SameLine(set_to_reverse1_rotation_size + 2 * space_size); - } - ImGui::Separator(); - } + } +} - m_imgui->text(_L("Featue 2") + ":"); - ImGui::SameLine(feature_text_size + space_size); - m_imgui->disabled_begin(!action.can_set_feature_2_reverse_rotation); - { - ImGui::PushItemWidth(set_to_reverse_rotation_size); - ImGui::PushID("Featue2"); - if (m_imgui->button(_L("Reverse rotation"))) { - set_to_reverse_rotation(same_model_object, 1); - } - ImGui::PopID(); +void GLGizmoMeasure::show_point_point_assembly() +{ +} + +void GLGizmoMeasure::show_face_face_assembly() +{ + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY && m_hit_different_volumes.size() == 2 && + m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Plane && + m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Plane) { + auto &action = m_assembly_action; + auto set_to_parallel_size = m_imgui->calc_button_size(_L("Parallel")).x; + auto set_to_center_coincidence_size = m_imgui->calc_button_size(_L("Center coincidence")).x; + auto feature_text_size = m_imgui->calc_button_size(_L("Featue 1")).x + m_imgui->calc_button_size(":").x; + auto set_to_reverse_rotation_size = m_imgui->calc_button_size(_L("Reverse rotation")).x; + auto rotate_around_center_size = m_imgui->calc_button_size(_L("Rotate around center:")).x; + auto parallel_distance_size = m_imgui->calc_button_size(_L("Parallel_distance:")).x; + // set_feature_1//keep code + //if (action.can_set_feature_1_reverse_rotation) { + // m_imgui->text(_L("Featue 1") + ":"); + // { + // ImGui::SameLine(feature_text_size + m_space_size); + // ImGui::PushItemWidth(set_to_reverse_rotation_size); + // if (m_imgui->button(_L("Reverse rotation"))) { + // set_to_reverse_rotation(m_same_model_object, 0); + // } + // // ImGui::SameLine(set_to_reverse1_rotation_size + 2 * space_size); + // } + // ImGui::Separator(); + //} + //m_imgui->text(_L("Featue 2") + ":"); + m_imgui->disabled_begin(!(action.can_set_to_center_coincidence)); + { + ImGui::PushItemWidth(set_to_center_coincidence_size); + if (m_imgui->button(_L("Center coincidence"))) { + set_to_center_coincidence(m_same_model_object); } - m_imgui->disabled_end(); + ImGui::SameLine(set_to_center_coincidence_size + m_space_size * 2); + } + m_imgui->disabled_end(); - m_imgui->disabled_begin(!action.can_set_to_parallel); - { - if (m_imgui->button(_L("Parallel"))) { - set_to_parallel(same_model_object); - } - ImGui::SameLine(set_to_parallel_size + space_size *2); + m_imgui->disabled_begin(!action.can_set_to_parallel); + { + if (m_imgui->button(_L("Parallel"))) { + set_to_parallel(m_same_model_object); } - m_imgui->disabled_end(); + } + m_imgui->disabled_end(); - m_imgui->disabled_begin(!(action.can_set_to_center_coincidence)); - { - ImGui::PushItemWidth(set_to_center_coincidence_size); - if (m_imgui->button(_L("Center coincidence"))) { - set_to_center_coincidence(same_model_object); - } + if (m_imgui->bbl_checkbox(_L("Flip by Face 2"), m_flip_volume_2)) { + set_to_reverse_rotation(m_same_model_object, 1); + } + /*ImGui::SameLine(feature_text_size + m_space_size); + m_imgui->disabled_begin(!action.can_set_feature_2_reverse_rotation); + { + ImGui::PushItemWidth(set_to_reverse_rotation_size); + ImGui::PushID("Featue2"); + if (m_imgui->button(_L("Reverse rotation"))) { + set_to_reverse_rotation(m_same_model_object, 1); } - m_imgui->disabled_end(); + ImGui::PopID(); + } + m_imgui->disabled_end();*/ - if (action.has_parallel_distance) { - m_imgui->text(_u8L("Parallel_distance:")); - ImGui::SameLine(parallel_distance_size + space_size); - ImGui::PushItemWidth(input_size_max); - ImGui::BBLInputDouble("##parallel_distance_z", &m_buffered_parallel_distance, 0.0f, 0.0f, "%.2f"); - if (m_last_active_item_imgui != current_active_id && std::abs(m_buffered_parallel_distance - action.parallel_distance) > EPSILON) { - set_parallel_distance(same_model_object, m_buffered_parallel_distance); - } + if (action.has_parallel_distance) { + m_imgui->text(_u8L("Parallel_distance:")); + ImGui::SameLine(parallel_distance_size + m_space_size); + ImGui::PushItemWidth(m_input_size_max); + ImGui::BBLInputDouble("##parallel_distance_z", &m_buffered_parallel_distance, 0.0f, 0.0f, "%.2f"); + if (m_last_active_item_imgui != m_current_active_imgui_id && std::abs(m_buffered_parallel_distance - action.parallel_distance) > EPSILON) { + set_parallel_distance(m_same_model_object, m_buffered_parallel_distance); } - if (action.can_around_center_of_faces) { - m_imgui->text(_u8L("Rotate around center:")); - ImGui::SameLine(rotate_around_center_size + space_size); - ImGui::PushItemWidth(input_size_max); - ImGui::BBLInputDouble("##rotate_around_center", &m_buffered_around_center, 0.0f, 0.0f, "%.2f"); - if (m_last_active_item_imgui != current_active_id && std::abs(m_buffered_around_center) > EPSILON) { - set_to_around_center_of_faces(same_model_object, m_buffered_around_center); - m_buffered_around_center = 0; - } - ImGui::SameLine(rotate_around_center_size + space_size + input_size_max+ space_size / 2.0f); - m_imgui->text(_L("°")); + } + if (action.can_around_center_of_faces) { + m_imgui->text(_u8L("Rotate around center:")); + ImGui::SameLine(rotate_around_center_size + m_space_size); + ImGui::PushItemWidth(m_input_size_max); + ImGui::BBLInputDouble("##rotate_around_center", &m_buffered_around_center, 0.0f, 0.0f, "%.2f"); + if (m_last_active_item_imgui != m_current_active_imgui_id && std::abs(m_buffered_around_center) > EPSILON) { + set_to_around_center_of_faces(m_same_model_object, m_buffered_around_center); + m_buffered_around_center = 0; } + ImGui::SameLine(rotate_around_center_size + m_space_size + m_input_size_max + m_space_size / 2.0f); + m_imgui->text(_L("°")); } } - render_input_window_warning(same_model_object); +} + +void GLGizmoMeasure::init_render_input_window() +{ + m_use_inches = wxGetApp().app_config->get("use_inches") == "1"; + m_units = m_use_inches ? " " + _u8L("in") : " " + _u8L("mm"); + m_space_size = ImGui::CalcTextSize(" ").x * 2; + m_input_size_max = ImGui::CalcTextSize("-100.00").x * 1.2; + m_same_model_object = is_two_volume_in_same_model_object(); +} + +void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit) +{ + static std::optional last_feature; + static EMode last_mode = EMode::FeatureSelection; + static SelectedFeatures last_selected_features; + + static float last_y = 0.0f; + static float last_h = 0.0f; + + if (m_editing_distance) + return; + m_current_active_imgui_id = ImGui::GetActiveID(); + // adjust window position to avoid overlap the view toolbar + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always, 0.0f, 0.0f); + if (last_h != win_h || last_y != y) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + ImGuiWrapper::push_toolbar_style(m_parent.get_scale()); + GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); + + init_render_input_window(); + show_selection_ui(); + ImGui::Separator(); + show_distance_xyz_ui(); ImGui::Separator(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 10.0f)); float get_cur_y = ImGui::GetContentRegionMax().y + ImGui::GetFrameHeight() + y; + float caption_max = 0.f; + float total_text_max = 0.f; + for (const auto &t : std::array{"point_selection", "reset", "unselect"}) { + caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc[t + "_caption"]).x); + total_text_max = std::max(total_text_max, m_imgui->calc_text_size(m_desc[t]).x); + } show_tooltip_information(caption_max, x, get_cur_y); - - float f_scale =m_parent.get_gizmos_manager().get_layout_scale(); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f * f_scale)); - - ImGui::PopStyleVar(2); - + ImGui::PopStyleVar(1); if (last_feature != m_curr_feature || last_mode != m_mode || last_selected_features != m_selected_features) { // the dialog may have changed its size, ask for an extra frame to render it properly last_feature = m_curr_feature; @@ -2185,22 +2145,14 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit last_selected_features = m_selected_features; m_imgui->set_requires_extra_frame(); } - m_last_active_item_imgui = current_active_id; + m_last_active_item_imgui = m_current_active_imgui_id; GizmoImguiEnd(); - // Orca ImGuiWrapper::pop_toolbar_style(); } void GLGizmoMeasure::render_input_window_warning(bool same_model_object) { - if (wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasView3D) { - if (m_hit_different_volumes.size() == 2) { - if (same_model_object == false) { - m_imgui->text(_L("Warning") + ": " + _L("Due to ensuer_on_bed, assembly between \ndifferent objects may not be correct in 3D view.\n It is recommended to assemble them together.")); - } - } - } } void GLGizmoMeasure::remove_selected_sphere_raycaster(int id) @@ -2355,6 +2307,7 @@ void GLGizmoMeasure::reset_feature2_render() void GLGizmoMeasure::reset_feature1() { + m_selected_wrong_feature_waring_tip = false; reset_feature1_render(); if (m_selected_features.second.feature.has_value()) { if (m_hit_different_volumes.size() == 2) { @@ -2395,6 +2348,7 @@ void GLGizmoMeasure::reset_feature2() remove_selected_sphere_raycaster(SEL_SPHERE_2_ID); m_selected_features.second.reset(); m_show_reset_first_tip = false; + m_selected_wrong_feature_waring_tip = false; reset_gripper_pick(GripperType::PLANE_2); reset_gripper_pick(GripperType::CIRCLE_2); reset_gripper_pick(GripperType::SPHERE_2); @@ -2677,5 +2631,22 @@ void GLGizmoMeasure::set_parallel_distance(bool same_model_object, float dist) } } +bool GLGizmoMeasure::is_pick_meet_assembly_mode(const SelectedFeatures::Item &item) { + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { + if (m_assembly_mode == AssemblyMode::FACE_FACE && item.feature->get_type() == Measure::SurfaceFeatureType::Plane) { + return true; + } + if (m_assembly_mode == AssemblyMode::POINT_POINT && + (item.feature->get_type() == Measure::SurfaceFeatureType::Point|| + item.feature->get_type() == Measure::SurfaceFeatureType::Circle)) { + return true; + } + return false; + } + else { + return true; + } +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp index 960f89b4ee..480dc503bd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.hpp @@ -15,9 +15,66 @@ namespace Measure { class Measuring; } namespace GUI { enum class SLAGizmoEventType : unsigned char; +enum class EMeasureMode : unsigned char { + ONLY_MEASURE, + ONLY_ASSEMBLY +}; +enum class AssemblyMode : unsigned char { + FACE_FACE, + POINT_POINT, +}; +static const Slic3r::ColorRGBA SELECTED_1ST_COLOR = {0.25f, 0.75f, 0.75f, 1.0f}; +static const Slic3r::ColorRGBA SELECTED_2ND_COLOR = {0.75f, 0.25f, 0.75f, 1.0f}; +static const Slic3r::ColorRGBA NEUTRAL_COLOR = {0.5f, 0.5f, 0.5f, 1.0f}; +static const Slic3r::ColorRGBA HOVER_COLOR = {0.0f, 1.0f, 0.0f, 1.0f}; // Green + +static const int POINT_ID = 100; +static const int EDGE_ID = 200; +static const int CIRCLE_ID = 300; +static const int PLANE_ID = 400; +static const int SEL_SPHERE_1_ID = 501; +static const int SEL_SPHERE_2_ID = 502; + +static const float TRIANGLE_BASE = 10.0f; +static const float TRIANGLE_HEIGHT = TRIANGLE_BASE * 1.618033f; + +static const std::string CTRL_STR = +#ifdef __APPLE__ + "⌘" +#else + "Ctrl" +#endif //__APPLE__ + ; + +class TransformHelper +{ + struct Cache + { + std::array viewport; + Matrix4d ndc_to_ss_matrix; + Transform3d ndc_to_ss_matrix_inverse; + }; + static Cache s_cache; + +public: + static Vec3d model_to_world(const Vec3d &model, const Transform3d &world_matrix); + static Vec4d world_to_clip(const Vec3d &world, const Matrix4d &projection_view_matrix); + static Vec3d clip_to_ndc(const Vec4d &clip); + static Vec2d ndc_to_ss(const Vec3d &ndc, const std::array &viewport); + static Vec4d model_to_clip(const Vec3d &model, const Transform3d &world_matrix, const Matrix4d &projection_view_matrix); + static Vec3d model_to_ndc(const Vec3d &model, const Transform3d &world_matrix, const Matrix4d &projection_view_matrix); + static Vec2d model_to_ss(const Vec3d &model, const Transform3d &world_matrix, const Matrix4d &projection_view_matrix, const std::array &viewport); + static Vec2d world_to_ss(const Vec3d &world, const Matrix4d &projection_view_matrix, const std::array &viewport); + static const Matrix4d & ndc_to_ss_matrix(const std::array &viewport); + static const Transform3d ndc_to_ss_matrix_inverse(const std::array &viewport); + +private: + static void update(const std::array &viewport); +}; class GLGizmoMeasure : public GLGizmoBase { +protected: enum class EMode : unsigned char { FeatureSelection, @@ -116,8 +173,6 @@ class GLGizmoMeasure : public GLGizmoBase GLModel arc; }; Dimensioning m_dimensioning; - bool m_show_reset_first_tip{false}; - std::map> m_mesh_raycaster_map; std::vector m_hit_different_volumes; @@ -172,7 +227,7 @@ class GLGizmoMeasure : public GLGizmoBase void data_changed(bool is_serializing) override; - bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + virtual bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); bool wants_enter_leave_snapshots() const override { return true; } std::string get_gizmo_entering_text() const override { return _u8L("Entering Measure gizmo"); } @@ -187,9 +242,14 @@ class GLGizmoMeasure : public GLGizmoBase void on_set_state() override; virtual void on_render_for_picking() override; + void show_selection_ui(); + void show_distance_xyz_ui(); + void show_point_point_assembly(); + void show_face_face_assembly(); + void init_render_input_window(); virtual void on_render_input_window(float x, float y, float bottom_limit) override; - void render_input_window_warning(bool same_model_object); + virtual void render_input_window_warning(bool same_model_object); void remove_selected_sphere_raycaster(int id); void update_measurement_result(); @@ -199,6 +259,14 @@ class GLGizmoMeasure : public GLGizmoBase void register_single_mesh_pick(); void update_single_mesh_pick(GLVolume* v); + std::string format_double(double value); + std::string format_vec3(const Vec3d &v); + std::string surface_feature_type_as_string(Measure::SurfaceFeatureType type); + std::string point_on_feature_type_as_string(Measure::SurfaceFeatureType type, int hover_id); + std::string center_on_feature_type_as_string(Measure::SurfaceFeatureType type); + bool is_feature_with_center(const Measure::SurfaceFeature &feature); + Vec3d get_feature_offset(const Measure::SurfaceFeature &feature); + void reset_all_feature(); void reset_feature1_render(); void reset_feature2_render(); @@ -214,10 +282,23 @@ class GLGizmoMeasure : public GLGizmoBase void set_to_around_center_of_faces(bool same_model_object,float rotate_degree); void set_to_center_coincidence(bool same_model_object); void set_parallel_distance(bool same_model_object,float dist); - private: + + bool is_pick_meet_assembly_mode(const SelectedFeatures::Item& item); + protected: // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. std::map m_desc; + bool m_show_reset_first_tip{false}; + bool m_selected_wrong_feature_waring_tip{false}; + EMeasureMode m_measure_mode{EMeasureMode::ONLY_MEASURE}; + AssemblyMode m_assembly_mode{AssemblyMode::FACE_FACE}; + bool m_flip_volume_2{false}; + float m_space_size; + float m_input_size_max; + bool m_use_inches; + std::string m_units; + mutable bool m_same_model_object; + mutable unsigned int m_current_active_imgui_id; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index ce55c95125..e13c6d1cee 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -24,7 +24,7 @@ #include "slic3r/GUI/Gizmos/GLGizmoSimplify.hpp" #include "slic3r/GUI/Gizmos/GLGizmoText.hpp" #include "slic3r/GUI/Gizmos/GLGizmoMeshBoolean.hpp" -#include "slic3r/GUI/Gizmos/GLGizmoMeasure.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoAssembly.hpp" #include "libslic3r/format.hpp" #include "libslic3r/Model.hpp" @@ -62,6 +62,7 @@ std::vector GLGizmosManager::get_selectable_idxs() const if (m_gizmos[i]->get_sprite_id() == (unsigned int) Move || m_gizmos[i]->get_sprite_id() == (unsigned int) Rotate || m_gizmos[i]->get_sprite_id() == (unsigned int) Measure || + m_gizmos[i]->get_sprite_id() == (unsigned int) Assembly || m_gizmos[i]->get_sprite_id() == (unsigned int) MmuSegmentation) out.push_back(i); } @@ -182,6 +183,9 @@ void GLGizmosManager::switch_gizmos_icon_filename() case (EType::Measure): gizmo->set_icon_filename(m_is_dark ? "toolbar_measure_dark.svg" : "toolbar_measure.svg"); break; + case (EType::Assembly): + gizmo->set_icon_filename(m_is_dark ? "toolbar_assembly_dark.svg" : "toolbar_assembly.svg"); + break; } } @@ -219,6 +223,7 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoText(m_parent, m_is_dark ? "toolbar_text_dark.svg" : "toolbar_text.svg", EType::Text)); m_gizmos.emplace_back(new GLGizmoMmuSegmentation(m_parent, m_is_dark ? "mmu_segmentation_dark.svg" : "mmu_segmentation.svg", EType::MmuSegmentation)); m_gizmos.emplace_back(new GLGizmoMeasure(m_parent, m_is_dark ? "toolbar_measure_dark.svg" : "toolbar_measure.svg", EType::Measure)); + m_gizmos.emplace_back(new GLGizmoAssembly(m_parent, m_is_dark ? "toolbar_assembly_dark.svg" : "toolbar_assembly.svg", EType::Assembly)); m_gizmos.emplace_back(new GLGizmoSimplify(m_parent, "reduce_triangles.svg", EType::Simplify)); //m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", sprite_id++)); //m_gizmos.emplace_back(new GLGizmoFaceDetector(m_parent, "face recognition.svg", sprite_id++)); @@ -385,7 +390,7 @@ bool GLGizmosManager::check_gizmos_closed_except(EType type) const void GLGizmosManager::set_hover_id(int id) { - if (m_current == EType::Measure) { return; } + if (m_current == EType::Measure || m_current == EType::Assembly) { return; } if (!m_enabled || m_current == Undefined) return; @@ -663,7 +668,8 @@ bool GLGizmosManager::is_gizmo_click_empty_not_exit() get_current_type() == GLGizmosManager::EType::Seam || get_current_type() == GLGizmosManager::EType::FdmSupports || get_current_type() == GLGizmosManager::EType::MmuSegmentation || - get_current_type() == GLGizmosManager::EType::Measure) { + get_current_type() == GLGizmosManager::EType::Measure || + get_current_type() == GLGizmosManager::EType::Assembly) { return true; } return false; @@ -730,6 +736,8 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p return dynamic_cast(m_gizmos[Text].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == Measure) return dynamic_cast(m_gizmos[Measure].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == Assembly) + return dynamic_cast(m_gizmos[Assembly].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == Cut) return dynamic_cast(m_gizmos[Cut].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == MeshBoolean) @@ -1020,7 +1028,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) // the gizmo got the event and took some action, there is no need to do anything more processed = true; else if (!selection.is_empty() && grabber_contains_mouse()) { - if (m_current != Measure) { + if (!(m_current == Measure || m_current == Assembly)) { update_data(); selection.start_dragging(); start_dragging(); @@ -1168,7 +1176,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case WXK_ESCAPE: { if (m_current != Undefined) { - if (m_current == Measure && gizmo_event(SLAGizmoEventType::Escape)) { + if ((m_current == Measure || m_current == Assembly) && gizmo_event(SLAGizmoEventType::Escape)) { // do nothing } else if ((m_current != SlaSupports) || !gizmo_event(SLAGizmoEventType::DiscardChanges)) reset_all_states(); @@ -1206,7 +1214,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) //case WXK_BACK: case WXK_DELETE: { - if ((m_current == Cut || m_current == Measure) && gizmo_event(SLAGizmoEventType::Delete)) + if ((m_current == Cut || m_current == Measure || m_current == Assembly) && gizmo_event(SLAGizmoEventType::Delete)) processed = true; break; } @@ -1313,7 +1321,7 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = true; } } - if (m_current == Measure) { + if (m_current == Measure || m_current == Assembly) { if (keyCode == WXK_CONTROL) gizmo_event(SLAGizmoEventType::CtrlUp, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); else if (keyCode == WXK_SHIFT) @@ -1400,7 +1408,7 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) // force extra frame to automatically update window size wxGetApp().imgui()->set_requires_extra_frame(); } - } else if (m_current == Measure) { + } else if (m_current == Measure || m_current == Assembly) { if (keyCode == WXK_CONTROL) gizmo_event(SLAGizmoEventType::CtrlDown, Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.CmdDown()); else if (keyCode == WXK_SHIFT) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 30c86727c9..71553bc5ff 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -79,6 +79,7 @@ class GLGizmosManager : public Slic3r::ObjectBase Text, MmuSegmentation, Measure, + Assembly, Simplify, SlaSupports, // BBS diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp index a9ada68aad..2b13c48575 100644 --- a/src/slic3r/GUI/ObjColorDialog.cpp +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -263,9 +263,6 @@ ObjColorPanel::ObjColorPanel(wxWindow * parent, specify_cluster_sizer->Add(specify_color_cluster_title, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); m_color_cluster_num_by_user_ebox = new wxTextCtrl(m_page_simple, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(25), -1), wxTE_PROCESS_ENTER); - if (m_color_num_recommend == 1) { - m_color_cluster_num_by_user_ebox->Enable(false); - } m_color_cluster_num_by_user_ebox->SetValue(std::to_string(m_color_cluster_num_by_algo).c_str()); {//event auto on_apply_color_cluster_text_modify = [this](wxEvent &e) { @@ -674,7 +671,7 @@ void ObjColorPanel::draw_table() m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); } m_scrolledWindow->SetSizer(m_gridsizer); - int totalHeight = row_height *(row+1); + int totalHeight = row_height *(row+1) * 2; m_scrolledWindow->SetVirtualSize(MIN_OBJCOLOR_DIALOG_WIDTH, totalHeight); auto look = FIX_SCROLL_HEIGTH; if (totalHeight > FIX_SCROLL_HEIGTH) { @@ -736,7 +733,7 @@ void ObjColorPanel::deal_add_btn() int new_index = m_colours.size() + 1; for (size_t i = 0; i < new_color_size; i++) { if (m_colours.size() + new_icons.size() >= g_max_color) { - m_warning_text->SetLabelText(_L("Waring:The count of newly added and current extruders exceeds 16.")); + m_warning_text->SetLabelText(_L("Waring:The count of newly added and \n current extruders exceeds 16.")); break; } wxColour cur_color = convert_to_wxColour(m_cluster_colors_from_algo[i]); From ca112321c5908a6fe270558a91b4c2bd883dd1aa Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Mon, 22 Apr 2024 16:29:42 +0800 Subject: [PATCH 58/74] ENH: translation JIRA: none Change-Id: I916e574df4dee363eb9a15bc44ab682242f79dbd --- bbl/i18n/BambuStudio.pot | 102 +++++++++++++++--- bbl/i18n/cs/BambuStudio_cs.po | 102 +++++++++++++++--- bbl/i18n/de/BambuStudio_de.po | 102 +++++++++++++++--- bbl/i18n/en/BambuStudio_en.po | 102 +++++++++++++++--- bbl/i18n/es/BambuStudio_es.po | 102 +++++++++++++++--- bbl/i18n/fr/BambuStudio_fr.po | 102 +++++++++++++++--- bbl/i18n/hu/BambuStudio_hu.po | 102 +++++++++++++++--- bbl/i18n/it/BambuStudio_it.po | 106 ++++++++++++++++--- bbl/i18n/ja/BambuStudio_ja.po | 102 +++++++++++++++--- bbl/i18n/ko/BambuStudio_ko.po | 114 ++++++++++++++++---- bbl/i18n/list.txt | 6 +- bbl/i18n/nl/BambuStudio_nl.po | 102 +++++++++++++++--- bbl/i18n/pt-BR/BambuStudio_pt-BR.po | 106 ++++++++++++++++--- bbl/i18n/ru/BambuStudio_ru.po | 102 +++++++++++++++--- bbl/i18n/sv/BambuStudio_sv.po | 102 +++++++++++++++--- bbl/i18n/tr/BambuStudio_tr.po | 102 +++++++++++++++--- bbl/i18n/uk/BambuStudio_uk.po | 102 +++++++++++++++--- bbl/i18n/zh_cn/BambuStudio_zh_CN.po | 132 +++++++++++++++++++----- resources/i18n/it/BambuStudio.mo | Bin 306836 -> 306861 bytes resources/i18n/ko/BambuStudio.mo | Bin 306996 -> 358888 bytes resources/i18n/pt-BR/BambuStudio.mo | Bin 331866 -> 331887 bytes resources/i18n/pt_br/BambuStudio.mo | Bin 331866 -> 331887 bytes resources/i18n/zh_cn/BambuStudio.mo | Bin 324781 -> 327236 bytes src/slic3r/GUI/SendMultiMachinePage.cpp | 6 +- 24 files changed, 1564 insertions(+), 232 deletions(-) diff --git a/bbl/i18n/BambuStudio.pot b/bbl/i18n/BambuStudio.pot index e50ff6d557..6195946384 100644 --- a/bbl/i18n/BambuStudio.pot +++ b/bbl/i18n/BambuStudio.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3349,15 +3349,15 @@ msgstr "" msgid "Export all sliced file" msgstr "" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "" msgid "Send all" msgstr "" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "" @@ -5601,9 +5601,6 @@ msgstr "" msgid "Other Device" msgstr "" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "" @@ -5821,6 +5818,9 @@ msgstr "" msgid "Modifying the device name" msgstr "" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "" @@ -5873,11 +5873,11 @@ msgid "Unknown Failure" msgstr "" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -5889,7 +5889,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -6885,7 +6885,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -9715,6 +9715,12 @@ msgid "" "XY Size compensation can not be combined with color-painting." msgstr "" +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -9734,6 +9740,9 @@ msgstr "" msgid "load_obj: failed to parse" msgstr "" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "" @@ -11247,6 +11256,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "How to use keyboard shortcuts\nDid you know that Bambu Studio offers a wide range of keyboard shortcuts and 3D scene operations." msgstr "" diff --git a/bbl/i18n/cs/BambuStudio_cs.po b/bbl/i18n/cs/BambuStudio_cs.po index 1923b1fc7d..83a95dab57 100644 --- a/bbl/i18n/cs/BambuStudio_cs.po +++ b/bbl/i18n/cs/BambuStudio_cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: 2023-10-18 10:45+0800\n" "Last-Translator: René Mošner \n" "Language-Team: \n" @@ -3510,15 +3510,15 @@ msgstr "Exportovat soubor slicované na podložce" msgid "Export all sliced file" msgstr "Exportovat všechny slicované soubory" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Vytisknout vše" msgid "Send all" msgstr "Odeslat vše" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" @@ -5840,9 +5840,6 @@ msgstr "Moje zařízení" msgid "Other Device" msgstr "Jiné zařízení" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6083,6 +6080,9 @@ msgstr "Automatická kalibrace průtoku pomocí Mikro Lidar" msgid "Modifying the device name" msgstr "Úprava názvu zařízení" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Odeslat do tiskárny SD kartu" @@ -6136,11 +6136,11 @@ msgid "Unknown Failure" msgstr "Neznámá chyba" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6152,7 +6152,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7221,7 +7221,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10393,6 +10393,12 @@ msgstr "" "natřený.\n" "Korekci velikosti XY nelze kombinovat s barevnou malbou." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10415,6 +10421,9 @@ msgstr "Zrušeno" msgid "load_obj: failed to parse" msgstr "load_obj: nepodařilo se zpracovat" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Soubor obsahuje polygon s více než 4 vrcholy." @@ -12017,6 +12026,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/de/BambuStudio_de.po b/bbl/i18n/de/BambuStudio_de.po index 9ccd081c95..5eeabc0ac7 100644 --- a/bbl/i18n/de/BambuStudio_de.po +++ b/bbl/i18n/de/BambuStudio_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3569,15 +3569,15 @@ msgstr "Exportieren der Datei einer gesliceten Druckplatte" msgid "Export all sliced file" msgstr "Alle gesliceten Dateien exportieren" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Alle Druckplatten drucken" msgid "Send all" msgstr "Alles senden" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Tastaturkürzel" @@ -5955,9 +5955,6 @@ msgstr "Mein Gerät" msgid "Other Device" msgstr "Anderes Gerät" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6216,6 +6213,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "Den Gerätenamen ändern" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "An MicroSD-Karte des Druckers senden" @@ -6275,11 +6275,11 @@ msgid "Unknown Failure" msgstr "Unbekannter Fehler" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6291,7 +6291,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7396,7 +7396,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10726,6 +10726,12 @@ msgstr "" "farbig bemalt ist.\n" "Die XY-Größenkompensation kann nicht mit der Farbmalerei kombiniert werden." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10749,6 +10755,9 @@ msgstr "Abgebrochen" msgid "load_obj: failed to parse" msgstr "load_obj: konnte nicht analysiert werden" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Die Datei enthält Polygone mit mehr als 4 Eckpunkten." @@ -12444,6 +12453,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/en/BambuStudio_en.po b/bbl/i18n/en/BambuStudio_en.po index f7b69242c2..f43d999cc0 100644 --- a/bbl/i18n/en/BambuStudio_en.po +++ b/bbl/i18n/en/BambuStudio_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3503,15 +3503,15 @@ msgstr "Export plate sliced file" msgid "Export all sliced file" msgstr "Export all sliced file" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Print all" msgid "Send all" msgstr "Send all" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Keyboard Shortcuts" @@ -5852,9 +5852,6 @@ msgstr "My Device" msgid "Other Device" msgstr "Other Device" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6102,6 +6099,9 @@ msgstr "Automatic flow calibration using Micro Lidar" msgid "Modifying the device name" msgstr "Modifying the device name" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Send to Printer MicroSD card" @@ -6154,11 +6154,11 @@ msgid "Unknown Failure" msgstr "Unknown Failure" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6170,7 +6170,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7243,7 +7243,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10458,6 +10458,12 @@ msgstr "" "painted.\n" "XY Size compensation can not be combined with color-painting." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10478,6 +10484,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -12144,6 +12153,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/es/BambuStudio_es.po b/bbl/i18n/es/BambuStudio_es.po index 6ced6c7fe6..9a5ec537e1 100644 --- a/bbl/i18n/es/BambuStudio_es.po +++ b/bbl/i18n/es/BambuStudio_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3564,15 +3564,15 @@ msgstr "Exportar la placa de impresión actual" msgid "Export all sliced file" msgstr "Exportar todas las placas" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Imprimir todo" msgid "Send all" msgstr "Enviar todo" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Atajos de teclado" @@ -5946,9 +5946,6 @@ msgstr "Mi dispositivo" msgid "Other Device" msgstr "Otro dispositivo" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "En línea" @@ -6200,6 +6197,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "Modificar el nombre del dispositivo" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Enviar a la tarjeta microSD de la impresora" @@ -6258,11 +6258,11 @@ msgid "Unknown Failure" msgstr "Error desconocido" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6274,7 +6274,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7373,7 +7373,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10696,6 +10696,12 @@ msgstr "" "está pintado de color.\n" "La compensación de tamaño XY no se puede combinar con la pintura en color." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10719,6 +10725,9 @@ msgstr "Cancelado" msgid "load_obj: failed to parse" msgstr "load_obj: no se pudo analizar" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "El archivo contiene polígonos con más de 4 vértices." @@ -12407,6 +12416,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/fr/BambuStudio_fr.po b/bbl/i18n/fr/BambuStudio_fr.po index 7a1bd2d608..51817f4cb3 100644 --- a/bbl/i18n/fr/BambuStudio_fr.po +++ b/bbl/i18n/fr/BambuStudio_fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -3555,15 +3555,15 @@ msgstr "Exporter fichier tranché du plateau" msgid "Export all sliced file" msgstr "Exporter tous les fichiers tranchés" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Tout imprimer" msgid "Send all" msgstr "Tout envoyer" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Raccourcis Clavier" @@ -5942,9 +5942,6 @@ msgstr "Mon appareil" msgid "Other Device" msgstr "Autre appareil" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "En ligne" @@ -6204,6 +6201,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "Modification du nom de l'appareil" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Envoyer à la carte SD de l'imprimante" @@ -6263,11 +6263,11 @@ msgid "Unknown Failure" msgstr "Erreur inconnue" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6279,7 +6279,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7391,7 +7391,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10732,6 +10732,12 @@ msgstr "" "La compensation de la taille XY ne peut pas être combinée avec la peinture " "couleur." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10755,6 +10761,9 @@ msgstr "Annulé" msgid "load_obj: failed to parse" msgstr "load_obj : échec de l'analyse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Le fichier contient des polygones comportant plus de 4 sommets." @@ -12452,6 +12461,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/hu/BambuStudio_hu.po b/bbl/i18n/hu/BambuStudio_hu.po index 637b0a16d9..cc6ef07b0e 100644 --- a/bbl/i18n/hu/BambuStudio_hu.po +++ b/bbl/i18n/hu/BambuStudio_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3540,15 +3540,15 @@ msgstr "Szeletelt tálca exportálása" msgid "Export all sliced file" msgstr "Minden szeletelt fájl exportálása" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Összes nyomtatása" msgid "Send all" msgstr "Összes elküldése" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" @@ -5902,9 +5902,6 @@ msgstr "Saját eszköz" msgid "Other Device" msgstr "Egyéb eszköz" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6158,6 +6155,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "Eszköz nevének módosítása" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Küldés a nyomtatóban lévő MicroSD kártyára" @@ -6213,11 +6213,11 @@ msgid "Unknown Failure" msgstr "Ismeretlen hiba" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6229,7 +6229,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7319,7 +7319,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10619,6 +10619,12 @@ msgstr "" "tartalmaz.\n" "Az XY méretkompenzáció nem kombinálható színfestéssel." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10642,6 +10648,9 @@ msgstr "Megszakítva" msgid "load_obj: failed to parse" msgstr "load_obj: nem sikerült feldolgozni" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "A fájl 4-nél több csúccsal rendelkező poligonokat tartalmaz." @@ -12318,6 +12327,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/it/BambuStudio_it.po b/bbl/i18n/it/BambuStudio_it.po index 5c6d2c7fbb..37bf2e097d 100644 --- a/bbl/i18n/it/BambuStudio_it.po +++ b/bbl/i18n/it/BambuStudio_it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1733,10 +1733,10 @@ msgid "AMS not connected" msgstr "AMS non collegato" msgid "Load" -msgstr "" +msgstr "Load" msgid "Unload" -msgstr "Scarica" +msgstr "UnLoad" msgid "Ext Spool" msgstr "Bobina esterna" @@ -3545,15 +3545,15 @@ msgstr "Esporta il file del piatto elaborato" msgid "Export all sliced file" msgstr "Esporta tutti i file elaborati" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Stampa tutto" msgid "Send all" msgstr "Invia tutto" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Scorciatoie Tastiera" @@ -5912,9 +5912,6 @@ msgstr "Mio dispositivo" msgid "Other Device" msgstr "Altro dispositivo" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6166,6 +6163,9 @@ msgstr "Automatic flow calibration using Micro Lidar" msgid "Modifying the device name" msgstr "Modifica nome del dispositivo" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Invia a microSD stampante" @@ -6222,11 +6222,11 @@ msgid "Unknown Failure" msgstr "Fallimento sconosciuto" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6238,7 +6238,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7335,7 +7335,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10663,6 +10663,12 @@ msgstr "" "La compensazione delle dimensioni XY non può essere combinata con la " "colorazione." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10686,6 +10692,9 @@ msgstr "Annullato" msgid "load_obj: failed to parse" msgstr "load_obj: analisi non riuscita" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Il file contiene poligoni con più di 4 vertici." @@ -12377,6 +12386,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/ja/BambuStudio_ja.po b/bbl/i18n/ja/BambuStudio_ja.po index d8a05294eb..ca2f0e9883 100644 --- a/bbl/i18n/ja/BambuStudio_ja.po +++ b/bbl/i18n/ja/BambuStudio_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3448,15 +3448,15 @@ msgstr "エクスポート" msgid "Export all sliced file" msgstr "エクスポート (全プレート)" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "造形開始 (全プレート)" msgid "Send all" msgstr "送信 (全プレート)" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "ショートカット" @@ -5782,9 +5782,6 @@ msgstr "私のデバイス" msgid "Other Device" msgstr "その他のデバイス" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "オンライン" @@ -6015,6 +6012,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "デバイス名を変更" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "プリンターのSDカードに送信" @@ -6069,11 +6069,11 @@ msgid "Unknown Failure" msgstr "不明な失敗" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6085,7 +6085,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7136,7 +7136,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10253,6 +10253,12 @@ msgstr "" "painted.\n" "XY Size compensation can not be combined with color-painting." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10274,6 +10280,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -11942,6 +11951,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/ko/BambuStudio_ko.po b/bbl/i18n/ko/BambuStudio_ko.po index eb61269850..67efa7f3d9 100644 --- a/bbl/i18n/ko/BambuStudio_ko.po +++ b/bbl/i18n/ko/BambuStudio_ko.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -3533,15 +3533,15 @@ msgstr "플레이트 슬라이스 파일 내보내기" msgid "Export all sliced file" msgstr "모든 슬라이스 파일 내보내기" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "모두 출력" msgid "Send all" msgstr "모두 보내기" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "키보드 단축키" @@ -5908,9 +5908,6 @@ msgstr "내 장치" msgid "Other Device" msgstr "기타 장치" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "온라인" @@ -6153,6 +6150,9 @@ msgstr "Micro Lidar를 사용한 자동 플로우 캘리브레이션" msgid "Modifying the device name" msgstr "장치 이름 수정" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "프린터 MicroSD 카드로 보내기" @@ -6205,11 +6205,11 @@ msgid "Unknown Failure" msgstr "알 수 없는 실패" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6221,7 +6221,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -6415,8 +6415,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "툴헤드 없이 타임랩스를 녹화할 때는 “타임랩스 와이프 타워”를 추가하는 것이 좋" "습니다. \n" @@ -7309,7 +7309,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10543,6 +10543,12 @@ msgstr "" "개체의 XY 크기 보정은 색상으로 칠해져 있기 때문에 사용되지 않습니다.\n" "XY 크기 보정은 컬러 페인팅과 함께 사용할 수 없습니다." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10565,6 +10571,9 @@ msgstr "취소됨" msgid "load_obj: failed to parse" msgstr "load_obj: 구문 분석에 실패" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "이 파일에는 꼭짓점이 4개 이상인 다각형이 포함되어 있습니다." @@ -11512,12 +11521,12 @@ msgstr "" "Do you want to rewrite it?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more prinetrs, Please go to printer selection" msgstr "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more prinetrs, Please go to printer selection" msgid "Create Printer/Nozzle" @@ -12282,6 +12291,75 @@ msgstr "" "니다. 따라서 인쇄하기 전에 공급업체에 적합한 프로파일을 요청하고 성능에 따라 " "일부 매개변수를 조정하는 것이 좋습니다." +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/list.txt b/bbl/i18n/list.txt index 2f74b95b01..e71c7cc1a0 100644 --- a/bbl/i18n/list.txt +++ b/bbl/i18n/list.txt @@ -158,4 +158,8 @@ src/slic3r/Utils/FlashAir.cpp src/slic3r/Utils/MKS.cpp src/slic3r/Utils/OctoPrint.cpp src/slic3r/Utils/Repetier.cpp -src/slic3r/Utils/ProfileDescription.hpp \ No newline at end of file +src/slic3r/Utils/ProfileDescription.hpp +src/slic3r/GUI/SendMultiMachinePage.cpp +src/slic3r/GUI/MultiMachinePage.cpp +src/slic3r/GUI/MultiMachineManagerPage.cpp +src/slic3r/GUI/MultiTaskManagerPage.cpp \ No newline at end of file diff --git a/bbl/i18n/nl/BambuStudio_nl.po b/bbl/i18n/nl/BambuStudio_nl.po index de3b0fafa6..a81d14f578 100644 --- a/bbl/i18n/nl/BambuStudio_nl.po +++ b/bbl/i18n/nl/BambuStudio_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3559,15 +3559,15 @@ msgstr "Exporteer plate sliced bestand" msgid "Export all sliced file" msgstr "Alle sliced bestanden exporteren" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Print alles" msgid "Send all" msgstr "Alles verzenden" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Sneltoesten" @@ -5949,9 +5949,6 @@ msgstr "Mijn apparaat" msgid "Other Device" msgstr "Ander apparaat" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6204,6 +6201,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "De naam van het apparaat wijzigen" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Verzenden naar de MicroSD-kaart in de printer" @@ -6262,11 +6262,11 @@ msgid "Unknown Failure" msgstr "Onbekende fout" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6278,7 +6278,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7384,7 +7384,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10718,6 +10718,12 @@ msgstr "" "kleur is geverfd.\n" "XY-formaatcompensatie kan niet worden gecombineerd met verven in kleur." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10741,6 +10747,9 @@ msgstr "Geannuleerd" msgid "load_obj: failed to parse" msgstr "load_obj: kon niet parseren" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Het bestand bevat polygonen met meer dan 4 hoekpunten." @@ -12425,6 +12434,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/pt-BR/BambuStudio_pt-BR.po b/bbl/i18n/pt-BR/BambuStudio_pt-BR.po index f3a7501325..63bfb9224b 100644 --- a/bbl/i18n/pt-BR/BambuStudio_pt-BR.po +++ b/bbl/i18n/pt-BR/BambuStudio_pt-BR.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -1752,10 +1752,10 @@ msgid "AMS not connected" msgstr "AMS não conectado" msgid "Load" -msgstr "" +msgstr "Load" msgid "Unload" -msgstr "Descarregar" +msgstr "Unload" msgid "Ext Spool" msgstr "Carretel Externo" @@ -3587,15 +3587,15 @@ msgstr "Exportar arquivo fatiado em placas" msgid "Export all sliced file" msgstr "Exportar todos os arquivos fatiados" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Imprimir tudo" msgid "Send all" msgstr "Enviar tudo" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Atalhos de teclado" @@ -5972,9 +5972,6 @@ msgstr "Meu dispositivo" msgid "Other Device" msgstr "Outro dispositivo" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "On-line" @@ -6226,6 +6223,9 @@ msgstr "Automatic flow calibration using Micro Lidar" msgid "Modifying the device name" msgstr "Modificando o nome do dispositivo" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Enviar para a impressora cartão microSD" @@ -6284,11 +6284,11 @@ msgid "Unknown Failure" msgstr "Falha desconhecida" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6300,7 +6300,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7396,7 +7396,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10771,6 +10771,12 @@ msgstr "" "pintado em cores.\n" "A compensação de tamanho XY não pode ser combinada com pintura colorida." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10794,6 +10800,9 @@ msgstr "Cancelado" msgid "load_obj: failed to parse" msgstr "load_obj: falha na análise" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "O arquivo contém polígonos com mais de 4 vértices." @@ -12501,6 +12510,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/ru/BambuStudio_ru.po b/bbl/i18n/ru/BambuStudio_ru.po index ce58c8e94e..a4832eed22 100644 --- a/bbl/i18n/ru/BambuStudio_ru.po +++ b/bbl/i18n/ru/BambuStudio_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio 1.9.0.70 Public Beta 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: 2024-04-18 20:55+0700\n" "Last-Translator: Andylg \n" "Language-Team: \n" @@ -3665,15 +3665,15 @@ msgstr "Экспорт стола в файл проекта" msgid "Export all sliced file" msgstr "Экспорт всех столов в файл проекта" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Распечатать все столы" msgid "Send all" msgstr "Отправить G-код всех столов на SD-карту" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Горячие клавиши" @@ -6121,9 +6121,6 @@ msgstr "Мой принтер" msgid "Other Device" msgstr "Другое устройство" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "В сети" @@ -6390,6 +6387,9 @@ msgstr "Автокалибровка потока с помощью микрол msgid "Modifying the device name" msgstr "Изменение имени принтера" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Отправить на SD-карту принтера" @@ -6442,11 +6442,11 @@ msgid "Unknown Failure" msgstr "Неизвестная ошибка" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6458,7 +6458,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7597,7 +7597,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -11043,6 +11043,12 @@ msgstr "" "Коррекция горизонтальных размеров модели не может использоваться в сочетании " "с функцией раскрашивания." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -11066,6 +11072,9 @@ msgstr "Отменено" msgid "load_obj: failed to parse" msgstr "load_obj: ошибка обработки" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Файл содержит многоугольники с более чем 4 вершинами." @@ -12883,6 +12892,75 @@ msgstr "" "профиль и настроить некоторые параметры в соответствии с его " "характеристиками." +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/sv/BambuStudio_sv.po b/bbl/i18n/sv/BambuStudio_sv.po index e21a9da186..fdb5a3c541 100644 --- a/bbl/i18n/sv/BambuStudio_sv.po +++ b/bbl/i18n/sv/BambuStudio_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -3518,15 +3518,15 @@ msgstr "Exportera byggplattans beredda fil" msgid "Export all sliced file" msgstr "Exportera alla beredda filer" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Skriv ut allt" msgid "Send all" msgstr "Skicka alla" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Kortkommando" @@ -5878,9 +5878,6 @@ msgstr "Min Enhet" msgid "Other Device" msgstr "Andra Enheter" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Online" @@ -6131,6 +6128,9 @@ msgstr "Automatic flow calibration using the Micro Lidar" msgid "Modifying the device name" msgstr "Ändra enhetens namn" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Skicka till skrivarens MicroSD-kort" @@ -6184,11 +6184,11 @@ msgid "Unknown Failure" msgstr "Okänt fel" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6200,7 +6200,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7288,7 +7288,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10528,6 +10528,12 @@ msgstr "" "är också färglagd.\n" "XY-storlekskompensation kan inte kombineras med färgläggning." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10549,6 +10555,9 @@ msgstr "Avbruten" msgid "load_obj: failed to parse" msgstr "load_obj: misslyckades med att analysera" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Filen innehåller polygoner med fler än 4 hörn." @@ -12226,6 +12235,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/tr/BambuStudio_tr.po b/bbl/i18n/tr/BambuStudio_tr.po index 9b4c68f059..092ed3aa6a 100644 --- a/bbl/i18n/tr/BambuStudio_tr.po +++ b/bbl/i18n/tr/BambuStudio_tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: 2024-04-16 18:18+0300\n" "Last-Translator: Fatih AYDIN \n" "Language-Team: \n" @@ -3587,15 +3587,15 @@ msgstr "Dilimlenmiş plaka dosyasını dışa aktar" msgid "Export all sliced file" msgstr "Tüm dilimlenmiş dosyayı dışa aktar" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Tümünü yazdır" msgid "Send all" msgstr "Hepsini gönder" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Klavye kısayolları" @@ -6003,9 +6003,6 @@ msgstr "Cihazım" msgid "Other Device" msgstr "Diğer Cihaz" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "Çevrimiçi" @@ -6264,6 +6261,9 @@ msgstr "Mikro Lidar kullanarak otomatik akış kalibrasyonu" msgid "Modifying the device name" msgstr "Cihaz adını değiştir" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Yazıcı SD kartına gönder" @@ -6316,11 +6316,11 @@ msgid "Unknown Failure" msgstr "Bilinmeyen Arıza" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6332,7 +6332,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7441,7 +7441,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10787,6 +10787,12 @@ msgstr "" "kullanılmayacaktır.\n" "XY Boyut telafisi renkli boyamayla birleştirilemez." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10810,6 +10816,9 @@ msgstr "İptal edildi" msgid "load_obj: failed to parse" msgstr "load_obj: ayrıştırılamadı" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Dosya 4'ten fazla köşesi olan çokgenler içeriyor." @@ -12615,6 +12624,75 @@ msgstr "" "öncesinde uygun profili sağlayan satıcıya başvurmanız ve performansına göre " "bazı parametreleri ayarlamanız şiddetle tavsiye edilir." +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/uk/BambuStudio_uk.po b/bbl/i18n/uk/BambuStudio_uk.po index efed919eae..825f09d007 100644 --- a/bbl/i18n/uk/BambuStudio_uk.po +++ b/bbl/i18n/uk/BambuStudio_uk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: BambuLab Україна\n" @@ -3595,15 +3595,15 @@ msgstr "Експортувати файл нарізки пластини" msgid "Export all sliced file" msgstr "Експортувати весь нарізаний файл" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "Роздрукувати все" msgid "Send all" msgstr "Надіслати все" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Гарячі клавіші" @@ -6013,9 +6013,6 @@ msgstr "Мої пристрої" msgid "Other Device" msgstr "Інші пристрої" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "У мережі" @@ -6271,6 +6268,9 @@ msgstr "Автоматична калібрування потоку за доп msgid "Modifying the device name" msgstr "Зміна імені пристрою" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Надіслати на SD-карту принтера" @@ -6325,11 +6325,11 @@ msgid "Unknown Failure" msgstr "Невідома помилка" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." msgstr "" -msgid "Can't find pin code?" +msgid "Can't find Pin Code?" msgstr "" msgid "Pin Code" @@ -6341,7 +6341,7 @@ msgstr "" msgid "Please confirm on the printer screen" msgstr "" -msgid "Log in failed. Please check the pin code." +msgid "Log in failed. Please check the Pin Code." msgstr "" msgid "Log in printer" @@ -7444,7 +7444,7 @@ msgstr "" msgid "Filament Extruded, Continue" msgstr "" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "" msgid "Finished, Continue" @@ -10806,6 +10806,12 @@ msgstr "" "забарвлений кольором.\n" "Компенсація розміру XY не може поєднуватися з кольором." +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" @@ -10829,6 +10835,9 @@ msgstr "Скасовано" msgid "load_obj: failed to parse" msgstr "помилка завантаження файлу OBJ: не вдалося розпізнати формат" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Цей файл містить полігони з більше ніж 4 вершинами." @@ -12665,6 +12674,75 @@ msgid "" "according to its performances." msgstr "" +msgid "No AMS" +msgstr "" + +msgid "Use External Spool" +msgstr "" + +msgid "Use AMS" +msgstr "" + +msgid "Select Printers" +msgstr "" + +msgid "Device Name" +msgstr "" + +msgid "Device Status" +msgstr "" + +msgid "Ams Status" +msgstr "" + +msgid "Unconnected device" +msgstr "" + +msgid "Printing Options" +msgstr "" + +msgid "Send Options" +msgstr "" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "" + +msgid "Wait" +msgstr "" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "" + +msgid "Task Sending" +msgstr "" + +msgid "Task Sent" +msgstr "" + +msgid "No task" +msgstr "" + +msgid "Task Name" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "Task Status" +msgstr "" + +msgid "Sent Time" +msgstr "" + +msgid "There are no tasks to be sent!" +msgstr "" + +msgid "No historical tasks!" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" diff --git a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po index d23cf5116d..9ba483055d 100644 --- a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po +++ b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-19 14:24+0800\n" +"POT-Creation-Date: 2024-04-22 16:06+0800\n" "PO-Revision-Date: 2024-02-23 20:10+0800\n" "Last-Translator: Jiang Yue \n" "Language-Team: \n" @@ -1708,7 +1708,7 @@ msgid "AMS not connected" msgstr "AMS未连接" msgid "Load" -msgstr "加载" +msgstr "进料" msgid "Unload" msgstr "退料" @@ -3411,7 +3411,7 @@ msgid "Device" msgstr "设备" msgid "Multi-device" -msgstr "" +msgstr "多设备" msgid "Project" msgstr "项目" @@ -3449,15 +3449,15 @@ msgstr "导出单盘切片文件" msgid "Export all sliced file" msgstr "导出所有切片文件" -msgid "Send to Multi-device" -msgstr "" - msgid "Print all" msgstr "打印所有盘" msgid "Send all" msgstr "发送所有盘" +msgid "Send to Multi-device" +msgstr "发送到多设备" + msgid "Keyboard Shortcuts" msgstr "快捷键" @@ -5326,12 +5326,12 @@ msgid "If enabled, auto-calculate every time when filament is changed" msgstr "如果启用,会在每一次更换材料时自动计算。" msgid "Multi-device Management(Take effect after restarting Studio)." -msgstr "" +msgstr "多设备管理(重启Studio后生效)" msgid "" "With this option enabled, you can send a task to multiple devices at the " "same time and manage multiple devices." -msgstr "" +msgstr "启用此选项后,您可以同时向多个设备发送任务并管理多个设备。" msgid "Presets" msgstr "预设" @@ -5740,9 +5740,6 @@ msgstr "我的设备" msgid "Other Device" msgstr "其他设备" -msgid "Bind with Pin Code" -msgstr "" - msgid "Online" msgstr "在线" @@ -5973,6 +5970,9 @@ msgstr "使用微型激光雷达进行自动流量校准" msgid "Modifying the device name" msgstr "修改打印机名称" +msgid "Bind with Pin Code" +msgstr "通过Pin码绑定" + msgid "Send to Printer SD card" msgstr "发送到打印机的SD卡" @@ -6025,24 +6025,24 @@ msgid "Unknown Failure" msgstr "发生错误" msgid "" -"Please Find the ping code in Account page on printer screen,\n" -" and type in the ping code below." -msgstr "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "请在打印机屏幕上的“帐户”页面中找到Pin码,然后在下面输入Pin码。" -msgid "Can't find pin code?" -msgstr "" +msgid "Can't find Pin Code?" +msgstr "无法找到Pin码?" msgid "Pin Code" msgstr "Pin码" msgid "Binding..." -msgstr "" +msgstr "绑定..." msgid "Please confirm on the printer screen" -msgstr "" +msgstr "请在打印机屏幕上确认。" -msgid "Log in failed. Please check the pin code." -msgstr "" +msgid "Log in failed. Please check the Pin Code." +msgstr "登录失败,请检查Pin码。" msgid "Log in printer" msgstr "登录打印机" @@ -7094,7 +7094,7 @@ msgstr "前往机器助手" msgid "Filament Extruded, Continue" msgstr "耗材已挤出,继续" -msgid "Not Extruded Yet,Retry" +msgid "Not Extruded Yet, Retry" msgstr "耗材未挤出,重试" msgid "Finished, Continue" @@ -7104,10 +7104,10 @@ msgid "Load Filament" msgstr "进料并前往进料页面" msgid "Filament Loaded, Resume" -msgstr "" +msgstr "耗材已加载,继续" msgid "View Liveview" -msgstr "" +msgstr "查看LiveView" msgid "Confirm and Update Nozzle" msgstr "确认并更新喷嘴" @@ -10119,6 +10119,12 @@ msgstr "" "对象的XY尺寸补偿不会生效,因为在此对象上做过涂色操作。\n" "XY尺寸补偿不能与涂色功能一起使用。" +msgid "Importing obj with png function is developing." +msgstr "" + +msgid "Importing obj occurred an unknown error." +msgstr "" + msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "未知的文件格式。输入文件的扩展名必须为.stl、.obj 或 .amf(.xml)。" @@ -10138,6 +10144,9 @@ msgstr "已取消" msgid "load_obj: failed to parse" msgstr "加载对象:无法分析" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "该文件包含顶点超过4个的多边形。" @@ -10267,10 +10276,9 @@ msgid "" "can continue the calibration, but you cannot create new calibration " "historical results. \n" "Do you still want to continue the calibration?" -msgstr"" +msgstr "" "该机型每个喷嘴最多只能保存16个历史结果。您可以删除先已有历史结果再开始校准。" -"或者您可以直接开始校准,但是无法创建新的校准历史结果。" -"您仍继续校准吗?" +"或者您可以直接开始校准,但是无法创建新的校准历史结果。您仍继续校准吗?" msgid "Connecting to printer..." msgstr "正在连接打印机..." @@ -11807,6 +11815,75 @@ msgstr "" "此耗材较为小众,拓竹并未出售,且不同品牌的差异很大,故强烈建议打印前向厂家咨" "询预设参数,并根据打印表现来调整打印参数。" +msgid "No AMS" +msgstr "没有AMS" + +msgid "Use External Spool" +msgstr "使用外挂料卷" + +msgid "Use AMS" +msgstr "使用AMS" + +msgid "Select Printers" +msgstr "选择打印机" + +msgid "Device Name" +msgstr "设备名" + +msgid "Device Status" +msgstr "设备状态" + +msgid "Ams Status" +msgstr "AMS状态" + +msgid "Unconnected device" +msgstr "未连接设备" + +msgid "Printing Options" +msgstr "打印选项" + +msgid "Send Options" +msgstr "发送选项" + +msgid "" +"printers at the same time.(It depends on how many devices can undergo " +"heating at the same time.)" +msgstr "打印机在同一时间。(这取决于有多少设备可以接受同时加热。)" + +msgid "Wait" +msgstr "等待" + +msgid "" +"minute each batch.(It depends on how long it takes to complete the heating.)" +msgstr "分钟发送一次。(这取决于完成加热需要多长时间。)" + +msgid "Task Sending" +msgstr "正在发送的任务" + +msgid "Task Sent" +msgstr "已发送的任务" + +msgid "No task" +msgstr "没有任务" + +msgid "Task Name" +msgstr "任务名" + +msgid "Actions" +msgstr "动作" + +msgid "Task Status" +msgstr "任务状态" + +msgid "Sent Time" +msgstr "发送时间" + +msgid "There are no tasks to be sent!" +msgstr "没有任务正在发送!" + +msgid "No historical tasks!" +msgstr "没有历史任务!" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -12074,6 +12151,9 @@ msgstr "" "避免翘曲\n" "您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。" +#~ msgid "Not Extruded Yet,Retry" +#~ msgstr "耗材未挤出,重试" + #~ msgid "active" #~ msgstr "活动的" diff --git a/resources/i18n/it/BambuStudio.mo b/resources/i18n/it/BambuStudio.mo index af05bd3e53ba04d643387318157335fbaec1fb1b..42aaed4bb109a1a53561884814131ea1e094280d 100644 GIT binary patch delta 61858 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 z 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 C9RAz@ delta 67596 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 Yx?|~S&r5Nm)$G_F#f~92J+J5aA5bX4O8@`> delta 63181 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 Yx?|~S&r5Nm)$G_F#f~92J+J5aA5bX4O8@`> delta 63181 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 diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index 6cb719dbdf..39ec47a20f 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -1217,9 +1217,9 @@ wxPanel* SendMultiMachinePage::create_page() // add printing options wxBoxSizer* title_print_option = create_item_title(_L("Printing Options"), main_page, ""); - wxBoxSizer* item_bed_level = create_item_checkbox(_("Bed Leveling"), main_page, "", 50, "bed_leveling"); - wxBoxSizer* item_timelapse = create_item_checkbox(_("Timelapse"), main_page, "", 50, "timelapse"); - wxBoxSizer* item_flow_dy_ca = create_item_checkbox(_("Flow Dynamic Calibration"), main_page, "", 50, "flow_cali"); + wxBoxSizer* item_bed_level = create_item_checkbox(_L("Bed Leveling"), main_page, "", 50, "bed_leveling"); + wxBoxSizer* item_timelapse = create_item_checkbox(_L("Timelapse"), main_page, "", 50, "timelapse"); + wxBoxSizer* item_flow_dy_ca = create_item_checkbox(_L("Flow Dynamics Calibration"), main_page, "", 50, "flow_cali"); sizer->Add(title_print_option, 0, wxEXPAND, 0); wxBoxSizer* options_sizer_v = new wxBoxSizer(wxHORIZONTAL); options_sizer_v->Add(item_bed_level, 0, wxLEFT, 0); From 2f9adb550f37f980c1484baeebc46114ddd0630b Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Mon, 22 Apr 2024 17:20:39 +0800 Subject: [PATCH 59/74] FIX: error code pop-up window without retry button in some code JIRA: STUDIO-6922 Change-Id: I67464bebaba4558618301592c455db8824bbfe30 --- src/slic3r/GUI/StatusPanel.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 27eef0f281..50372ba7b0 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -83,7 +83,8 @@ static std::vector message_containing_retry{ "07FF 8011", "07FF 8012", "07FF 8013", - "12FF 8007" + "12FF 8007", + "1200 8006" }; static std::vector message_containing_done{ @@ -2176,18 +2177,18 @@ void StatusPanel::update_error_message() ::sprintf(buf, "%08X", obj->print_error); std::string print_error_str = std::string(buf); if (print_error_str.size() > 4) { - print_error_str.insert(4, "-"); + print_error_str.insert(4, " "); } wxString error_msg = wxGetApp().get_hms_query()->query_print_error_msg(obj->print_error); std::vector used_button; wxString error_image_url = wxGetApp().get_hms_query()->query_print_error_url_action(obj->print_error,obj->dev_id, used_button); // special case - if (print_error_str == "0300-8003" || print_error_str == "0300-8002" || print_error_str == "0300-800A") + if (print_error_str == "0300 8003" || print_error_str == "0300 8002" || print_error_str == "0300 800A") used_button.emplace_back(PrintErrorDialog::PrintErrorButton::JUMP_TO_LIVEVIEW); if (!error_msg.IsEmpty()) { wxDateTime now = wxDateTime::Now(); - wxString show_time = wxString::Format("%d%02d%02d", now.GetDay(), now.GetHour(), now.GetMinute()); + wxString show_time = now.Format("%Y-%m-%d %H:%M:%S"); error_msg = wxString::Format("%s\n[%s %s]", error_msg, From 17de1883c5dcd5a0ee9650fcfbe00e0fdc582c6f Mon Sep 17 00:00:00 2001 From: "liz.li" Date: Mon, 22 Apr 2024 11:03:20 +0800 Subject: [PATCH 60/74] FIX: air printing and nozzle blob detection issue jira: STUDIO-6897 Change-Id: I008ddb24b74119d7e4124ae26310b4b86c42a799 --- src/slic3r/GUI/AMSSetting.cpp | 5 ++++- src/slic3r/GUI/PrintOptionsDialog.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/AMSSetting.cpp b/src/slic3r/GUI/AMSSetting.cpp index ec6634d78f..2b273ae00a 100644 --- a/src/slic3r/GUI/AMSSetting.cpp +++ b/src/slic3r/GUI/AMSSetting.cpp @@ -222,6 +222,9 @@ void AMSSetting::create() m_sizer_air_print_inline->Add(m_tip_air_print_line, 0, wxEXPAND, 0); m_sizer_air_print_tip->Add(m_sizer_air_print_inline, 1, wxALIGN_CENTER, 0); + m_checkbox_air_print->Hide(); + m_title_air_print->Hide(); + m_tip_air_print_line->Hide(); // panel img @@ -377,7 +380,7 @@ void AMSSetting::update_switch_filament(bool selected) void AMSSetting::update_air_printing_detection(bool selected) { - if (obj->is_support_air_print_detection) { + if (false/*obj->is_support_air_print_detection*/) { m_checkbox_air_print->Show(); m_title_air_print->Show(); m_tip_air_print_line->Show(); diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index b6487ca9d6..d2916865ff 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -169,7 +169,7 @@ void PrintOptionsDialog::update_options(MachineObject* obj_) m_cb_filament_tangle->Hide(); line6->Hide(); } - if (obj_->is_support_nozzle_blob_detection) { + if (false/*obj_->is_support_nozzle_blob_detection*/) { text_nozzle_blob->Show(); m_cb_nozzle_blob->Show(); text_nozzle_blob_caption->Show(); @@ -372,6 +372,11 @@ wxBoxSizer* PrintOptionsDialog::create_settings_group(wxWindow* parent) line7->SetLineColour(STATIC_BOX_LINE_COL); sizer->Add(line7, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); + text_nozzle_blob->Hide(); + m_cb_nozzle_blob->Hide(); + text_nozzle_blob_caption->Hide(); + line7->Hide(); + ai_monitoring_level_list->Connect( wxEVT_COMBOBOX, wxCommandEventHandler(PrintOptionsDialog::set_ai_monitor_sensitivity), NULL, this ); return sizer; From f87baaf44e3d363910af487a353c90c477191e21 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 23 Apr 2024 09:14:37 +0800 Subject: [PATCH 61/74] FIX:fix bugs of algo and read quad in obj file Jira: STUDIO-6805 Change-Id: I6c33e8197225f27dccdfa0681e64d76d1df14f61 --- src/libslic3r/Format/OBJ.cpp | 7 +------ src/libslic3r/Format/objparser.cpp | 28 ++++++++++++++++++++++++++++ src/libslic3r/Format/objparser.hpp | 2 ++ src/libslic3r/ObjColorUtils.hpp | 12 ++++++++---- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index 8c504a642d..0433e917c6 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -165,12 +165,7 @@ bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::s } else { for (size_t k = 0; k < data.usemtls.size(); k++) { auto mtl = data.usemtls[k]; - if (mtl.vertexIdxEnd == -1 && face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE)) { - set_face_color(face_index, data.usemtls[k].name); - break; - } else if (mtl.vertexIdxEnd != -1 && - face_index >= (mtl.vertexIdxFirst / ONE_FACE_SIZE) - && face_index < (mtl.vertexIdxEnd / ONE_FACE_SIZE)) { + if (face_index >= mtl.face_start && face_index <= mtl.face_end) { set_face_color(face_index, data.usemtls[k].name); break; } diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index 917f33d41c..c56d6930ce 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -251,6 +251,24 @@ static bool obj_parseline(const char *line, ObjData &data) data.vertices.push_back(vertex); EATWS(); } + if (data.usemtls.size() > 0) { + data.usemtls.back().vertexIdxEnd = (int) data.vertices.size(); + } + if (data.usemtls.size() > 0) { + int face_index_count = 0; + for (int i = data.vertices.size() - 1; i >= 0; i--) { + if (data.vertices[i].coordIdx == -1) { + break; + } + face_index_count++; + } + if (face_index_count == 3) {//tri + data.usemtls.back().face_end++; + } else if (face_index_count == 4) {//quad + data.usemtls.back().face_end++; + data.usemtls.back().face_end++; + } + } vertex.coordIdx = -1; vertex.normalIdx = -1; vertex.textureCoordIdx = -1; @@ -289,6 +307,16 @@ static bool obj_parseline(const char *line, ObjData &data) usemtl.vertexIdxFirst = (int)data.vertices.size(); usemtl.name = line; data.usemtls.push_back(usemtl); + if (data.usemtls.size() == 1) { + data.usemtls.back().face_start = 0; + } + else {//>=2 + auto count = data.usemtls.size(); + auto& last_usemtl = data.usemtls[count-1]; + auto& last_last_usemtl = data.usemtls[count - 2]; + last_usemtl.face_start = last_last_usemtl.face_end + 1; + } + data.usemtls.back().face_end = data.usemtls.back().face_start - 1; break; } case 'o': diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5c4a3ca2ab..48493de3de 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -27,6 +27,8 @@ struct ObjUseMtl { int vertexIdxFirst; int vertexIdxEnd{-1}; + int face_start; + int face_end{-1}; std::string name; }; diff --git a/src/libslic3r/ObjColorUtils.hpp b/src/libslic3r/ObjColorUtils.hpp index 2e8565e42d..4fe924fab2 100644 --- a/src/libslic3r/ObjColorUtils.hpp +++ b/src/libslic3r/ObjColorUtils.hpp @@ -57,16 +57,19 @@ class QuantKMeans convert_color_space(flatten_image8UC3, image8UC3, color_space); cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); - for (int i = 0; i < image8UC3.rows; i++) image32FC3.at(i, 0) = image8UC3.at(i, 0); + for (int i = 0; i < image8UC3.rows; i++) + image32FC3.at(i, 0) = image8UC3.at(i, 0); - int best_cluster = 1, cur_score = 0, best_score = 100; + int best_cluster = 1; + double cur_score, best_score = 100; int max_cluster = ori_colors.size(); num_cluster = fmin(num_cluster, max_cluster); if (num_cluster < 1) { cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); best_score = cur_score; for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) { - if (cur_cluster > max_cluster) break; + if (cur_cluster > max_cluster) + break; cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); best_cluster = cur_score < best_score ? cur_cluster : best_cluster; @@ -79,7 +82,8 @@ class QuantKMeans kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, centers32FC3); this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3); - for (int i = 0; i < best_cluster; i++) this->m_centers8UC3.at(i) = centers32FC3.at(i); + for (int i = 0; i < best_cluster; i++) + this->m_centers8UC3.at(i) = centers32FC3.at(i); convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true); From 75f6e4afad1e2683b2e24a8665d319a29f8e5ac7 Mon Sep 17 00:00:00 2001 From: tao wang Date: Mon, 22 Apr 2024 10:27:10 +0800 Subject: [PATCH 62/74] ENH:Set the default nozzle diameter to 0.4 jira:[for nozzle] Change-Id: I74a5c9b0460046496b897eae3d9f917ac1b99052 --- src/slic3r/GUI/PrintOptionsDialog.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index d2916865ff..f9b1a4d6b9 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -538,6 +538,8 @@ void PrinterPartsDialog::set_nozzle_type(wxCommandEvent& evt) nozzle_diameter_checkbox->Append(wxString::Format(_L("%.1f"), diameter_list[i])); } nozzle_diameter_checkbox->SetSelection(0); + + last_nozzle_type = type; set_nozzle_diameter(evt); } @@ -577,7 +579,11 @@ bool PrinterPartsDialog::Show(bool show) CentreOnParent(); auto type = obj->nozzle_type; - auto diameter = round(obj->nozzle_diameter * 10) / 10; + auto diameter = 0.4f; + + if (obj->nozzle_diameter > 0) { + diameter = round(obj->nozzle_diameter * 10) / 10; + } nozzle_type_checkbox->Clear(); nozzle_diameter_checkbox->Clear(); From eb63ceff706bded8b10178046f8468580a6097a9 Mon Sep 17 00:00:00 2001 From: tao wang Date: Mon, 22 Apr 2024 17:46:40 +0800 Subject: [PATCH 63/74] FIX:fixed backspace error on macos Change-Id: I76066391783c04857c1a60a6f8438111501b6d7c --- src/slic3r/GUI/BindDialog.cpp | 45 +++++++++++++++++++++++++++++++---- src/slic3r/GUI/BindDialog.hpp | 2 ++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index 6678cde767..d2240280de 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -127,6 +127,7 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) m_text_input_single_code[i]->GetTextCtrl()->SetMaxLength(1); m_text_input_single_code[i]->GetTextCtrl()->Bind(wxEVT_TEXT, &PingCodeBindDialog::on_text_changed, this); m_text_input_single_code[i]->GetTextCtrl()->Bind(wxEVT_KEY_DOWN, &PingCodeBindDialog::on_key_backspace, this); + m_text_input_single_code[i]->GetTextCtrl()->Bind(wxEVT_CHAR, &PingCodeBindDialog::on_key_input, this); ping_code_input->Add(m_text_input_single_code[i], 0, wxALL, FromDIP(5)); } @@ -194,7 +195,7 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) wxBoxSizer* m_sizer_binding_button = new wxBoxSizer(wxHORIZONTAL); m_sizer_binding_button->Add(0, 0, 1, wxEXPAND, 5); - auto m_button_close = new Button(binding_panel, _L("Close")); + m_button_close = new Button(binding_panel, _L("Close")); m_button_close->SetBackgroundColor(btn_bg_white); m_button_close->SetBorderColor(BIND_DIALOG_GREY900); m_button_close->SetSize(BIND_DIALOG_BUTTON_SIZE); @@ -227,10 +228,26 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) m_button_bind->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_bind_printer), NULL, this); m_button_cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); + m_button_close->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); m_simplebook->SetSelection(0); } +void PingCodeBindDialog::on_key_input(wxKeyEvent& evt) +{ + int keyCode = evt.GetKeyCode(); + + if (keyCode == WXK_BACK || (keyCode >= '0' && keyCode <= '9') || (keyCode >= 'a' && keyCode <= 'z') || (keyCode >= 'A' && keyCode <= 'Z')) + { + evt.Skip(); + } + else + { + wxBell(); + return; + } +} + void PingCodeBindDialog::on_text_changed(wxCommandEvent& event) { //switch focus to the text text input wxTextCtrl* text_input = static_cast(event.GetEventObject()); @@ -246,9 +263,24 @@ void PingCodeBindDialog::on_text_changed(wxCommandEvent& event) { if (idx < PING_CODE_LENGTH-1) { m_text_input_single_code[idx + 1]->SetFocus(); } - else if (idx == PING_CODE_LENGTH - 1) { + + auto has_empty = false; + for (int i = 0; i < PING_CODE_LENGTH; i++) { + if (m_text_input_single_code[i]->GetTextCtrl()->GetValue().ToStdString().empty()) { + has_empty = true; + } + } + + if (has_empty) { + m_button_bind->Enable(false); + } + else { m_button_bind->Enable(true); } + + /*if (idx == PING_CODE_LENGTH - 1) { + m_button_bind->Enable(true); + }*/ } } @@ -264,9 +296,11 @@ void PingCodeBindDialog::on_key_backspace(wxKeyEvent& event) } } - if (event.GetKeyCode() == WXK_BACK && idx > 0) { - m_text_input_single_code[idx - 1]->SetFocus(); - m_button_bind->Enable(false); + if (event.GetKeyCode() == WXK_BACK && idx >= 0) { + CallAfter([this, idx]() { + m_text_input_single_code[idx - 1]->SetFocus(); + m_button_bind->Enable(false); + }); } event.Skip(); } @@ -308,6 +342,7 @@ void PingCodeBindDialog::on_dpi_changed(const wxRect& suggested_rect) PingCodeBindDialog::~PingCodeBindDialog() { m_button_bind->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_bind_printer), NULL, this); m_button_cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); + m_button_close->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); } BindMachineDialog::BindMachineDialog(Plater *plater /*= nullptr*/) diff --git a/src/slic3r/GUI/BindDialog.hpp b/src/slic3r/GUI/BindDialog.hpp index e7d7a9d97c..11f31b2c28 100644 --- a/src/slic3r/GUI/BindDialog.hpp +++ b/src/slic3r/GUI/BindDialog.hpp @@ -55,6 +55,7 @@ class PingCodeBindDialog : public DPIDialog TextInput* m_text_input_single_code[PING_CODE_LENGTH]; Button* m_button_bind; Button* m_button_cancel; + Button* m_button_close; wxSimplebook* m_simplebook; wxPanel* request_bind_panel; wxPanel* binding_panel; @@ -77,6 +78,7 @@ class PingCodeBindDialog : public DPIDialog PingCodeBindDialog(Plater* plater = nullptr); ~PingCodeBindDialog(); + void on_key_input(wxKeyEvent& evt); void on_text_changed(wxCommandEvent& event); void on_key_backspace(wxKeyEvent& event); void on_cancel(wxCommandEvent& event); From ee5aa815621ad5e69c3ffb485876649b76ed884c Mon Sep 17 00:00:00 2001 From: tao wang Date: Tue, 23 Apr 2024 09:22:19 +0800 Subject: [PATCH 64/74] ENH:Subscription list deduplication jira:[for mulit] Change-Id: I10e9d849986c9661b587c7b1a509180c2451816e --- src/slic3r/GUI/MultiTaskManagerPage.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp index cc24655d40..b26940101d 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.cpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -1217,7 +1217,11 @@ void CloudTaskManagerPage::refresh_user_device(bool clear) m_task_items[it->first] = mtitem; mtitem->update_info(); task_temps.push_back(mtitem); - subscribe_list.push_back(mtitem->m_dev_id); + + auto find_it = std::find(subscribe_list.begin(), subscribe_list.end(), mtitem->m_dev_id); + if (find_it == subscribe_list.end()) { + subscribe_list.push_back(mtitem->m_dev_id); + } } dev->subscribe_device_list(subscribe_list); From 4b13d016df4211f8892473da6128a66d0c27dcef Mon Sep 17 00:00:00 2001 From: gerrit Date: Tue, 23 Apr 2024 10:20:03 +0800 Subject: [PATCH 65/74] ci: update build version to 01.09.01.53 Change-Id: I756740960782dbffb6b592dd45cf9a1791fb249b --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index 8eaaa4bc76..4adab063fd 100644 --- a/version.inc +++ b/version.inc @@ -15,4 +15,4 @@ endif() # The build_version should start from 50 in master branch -set(SLIC3R_VERSION "01.09.01.52") +set(SLIC3R_VERSION "01.09.01.53") From 7b243391958e94f2d461b694cbe9874837044cbf Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 23 Apr 2024 10:30:29 +0800 Subject: [PATCH 66/74] ENH:translate texts jira: none Change-Id: Ibb105e95bef7afb8fb620617e0bf16704148a10c --- bbl/i18n/BambuStudio.pot | 106 ++++++++++++++++++- bbl/i18n/cs/BambuStudio_cs.po | 106 ++++++++++++++++++- bbl/i18n/de/BambuStudio_de.po | 106 ++++++++++++++++++- bbl/i18n/en/BambuStudio_en.po | 106 ++++++++++++++++++- bbl/i18n/es/BambuStudio_es.po | 106 ++++++++++++++++++- bbl/i18n/fr/BambuStudio_fr.po | 106 ++++++++++++++++++- bbl/i18n/hu/BambuStudio_hu.po | 106 ++++++++++++++++++- bbl/i18n/it/BambuStudio_it.po | 106 ++++++++++++++++++- bbl/i18n/ja/BambuStudio_ja.po | 106 ++++++++++++++++++- bbl/i18n/ko/BambuStudio_ko.po | 111 ++++++++++++++++++-- bbl/i18n/list.txt | 2 + bbl/i18n/nl/BambuStudio_nl.po | 106 ++++++++++++++++++- bbl/i18n/pt-BR/BambuStudio_pt-BR.po | 106 ++++++++++++++++++- bbl/i18n/ru/BambuStudio_ru.po | 111 ++++++++++++++++++-- bbl/i18n/sv/BambuStudio_sv.po | 106 ++++++++++++++++++- bbl/i18n/tr/BambuStudio_tr.po | 111 ++++++++++++++++++-- bbl/i18n/uk/BambuStudio_uk.po | 106 ++++++++++++++++++- bbl/i18n/zh_cn/BambuStudio_zh_CN.po | 119 ++++++++++++++++++++-- resources/i18n/ko/BambuStudio.mo | Bin 358888 -> 358854 bytes resources/i18n/ru/BambuStudio.mo | Bin 495786 -> 495736 bytes resources/i18n/tr/BambuStudio.mo | Bin 367894 -> 367858 bytes resources/i18n/zh_cn/BambuStudio.mo | Bin 327236 -> 329642 bytes src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp | 12 +-- src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 5 +- 24 files changed, 1753 insertions(+), 96 deletions(-) diff --git a/bbl/i18n/BambuStudio.pot b/bbl/i18n/BambuStudio.pot index 6195946384..4b6405db21 100644 --- a/bbl/i18n/BambuStudio.pot +++ b/bbl/i18n/BambuStudio.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -628,11 +628,42 @@ msgstr "" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "" @@ -669,7 +700,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -678,6 +724,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "" @@ -1147,9 +1196,6 @@ msgstr "" msgid "Restore to meter" msgstr "" -msgid "Assemble" -msgstr "" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "" @@ -6559,6 +6605,56 @@ msgstr "" msgid "The configuration is up to date." msgstr "" +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "" diff --git a/bbl/i18n/cs/BambuStudio_cs.po b/bbl/i18n/cs/BambuStudio_cs.po index 83a95dab57..c275824b44 100644 --- a/bbl/i18n/cs/BambuStudio_cs.po +++ b/bbl/i18n/cs/BambuStudio_cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: 2023-10-18 10:45+0800\n" "Last-Translator: René Mošner \n" "Language-Team: \n" @@ -634,11 +634,42 @@ msgstr "Vzdálenost" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Kopírovat do schránky" @@ -675,7 +706,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Sestavit" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -684,6 +730,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Velikost štětce" @@ -1163,9 +1212,6 @@ msgstr "Převést z mm" msgid "Restore to meter" msgstr "Obnovit do mm" -msgid "Assemble" -msgstr "Sestavit" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Sestavte vybrané objekty do objektu s více částmi" @@ -6890,6 +6936,56 @@ msgstr "Žádné aktualizace nejsou dostupné." msgid "The configuration is up to date." msgstr "Konfigurace je aktuální." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Automatický výpočet" diff --git a/bbl/i18n/de/BambuStudio_de.po b/bbl/i18n/de/BambuStudio_de.po index 5eeabc0ac7..4ad79ad664 100644 --- a/bbl/i18n/de/BambuStudio_de.po +++ b/bbl/i18n/de/BambuStudio_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -630,11 +630,42 @@ msgstr "Länge" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "In Zwischenablage kopieren" @@ -671,7 +702,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Zusammenbauen" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -680,6 +726,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Pinselgröße" @@ -1168,9 +1217,6 @@ msgstr "Von Metern umrechnen" msgid "Restore to meter" msgstr "Auf Meter zurücksetzen" -msgid "Assemble" -msgstr "Zusammenbauen" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "" "Die ausgewählten Objekte zu einem Objekt mit mehreren Teilen zusammenfügen" @@ -7061,6 +7107,56 @@ msgstr "Keine Updates verfügbar." msgid "The configuration is up to date." msgstr "Die Konfiguration ist auf dem neuesten Stand." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Automatisch berechnen" diff --git a/bbl/i18n/en/BambuStudio_en.po b/bbl/i18n/en/BambuStudio_en.po index f43d999cc0..ee4da3c996 100644 --- a/bbl/i18n/en/BambuStudio_en.po +++ b/bbl/i18n/en/BambuStudio_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -627,11 +627,42 @@ msgstr "Length" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Copy to clipboard" @@ -668,7 +699,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Assemble" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -677,6 +723,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Brush size" @@ -1159,9 +1208,6 @@ msgstr "Convert from meter" msgid "Restore to meter" msgstr "Restore to meter" -msgid "Assemble" -msgstr "Assemble" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assemble the selected objects into an object with multiple parts" @@ -6913,6 +6959,56 @@ msgstr "No updates available." msgid "The configuration is up to date." msgstr "The configuration is up to date." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Auto-Calc" diff --git a/bbl/i18n/es/BambuStudio_es.po b/bbl/i18n/es/BambuStudio_es.po index 9a5ec537e1..03269aa7fe 100644 --- a/bbl/i18n/es/BambuStudio_es.po +++ b/bbl/i18n/es/BambuStudio_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -630,11 +630,42 @@ msgstr "Largo" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Copiar al portapapeles" @@ -671,7 +702,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Montar" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -680,6 +726,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Grosor de trazo" @@ -1171,9 +1220,6 @@ msgstr "Convertir desde metros" msgid "Restore to meter" msgstr "Restaurar a metros" -msgid "Assemble" -msgstr "Montar" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Ensamblar los objetos seleccionados en un objeto con múltiples partes" @@ -7035,6 +7081,56 @@ msgstr "No hay actualizaciones disponibles." msgid "The configuration is up to date." msgstr "La configuración está actualizada." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Auto-Calc" diff --git a/bbl/i18n/fr/BambuStudio_fr.po b/bbl/i18n/fr/BambuStudio_fr.po index 51817f4cb3..cc6145f5ac 100644 --- a/bbl/i18n/fr/BambuStudio_fr.po +++ b/bbl/i18n/fr/BambuStudio_fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -633,11 +633,42 @@ msgstr "Longueur" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" @@ -674,7 +705,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Assembler" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -683,6 +729,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Taille du pinceau" @@ -1176,9 +1225,6 @@ msgstr "Convertir en mètre" msgid "Restore to meter" msgstr "Restaurer au compteur" -msgid "Assemble" -msgstr "Assembler" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assembler les objets sélectionnés à un objet en plusieurs parties" @@ -7052,6 +7098,56 @@ msgstr "Aucune mise à jour disponible." msgid "The configuration is up to date." msgstr "La configuration est à jour." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Auto-Calc" diff --git a/bbl/i18n/hu/BambuStudio_hu.po b/bbl/i18n/hu/BambuStudio_hu.po index cc6ef07b0e..e1eb1dfb66 100644 --- a/bbl/i18n/hu/BambuStudio_hu.po +++ b/bbl/i18n/hu/BambuStudio_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -629,11 +629,42 @@ msgstr "Hossz" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Másolás a vágólapra" @@ -670,7 +701,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Összeállítás" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -679,6 +725,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Ecset mérete" @@ -1167,9 +1216,6 @@ msgstr "Átváltás méterről" msgid "Restore to meter" msgstr "Visszaállítás méterre" -msgid "Assemble" -msgstr "Összeállítás" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Összeállítja a kijelölt objektumot egy több részből álló objektummá" @@ -6984,6 +7030,56 @@ msgstr "Nincs elérhető frissítés." msgid "The configuration is up to date." msgstr "A konfiguráció naprakész." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Automatikus számítás" diff --git a/bbl/i18n/it/BambuStudio_it.po b/bbl/i18n/it/BambuStudio_it.po index 37bf2e097d..6b8d6eb868 100644 --- a/bbl/i18n/it/BambuStudio_it.po +++ b/bbl/i18n/it/BambuStudio_it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -629,11 +629,42 @@ msgstr "Lunghezza" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Copia negli appunti" @@ -670,7 +701,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Assembla" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -679,6 +725,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Misura del pennello" @@ -1165,9 +1214,6 @@ msgstr "Converti da metri" msgid "Restore to meter" msgstr "Ripristina in metri" -msgid "Assemble" -msgstr "Assembla" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assembla gli oggetti selezionati in un oggetto con più parti" @@ -6998,6 +7044,56 @@ msgstr "Nessun aggiornamento disponibile." msgid "The configuration is up to date." msgstr "Configurazione aggiornata." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Calcolo automatico" diff --git a/bbl/i18n/ja/BambuStudio_ja.po b/bbl/i18n/ja/BambuStudio_ja.po index ca2f0e9883..c771037059 100644 --- a/bbl/i18n/ja/BambuStudio_ja.po +++ b/bbl/i18n/ja/BambuStudio_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -625,11 +625,42 @@ msgstr "長さ" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "コピー" @@ -666,7 +697,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "組立てる" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -675,6 +721,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "サイズ" @@ -1154,9 +1203,6 @@ msgstr "メートルから変換" msgid "Restore to meter" msgstr "メータル単位に復元" -msgid "Assemble" -msgstr "組立てる" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "選択したオブジェクトを一つオブジェクトに組み立てます(複数パーツ)" @@ -6808,6 +6854,56 @@ msgstr "利用可能なアップデートはありません" msgid "The configuration is up to date." msgstr "構成データが最新です" +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "自動計算" diff --git a/bbl/i18n/ko/BambuStudio_ko.po b/bbl/i18n/ko/BambuStudio_ko.po index 67efa7f3d9..987eb20376 100644 --- a/bbl/i18n/ko/BambuStudio_ko.po +++ b/bbl/i18n/ko/BambuStudio_ko.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -631,6 +631,28 @@ msgstr "길이" msgid "Selection" msgstr "선택" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" @@ -638,6 +660,15 @@ msgstr "" "기능 1이 재설정되었습니다.\n" "기능 2는 기능 1이 되었습니다." +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "클립보드에 복사" @@ -674,8 +705,23 @@ msgstr "중심 회전" msgid "Parallel_distance:" msgstr "병렬_거리" -msgid "Featue 2" -msgstr "기능 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "결합" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" +msgstr "" msgid "" "Due to ensuer_on_bed, assembly between \n" @@ -686,6 +732,9 @@ msgstr "" "다른 객체간의 조립이 3D 보기에서 정확하지 않을 수 있습니다.\n" " 함께 조립하는 것이 좋습니다." +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "브러시 크기" @@ -1170,9 +1219,6 @@ msgstr "미터 단위 모델링 변환 (1000배)" msgid "Restore to meter" msgstr "미터 단위로 복원" -msgid "Assemble" -msgstr "결합" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "선택한 객체들을 여러부품으로 이루어진 하나의 객채로 통합" @@ -6975,6 +7021,56 @@ msgstr "사용 가능한 업데이트가 없습니다." msgid "The configuration is up to date." msgstr "설정이 최신 상태입니다." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "자동 계산" @@ -12648,6 +12744,9 @@ msgstr "" "알고 계셨나요? ABS등 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도" "를 적절하게 높이면 뒤틀림 가능성을 줄일 수 있습니다." +#~ msgid "Featue 2" +#~ msgstr "기능 2" + #~ msgid "active" #~ msgstr "Active" diff --git a/bbl/i18n/list.txt b/bbl/i18n/list.txt index e71c7cc1a0..b4cce4cab3 100644 --- a/bbl/i18n/list.txt +++ b/bbl/i18n/list.txt @@ -11,6 +11,7 @@ src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp src/slic3r/GUI/Gizmos/GLGizmoFaceDetector.cpp src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp src/slic3r/GUI/Gizmos/GLGizmoText.cpp @@ -104,6 +105,7 @@ src/slic3r/GUI/UnsavedChangesDialog.cpp src/slic3r/GUI/Auxiliary.cpp src/slic3r/GUI/UpdateDialogs.cpp src/slic3r/GUI/UnsavedChangesDialog.cpp +src/slic3r/GUI/ObjColorDialog.cpp src/slic3r/GUI/WipeTowerDialog.cpp src/slic3r/GUI/wxExtensions.cpp src/slic3r/GUI/WebUserLoginDialog.cpp diff --git a/bbl/i18n/nl/BambuStudio_nl.po b/bbl/i18n/nl/BambuStudio_nl.po index a81d14f578..bc3c097dd6 100644 --- a/bbl/i18n/nl/BambuStudio_nl.po +++ b/bbl/i18n/nl/BambuStudio_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -629,11 +629,42 @@ msgstr "Lengte" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Kopieer naar klembord" @@ -670,7 +701,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Monteren" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -679,6 +725,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Penseelgrootte" @@ -1164,9 +1213,6 @@ msgstr "Converteren vanuit meter" msgid "Restore to meter" msgstr "Terugzetten naar meter" -msgid "Assemble" -msgstr "Monteren" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "" "Monteer de geselecteerde objecten tot een object bestaande uit meerdere delen" @@ -7046,6 +7092,56 @@ msgstr "Geen updates beschikbaar." msgid "The configuration is up to date." msgstr "De configuratie is up to date." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Automatisch berekenen" diff --git a/bbl/i18n/pt-BR/BambuStudio_pt-BR.po b/bbl/i18n/pt-BR/BambuStudio_pt-BR.po index 63bfb9224b..7375c32621 100644 --- a/bbl/i18n/pt-BR/BambuStudio_pt-BR.po +++ b/bbl/i18n/pt-BR/BambuStudio_pt-BR.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -635,11 +635,42 @@ msgstr "Comprimento" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" @@ -676,7 +707,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Montar" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -685,6 +731,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Tamanho de escova" @@ -1178,9 +1227,6 @@ msgstr "Converter a partir do medidor" msgid "Restore to meter" msgstr "Restaurar para o medidor" -msgid "Assemble" -msgstr "Montar" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Montar os objetos selecionados em um objeto com várias peças" @@ -7065,6 +7111,56 @@ msgstr "Nenhuma atualização disponível" msgid "The configuration is up to date." msgstr "A configuração está atualizada." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Cálculo automático" diff --git a/bbl/i18n/ru/BambuStudio_ru.po b/bbl/i18n/ru/BambuStudio_ru.po index a4832eed22..50d8df3a9b 100644 --- a/bbl/i18n/ru/BambuStudio_ru.po +++ b/bbl/i18n/ru/BambuStudio_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio 1.9.0.70 Public Beta 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: 2024-04-18 20:55+0700\n" "Last-Translator: Andylg \n" "Language-Team: \n" @@ -643,6 +643,28 @@ msgstr "Длина" msgid "Selection" msgstr "Выделение" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" @@ -650,6 +672,15 @@ msgstr "" "Выбор элемента 1 отменён,\n" "элемент 2 стал элементом 1." +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Скопировать в буфер обмена" @@ -689,8 +720,23 @@ msgstr "" "Расстояние между \n" "параллельными гранями:" -msgid "Featue 2" -msgstr "Элемент 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Объединить в сборку" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" +msgstr "" # ??? msgid "" @@ -702,6 +748,9 @@ msgstr "" "сборка различных объектов может быть \n" "некорректной в 3D-виде. Рекомендуется объединить их." +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Размер кисти" @@ -1196,9 +1245,6 @@ msgstr "Преобразовать размеры из метров" msgid "Restore to meter" msgstr "Восстановить размеры в метры" -msgid "Assemble" -msgstr "Объединить в сборку" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "" "Объединение выбранных объектов в модель, состоящую из несколько частей." @@ -7258,6 +7304,56 @@ msgstr "Обновления отсутствуют." msgid "The configuration is up to date." msgstr "Текущая конфигурация не требует обновления." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Авторасчёт" @@ -13256,6 +13352,9 @@ msgstr "" "ABS, повышение температуры подогреваемого стола может снизить вероятность " "коробления?" +#~ msgid "Featue 2" +#~ msgstr "Элемент 2" + #~ msgid "active" #~ msgstr "активный" diff --git a/bbl/i18n/sv/BambuStudio_sv.po b/bbl/i18n/sv/BambuStudio_sv.po index fdb5a3c541..c9930b66e9 100644 --- a/bbl/i18n/sv/BambuStudio_sv.po +++ b/bbl/i18n/sv/BambuStudio_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -628,11 +628,42 @@ msgstr "Längd" msgid "Selection" msgstr "" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Kopiera till urklipp" @@ -669,7 +700,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Montera" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -678,6 +724,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Pensel storlek" @@ -1161,9 +1210,6 @@ msgstr "Konvertera ifrån meter" msgid "Restore to meter" msgstr "Återställ till meter" -msgid "Assemble" -msgstr "Montera" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Montera de valda objekten till ett objekt med multipla delar" @@ -6958,6 +7004,56 @@ msgstr "Inga uppdateringar tillgängliga." msgid "The configuration is up to date." msgstr "Konfigurationen är aktuell." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Autoberäkna" diff --git a/bbl/i18n/tr/BambuStudio_tr.po b/bbl/i18n/tr/BambuStudio_tr.po index 092ed3aa6a..ea7ca8b434 100644 --- a/bbl/i18n/tr/BambuStudio_tr.po +++ b/bbl/i18n/tr/BambuStudio_tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: 2024-04-16 18:18+0300\n" "Last-Translator: Fatih AYDIN \n" "Language-Team: \n" @@ -637,6 +637,28 @@ msgstr "Uzunluk" msgid "Selection" msgstr "Seçim" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" @@ -644,6 +666,15 @@ msgstr "" "Özellik 1 sıfırlandı,\n" "özellik 2, özellik 1 olmuştur" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Panoya kopyala" @@ -680,8 +711,23 @@ msgstr "Merkez etrafında döndürün:" msgid "Parallel_distance:" msgstr "Paralel_mesafe:" -msgid "Featue 2" -msgstr "Özellik 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Birleştir" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" +msgstr "" msgid "" "Due to ensuer_on_bed, assembly between \n" @@ -692,6 +738,9 @@ msgstr "" "farklı nesneler 3D görünümde doğru olmayabilir.\n" " Bunları bir araya getirmeniz önerilir." +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Fırça boyutu" @@ -1180,9 +1229,6 @@ msgstr "Metreden dönüştür" msgid "Restore to meter" msgstr "Metreye geri çevir" -msgid "Assemble" -msgstr "Birleştir" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Seçilen nesneleri birden çok parçalı bir nesneyle birleştirin" @@ -7107,6 +7153,56 @@ msgstr "Güncelleme mevcut değil." msgid "The configuration is up to date." msgstr "Yapılandırma güncel." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Otomatik Hesaplama" @@ -12988,6 +13084,9 @@ msgstr "" "sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını " "azaltabileceğini biliyor muydunuz." +#~ msgid "Featue 2" +#~ msgstr "Özellik 2" + #~ msgid "active" #~ msgstr "aktif" diff --git a/bbl/i18n/uk/BambuStudio_uk.po b/bbl/i18n/uk/BambuStudio_uk.po index 825f09d007..edbbffb8c6 100644 --- a/bbl/i18n/uk/BambuStudio_uk.po +++ b/bbl/i18n/uk/BambuStudio_uk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: BambuLab Україна\n" @@ -633,6 +633,28 @@ msgstr "Довжина" msgid "Selection" msgstr "Вибір" +msgid " (Moving)" +msgstr "" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" + +msgid "Face" +msgstr "" + +msgid " (Fixed)" +msgstr "" + +msgid "Point" +msgstr "" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" @@ -640,6 +662,15 @@ msgstr "" "Особливість 1 скинута, \n" "Особливість 2 тепер особливість 1" +msgid "Warning:please select Plane's feature." +msgstr "" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "" + +msgid "Warning:please select two different mesh." +msgstr "" + msgid "Copy to clipboard" msgstr "Копіювати в буфер обміну" @@ -676,7 +707,22 @@ msgstr "" msgid "Parallel_distance:" msgstr "" -msgid "Featue 2" +msgid "Flip by Face 2" +msgstr "" + +msgid "Assemble" +msgstr "Зібрати" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "" + +msgid "Please select at least two volumes." +msgstr "" + +msgid "(Moving)" +msgstr "" + +msgid "Point and point assembly" msgstr "" msgid "" @@ -685,6 +731,9 @@ msgid "" " It is recommended to assemble them together." msgstr "" +msgid "Face and face assembly" +msgstr "" + msgid "Brush size" msgstr "Розмір пензля" @@ -1175,9 +1224,6 @@ msgstr "Перетворити з метричної" msgid "Restore to meter" msgstr "Відновити в метричну" -msgid "Assemble" -msgstr "Зібрати" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "Зберіть вибрані об'єкти в об'єкт з кількома частинами" @@ -7113,6 +7159,56 @@ msgstr "Оновлення відсутні." msgid "The configuration is up to date." msgstr "Конфігурація є актуальною." +msgid "Obj file Import color" +msgstr "" + +msgid "Specify number of colors:" +msgstr "" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "" + +msgid "Recommended " +msgstr "" + +msgid "Current filament colors:" +msgstr "" + +msgid "Quick set:" +msgstr "" + +msgid "Color match" +msgstr "" + +msgid "Approximate color matching." +msgstr "" + +msgid "Append" +msgstr "" + +msgid "Add consumable extruder after existing extruders." +msgstr "" + +msgid "Reset mapped extruders." +msgstr "" + +msgid "Cluster colors" +msgstr "" + +msgid "Map Filament" +msgstr "" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" + msgid "Auto-Calc" msgstr "Автокалькулятор" diff --git a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po index 9ba483055d..a7cd26c9eb 100644 --- a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po +++ b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-22 16:06+0800\n" +"POT-Creation-Date: 2024-04-23 10:24+0800\n" "PO-Revision-Date: 2024-02-23 20:10+0800\n" "Last-Translator: Jiang Yue \n" "Language-Team: \n" @@ -630,11 +630,46 @@ msgstr "长度" msgid "Selection" msgstr "选择" +msgid " (Moving)" +msgstr "(活动的)" + +msgid "" +"Select 2 faces on objects and \n" +" make objects assemble together." +msgstr "" +"在两个物体上选择两个面 \n" +"并将物体组合在一起。" + +msgid "" +"Select 2 points or circles on objects and \n" +" specify distance between them." +msgstr "" +"在两个物体上选择两个点或圆 \n" +"并指定它们之间的距离。" + +msgid "Face" +msgstr "面" + +msgid " (Fixed)" +msgstr "(固定的)" + +msgid "Point" +msgstr "点" + msgid "" "Feature 1 has been reset, \n" "feature 2 has been feature 1" msgstr "特征1已经被重置,特征2变成特征1" +msgid "Warning:please select Plane's feature." +msgstr "警告:请选择面特征。" + +msgid "Warning:please select Point's or Circle's feature." +msgstr "警告:请选择点或圆特征。" + +msgid "Warning:please select two different mesh." +msgstr "警告:请选择两个不同的网格。" + msgid "Copy to clipboard" msgstr "复制到剪贴板" @@ -671,8 +706,23 @@ msgstr "绕中心旋转:" msgid "Parallel_distance:" msgstr "平行距离:" -msgid "Featue 2" -msgstr "特征2" +msgid "Flip by Face 2" +msgstr "通过面2翻转" + +msgid "Assemble" +msgstr "装配" + +msgid "Please confirm explosion ratio = 1 and select at least two volumes." +msgstr "请确保爆炸比例为1且至少选择两个网格。" + +msgid "Please select at least two volumes." +msgstr "请至少选择两个网格。" + +msgid "(Moving)" +msgstr "(活动的)" + +msgid "Point and point assembly" +msgstr "点和点装配" msgid "" "Due to ensuer_on_bed, assembly between \n" @@ -682,6 +732,9 @@ msgstr "" "由于对象必须在热床上,不同对象之间的 \n" "装配在3D视图也许不正确。推荐将它们组合在一起。" +msgid "Face and face assembly" +msgstr "面和面装配" + msgid "Brush size" msgstr "画刷尺寸" @@ -1158,9 +1211,6 @@ msgstr "从米转换" msgid "Restore to meter" msgstr "恢复到米" -msgid "Assemble" -msgstr "组合" - msgid "Assemble the selected objects to an object with multiple parts" msgstr "组合所选对象为一个多零件对象" @@ -6764,6 +6814,60 @@ msgstr "没有可用的更新。" msgid "The configuration is up to date." msgstr "当前配置已经是最新版本。" +msgid "Obj file Import color" +msgstr "Obj文件导入颜色" + +msgid "Specify number of colors:" +msgstr "指定颜色数量:" + +#, c-format, boost-format +msgid "The color count should be in range [%d, %d]." +msgstr "颜色数量范围应该是[%d, %d]。" + +msgid "Recommended " +msgstr "推荐" + +msgid "Current filament colors:" +msgstr "当前耗材丝颜色:" + +msgid "Quick set:" +msgstr "快捷设置:" + +msgid "Color match" +msgstr "颜色匹配" + +msgid "Approximate color matching." +msgstr "近似的颜色匹配。" + +msgid "Append" +msgstr "追加" + +msgid "Add consumable extruder after existing extruders." +msgstr "近似的颜色匹配。" + +msgid "Reset mapped extruders." +msgstr "重置匹配的耗材丝。" + +msgid "Cluster colors" +msgstr "重置匹配的耗材丝" + +msgid "Map Filament" +msgstr "匹配耗材丝" + +msgid "" +"Note:The color has been selected, you can choose OK \n" +" to continue or manually adjust it." +msgstr "" +"注意:颜色已经选好了,您可以选中确认 \n" +" 继续或手动修改它。" + +msgid "" +"Waring:The count of newly added and \n" +" current extruders exceeds 16." +msgstr "" +"警告:新增追加耗材丝数量 \n" +" 和已有耗材丝数量超过了16." + msgid "Auto-Calc" msgstr "自动计算" @@ -12151,6 +12255,9 @@ msgstr "" "避免翘曲\n" "您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。" +#~ msgid "Featue 2" +#~ msgstr "特征2" + #~ msgid "Not Extruded Yet,Retry" #~ msgstr "耗材未挤出,重试" diff --git a/resources/i18n/ko/BambuStudio.mo b/resources/i18n/ko/BambuStudio.mo index 33230f760350466eb54de293613dcf1529699a25..4bcb9203b06c82da09c4d964985a56cf80077922 100644 GIT binary patch delta 68510 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 z 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 diff --git a/resources/i18n/ru/BambuStudio.mo b/resources/i18n/ru/BambuStudio.mo index d912de6d444dc230b9afe1047b6313993182d41a..e2ab0e198058b9612bfcd0d80d909a659430b1fc 100644 GIT binary patch delta 69994 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­`vFhkFF5V0Em_}dwuE!= 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

)2NC;=u0=lv+xW0NmsjF+Xw1=T?%``bFd{W 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 N8rWNUM6h$5{}1A9V=e#y delta 70003 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 diff --git a/resources/i18n/tr/BambuStudio.mo b/resources/i18n/tr/BambuStudio.mo index 994d04c42a3b42025eefe57160bd4c429e83daa8..cfe57636d7abfd84714f298c1a669ddb8a337dfe 100644 GIT binary patch delta 69145 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 delta 69168 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 a4Y%Xn_VB)WeR7O`@izR97jJ!|Z1^9WR35be diff --git a/resources/i18n/zh_cn/BambuStudio.mo b/resources/i18n/zh_cn/BambuStudio.mo index c270ad36cfd816d9b3df455e7dd8f4405025962d..298075085abdb0d93c99be16e1efb0e73f414416 100644 GIT binary patch delta 72911 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 O+zvX5E_eOo^86o6B5Gy; delta 70803 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

CpOMF*cz(o$bRVlWYWDzL%0Amf3j-Y55^nY1Tl#R@P@SlpVgEe-S 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 azbhBs^>Y1+XH&+$-#f>9^ojdukUP diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp index c0d3f81bf5..c0c86b1ac4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp @@ -31,13 +31,13 @@ std::string GLGizmoAssembly::on_get_name() const { if (!on_is_activable() && m_state == EState::Off) { if (wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasAssembleView) { - return _u8L("Assembly") + ":\n" + _u8L("Please confirm explosion ratio = 1 and select at least two volumes."); + return _u8L("Assemble") + ":\n" + _u8L("Please confirm explosion ratio = 1 and select at least two volumes."); } else { - return _u8L("Assembly") + ":\n" + _u8L("Please select at least two volumes."); + return _u8L("Assemble") + ":\n" + _u8L("Please select at least two volumes."); } } else { - return _u8L("Assembly"); + return _u8L("Assemble"); } } @@ -85,9 +85,9 @@ void GLGizmoAssembly::on_render_input_window(float x, float y, float bottom_limi init_render_input_window(); float moving_size = m_imgui->calc_text_size(_L("(Moving)")).x; - float combox_content_size = (m_imgui->calc_text_size(_L("Point and point")).x +ImGui::GetStyle().FramePadding.x * 2.0f); + float combox_content_size = (m_imgui->calc_text_size(_L("Point and point assembly")).x +ImGui::GetStyle().FramePadding.x * 2.0f); float caption_size = moving_size + 2 * m_space_size; - if (render_assembly_mode_combo(caption_size + 0.5 * m_space_size, 1.8 * combox_content_size)) { + if (render_assembly_mode_combo(caption_size + 0.5 * m_space_size, 2.0 * combox_content_size)) { ; } show_selection_ui(); @@ -141,7 +141,7 @@ bool GLGizmoAssembly::render_assembly_mode_combo(double label_width, float item_ { ImGui::AlignTextToFramePadding(); size_t selection_idx = int(m_assembly_mode); - std::vector modes = {_u8L("Face and face"), _u8L("Point and point")}; + std::vector modes = {_u8L("Face and face assembly"), _u8L("Point and point assembly")}; bool is_changed = false; ImGuiWrapper::push_combo_style(m_parent.get_scale()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp index 7ea699ef81..74edb59f28 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -1796,7 +1796,7 @@ void GLGizmoMeasure::show_selection_ui() ImGui::AlignTextToFramePadding(); if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY) { if (m_assembly_mode == AssemblyMode::FACE_FACE) { - m_imgui->text(_u8L("Select 2 faces on objects and \n make the object assemble together.")); // tip + m_imgui->text(_u8L("Select 2 faces on objects and \n make objects assemble together.")); // tip } else if (m_assembly_mode == AssemblyMode::POINT_POINT) { m_imgui->text(_u8L("Select 2 points or circles on objects and \n specify distance between them.")); // tip } @@ -1870,6 +1870,9 @@ void GLGizmoMeasure::show_selection_ui() } } } + if (m_measure_mode == EMeasureMode::ONLY_ASSEMBLY && m_hit_different_volumes.size() == 1) { + m_imgui->text(_L("Warning:please select two different mesh.")); + } } void GLGizmoMeasure::show_distance_xyz_ui() From 8d5a264cd53286a234b7f38378e3b32fee4a4260 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 23 Apr 2024 10:47:04 +0800 Subject: [PATCH 67/74] FIX: add filament should reset ComboBox jira: STUDIO-6937 Change-Id: Ifabd27d1d74369245edbb47b095fcd448b6626fc --- src/slic3r/GUI/ObjColorDialog.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp index 2b13c48575..d872d9b18d 100644 --- a/src/slic3r/GUI/ObjColorDialog.cpp +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -395,8 +395,9 @@ void ObjColorPanel::update_filament_ids() { if (m_is_add_filament) { for (auto c:m_new_add_colors) { - auto evt = new ColorEvent(EVT_ADD_CUSTOM_FILAMENT, c); - wxQueueEvent(wxGetApp().plater(), evt); + /*auto evt = new ColorEvent(EVT_ADD_CUSTOM_FILAMENT, c); + wxQueueEvent(wxGetApp().plater(), evt);*/ + wxGetApp().sidebar().add_custom_filament(c); } } //deal m_filament_ids @@ -725,15 +726,17 @@ void ObjColorPanel::deal_default_strategy() void ObjColorPanel::deal_add_btn() { if (m_colours.size() > g_max_color) { return; } + deal_reset_btn(); std::vector new_icons; auto new_color_size = m_cluster_colors_from_algo.size(); new_icons.reserve(new_color_size); m_new_add_colors.clear(); m_new_add_colors.reserve(new_color_size); int new_index = m_colours.size() + 1; + bool is_exceed = false; for (size_t i = 0; i < new_color_size; i++) { if (m_colours.size() + new_icons.size() >= g_max_color) { - m_warning_text->SetLabelText(_L("Waring:The count of newly added and \n current extruders exceeds 16.")); + is_exceed = true; break; } wxColour cur_color = convert_to_wxColour(m_cluster_colors_from_algo[i]); @@ -753,6 +756,10 @@ void ObjColorPanel::deal_add_btn() m_cluster_map_filaments[i] = new_index; new_index++; } + if (is_exceed) { + deal_approximate_match_btn(); + m_warning_text->SetLabelText(_L("Waring:The count of newly added and \n current extruders exceeds 16.")); + } m_is_add_filament = true; } From 27f70ccee9f02d5735d254af6cae111af7ac0010 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 23 Apr 2024 12:27:48 +0800 Subject: [PATCH 68/74] ENH: enhance render assembly combox jira: none Change-Id: I84d83a8baf639ae609247928c457d6363bb84dc3 --- src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp index c0c86b1ac4..2fcdd3a21a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp @@ -85,9 +85,9 @@ void GLGizmoAssembly::on_render_input_window(float x, float y, float bottom_limi init_render_input_window(); float moving_size = m_imgui->calc_text_size(_L("(Moving)")).x; - float combox_content_size = (m_imgui->calc_text_size(_L("Point and point assembly")).x +ImGui::GetStyle().FramePadding.x * 2.0f); + float combox_content_size = m_imgui->calc_text_size(_L("Point and point assembly")).x*1.1 + ImGui::GetStyle().FramePadding.x * 18.0f; float caption_size = moving_size + 2 * m_space_size; - if (render_assembly_mode_combo(caption_size + 0.5 * m_space_size, 2.0 * combox_content_size)) { + if (render_assembly_mode_combo(caption_size + 0.5 * m_space_size, combox_content_size)) { ; } show_selection_ui(); From 51e1cf87a7322401e3cce064e22cbc62655dcdb7 Mon Sep 17 00:00:00 2001 From: "qing.zhang" Date: Tue, 23 Apr 2024 15:36:19 +0800 Subject: [PATCH 69/74] ENH: translation Jira: none Signed-off-by: qing.zhang Change-Id: If86ef981837146f9a198abf1ff1833364ee6dc6f --- bbl/i18n/BambuStudio.pot | 5 ++++- bbl/i18n/cs/BambuStudio_cs.po | 5 ++++- bbl/i18n/de/BambuStudio_de.po | 5 ++++- bbl/i18n/en/BambuStudio_en.po | 5 ++++- bbl/i18n/es/BambuStudio_es.po | 5 ++++- bbl/i18n/fr/BambuStudio_fr.po | 5 ++++- bbl/i18n/hu/BambuStudio_hu.po | 5 ++++- bbl/i18n/it/BambuStudio_it.po | 5 ++++- bbl/i18n/ja/BambuStudio_ja.po | 5 ++++- bbl/i18n/ko/BambuStudio_ko.po | 5 ++++- bbl/i18n/nl/BambuStudio_nl.po | 5 ++++- bbl/i18n/pt-BR/BambuStudio_pt-BR.po | 5 ++++- bbl/i18n/ru/BambuStudio_ru.po | 5 ++++- bbl/i18n/sv/BambuStudio_sv.po | 5 ++++- bbl/i18n/tr/BambuStudio_tr.po | 5 ++++- bbl/i18n/uk/BambuStudio_uk.po | 5 ++++- bbl/i18n/zh_cn/BambuStudio_zh_CN.po | 5 ++++- resources/i18n/zh_cn/BambuStudio.mo | Bin 329642 -> 329675 bytes src/slic3r/GUI/GUI_Factories.cpp | 4 ++-- 19 files changed, 70 insertions(+), 19 deletions(-) diff --git a/bbl/i18n/BambuStudio.pot b/bbl/i18n/BambuStudio.pot index 4b6405db21..7dd34b50fd 100644 --- a/bbl/i18n/BambuStudio.pot +++ b/bbl/i18n/BambuStudio.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1196,6 +1196,9 @@ msgstr "" msgid "Restore to meter" msgstr "" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "" diff --git a/bbl/i18n/cs/BambuStudio_cs.po b/bbl/i18n/cs/BambuStudio_cs.po index c275824b44..62b714f0ce 100644 --- a/bbl/i18n/cs/BambuStudio_cs.po +++ b/bbl/i18n/cs/BambuStudio_cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: 2023-10-18 10:45+0800\n" "Last-Translator: René Mošner \n" "Language-Team: \n" @@ -1212,6 +1212,9 @@ msgstr "Převést z mm" msgid "Restore to meter" msgstr "Obnovit do mm" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Sestavte vybrané objekty do objektu s více částmi" diff --git a/bbl/i18n/de/BambuStudio_de.po b/bbl/i18n/de/BambuStudio_de.po index 4ad79ad664..0931147962 100644 --- a/bbl/i18n/de/BambuStudio_de.po +++ b/bbl/i18n/de/BambuStudio_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1217,6 +1217,9 @@ msgstr "Von Metern umrechnen" msgid "Restore to meter" msgstr "Auf Meter zurücksetzen" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "" "Die ausgewählten Objekte zu einem Objekt mit mehreren Teilen zusammenfügen" diff --git a/bbl/i18n/en/BambuStudio_en.po b/bbl/i18n/en/BambuStudio_en.po index ee4da3c996..60881732af 100644 --- a/bbl/i18n/en/BambuStudio_en.po +++ b/bbl/i18n/en/BambuStudio_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1208,6 +1208,9 @@ msgstr "Convert from meter" msgid "Restore to meter" msgstr "Restore to meter" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assemble the selected objects into an object with multiple parts" diff --git a/bbl/i18n/es/BambuStudio_es.po b/bbl/i18n/es/BambuStudio_es.po index 03269aa7fe..b7a7e4ebe9 100644 --- a/bbl/i18n/es/BambuStudio_es.po +++ b/bbl/i18n/es/BambuStudio_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1220,6 +1220,9 @@ msgstr "Convertir desde metros" msgid "Restore to meter" msgstr "Restaurar a metros" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Ensamblar los objetos seleccionados en un objeto con múltiples partes" diff --git a/bbl/i18n/fr/BambuStudio_fr.po b/bbl/i18n/fr/BambuStudio_fr.po index cc6145f5ac..df906d28f8 100644 --- a/bbl/i18n/fr/BambuStudio_fr.po +++ b/bbl/i18n/fr/BambuStudio_fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -1225,6 +1225,9 @@ msgstr "Convertir en mètre" msgid "Restore to meter" msgstr "Restaurer au compteur" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assembler les objets sélectionnés à un objet en plusieurs parties" diff --git a/bbl/i18n/hu/BambuStudio_hu.po b/bbl/i18n/hu/BambuStudio_hu.po index e1eb1dfb66..fa89a277c8 100644 --- a/bbl/i18n/hu/BambuStudio_hu.po +++ b/bbl/i18n/hu/BambuStudio_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1216,6 +1216,9 @@ msgstr "Átváltás méterről" msgid "Restore to meter" msgstr "Visszaállítás méterre" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Összeállítja a kijelölt objektumot egy több részből álló objektummá" diff --git a/bbl/i18n/it/BambuStudio_it.po b/bbl/i18n/it/BambuStudio_it.po index 6b8d6eb868..4d7d54e27b 100644 --- a/bbl/i18n/it/BambuStudio_it.po +++ b/bbl/i18n/it/BambuStudio_it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1214,6 +1214,9 @@ msgstr "Converti da metri" msgid "Restore to meter" msgstr "Ripristina in metri" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assembla gli oggetti selezionati in un oggetto con più parti" diff --git a/bbl/i18n/ja/BambuStudio_ja.po b/bbl/i18n/ja/BambuStudio_ja.po index c771037059..8c64c5ac6b 100644 --- a/bbl/i18n/ja/BambuStudio_ja.po +++ b/bbl/i18n/ja/BambuStudio_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1203,6 +1203,9 @@ msgstr "メートルから変換" msgid "Restore to meter" msgstr "メータル単位に復元" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "選択したオブジェクトを一つオブジェクトに組み立てます(複数パーツ)" diff --git a/bbl/i18n/ko/BambuStudio_ko.po b/bbl/i18n/ko/BambuStudio_ko.po index 987eb20376..8c7d38fe38 100644 --- a/bbl/i18n/ko/BambuStudio_ko.po +++ b/bbl/i18n/ko/BambuStudio_ko.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -1219,6 +1219,9 @@ msgstr "미터 단위 모델링 변환 (1000배)" msgid "Restore to meter" msgstr "미터 단위로 복원" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "선택한 객체들을 여러부품으로 이루어진 하나의 객채로 통합" diff --git a/bbl/i18n/nl/BambuStudio_nl.po b/bbl/i18n/nl/BambuStudio_nl.po index bc3c097dd6..f97021ca66 100644 --- a/bbl/i18n/nl/BambuStudio_nl.po +++ b/bbl/i18n/nl/BambuStudio_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1213,6 +1213,9 @@ msgstr "Converteren vanuit meter" msgid "Restore to meter" msgstr "Terugzetten naar meter" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "" "Monteer de geselecteerde objecten tot een object bestaande uit meerdere delen" diff --git a/bbl/i18n/pt-BR/BambuStudio_pt-BR.po b/bbl/i18n/pt-BR/BambuStudio_pt-BR.po index 7375c32621..01175469bb 100644 --- a/bbl/i18n/pt-BR/BambuStudio_pt-BR.po +++ b/bbl/i18n/pt-BR/BambuStudio_pt-BR.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -1227,6 +1227,9 @@ msgstr "Converter a partir do medidor" msgid "Restore to meter" msgstr "Restaurar para o medidor" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Montar os objetos selecionados em um objeto com várias peças" diff --git a/bbl/i18n/ru/BambuStudio_ru.po b/bbl/i18n/ru/BambuStudio_ru.po index 50d8df3a9b..0c1fc6e3f7 100644 --- a/bbl/i18n/ru/BambuStudio_ru.po +++ b/bbl/i18n/ru/BambuStudio_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio 1.9.0.70 Public Beta 3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: 2024-04-18 20:55+0700\n" "Last-Translator: Andylg \n" "Language-Team: \n" @@ -1245,6 +1245,9 @@ msgstr "Преобразовать размеры из метров" msgid "Restore to meter" msgstr "Восстановить размеры в метры" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "" "Объединение выбранных объектов в модель, состоящую из несколько частей." diff --git a/bbl/i18n/sv/BambuStudio_sv.po b/bbl/i18n/sv/BambuStudio_sv.po index c9930b66e9..d26cb12f39 100644 --- a/bbl/i18n/sv/BambuStudio_sv.po +++ b/bbl/i18n/sv/BambuStudio_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1210,6 +1210,9 @@ msgstr "Konvertera ifrån meter" msgid "Restore to meter" msgstr "Återställ till meter" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Montera de valda objekten till ett objekt med multipla delar" diff --git a/bbl/i18n/tr/BambuStudio_tr.po b/bbl/i18n/tr/BambuStudio_tr.po index ea7ca8b434..502646d101 100644 --- a/bbl/i18n/tr/BambuStudio_tr.po +++ b/bbl/i18n/tr/BambuStudio_tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: 2024-04-16 18:18+0300\n" "Last-Translator: Fatih AYDIN \n" "Language-Team: \n" @@ -1229,6 +1229,9 @@ msgstr "Metreden dönüştür" msgid "Restore to meter" msgstr "Metreye geri çevir" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Seçilen nesneleri birden çok parçalı bir nesneyle birleştirin" diff --git a/bbl/i18n/uk/BambuStudio_uk.po b/bbl/i18n/uk/BambuStudio_uk.po index edbbffb8c6..b4650f2d38 100644 --- a/bbl/i18n/uk/BambuStudio_uk.po +++ b/bbl/i18n/uk/BambuStudio_uk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: BambuLab Україна\n" @@ -1224,6 +1224,9 @@ msgstr "Перетворити з метричної" msgid "Restore to meter" msgstr "Відновити в метричну" +msgid "Combinate" +msgstr "" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "Зберіть вибрані об'єкти в об'єкт з кількома частинами" diff --git a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po index a7cd26c9eb..ffb371a17b 100644 --- a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po +++ b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-23 10:24+0800\n" +"POT-Creation-Date: 2024-04-23 15:35+0800\n" "PO-Revision-Date: 2024-02-23 20:10+0800\n" "Last-Translator: Jiang Yue \n" "Language-Team: \n" @@ -1211,6 +1211,9 @@ msgstr "从米转换" msgid "Restore to meter" msgstr "恢复到米" +msgid "Combinate" +msgstr "组合" + msgid "Assemble the selected objects to an object with multiple parts" msgstr "组合所选对象为一个多零件对象" diff --git a/resources/i18n/zh_cn/BambuStudio.mo b/resources/i18n/zh_cn/BambuStudio.mo index 298075085abdb0d93c99be16e1efb0e73f414416..4f56cce6b103b9eb863b484b253cff684d42cfd6 100644 GIT binary patch delta 70772 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 }, "", menu, []() { return obj_list()->can_merge_to_multipart_object(); }, m_parent); } @@ -956,7 +956,7 @@ void MenuFactory::append_menu_item_merge_to_multipart_object(wxMenu* menu) void MenuFactory::append_menu_item_merge_to_single_object(wxMenu* menu) { menu->AppendSeparator(); - append_menu_item(menu, wxID_ANY, _L("Assemble"), _L("Assemble the selected objects to an object with single part"), + append_menu_item(menu, wxID_ANY, _L("Combinate"), _L("Assemble the selected objects to an object with single part"), [](wxCommandEvent&) { obj_list()->merge(false); }, "", menu, []() { return obj_list()->can_merge_to_single_object(); }, m_parent); } From 3d4f355f8324d6a1e3fb7b8b5d88434378d9e426 Mon Sep 17 00:00:00 2001 From: tao wang Date: Tue, 23 Apr 2024 17:07:50 +0800 Subject: [PATCH 70/74] ENH:update wiki url for Pin Code jira:[pin code] Change-Id: I95faaa396a839b5b159119ef235b650c76706a84 --- src/slic3r/GUI/BindDialog.cpp | 1 + src/slic3r/GUI/BindDialog.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index d2240280de..d0d6388974 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -107,6 +107,7 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) m_link_show_ping_code_wiki->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); m_link_show_ping_code_wiki->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + m_ping_code_wiki = "https://wiki.bambulab.com/en/bambu-studio/manual/pin-code"; wxLaunchDefaultBrowser(m_ping_code_wiki); }); diff --git a/src/slic3r/GUI/BindDialog.hpp b/src/slic3r/GUI/BindDialog.hpp index 11f31b2c28..630516cef0 100644 --- a/src/slic3r/GUI/BindDialog.hpp +++ b/src/slic3r/GUI/BindDialog.hpp @@ -68,7 +68,7 @@ class PingCodeBindDialog : public DPIDialog wxHyperlinkCtrl* m_link_network_state{ nullptr }; wxString m_result_info; wxString m_result_extra; - wxString m_ping_code_wiki="www.bambulab.com"; + wxString m_ping_code_wiki; bool m_show_error_info_state = true; int m_result_code; From 4cd62d574b6e5827cc172351ce43e0f810791af0 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 23 Apr 2024 17:44:45 +0800 Subject: [PATCH 71/74] FIX: organic support may crash with some model bad function call when calling empty function throw_on_cancel. jira: STUDIO-6927 Change-Id: Ib37530b5cf155973d4e21d088e07d3110c2d36e4 (cherry picked from commit 53f27f5968a481bab1666fe0053f9753d585f0da) --- src/libslic3r/Support/TreeModelVolumes.cpp | 9 ++++-- src/libslic3r/Support/TreeModelVolumes.hpp | 6 ++-- src/libslic3r/Support/TreeSupport3D.cpp | 32 ++++------------------ 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/src/libslic3r/Support/TreeModelVolumes.cpp b/src/libslic3r/Support/TreeModelVolumes.cpp index 81ea970215..3024047a0c 100644 --- a/src/libslic3r/Support/TreeModelVolumes.cpp +++ b/src/libslic3r/Support/TreeModelVolumes.cpp @@ -181,7 +181,8 @@ void TreeModelVolumes::precalculate(const PrintObject& print_object, const coord m_ignorable_radii.emplace_back(radius_eval); } - throw_on_cancel(); + if (throw_on_cancel) + throw_on_cancel(); // it may seem that the required avoidance can be of a smaller radius when going to model (no initial layer diameter for to model branches) // but as for every branch going towards the bp, the to model avoidance is required to check for possible merges with to model branches, this assumption is in-fact wrong. @@ -202,7 +203,8 @@ void TreeModelVolumes::precalculate(const PrintObject& print_object, const coord update_radius_until_layer(ceilRadius(config.recommendedMinRadius(current_layer) + m_current_min_xy_dist_delta)); } - throw_on_cancel(); + if (throw_on_cancel) + throw_on_cancel(); // Copy to deque to use in parallel for later. std::vector relevant_avoidance_radiis{ radius_until_layer.begin(), radius_until_layer.end() }; @@ -296,7 +298,7 @@ const Polygons& TreeModelVolumes::getCollision(const coord_t orig_radius, LayerI BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate collision at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; tree_supports_show_error("Not precalculated Collision requested."sv, false); } - const_cast(this)->calculateCollision(radius, layer_idx, {}); + const_cast(this)->calculateCollision(radius, layer_idx, []{}); return getCollision(orig_radius, layer_idx, min_xy_dist); } @@ -458,6 +460,7 @@ void TreeModelVolumes::calculateCollision(const coord_t radius, const LayerIndex collision_areas_offsetted[layer_idx] = offset_value == 0 ? union_(collision_areas) : offset(union_ex(collision_areas), offset_value, ClipperLib::jtMiter, 1.2); + if(throw_on_cancel) throw_on_cancel(); } }); diff --git a/src/libslic3r/Support/TreeModelVolumes.hpp b/src/libslic3r/Support/TreeModelVolumes.hpp index fc91c4ed81..1c624fbe69 100644 --- a/src/libslic3r/Support/TreeModelVolumes.hpp +++ b/src/libslic3r/Support/TreeModelVolumes.hpp @@ -356,7 +356,7 @@ class TreeModelVolumes */ void calculateCollisionHolefree(RadiusLayerPair key) { - calculateCollisionHolefree(std::vector{ RadiusLayerPair(key) }, {}); + calculateCollisionHolefree(std::vector{ RadiusLayerPair(key) }, []{}); } /*! @@ -377,7 +377,7 @@ class TreeModelVolumes */ void calculateAvoidance(RadiusLayerPair key, bool to_build_plate, bool to_model) { - calculateAvoidance(std::vector{ RadiusLayerPair(key) }, to_build_plate, to_model, {}); + calculateAvoidance(std::vector{ RadiusLayerPair(key) }, to_build_plate, to_model, []{}); } /*! @@ -411,7 +411,7 @@ class TreeModelVolumes */ void calculateWallRestrictions(RadiusLayerPair key) { - calculateWallRestrictions(std::vector{ RadiusLayerPair(key) }, {}); + calculateWallRestrictions(std::vector{ RadiusLayerPair(key) }, []{}); } /*! diff --git a/src/libslic3r/Support/TreeSupport3D.cpp b/src/libslic3r/Support/TreeSupport3D.cpp index 36983cff29..4ed3d72ed0 100644 --- a/src/libslic3r/Support/TreeSupport3D.cpp +++ b/src/libslic3r/Support/TreeSupport3D.cpp @@ -3556,15 +3556,8 @@ static std::pair extrude_branch( result.vertices.emplace_back((p1 - nprev * radius).cast()); zmin = result.vertices.back().z(); float angle = angle_step; - std::pair strip; - if (current.state.type == TreeNodeType::ePolygon) { - strip = discretize_polygon(p1.cast(), current.influence_area, result.vertices); - prev_strip = strip; - strip = discretize_polygon(p2.cast(), current.influence_area, result.vertices); - } - else { for (int i = 1; i < nsteps; ++i, angle += angle_step) { - strip = discretize_circle((p1 - nprev * radius * cos(angle)).cast(), nprev.cast(), radius * sin(angle), eps, result.vertices); + std::pair strip = discretize_circle((p1 - nprev * radius * cos(angle)).cast(), nprev.cast(), radius * sin(angle), eps, result.vertices); if (i == 1) triangulate_fan(result, ifan, strip.first, strip.second); else @@ -3572,7 +3565,6 @@ static std::pair extrude_branch( // sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++ irun); // its_write_obj(result, fname); prev_strip = strip; - } } } if (ipath + 1 == path.size()) { @@ -3584,13 +3576,8 @@ static std::pair extrude_branch( auto nsteps = int(ceil(M_PI / (2. * angle_step))); angle_step = M_PI / (2. * nsteps); auto angle = float(M_PI / 2.); - std::pair strip; - if (current.state.type == TreeNodeType::ePolygon) { - strip = discretize_polygon(p2.cast(), current.influence_area, result.vertices); - } - else { for (int i = 0; i < nsteps; ++i, angle -= angle_step) { - strip = discretize_circle((p2 + ncurrent * radius * cos(angle)).cast(), ncurrent.cast(), radius * sin(angle), eps, result.vertices); + std::pair strip = discretize_circle((p2 + ncurrent * radius * cos(angle)).cast(), ncurrent.cast(), radius * sin(angle), eps, result.vertices); triangulate_strip(result, prev_strip.first, prev_strip.second, strip.first, strip.second); // sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++ irun); // its_write_obj(result, fname); @@ -3602,7 +3589,6 @@ static std::pair extrude_branch( triangulate_fan(result, ifan, prev_strip.first, prev_strip.second); // sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++ irun); // its_write_obj(result, fname); - } } else { const SupportElement &next = *path[ipath + 1]; assert(current.state.layer_idx + 1 == next.state.layer_idx); @@ -3610,13 +3596,7 @@ static std::pair extrude_branch( v2 = (p3 - p2).normalized(); ncurrent = (v1 + v2).normalized(); float radius = unscaled(support_element_radius(config, current)); - std::pair strip; - if (current.state.type == TreeNodeType::ePolygon) { - strip = discretize_polygon(p2.cast(), current.influence_area, result.vertices); - } - else { - strip = discretize_circle(p2.cast(), ncurrent.cast(), radius, eps, result.vertices); - } + std::pair strip = discretize_circle(p2.cast(), ncurrent.cast(), radius, eps, result.vertices); triangulate_strip(result, prev_strip.first, prev_strip.second, strip.first, strip.second); prev_strip = strip; // sprintf(fname, "d:\\temp\\meshes\\tree-partial-%d.obj", ++irun); @@ -4052,9 +4032,9 @@ indexed_triangle_set draw_branches( // Triangulate the tube. partial_mesh.clear(); extrude_branch(path, config, slicing_params, move_bounds, partial_mesh); -#if 1 +#if 0 char fname[2048]; - sprintf(fname, "SVG\\tree-raw-%d.obj", ++ irun); + sprintf(fname, "%s\\SVG\\tree-raw-%d.obj",data_dir().c_str(), ++irun); its_write_obj(partial_mesh, fname); #if 0 temp_mesh.clear(); @@ -4561,7 +4541,7 @@ void organic_draw_branches( MeshSlicingParams mesh_slicing_params; mesh_slicing_params.mode = MeshSlicingParams::SlicingMode::Positive; - tbb::parallel_for(tbb::blocked_range(0, trees.size(), trees.size()), + tbb::parallel_for(tbb::blocked_range(0, trees.size(), 1), [&trees, &volumes, &config, &slicing_params, &move_bounds, &mesh_slicing_params, &throw_on_cancel](const tbb::blocked_range& range) { indexed_triangle_set partial_mesh; std::vector slice_z; From 5332bff2e82969d42b8380e7edaaa15c4c8626b3 Mon Sep 17 00:00:00 2001 From: gerrit Date: Tue, 23 Apr 2024 17:58:35 +0800 Subject: [PATCH 72/74] ci: update build version to 01.09.01.54 Change-Id: I1a0da25d8eb99037eefb1c9a911464719ce29abd --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index 4adab063fd..c049887905 100644 --- a/version.inc +++ b/version.inc @@ -15,4 +15,4 @@ endif() # The build_version should start from 50 in master branch -set(SLIC3R_VERSION "01.09.01.53") +set(SLIC3R_VERSION "01.09.01.54") From 187f23d9d4eaa8757dd8c7daf89aec9bfab9b517 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 23 Apr 2024 18:40:24 +0800 Subject: [PATCH 73/74] FIX:not init m_current_active_imgui_id in gizmo assembly jira: none Change-Id: I694f4fc54c2d6be7b4cc21265f00387d343dfb88 --- src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp index 2fcdd3a21a..893c2175d2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAssembly.cpp @@ -66,7 +66,7 @@ void GLGizmoAssembly::on_render_input_window(float x, float y, float bottom_limi if (m_editing_distance) return; - unsigned int current_active_id = ImGui::GetActiveID(); + m_current_active_imgui_id = ImGui::GetActiveID(); // adjust window position to avoid overlap the view toolbar const float win_h = ImGui::GetWindowHeight(); y = std::min(y, bottom_limit - win_h); @@ -120,7 +120,7 @@ void GLGizmoAssembly::on_render_input_window(float x, float y, float bottom_limi last_selected_features = m_selected_features; m_imgui->set_requires_extra_frame(); } - m_last_active_item_imgui = current_active_id; + m_last_active_item_imgui = m_current_active_imgui_id; GizmoImguiEnd(); // Orca ImGuiWrapper::pop_toolbar_style(); From eef0801db325b9a2b87fd764b5afaec0cf09d3e3 Mon Sep 17 00:00:00 2001 From: gerrit Date: Tue, 23 Apr 2024 18:52:25 +0800 Subject: [PATCH 74/74] ci: update build version to 01.09.01.55 Change-Id: Id7ecc86f9fd1c6ac92f5c31a2ff5181bdbe0f9d8 --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index c049887905..49b1426a00 100644 --- a/version.inc +++ b/version.inc @@ -15,4 +15,4 @@ endif() # The build_version should start from 50 in master branch -set(SLIC3R_VERSION "01.09.01.54") +set(SLIC3R_VERSION "01.09.01.55")