def probe_scan(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) feeder = app.config.get_feeder_info('built_in_feeder') units_a = feeder['steps_per_angle'] try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 app.trace(_("Initializing Probing procedure")) if (safety_door == 1): app.macro("M741", "TRIGGERED", 2, _("Front panel door control"), warning=True) app.macro("M402", "ok", 2, _("Retracting Probe")) app.macro("M744", "TRIGGERED", 2, _("Building plane is absent"), warning=True) app.macro("M742", "TRIGGERED", 2, _("Spool panel"), warning=False) app.macro("G90", "ok", 2, _("Setting abs position"), verbose=True) app.macro("M302 S0", "ok", 2, _("Disabling cold extrusion prevention"), verbose=True) app.macro("M92 E" + str(units_a), "ok", 2, _("Setting 4th axis mode"), verbose=True)
def end_subtractive(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.trace("Terminating...") # Deinitialize and restore settings end_subtractive_aborted(app, args, lang)
def check_measure_probe(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 try: bed_enabled = app.config.get('settings', 'hardware')['bed']['enable'] except KeyError: bed_enabled = True app.trace(_("Checking safety measures")) if safety_door == 1: app.macro("M741", "TRIGGERED", 2, _("Front panel door opened"), verbose=False) app.trace(_("Checking building plate")) if bed_enabled == True: app.macro("M744", "TRIGGERED", 1, _("Build plate needs to be flipped to the printing side"), verbose=False) app.macro("M742", "TRIGGERED", 1, _("Spool panel control"), verbose=False, warning=True)
def home_all(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: zprobe_disabled = int(app.config.get('settings', 'probe.enable')) == 0 z_max_offset = app.config.get('settings', 'z_max_offset') except KeyError: z_max_offset = Z_MAX_OFFSET zprobe_disabled = False app.trace(_("Homing all axes")) app.macro("G90", "ok", 2, _("Setting abs position"), verbose=False) if zprobe_disabled: app.macro("G27", "ok", 200, _("Homing all axes"), verbose=False) app.macro('G92 Z{0}'.format(z_max_offset), "ok", 99, _("Set Z Max"), verbose=False) app.macro("G0 Z50 F10000", "ok", 120, _("Raising"), verbose=False) app.macro("M400", "ok", 120, _("Waiting for all moves to finish"), verbose=False) else: app.macro("G28", "ok", 200, _("Homing all axes"), verbose=False)
def pause_subtractive(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.macro("M400", "ok", 240, _("Waiting for all moves to finish"), verbose=False) position = getPosition(app, lang) with open('/var/lib/fabui/settings/stored_task.json', 'w') as f: f.write(json.dumps({'position': position})) current_z = float(position['z']) safe_z = current_z + 50.0 max_z = app.config.get('settings', 'z_max_offset', Z_MAX_OFFSET) - 5 if safe_z > max_z: safe_z = max_z app.macro("G90", "ok", 2, _("Setting absolute position"), verbose=False) app.macro("G0 Z{0} F5000".format(safe_z), "ok", 100, _("Moving to Z safe zone"), verbose=False) app.macro("G0 X210 Y210 F6000", "ok", 100, _("Moving to safe zone"), verbose=False) #block stepper motor for 5min => 60*5=300 app.macro("M84 S300", "ok", 2, _("Block stepper motor"), verbose=False) app.macro("M732 S0", "ok", 2, _("Disabling door safety"))
def install_head(app, args, lang='en_US.UTF-8'): setLanguage(lang) head_name = args[0] result = configure_head(app, head_name, lang) # app.trace(_("Restarting totumduino")) return result
def shutdown(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) installed_head = app.config.get_current_head_info() temps = getTemperature(app) min_temperature = 70 app.trace(_("Shutting down...")) if "print" in installed_head['capabilities'] and (float(temps['T']) > min_temperature): app.macro("M104 S{0}".format(min_temperature), "ok", 5, _("Cooling down nozzle temperature")) app.macro( "M109 S{0}".format(min_temperature), "*", 400, _("Waiting for nozzle to reach temperature (<span class='top-bar-nozzle-actual'>-</span> / {0}°)" .format(min_temperature))) #heating and waiting. app.trace(_("Nozzle cooled")) app.macro("M300", "ok", 5, _("Play alert sound!"), verbose=False) app.macro("M729", "ok", 2, _("Asleep!"), verbose=False)
def auto_bed_leveling(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.trace(_("Auto Bed leveling Initialized")) app.macro("G28", "ok", 120, _("Homing Z axis")) app.macro("G28 X Y", "ok", 90, _("Homing X/Y axis")) app.macro("G29", "ok", 150, _("Probing the bed"))
def set_lights(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) if (len(args) < 3): try: colors = app.config.get('settings', 'color') red = colors['r'] green = colors['g'] blue = colors['b'] except: red = 255 green = 255 blue = 255 else: red = args[0] green = args[1] blue = args[2] app.macro("M701 S{0}".format(red), "ok", 1, _("Setting red color"), verbose=False) app.macro("M702 S{0}".format(green), "ok", 1, _("Setting green color"), verbose=False) app.macro("M703 S{0}".format(blue), "ok", 1, _("Setting blue color"), verbose=False)
def getPosition(app, lang='en_US.UTF-8'): setLanguage(lang) reply = app.macro("M114", "ok", 120, _("Get position"), verbose=False) result = parseM114(reply) if result: return result
def sweep_scan(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 app.trace(_("Initializing Sweeping Laserscanner")) app.trace(_("Checking panel door status and bed inserted")) if (safety_door == 1): app.macro("M741", "TRIGGERED", 2, _("Front panel door control")) app.macro("M744", "TRIGGERED", 2, _("Building plane removed!"), warning=True) app.macro("M742", "TRIGGERED", 1, _("Spool panel is not closed!"), warning=True, verbose=False) app.macro("M701 S0", "ok", 2, _("Turning off lights")) app.macro("M702 S0", "ok", 2, _("Turning off lights"), verbose=False) app.macro("M703 S0", "ok", 2, _("Turning off lights"), verbose=False) # macro("M744","open",2,"Working plane absent/tilted",0.1) #~ app.macro("G28 X0 Y0", "ok", 90, _("Homing all axis"), 1) #~ app.macro("G27", "ok", 90, _("Homing all axis") ) app.macro("G90", "ok", 2, _("Setting abs position"), verbose=False) # macro("M92 E"+str(units['a']),"ok",1,"Setting 4th axis mode",0) app.macro("G0 Z145 F1000", "ok", 100, _("Lowering the plane"), verbose=False)
def measure_nozzle_offset(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.macro("M104 S0", "ok", 2, _("Extruder heating off")) app.macro("M140 S0", "ok", 2, _("Bed heating off")) app.trace(_("Measuring nozzle offset")) zpos = getPosition(app, lang) # Paper width is 0.08mm nozzle = float(zpos['z']) - 0.08 app.macro("G90", "ok", 2, _("Setting rel position"), verbose=False) app.macro("G0 Z+40", "ok", 100, _("Moving the bed 40mm away from measured height"), verbose=False) # Store offset to head config head_file = os.path.join( app.config.get('hardware', 'heads'), app.config.get('settings', 'hardware.head') + '.json') with open(head_file) as json_f: head_info = json.load(json_f) #head_info['nozzle_offset'] = str(round(nozzle,2)) head_info['nozzle_offset'] = nozzle with open(head_file, 'w') as outfile: json.dump(head_info, outfile, sort_keys=True, indent=4) return {'nozzle_z_offset': nozzle}
def photogrammetry_scan(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) feeder = app.config.get_feeder_info('built_in_feeder') units_a = feeder['steps_per_angle'] try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 app.trace(_("Initializing Photogrammetry scanner")) app.trace(_("Checking panel door status and bed inserted")) if (safety_door == 1): app.macro("M741", "TRIGGERED", 2, _("Front panel door control"), verbose=False) app.macro("M744", "open", 1, _("Building plane (must be removed)")) app.macro("M742", "TRIGGERED", 1, _("Spool panel closed"), warning=True) app.macro("M701 S255", "ok", 2, _("Turning on lights"), verbose=False) app.macro("M702 S255", "ok", 2, _("Turning on lights"), verbose=False) app.macro("M703 S255", "ok", 2, _("Turning on lights"), verbose=False) app.macro("G90", "ok", 2, _("Setting abs position"), verbose=False) app.macro("G0 X96 Y175 Z135 E0 F10000", "ok", 100, _("Moving to collimation position")) app.macro("M302 S0", "ok", 2, _("Enabling cold extrusion"), verbose=False) app.macro("M92 E" + str(units_a), "ok", 1, _("Setting 4th axis mode"), verbose=True)
def load_spool(app, args = None, lang='en_US.UTF-8'): setLanguage(lang) try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 app.trace( _("Checking safety measures") ) if safety_door == 1: app.macro("M741", "TRIGGERED", 2, _("Front panel door opened"), verbose=False ) feeder = app.config.get_current_feeder_info() head = app.config.get_current_head_info() tube_length = feeder['tube_length'] units_e = feeder['steps_per_unit'] min_temp = head['min_temp'] has_feeder = False if 'feeder' in head: has_feeder = True if tube_length == 0 : tube_length = 50 #~ ext_temp = float(args[0]) ext_temp = args[0] task_running = int(args[1]) == 1 app.trace( _("Loading Spool : procedure Started.") ) app.macro("M104 S{0}".format(ext_temp), "ok", 5, _("Pre-Heating Nozzle..."), verbose=False) if ((task_running == False) and (has_feeder == False)) : app.macro("G90", "ok", 2, _("Setting abs position"), verbose=False) app.macro("G27", "ok", 100, _("Zeroing Z axis"), verbose=False) app.macro("G0 X102 Y117 Z150 F10000", "ok", 100, _("Moving to safe zone"), verbose=False) else: app.macro("M17", "ok", 5, _("Enable power to all stepper motors"), verbose=False) app.macro("M302 S0", "ok", 5, _("Enabling Cold extrusion"), verbose=False) #app.macro("G91", "ok", 2, _("Setting rel position"), verbose=False) app.macro("M83", "ok", 1, _("set the extruder to relative modee"), verbose=False) app.macro("G92 E0", "ok", 5, _("Setting extruder position to 0"), verbose=False) app.macro("M92 E{0}".format(units_e), "ok", 5, _("Setting extruder mode"), verbose=False) app.macro("M104 S{0}".format(ext_temp), "ok", 5, _("Pre-Heating Nozzle. Get ready to push... ") ) #heating and waiting. if has_feeder == False: ## for built-in feeder app.macro("M300", "ok", 5, _("<b>Start pushing!</b>") ) app.trace( _("Note: help the filament to be loaded by gently pushing it") ) app.macro("G0 E110 F500", "ok", 300, _("Loading filament") ) app.macro("G0 E{0} F700".format(tube_length), "ok", 300, _("Loading filament (fast)") ) tube_length = 150 ## entering hot end app.macro("M109 S{0}".format(ext_temp), "*", 400, _("Waiting to get to temperature (<span class='top-bar-nozzle-actual'>-</span> / {0}°)".format(ext_temp)) ) #heating and waiting. app.macro("G0 E{0} F450".format(tube_length), "ok", 100, _("Entering the hotend (slow)") ) if (task_running == False) : app.macro("M104 S0", "ok", 1, _("Turning off heater") ) app.macro("M302 S{0}".format(min_temp), "ok", 1, _("Disabling Cold Extrusion Prevention"), verbose=False)
def end_additive_aborted(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) #app.macro("G91", "ok", 2, _("Setting rel position") ) #app.macro("G0 Z5 F10000", "ok", 100, _("Moving to safe zone") ) app.macro("G27 Z0", "ok", 100, _("Moving to safe zone")) app.macro("G28 XY", "ok", 100, _("Zeroing Z axis"), verbose=False) app.macro("M400", "ok", 200, _("Waiting for all moves to finish")) app.macro("M18", "ok", 2, _("Motors off"), verbose=False)
def resume_prism(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: z_offset = args[0] except: z_offset = 100.00 safety_door = app.config.get('settings', 'safety.door', 0) app.macro("M999", "ok", 3, _("Reset all errors"), verbose=False) app.trace(_("Turning off lights")) set_lights(app, [0, 0, 0]) app.macro("M300", "ok", 3, _("Play beep"), verbose=False) app.macro("M732 S{0}".format(safety_door), "ok", 2, _("Set door safety"), verbose=False) # restore position if os.path.exists('/var/lib/fabui/settings/stored_task.json'): content = {} with open('/var/lib/fabui/settings/stored_task.json') as f: content = json.load(f) os.remove('/var/lib/fabui/settings/stored_task.json') if "position" in content: z = float(content['position']['z']) restored_z = z + z_offset app.macro("G91", "ok", 1, _("Relative mode"), verbose=False) app.macro("G0 Z{0} F300".format(restored_z), "ok", 100, _("Return to position"), verbose=False) app.macro("M400", "ok", 120, _("Wait for all movements"), verbose=False)
def get_versions(app, lang='en_US.UTF-8'): setLanguage(lang) ### controller serail ID retr = app.macro("M760", "ok", 1, _("Controller serial ID"), verbose=False) controller_serial_id = retr[0] ### controller control code retr = app.macro("M761", "ok", 1, _("Controller control code"), verbose=False) controller_control_code = retr[0] ### board version retr = app.macro("M762", "ok", 1, _("Board version"), verbose=False) board_version = retr[0] ### Production batch (hardware version) retr = app.macro("M763", "ok", 1, _("Production batch"), verbose=False) production_batch = retr[0] ### Production batch control code retr = app.macro("M764", "ok", 1, _("Production batch control code"), verbose=False) production_batch_control_code = retr[0] ### firmware version retr = app.macro("M765", "ok", 1, _("Firmware version"), verbose=False) firmware_version = retr[0] try: firmware_version = firmware_version.split()[1] except: pass ### Firmware build date retr = app.macro("M766", "ok", 1, _("Firmware build date"), verbose=False) firmware_build_date = retr[0] ### firmware author retr = app.macro("M767", "ok", 1, _("Firmware author"), verbose=False) firmware_author = retr[0] return { 'firmware': { 'version': firmware_version, 'build_date': firmware_build_date, 'author': firmware_author }, 'production': { 'batch': production_batch, 'control_code': production_batch_control_code }, 'controller': { 'serial_id': controller_serial_id, 'control_code': controller_control_code }, 'board': { 'version': board_version } }
def check_additive(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 try: bed_enabled = app.config.get('settings', 'hardware')['bed']['enable'] except KeyError: bed_enabled = True try: wire_end = app.config.get('settings', 'wire_end', 0) except KeyError: wire_end = 0 head = app.config.get_current_head_info() is_pro_head = app.config.is_pro_head(head['fw_id']) app.trace(_("Checking safety measures")) if (is_pro_head == True and wire_end == 1): app.macro("M805 S1", "ok", 1, _("Enable wire end check"), verbose=False) app.macro("M740", "TRIGGERED", 1, _("Filament not inserted"), verbose=False) else: app.macro("M805 S0", "ok", 1, _("Disable wire end check"), verbose=False) if safety_door == 1: app.macro("M741", "TRIGGERED", 2, _("Front panel door opened")) app.trace(_("Checking building plate")) if bed_enabled == True: app.macro("M744", "TRIGGERED", 1, _("Build plate needs to be flipped to the printing side"), verbose=False) app.macro("M742", "TRIGGERED", 1, _("Spool panel control"), verbose=False, warning=True)
def do_4th_axis_mode(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) feeder = get_feeder_info('built_in_feeder') units_a = feeder['steps_per_angle'] app.macro("M92 E" + str(units_a), "ok", 1, _("Setting 4th axis mode"), verbose=False)
def pause_prism(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: max_height = args[0] except: max_height = 40.00 try: z_offset = args[1] except: z_offset = 100.00 app.macro("M300", "ok", 3, _("Play beep"), verbose=False) app.macro("M732 S0", "ok", 2, _("Disabling door safety"), verbose=False) # turn lights to red set_lights(app, [25, 2, 0]) # get position position = getPosition(app, lang) current_z = float(position['z']) # raise platform only if object's height is < max_height if current_z < max_height: # store position with open('/var/lib/fabui/settings/stored_task.json', 'w') as f: f.write(json.dumps({'position': position})) safe_z = current_z + z_offset app.macro("G91", "ok", 1, _("Relative mode"), verbose=False) app.macro("G0 Z-{0} F300".format(safe_z), "ok", 100, _("Raising platform"), verbose=False) app.macro("M400", "ok", 120, _("Wait for all movements"), verbose=False)
def manual_bed_leveling(app, args = None, lang='en_US.UTF-8'): setLanguage(lang) app.trace( _("Manual bed leveling started.") ) skip_homing = args[0] PROBE_SECURE_OFFSET = 15.0 probe_height = 50.0 try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 if safety_door == 1: app.macro("M741", "TRIGGERED", 2, _("Front panel door opened"), verbose=False ) zprobe = app.config.get('settings', 'probe') zprobe_disabled = (zprobe['enable'] == 0) zmax_home_pos = float(app.config.get('settings', 'z_max_offset')) probe_length = 50.0 reply = app.macro("M503", "ok", 2, _("Get proble length"), verbose=False) for line in reply: if line.startswith("echo:Z Probe Length:"): probe_length = abs(float(line.split("Z Probe Length: ")[1])) probe_height = (probe_length + 1) + PROBE_SECURE_OFFSET try: app.macro("M744", "TRIGGERED", 2, _("Milling bed side up"), verbose=False) except: app.trace(_("Milling bed side up")) try: milling_offset = float(app.config.get('settings', 'milling')['layer_offset']) app.trace("Milling sacrificial layer thickness: "+str(milling_offset)) probe_height += milling_offset except KeyError: app.trace("Milling sacrificial layer thickness not configured - assuming zero") app.macro("M402", "ok", 2, _("Retracting Probe (safety)"), warning=True, verbose=False) app.macro("G90", "ok", 5, _("Setting abs position"), verbose=False) if not skip_homing: app.macro("G27", "ok", 100, _("Homing Z - Fast") ) app.macro("G92 Z241.2", "ok", 5, _("Setting correct Z"), verbose=False) app.macro("M402", "ok", 2, _("Retracting Probe (safety)"), verbose=False) else: app.macro("M733 S0", "ok", 2, _("Disbaleb home check"), verbose=False) app.macro("G0 Z{0} F5000".format(probe_height), "ok", 99, _("Moving to start Z height")) #mandatory! #app.macro("M400", "ok", 200, _("Waiting for all moves to finish"), verbose=False ) app.macro("M401", "ok", 5, _("Extend Probe"), warning=True, verbose=False) return {'probe_height' : probe_height}
def end_additive_safe_zone(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.macro("M121", "ok", 2, _("Force endstops"), verbose=False) app.macro("G90", "ok", 2, _("Setting abs position"), verbose=False) app.macro("G0 X210 Y210 Z240 F10000", "ok", 100, _("Moving to safe zone"), verbose=False) app.macro("G27 Z0", "ok", 100, _("Zeroing Z axis"), verbose=False) app.macro("M400", "ok", 200, _("Waiting for all moves to finish")) app.macro("M18", "ok", 2, _("Motors off"), verbose=False)
def end_engraving(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.trace("Terminating...") app.macro("G0 X0 Y0 Z0 E0 F2000", "ok", 1, _("Go back to Origin Point"), verbose=False) # Deinitialize and restore settings end_engraving_aborted(app, args, lang)
def prepare_additive(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) ext_temp = args[0] bed_temp = args[1] app.macro("M104 S" + str(ext_temp), "ok", 3, _("Pre Heating Nozzle ({0}°) (fast)").format(str(ext_temp))) app.macro("M140 S" + str(bed_temp), "ok", 3, _("Pre Heating Bed ({0}°) (fast)").format(str(bed_temp))) app.macro("M402", "ok", 2, _("Retract Probe"), verbose=False)
def initial_prism_homing(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.trace(_("Moving head to safe zone")) app.macro("G28 XY", "ok", 90, _("Homing XY"), verbose=False) app.macro("G90", "ok", 2, _("Absoulte mode"), verbose=False) app.macro("G0 X210 Y210 F10000", "ok", 90, _("Going to safe zone"), verbose=False) app.macro("M400", "ok", 120, _("Wait for all movements"), verbose=False) app.trace(_("Positioning the platform")) app.macro("G91", "ok", 1, _("Relative mode"), verbose=False) app.macro("G0 Z-200 F500", "ok", 60, _("Going up"), verbose=False) app.macro("M400", "ok", 120, _("Wait for all movements"), verbose=False) app.macro("G92 Z0", "ok", 1, _("Set Z 0"), verbose=False) app.macro("M564 Z175 S1", "ok", 1, _("Restrict Z movements"), verbose=False) app.macro("G90", "ok", 1, _("Absolute mode"), verbose=False) app.macro("G0 Z130 F1000", "ok", 60, _("Going to position (fast)"), verbose=False) app.macro("G0 Z150 F200", "ok", 60, _("Going to position (slow)"), verbose=False) app.macro("M400", "ok", 120, _("Wait for all movements"), verbose=False) app.macro("M732 S0", "ok", 2, _("Disabling door safety"), verbose=False)
def door_safety(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) try: safety_door = app.config.get('settings', 'safety')['door'] except KeyError: safety_door = 0 app.trace(_("Checking safety measures")) if safety_door == 1: app.macro("M741", "TRIGGERED", 2, _("Front panel door opened"), verbose=False)
def heats(app, args = None, lang='en_US.UTF-8'): setLanguage(lang) what = args[0] temperature = float(args[1]) CODES = { "nozzle" : "M109", "bed" : "M190" } app.macro("{0} S{1}".format(CODES[what], temperature), "*", 400, _("Waiting for {0} to reach temperature (<span class='top-bar-{1}-actual'>-</span> / {2}°)".format(what, what, temperature)) ) #heating and waiting. app.trace( _("Please wait...") )
def zProbe(app, lang='en_US.UTF-8'): setLanguage(lang) app.macro("M401", "ok", 5, _("Open probe"), verbose=False) reply = app.macro("G30", "ok", 120, _("Probe position"), verbose=False) probe = parseG30(reply) app.macro("G91", "ok", 2, _("Setting rel position"), verbose=False) app.macro("G0 Z5 F1000", "ok", 20, _("Moving bed away from the probe"), verbose=False) app.macro("M402", "ok", 5, _("Retract probe"), verbose=False) return probe
def end_prism(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) set_lights(app, [0, 0, 0]) app.macro("G91", "ok", 1, _("Relative mode"), verbose=False) app.macro("G0 Z-200 F300", "ok", 60, _("Raising the platform"), verbose=True) app.macro("M400", "ok", 120, _("Wait for all movements"), verbose=False)
def prepare_prism(app, args=None, lang='en_US.UTF-8'): setLanguage(lang) app.trace(_("Turning off lights")) set_lights(app, [0, 0, 0]) app.macro("M564 S0", "ok", 3, _("Disbale restricted movements"), verbose=False) app.macro("G92 Z0", "ok", 3, _("Set Z 0"), verbose=False)