diff --git a/config/CreatBot_D1000/base.cfg b/config/CreatBot_D1000/base.cfg index 81445271b..312c5a214 100644 --- a/config/CreatBot_D1000/base.cfg +++ b/config/CreatBot_D1000/base.cfg @@ -52,6 +52,7 @@ mesh_min: 40,60 mesh_max: 1000, 1000 probe_count: 6,6 mesh_pps: 2,2 +fade_end: 10 algorithm: bicubic bicubic_tension: 0.2 @@ -360,29 +361,52 @@ gcode: [gcode_macro T0] gcode: - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z=0 - SET_GCODE_OFFSET Y=0 - SET_GCODE_OFFSET X=0 - SET_SERVO SERVO=switch_nozzle angle=45 - ACTIVATE_EXTRUDER EXTRUDER=extruder - _RUNOUT_HANDLE + {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set printing = printer.print_stats.state == "printing" %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z=0 MOVE=1 + {% else %} + SET_GCODE_OFFSET Z=0 + {% endif %} + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + SET_SERVO SERVO=switch_nozzle angle=45 + ACTIVATE_EXTRUDER EXTRUDER=extruder + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T0"' + RESPOND TYPE=error MSG='{"Noting! extruder filament has been run out."}' + {% endif %} [gcode_macro T1] gcode: {% set sv = printer.save_variables.variables %} - {% set x_offset = sv.dual_x_offset|default(60)|float %} - {% set y_offset = sv.dual_y_offset|default(0)|float %} - {% set z_offset = sv.dual_z_offset|default(0)|float %} - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z={z_offset} - SET_GCODE_OFFSET Y={y_offset} - SET_GCODE_OFFSET X={x_offset} - SET_SERVO SERVO=switch_nozzle angle=225 - ACTIVATE_EXTRUDER EXTRUDER=extruder1 - _RUNOUT_HANDLE + {% set x_offset = sv.nozzle_x_offset_val|default(0)|float %} + {% set y_offset = sv.nozzle_y_offset_val|default(0)|float %} + {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} + {% set x_offset = x_offset - 59 %} + {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set printing = (printer.print_stats.state == "printing") %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z={z_offset} MOVE=1 + {% else %} + SET_GCODE_OFFSET Z={z_offset} + {% endif %} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T1"' + RESPOND TYPE=error MSG='{"Noting! extruder1 filament has been run out."}' + {% endif %} [gcode_macro PROBE_SERVO_OPEN] gcode: @@ -638,13 +662,57 @@ gcode: else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_extruder VALUE="'{printer.toolhead.extruder}'" + +[gcode_macro _RESUME_EXTRUDER] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set autoshift_on = params.AUTOSHIFT|default(False) %} + {% set toolchange = client.change_runout|lower|default("") %} + {% set extruder_filament = client.filament_state.extruder %} + {% set extruder1_filament = client.filament_state.extruder1 %} + {% set resume_extruder = client.resume_extruder|default("extruder") %} + + {% if autoshift_on %} + {% if extruder_filament and extruder1_filament %} + {% if toolchange == "t0" %} + {% set resume_extruder = "extruder" %} + {% elif toolchange == "t1" %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% else %} + {% if extruder_filament %} + {% set resume_extruder = "extruder" %} + {% elif extruder1_filament %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% endif %} + {% endif %} + {% if printer.toolhead.extruder != resume_extruder %} + T{0 if resume_extruder|default("extruder") == "extruder" else 1 } + {% endif %} + _FILAMENT_UPDATE + +[gcode_macro _EXTRUDER_TEMPERATURE_HANDLE] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set last_extruder_temp = client.last_extruder_temp %} + {% set last_extruder1_temp = client.last_extruder1_temp %} + {% set resume_extruder = client.resume_extruder|lower %} + {% if resume_extruder != printer.toolhead.extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{last_extruder1_temp}" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder1_temp VALUE="{last_extruder_temp}" + {% endif %} [gcode_macro _USER_TEMP_RESUME] gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} - + {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} + {% set value = printer["gcode_macro RESUME"][temperature].temp %} + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % + (printer.toolhead.extruder, value)}' {% for info in extruder_info %} {% set variable = printer["gcode_macro RESUME"][info.name] %} {% if variable.restore %} @@ -675,23 +743,27 @@ variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False -variable_filament_state: False +variable_filament_state: "" +variable_change_runout: "" +variable_autoshift: False +variable_resume_extruder: "" gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} - {% set prompt_txt = [] %} {% set runout = True %} ##### end of definitions ##### _FILAMENT_UPDATE + _RESUME_EXTRUDER AUTOSHIFT={autoshift} + _EXTRUDER_TEMPERATURE_HANDLE + + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_temp.restore or last_extruder1_temp.restore %} # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise - RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' {client.user_temp_macro|default("")} {% set do_resume = True %} {% elif can_extrude %} @@ -714,17 +786,20 @@ gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set auto_extruder = params.AUTO|default(False) %} {% set sp_move = client.speed_move|default(velocity) %} {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} {% set prompt_txt = [] %} {% if filament_state %} - {% if do_resume %} + {% if do_resume or auto_extruder %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE="False" {% else %} {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} @@ -766,7 +841,7 @@ gcode: {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} {% endif %} {% endif %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE="{{'runout': runout, 'extruder': runout_resume, 'extruder1': runout_resume1}}" [gcode_macro _RUNOUT_HANDLE] description: filament state update @@ -778,11 +853,22 @@ gcode: [gcode_macro _RUNOUT_PAUSE] gcode: - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set svv = printer.save_variables.variables %} + {% set autoshift_extruder = svv.auto_change_nozzle|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} + {% set target_extruder = "extruder1" if printer.toolhead.extruder == "extruder" else "extruder" %} {% if not filament_state %} - {% set msg_extruder = "extruder" if printer.toolhead.extruder == "extruder" else "extruder1" %} - RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' PAUSE + {% if autoshift_extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE=True + {% if printer["gcode_macro RESUME"].filament_state[target_extruder] %} + RESUME + {% else %} + RESPOND TYPE=error MSG='{"Noting! All extruders filament has been run out."}' + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Noting! \"%s\" filament has been run out." % printer.toolhead.extruder}' + {% endif %} {% endif %} ######################################## @@ -1001,3 +1087,27 @@ gcode: _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose BED_MESH_PROFILE LOAD={default_profile} + +######################################## +# Nozzle Calibrate +######################################## + +[gcode_shell_command fetch_assets] +command: sh /home/klipper/klipper/scripts/fetch_assets.sh +timeout: 5. +verbose: False + +[gcode_macro _NOZZLE_Z_OFFSET_CALIBRATE] +gcode: + G28 X Y + G28 Z + G91 + G0 x-60 F6000 + SET_GCODE_OFFSET Z=0 MOVE=0 + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + +[gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] +gcode: + RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"D1000HS\" \"NozzleAglin.zip\"" + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file diff --git a/config/CreatBot_D1000_V0/base.cfg b/config/CreatBot_D1000_V0/base.cfg index 161461a92..a7f53925c 100644 --- a/config/CreatBot_D1000_V0/base.cfg +++ b/config/CreatBot_D1000_V0/base.cfg @@ -52,6 +52,7 @@ mesh_min: 40,60 mesh_max: 1000, 1000 probe_count: 6,6 mesh_pps: 2,2 +fade_end: 10 algorithm: bicubic bicubic_tension: 0.2 @@ -296,29 +297,52 @@ gcode: [gcode_macro T0] gcode: - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z=0 - SET_GCODE_OFFSET Y=0 - SET_GCODE_OFFSET X=0 - SET_SERVO SERVO=switch_nozzle angle=45 - ACTIVATE_EXTRUDER EXTRUDER=extruder - _RUNOUT_HANDLE + {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set printing = printer.print_stats.state == "printing" %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z=0 MOVE=1 + {% else %} + SET_GCODE_OFFSET Z=0 + {% endif %} + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + SET_SERVO SERVO=switch_nozzle angle=45 + ACTIVATE_EXTRUDER EXTRUDER=extruder + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T0"' + RESPOND TYPE=error MSG='{"Noting! extruder filament has been run out."}' + {% endif %} [gcode_macro T1] gcode: {% set sv = printer.save_variables.variables %} - {% set x_offset = sv.dual_x_offset|default(60)|float %} - {% set y_offset = sv.dual_y_offset|default(0)|float %} - {% set z_offset = sv.dual_z_offset|default(0)|float %} - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z={z_offset} - SET_GCODE_OFFSET Y={y_offset} - SET_GCODE_OFFSET X={x_offset} - SET_SERVO SERVO=switch_nozzle angle=225 - ACTIVATE_EXTRUDER EXTRUDER=extruder1 - _RUNOUT_HANDLE + {% set x_offset = sv.nozzle_x_offset_val|default(0)|float %} + {% set y_offset = sv.nozzle_y_offset_val|default(0)|float %} + {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} + {% set x_offset = x_offset - 59 %} + {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set printing = (printer.print_stats.state == "printing") %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z={z_offset} MOVE=1 + {% else %} + SET_GCODE_OFFSET Z={z_offset} + {% endif %} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T1"' + RESPOND TYPE=error MSG='{"Noting! extruder1 filament has been run out."}' + {% endif %} [gcode_macro PROBE_SERVO_OPEN] gcode: @@ -574,13 +598,57 @@ gcode: else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_extruder VALUE="'{printer.toolhead.extruder}'" + +[gcode_macro _RESUME_EXTRUDER] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set autoshift_on = params.AUTOSHIFT|default(False) %} + {% set toolchange = client.change_runout|lower|default("") %} + {% set extruder_filament = client.filament_state.extruder %} + {% set extruder1_filament = client.filament_state.extruder1 %} + {% set resume_extruder = client.resume_extruder|default("extruder") %} + + {% if autoshift_on %} + {% if extruder_filament and extruder1_filament %} + {% if toolchange == "t0" %} + {% set resume_extruder = "extruder" %} + {% elif toolchange == "t1" %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% else %} + {% if extruder_filament %} + {% set resume_extruder = "extruder" %} + {% elif extruder1_filament %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% endif %} + {% endif %} + {% if printer.toolhead.extruder != resume_extruder %} + T{0 if resume_extruder|default("extruder") == "extruder" else 1 } + {% endif %} + _FILAMENT_UPDATE + +[gcode_macro _EXTRUDER_TEMPERATURE_HANDLE] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set last_extruder_temp = client.last_extruder_temp %} + {% set last_extruder1_temp = client.last_extruder1_temp %} + {% set resume_extruder = client.resume_extruder|lower %} + {% if resume_extruder != printer.toolhead.extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{last_extruder1_temp}" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder1_temp VALUE="{last_extruder_temp}" + {% endif %} [gcode_macro _USER_TEMP_RESUME] gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} - + {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} + {% set value = printer["gcode_macro RESUME"][temperature].temp %} + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % + (printer.toolhead.extruder, value)}' {% for info in extruder_info %} {% set variable = printer["gcode_macro RESUME"][info.name] %} {% if variable.restore %} @@ -611,23 +679,27 @@ variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False -variable_filament_state: False +variable_filament_state: "" +variable_change_runout: "" +variable_autoshift: False +variable_resume_extruder: "" gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} - {% set prompt_txt = [] %} {% set runout = True %} ##### end of definitions ##### _FILAMENT_UPDATE + _RESUME_EXTRUDER AUTOSHIFT={autoshift} + _EXTRUDER_TEMPERATURE_HANDLE + + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_temp.restore or last_extruder1_temp.restore %} # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise - RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' {client.user_temp_macro|default("")} {% set do_resume = True %} {% elif can_extrude %} @@ -650,17 +722,20 @@ gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set auto_extruder = params.AUTO|default(False) %} {% set sp_move = client.speed_move|default(velocity) %} {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} {% set prompt_txt = [] %} {% if filament_state %} - {% if do_resume %} + {% if do_resume or auto_extruder %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE="False" {% else %} {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} @@ -702,7 +777,7 @@ gcode: {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} {% endif %} {% endif %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE="{{'runout': runout, 'extruder': runout_resume, 'extruder1': runout_resume1}}" [gcode_macro _RUNOUT_HANDLE] description: filament state update @@ -714,11 +789,22 @@ gcode: [gcode_macro _RUNOUT_PAUSE] gcode: - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set svv = printer.save_variables.variables %} + {% set autoshift_extruder = svv.auto_change_nozzle|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} + {% set target_extruder = "extruder1" if printer.toolhead.extruder == "extruder" else "extruder" %} {% if not filament_state %} - {% set msg_extruder = "extruder" if printer.toolhead.extruder == "extruder" else "extruder1" %} - RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' PAUSE + {% if autoshift_extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE=True + {% if printer["gcode_macro RESUME"].filament_state[target_extruder] %} + RESUME + {% else %} + RESPOND TYPE=error MSG='{"Noting! All extruders filament has been run out."}' + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Noting! \"%s\" filament has been run out." % printer.toolhead.extruder}' + {% endif %} {% endif %} ######################################## @@ -937,3 +1023,27 @@ gcode: _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose BED_MESH_PROFILE LOAD={default_profile} + +######################################## +# Nozzle Calibrate +######################################## + +[gcode_shell_command fetch_assets] +command: sh /home/klipper/klipper/scripts/fetch_assets.sh +timeout: 5. +verbose: False + +[gcode_macro _NOZZLE_Z_OFFSET_CALIBRATE] +gcode: + G28 X Y + G28 Z + G91 + G0 x-60 F6000 + SET_GCODE_OFFSET Z=0 MOVE=0 + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + +[gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] +gcode: + RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"D1000HS\" \"NozzleAglin.zip\"" + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file diff --git a/config/CreatBot_D600Pro2/base.cfg b/config/CreatBot_D600Pro2/base.cfg index dcc307df5..9e8462ecb 100644 --- a/config/CreatBot_D600Pro2/base.cfg +++ b/config/CreatBot_D600Pro2/base.cfg @@ -52,6 +52,7 @@ mesh_min: 40,60 mesh_max: 600, 600 probe_count: 6,6 mesh_pps: 2,2 +fade_end: 10 algorithm: bicubic bicubic_tension: 0.2 @@ -360,29 +361,52 @@ gcode: [gcode_macro T0] gcode: - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z=0 - SET_GCODE_OFFSET Y=0 - SET_GCODE_OFFSET X=0 - SET_SERVO SERVO=switch_nozzle angle=45 - ACTIVATE_EXTRUDER EXTRUDER=extruder - _RUNOUT_HANDLE + {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set printing = printer.print_stats.state == "printing" %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z=0 MOVE=1 + {% else %} + SET_GCODE_OFFSET Z=0 + {% endif %} + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + SET_SERVO SERVO=switch_nozzle angle=45 + ACTIVATE_EXTRUDER EXTRUDER=extruder + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T0"' + RESPOND TYPE=error MSG='{"Noting! extruder filament has been run out."}' + {% endif %} [gcode_macro T1] gcode: {% set sv = printer.save_variables.variables %} - {% set x_offset = sv.dual_x_offset|default(60)|float %} - {% set y_offset = sv.dual_y_offset|default(0)|float %} - {% set z_offset = sv.dual_z_offset|default(0)|float %} - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z={z_offset} - SET_GCODE_OFFSET Y={y_offset} - SET_GCODE_OFFSET X={x_offset} - SET_SERVO SERVO=switch_nozzle angle=225 - ACTIVATE_EXTRUDER EXTRUDER=extruder1 - _RUNOUT_HANDLE + {% set x_offset = sv.nozzle_x_offset_val|default(0)|float %} + {% set y_offset = sv.nozzle_y_offset_val|default(0)|float %} + {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} + {% set x_offset = x_offset - 59 %} + {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set printing = (printer.print_stats.state == "printing") %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z={z_offset} MOVE=1 + {% else %} + SET_GCODE_OFFSET Z={z_offset} + {% endif %} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T1"' + RESPOND TYPE=error MSG='{"Noting! extruder1 filament has been run out."}' + {% endif %} [gcode_macro PROBE_SERVO_OPEN] gcode: @@ -631,13 +655,57 @@ gcode: else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_extruder VALUE="'{printer.toolhead.extruder}'" + +[gcode_macro _RESUME_EXTRUDER] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set autoshift_on = params.AUTOSHIFT|default(False) %} + {% set toolchange = client.change_runout|lower|default("") %} + {% set extruder_filament = client.filament_state.extruder %} + {% set extruder1_filament = client.filament_state.extruder1 %} + {% set resume_extruder = client.resume_extruder %} + + {% if autoshift_on %} + {% if extruder_filament and extruder1_filament %} + {% if toolchange == "t0" %} + {% set resume_extruder = "extruder" %} + {% elif toolchange == "t1" %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% else %} + {% if extruder_filament %} + {% set resume_extruder = "extruder" %} + {% elif extruder1_filament %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% endif %} + {% endif %} + {% if printer.toolhead.extruder != resume_extruder %} + T{0 if resume_extruder|default("extruder") == "extruder" else 1 } + {% endif %} + _FILAMENT_UPDATE + +[gcode_macro _EXTRUDER_TEMPERATURE_HANDLE] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set last_extruder_temp = client.last_extruder_temp %} + {% set last_extruder1_temp = client.last_extruder1_temp %} + {% set resume_extruder = client.resume_extruder|lower %} + {% if resume_extruder != printer.toolhead.extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{last_extruder1_temp}" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder1_temp VALUE="{last_extruder_temp}" + {% endif %} [gcode_macro _USER_TEMP_RESUME] gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} - + {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} + {% set value = printer["gcode_macro RESUME"][temperature].temp %} + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % + (printer.toolhead.extruder, value)}' {% for info in extruder_info %} {% set variable = printer["gcode_macro RESUME"][info.name] %} {% if variable.restore %} @@ -668,23 +736,29 @@ variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False -variable_filament_state: False +variable_filament_state: "" +variable_change_runout: "" +variable_autoshift: False +variable_resume_extruder: "" gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} {% set prompt_txt = [] %} {% set runout = True %} ##### end of definitions ##### _FILAMENT_UPDATE + _RESUME_EXTRUDER AUTOSHIFT={autoshift} + _EXTRUDER_TEMPERATURE_HANDLE + + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder + #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_temp.restore or last_extruder1_temp.restore %} # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise - RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' {client.user_temp_macro|default("")} {% set do_resume = True %} {% elif can_extrude %} @@ -707,17 +781,20 @@ gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set auto_extruder = params.AUTO|default(False) %} {% set sp_move = client.speed_move|default(velocity) %} {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} {% set prompt_txt = [] %} {% if filament_state %} - {% if do_resume %} + {% if do_resume or auto_extruder %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE="False" {% else %} {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} @@ -759,7 +836,7 @@ gcode: {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} {% endif %} {% endif %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE="{{'runout': runout, 'extruder': runout_resume, 'extruder1': runout_resume1}}" [gcode_macro _RUNOUT_HANDLE] description: filament state update @@ -771,11 +848,22 @@ gcode: [gcode_macro _RUNOUT_PAUSE] gcode: - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set svv = printer.save_variables.variables %} + {% set autoshift_extruder = svv.auto_change_nozzle|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} + {% set target_extruder = "extruder1" if printer.toolhead.extruder == "extruder" else "extruder" %} {% if not filament_state %} - {% set msg_extruder = "extruder" if printer.toolhead.extruder == "extruder" else "extruder1" %} - RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' PAUSE + {% if autoshift_extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE=True + {% if printer["gcode_macro RESUME"].filament_state[target_extruder] %} + RESUME + {% else %} + RESPOND TYPE=error MSG='{"Noting! All extruders filament has been run out."}' + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Noting! \"%s\" filament has been run out." % printer.toolhead.extruder}' + {% endif %} {% endif %} ######################################## @@ -994,3 +1082,27 @@ gcode: _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose BED_MESH_PROFILE LOAD={default_profile} + +######################################## +# Nozzle Calibrate +######################################## + +[gcode_shell_command fetch_assets] +command: sh /home/klipper/klipper/scripts/fetch_assets.sh +timeout: 5. +verbose: False + +[gcode_macro _NOZZLE_Z_OFFSET_CALIBRATE] +gcode: + G28 X Y + G28 Z + G91 + G0 x-60 F6000 + SET_GCODE_OFFSET Z=0 MOVE=0 + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + +[gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] +gcode: + RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"D600Pro2HS\" \"NozzleAglin.zip\"" + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file diff --git a/config/CreatBot_D600Pro2_V0/base.cfg b/config/CreatBot_D600Pro2_V0/base.cfg index 95b0bf4d3..0130ccd62 100644 --- a/config/CreatBot_D600Pro2_V0/base.cfg +++ b/config/CreatBot_D600Pro2_V0/base.cfg @@ -52,6 +52,7 @@ mesh_min: 40,60 mesh_max: 600, 600 probe_count: 6,6 mesh_pps: 2,2 +fade_end: 10 algorithm: bicubic bicubic_tension: 0.2 @@ -296,29 +297,52 @@ gcode: [gcode_macro T0] gcode: - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z=0 - SET_GCODE_OFFSET Y=0 - SET_GCODE_OFFSET X=0 - SET_SERVO SERVO=switch_nozzle angle=45 - ACTIVATE_EXTRUDER EXTRUDER=extruder - _RUNOUT_HANDLE + {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set printing = printer.print_stats.state == "printing" %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z=0 MOVE=1 + {% else %} + SET_GCODE_OFFSET Z=0 + {% endif %} + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + SET_SERVO SERVO=switch_nozzle angle=45 + ACTIVATE_EXTRUDER EXTRUDER=extruder + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T0"' + RESPOND TYPE=error MSG='{"Noting! extruder filament has been run out."}' + {% endif %} [gcode_macro T1] gcode: {% set sv = printer.save_variables.variables %} - {% set x_offset = sv.dual_x_offset|default(60)|float %} - {% set y_offset = sv.dual_y_offset|default(0)|float %} - {% set z_offset = sv.dual_z_offset|default(0)|float %} - SET_SERVO SERVO=switch_nozzle angle=135 - G4 P500 - SET_GCODE_OFFSET Z={z_offset} - SET_GCODE_OFFSET Y={y_offset} - SET_GCODE_OFFSET X={x_offset} - SET_SERVO SERVO=switch_nozzle angle=225 - ACTIVATE_EXTRUDER EXTRUDER=extruder1 - _RUNOUT_HANDLE + {% set x_offset = sv.nozzle_x_offset_val|default(0)|float %} + {% set y_offset = sv.nozzle_y_offset_val|default(0)|float %} + {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} + {% set x_offset = x_offset - 59 %} + {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set printing = (printer.print_stats.state == "printing") %} + {% if filament_insert or printing == False %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z={z_offset} MOVE=1 + {% else %} + SET_GCODE_OFFSET Z={z_offset} + {% endif %} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T1"' + RESPOND TYPE=error MSG='{"Noting! extruder1 filament has been run out."}' + {% endif %} [gcode_macro PROBE_SERVO_OPEN] gcode: @@ -567,13 +591,57 @@ gcode: else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_extruder VALUE="'{printer.toolhead.extruder}'" + +[gcode_macro _RESUME_EXTRUDER] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set autoshift_on = params.AUTOSHIFT|default(False) %} + {% set toolchange = client.change_runout|lower|default("") %} + {% set extruder_filament = client.filament_state.extruder %} + {% set extruder1_filament = client.filament_state.extruder1 %} + {% set resume_extruder = client.resume_extruder|default("extruder") %} + + {% if autoshift_on %} + {% if extruder_filament and extruder1_filament %} + {% if toolchange == "t0" %} + {% set resume_extruder = "extruder" %} + {% elif toolchange == "t1" %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% else %} + {% if extruder_filament %} + {% set resume_extruder = "extruder" %} + {% elif extruder1_filament %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% endif %} + {% endif %} + {% if printer.toolhead.extruder != resume_extruder %} + T{0 if resume_extruder|default("extruder") == "extruder" else 1 } + {% endif %} + _FILAMENT_UPDATE + +[gcode_macro _EXTRUDER_TEMPERATURE_HANDLE] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set last_extruder_temp = client.last_extruder_temp %} + {% set last_extruder1_temp = client.last_extruder1_temp %} + {% set resume_extruder = client.resume_extruder|lower %} + {% if resume_extruder != printer.toolhead.extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{last_extruder1_temp}" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder1_temp VALUE="{last_extruder_temp}" + {% endif %} [gcode_macro _USER_TEMP_RESUME] gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} - + {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} + {% set value = printer["gcode_macro RESUME"][temperature].temp %} + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % + (printer.toolhead.extruder, value)}' {% for info in extruder_info %} {% set variable = printer["gcode_macro RESUME"][info.name] %} {% if variable.restore %} @@ -604,23 +672,29 @@ variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False -variable_filament_state: False +variable_filament_state: "" +variable_change_runout: "" +variable_autoshift: False +variable_resume_extruder: "" gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} {% set prompt_txt = [] %} {% set runout = True %} ##### end of definitions ##### _FILAMENT_UPDATE + _RESUME_EXTRUDER AUTOSHIFT={autoshift} + _EXTRUDER_TEMPERATURE_HANDLE + + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder + #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_temp.restore or last_extruder1_temp.restore %} # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise - RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' {client.user_temp_macro|default("")} {% set do_resume = True %} {% elif can_extrude %} @@ -643,17 +717,20 @@ gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set auto_extruder = params.AUTO|default(False) %} {% set sp_move = client.speed_move|default(velocity) %} {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} {% set prompt_txt = [] %} {% if filament_state %} - {% if do_resume %} + {% if do_resume or auto_extruder %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE="False" {% else %} {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} @@ -695,7 +772,7 @@ gcode: {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} {% endif %} {% endif %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE="{{'runout': runout, 'extruder': runout_resume, 'extruder1': runout_resume1}}" [gcode_macro _RUNOUT_HANDLE] description: filament state update @@ -707,11 +784,22 @@ gcode: [gcode_macro _RUNOUT_PAUSE] gcode: - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set svv = printer.save_variables.variables %} + {% set autoshift_extruder = svv.auto_change_nozzle|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} + {% set target_extruder = "extruder1" if printer.toolhead.extruder == "extruder" else "extruder" %} {% if not filament_state %} - {% set msg_extruder = "extruder" if printer.toolhead.extruder == "extruder" else "extruder1" %} - RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' PAUSE + {% if autoshift_extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE=True + {% if printer["gcode_macro RESUME"].filament_state[target_extruder] %} + RESUME + {% else %} + RESPOND TYPE=error MSG='{"Noting! All extruders filament has been run out."}' + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Noting! \"%s\" filament has been run out." % printer.toolhead.extruder}' + {% endif %} {% endif %} ######################################## @@ -930,3 +1018,27 @@ gcode: _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose BED_MESH_PROFILE LOAD={default_profile} + +######################################## +# Nozzle Calibrate +######################################## + +[gcode_shell_command fetch_assets] +command: sh /home/klipper/klipper/scripts/fetch_assets.sh +timeout: 5. +verbose: False + +[gcode_macro _NOZZLE_Z_OFFSET_CALIBRATE] +gcode: + G28 X Y + G28 Z + G91 + G0 x-60 F6000 + SET_GCODE_OFFSET Z=0 MOVE=0 + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + +[gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] +gcode: + RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"D600Pro2HS\" \"NozzleAglin.zip\"" + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file diff --git a/config/CreatBot_F430NX/base.cfg b/config/CreatBot_F430NX/base.cfg index 545ce4dd2..87df64a4e 100644 --- a/config/CreatBot_F430NX/base.cfg +++ b/config/CreatBot_F430NX/base.cfg @@ -52,6 +52,7 @@ mesh_min: 34.6,17.4 mesh_max: 420, 300 probe_count: 5,4 mesh_pps: 2,2 +fade_end: 5 algorithm: bicubic bicubic_tension: 0.2 @@ -68,16 +69,17 @@ position_endstop: -20 position_max: 475 homing_speed: 100 homing_retract_dist: 10 +step_pulse_duration:0.0000025 [tmc5160 stepper_x] cs_pin: PE2 spi_software_sclk_pin: PB3 spi_software_mosi_pin: PB5 spi_software_miso_pin: PB4 -run_current: 1.0 +run_current: 1.5 interpolate: True sense_resistor: 0.075 -stealthchop_threshold: 200 +stealthchop_threshold: 300 [dual_carriage] axis: x @@ -119,16 +121,7 @@ position_endstop: 0 position_max: 300 homing_speed: 60 homing_retract_dist: 10 - -[tmc5160 stepper_y] -cs_pin: PE3 -spi_software_sclk_pin: PB3 -spi_software_mosi_pin: PB5 -spi_software_miso_pin: PB4 -run_current: 2.3 -interpolate: True -sense_resistor: 0.075 -stealthchop_threshold: 200 +step_pulse_duration:0.0000025 [stepper_z] step_pin: PD7 @@ -336,7 +329,7 @@ pin:L_tool:PA5 maximum_servo_angle: 180 minimum_pulse_width: 0.000900 maximum_pulse_width: 0.002100 -initial_angle: 135 +initial_angle: 165 # initial_pulse_width: @@ -437,21 +430,33 @@ gcode: [gcode_macro T0] gcode: - {% if "x" not in printer.toolhead.homed_axes %} - G28 X - {% set x_home = true %} - {% endif %} - {% if printer.toolhead.extruder != 'extruder' or x_home %} - SAVE_GCODE_STATE NAME=park0 - G90 - _PARK_{printer.toolhead.extruder} - ACTIVATE_EXTRUDER EXTRUDER=extruder - SET_DUAL_CARRIAGE CARRIAGE=0 - SET_GCODE_OFFSET Z=0 - SET_GCODE_OFFSET Y=0 - SET_GCODE_OFFSET X=0 - G1 X0 F6000 - RESTORE_GCODE_STATE NAME=park0 + {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set printing = printer.print_stats.state == "printing" %} + {% if filament_insert or printing == False %} + {% if "x" not in printer.toolhead.homed_axes %} + G28 X + {% set x_home = true %} + {% endif %} + {% if printer.toolhead.extruder != 'extruder' or x_home %} + SAVE_GCODE_STATE NAME=park0 + G90 + _PARK_{printer.toolhead.extruder} + ACTIVATE_EXTRUDER EXTRUDER=extruder + SET_DUAL_CARRIAGE CARRIAGE=0 + RESTORE_GCODE_STATE NAME=park0 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z=0 MOVE=1 + {% else %} + SET_GCODE_OFFSET Z=0 + {% endif %} + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + G1 X0 F6000 + {% endif %} + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T0"' + RESPOND TYPE=error MSG='{"Noting! extruder filament has been run out."}' {% endif %} [gcode_macro _PARK_extruder1] @@ -467,48 +472,66 @@ gcode: {% set y_offset = svv.dual_y_offset|default(0)|float %} {% set z_offset = svv.dual_z_offset|default(0)|float %} - {% if "x" not in printer.toolhead.homed_axes %} - G28 X - {% set x_home = true %} - {% endif %} + {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set printing = (printer.print_stats.state == "printing") %} + {% if filament_insert or printing == False %} + {% if "x" not in printer.toolhead.homed_axes %} + G28 X + {% set x_home = true %} + {% endif %} - {% if printer.toolhead.extruder != 'extruder1' or x_home %} - SAVE_GCODE_STATE NAME=park1 - G90 - _PARK_{printer.toolhead.extruder} - ACTIVATE_EXTRUDER EXTRUDER=extruder1 - SET_DUAL_CARRIAGE CARRIAGE=1 - SET_GCODE_OFFSET Z={z_offset} - SET_GCODE_OFFSET Y={y_offset} - SET_GCODE_OFFSET X={x_offset} - G1 X455 F6000 - RESTORE_GCODE_STATE NAME=park1 + {% if printer.toolhead.extruder != 'extruder1' or x_home %} + SAVE_GCODE_STATE NAME=park1 + G90 + _PARK_{printer.toolhead.extruder} + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + SET_DUAL_CARRIAGE CARRIAGE=1 + RESTORE_GCODE_STATE NAME=park1 + {% if "z" in printer.toolhead.homed_axes | lower %} + SET_GCODE_OFFSET Z={z_offset} MOVE=1 + {% else %} + SET_GCODE_OFFSET Z={z_offset} + {% endif %} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + G1 X455 F6000 + {% endif %} + {% else %} + PAUSE + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE='"T1"' + RESPOND TYPE=error MSG='{"Noting! extruder1 filament has been run out."}' {% endif %} - [gcode_macro ACTIVATE_COPY_MODE] gcode: - SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY - G1 X0 F6000 - ACTIVATE_EXTRUDER EXTRUDER=extruder - SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY - G1 X227.5 F6000 - SET_DUAL_CARRIAGE CARRIAGE=1 MODE=COPY - SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=extruder - _RUNOUT_HANDLE + SET_GCODE_VARIABLE MACRO=_SET_DUAL_MODE VARIABLE=dual_mode VALUE='"copy"' [gcode_macro ACTIVATE_MIRROR_MODE] gcode: + SET_GCODE_VARIABLE MACRO=_SET_DUAL_MODE VARIABLE=dual_mode VALUE='"mirror"' + +[gcode_macro _ACTIVATE_PRIMARY_MODE] +gcode: + SET_GCODE_VARIABLE MACRO=_SET_DUAL_MODE VARIABLE=dual_mode VALUE='"primary"' + +[gcode_macro _SET_DUAL_MODE] +variable_dual_mode: "primary" +gcode: + G90 SET_DUAL_CARRIAGE CARRIAGE=0 MODE=PRIMARY G1 X0 F6000 ACTIVATE_EXTRUDER EXTRUDER=extruder SET_DUAL_CARRIAGE CARRIAGE=1 MODE=PRIMARY - G1 X455 F6000 - SET_DUAL_CARRIAGE CARRIAGE=1 MODE=MIRROR + {% if dual_mode == "copy" %} + G1 X227.5 F6000 + SET_DUAL_CARRIAGE CARRIAGE=1 MODE=COPY + {% elif dual_mode == "mirror" %} + G1 X455 F6000 + SET_DUAL_CARRIAGE CARRIAGE=1 MODE=MIRROR + {% endif %} SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=extruder _RUNOUT_HANDLE - [gcode_macro PROBE_SERVO_OPEN] gcode: SET_SERVO SERVO=probe_servo angle=45 @@ -517,7 +540,7 @@ gcode: [gcode_macro PROBE_SERVO_CLOSE] gcode: G4 P500 - SET_SERVO SERVO=probe_servo angle=135 + SET_SERVO SERVO=probe_servo angle=165 [gcode_macro _START_PRINT_BASE] description: Call when starting to print @@ -525,6 +548,11 @@ gcode: _CLEAR_LAST_FILE _RUNOUT_HANDLE +[gcode_macro _CANCEL_PRINT_BASE] +description: Call when cancelled to print +gcode: + _ACTIVATE_PRIMARY_MODE + [gcode_macro START_PRINT] gcode: {% set BED_TEMP = params.BED|default(0)|float %} @@ -570,6 +598,7 @@ gcode: G0 Z1.00 F6000 _PARK_extruder _PARK_extruder1 + _ACTIVATE_PRIMARY_MODE {% else %} G0 Z1.00 X20.0 Y20.0 F6000 {% endif %} @@ -652,6 +681,7 @@ gcode: rename_existing: C28 gcode: {% set homing_cmd = ''%} + {% set dual_mode = printer['gcode_macro _SET_DUAL_MODE'].dual_mode|default("primary") %} {% set do_x = 'X' in params|string %} {% set do_y = 'Y' in params|string %} {% set do_z = 'Z' in params|string %} @@ -678,6 +708,9 @@ gcode: _RESTORE_DEFAULT_EXTRUDER {% endif %} {% endif %} + {% if dual_mode == "copy" or dual_mode == "mirror" %} + _SET_DUAL_MODE + {% endif %} [gcode_macro M109] rename_existing: C109 @@ -736,7 +769,7 @@ gcode: [gcode_macro _CLIENT_VARIABLE] variable_use_custom_pos : True -variable_custom_park_x : 200.0 +variable_custom_park_x : 180.0 variable_custom_park_y : 250.0 variable_custom_park_dz : 20.0 variable_retract : 2.0 @@ -782,13 +815,17 @@ gcode: SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_dual VALUE=True {% endif %} {% endif %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_extruder VALUE="'{printer.toolhead.extruder}'" [gcode_macro _USER_TEMP_RESUME] gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} - + {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} + {% set value = printer["gcode_macro RESUME"][temperature].temp %} + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % + (printer.toolhead.extruder, value)}' {% for info in extruder_info %} {% set variable = printer["gcode_macro RESUME"][info.name] %} {% if variable.restore %} @@ -806,6 +843,46 @@ gcode: {% endif %} {% endfor %} +[gcode_macro _RESUME_EXTRUDER] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set autoshift_on = params.AUTOSHIFT|default(False) %} + {% set toolchange = client.change_runout|lower|default("") %} + {% set extruder_filament = client.filament_state.extruder %} + {% set extruder1_filament = client.filament_state.extruder1 %} + {% set resume_extruder = client.resume_extruder|default("extruder") %} + + {% if autoshift_on %} + {% if extruder_filament and extruder1_filament %} + {% if toolchange == "t0" %} + {% set resume_extruder = "extruder" %} + {% elif toolchange == "t1" %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% else %} + {% if extruder_filament %} + {% set resume_extruder = "extruder" %} + {% elif extruder1_filament %} + {% set resume_extruder = "extruder1" %} + {% endif %} + {% endif %} + {% endif %} + {% if printer.toolhead.extruder != resume_extruder %} + T{0 if resume_extruder|default("extruder") == "extruder" else 1 } + {% endif %} + _FILAMENT_UPDATE + +[gcode_macro _EXTRUDER_TEMPERATURE_HANDLE] +gcode: + {% set client = printer['gcode_macro RESUME']|default({}) %} + {% set last_extruder_temp = client.last_extruder_temp %} + {% set last_extruder1_temp = client.last_extruder1_temp %} + {% set resume_extruder = client.resume_extruder|lower %} + {% if resume_extruder != printer.toolhead.extruder %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{ last_extruder1_temp }" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder1_temp VALUE="{ last_extruder_temp }" + {% endif %} + [gcode_macro _USER_CANCEL] gcode: G91 @@ -820,33 +897,35 @@ variable_last_extruder1_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False variable_resume_dual: False -variable_filament_state: False +variable_filament_state: "" +variable_change_runout: "" +variable_autoshift: False +variable_resume_extruder: "" gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder {% set do_resume = False %} {% set prompt_txt = [] %} {% set runout = True %} ##### end of definitions ##### - {% if printer["dual_carriage"] is defined %} - {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %} - {% if resume_dual %} + _FILAMENT_UPDATE + {% if resume_dual %} RESTORE_DUAL_CARRIAGE_STATE ACTIVATE_EXTRUDER EXTRUDER=extruder SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=extruder SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=resume_dual VALUE=False - {% endif %} + {% else %} + _RESUME_EXTRUDER AUTOSHIFT={autoshift} {% endif %} + _EXTRUDER_TEMPERATURE_HANDLE - _FILAMENT_UPDATE + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False {% if last_extruder_temp.restore or last_extruder1_temp.restore %} # we need to use the unicode (\u00B0) for the ¡ã as py2 env's would throw an error otherwise - RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' {client.user_temp_macro|default("")} {% set do_resume = True %} {% elif can_extrude %} @@ -869,17 +948,20 @@ gcode: ##### get user parameters or use default ##### {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set auto_extruder = params.AUTO|default(False) %} {% set sp_move = client.speed_move|default(velocity) %} {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} {% set prompt_txt = [] %} {% if filament_state %} - {% if do_resume %} + {% if do_resume or auto_extruder %} {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE="False" {% else %} {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} {% endif %} @@ -921,7 +1003,7 @@ gcode: {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} {% endif %} {% endif %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE="{{'runout': runout, 'extruder': runout_resume, 'extruder1': runout_resume1}}" [gcode_macro _RUNOUT_HANDLE] description: filament state update @@ -933,12 +1015,29 @@ gcode: [gcode_macro _RUNOUT_PAUSE] gcode: - {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set svv = printer.save_variables.variables %} + {% set autoshift_extruder = svv.auto_change_nozzle|default(False) %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state.runout|default(False) %} + {% set target_extruder = "extruder1" if printer.toolhead.extruder == "extruder" else "extruder" %} + {% set idex = False %} + {% if printer["dual_carriage"] is defined %} + {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %} + {% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %} + {% set idex = True %} + {% endif %} + {% endif %} {% if not filament_state %} - {% set runout = printer['filament_switch_sensor extruder'].filament_detected %} - {% set msg_extruder = "extruder1" if runout else "extruder" %} - RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' PAUSE + {% if autoshift_extruder and idex == False %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=autoshift VALUE=True + {% if printer["gcode_macro RESUME"].filament_state[target_extruder] %} + RESUME + {% else %} + RESPOND TYPE=error MSG='{"Noting! All extruders filament has been run out."}' + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Noting! \"%s\" filament has been run out." % printer.toolhead.extruder}' + {% endif %} {% endif %} ######################################## @@ -1157,3 +1256,28 @@ gcode: _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose BED_MESH_PROFILE LOAD={default_profile} + +######################################## +# Nozzle Calibrate +######################################## + +[gcode_shell_command fetch_assets] +command: sh /home/klipper/klipper/scripts/fetch_assets.sh +timeout: 5. +verbose: False + +[gcode_macro _NOZZLE_Z_OFFSET_CALIBRATE] +gcode: + G28 + G90 + _PARK_extruder + G0 Z5 + SET_GCODE_OFFSET Z=0 MOVE=0 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + SET_DUAL_CARRIAGE CARRIAGE=1 + G1 X200 F6000 + +[gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] +gcode: + RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"F430NX\" \"NozzleAglin.zip\"" + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file diff --git a/klippy/extras/heaters.py b/klippy/extras/heaters.py index 548050132..b1e2d5583 100644 --- a/klippy/extras/heaters.py +++ b/klippy/extras/heaters.py @@ -81,7 +81,7 @@ class Heater: # self.last_temp, self.last_temp_time, self.target_temp) def temperature_callback(self, read_time, temp): with self.lock: - time_diff = read_time - self.last_temp_time + time_diff = max(0, read_time - self.last_temp_time) self.last_temp = temp self.last_temp_time = read_time self.control.temperature_update(read_time, temp, self.target_temp) diff --git a/scripts/fetch_assets.sh b/scripts/fetch_assets.sh new file mode 100644 index 000000000..418ceecc3 --- /dev/null +++ b/scripts/fetch_assets.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Get model name and type +Type="$1" +Model="$2" +Filename="$3" + +echo "Type: ${Type}" +echo "Model: ${Model}" +echo "Filename: ${Filename}" + +# Check if model name is provided +if [ -z "$Model" ]; then + echo "Error: Model name not provided" + exit 1 +fi + +# Check if the Type is Gcode +if [ "$Type" = "Gcode" ]; then + # Define download path and filename + download_path="$HOME/.temp/" + download_filename="${download_path}NozzleAglin.zip" + download_url="https://www.creatbot.com/downloads/3dmodels/gcode/${Model}/NozzleAglin.zip" + + # Create temporary download directory + mkdir -p "${download_path}" + + # Define target folder for extracted file + target_folder="$HOME/printer_data/gcodes/.PresetModel/" + + # Check if the target folder already contains the extracted file + if [ -f "${target_folder}NozzleAglin.gcode" ]; then + echo "Target file 'NozzleAglin.gcode' already exists, skipping download and extraction." + exit 0 + fi + + # If the file does not exist, start downloading the file + wget -q -O "${download_filename}" "${download_url}" + + # Check if wget successfully downloaded the file + if [ $? -ne 0 ]; then + echo "Error: Download failed, the URL might be invalid or there is a network issue." + exit 1 + fi + + # Create target extraction directory if it doesn't exist + mkdir -p "$target_folder" + + # Extract the downloaded file to the target directory, using -o to overwrite existing files + unzip -o -q "${download_filename}" -d "$target_folder" + + # Check if the extraction was successful + if [ $? -ne 0 ]; then + echo "Error: Extraction failed, please check if the file is corrupted or the path is correct." + exit 1 + fi + + # Remove the temporary download folder + rm -rf "${download_path}" + + echo "Download and extraction completed successfully." + +fi