From d6c345656c505785df2626b3d7f76908493a748d Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 30 Jan 2022 21:33:06 +0200 Subject: [PATCH] - finished implementing the new feature that add a new parameter `laser minimum power` for the Drillin, Milling Plugins and for the `cncjob` and `drillcncjob` Tcl commands: - modified all the preprocessors that are for `laser` to use the new parameter: `laser minimum power` --- CHANGELOG.md | 2 ++ appObjects/FlatCAMGeometry.py | 6 +++- appPlugins/ToolDrilling.py | 3 ++ appPlugins/ToolMilling.py | 4 +++ camlib.py | 19 ++++++++++-- preprocessors/GRBL_laser.py | 23 +++++++++++--- preprocessors/GRBL_laser_z.py | 21 ++++++++++--- preprocessors/Marlin_laser_FAN_pin.py | 30 ++++++++++++------ preprocessors/Marlin_laser_Spindle_pin.py | 38 +++++++++++++++-------- preprocessors/Marlin_laser_z.py | 36 +++++++++++++++------ tclCommands/TclCommandCncjob.py | 7 +++++ tclCommands/TclCommandDrillcncjob.py | 5 +++ 12 files changed, 150 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 817d944d..8345ff32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ CHANGELOG for FlatCAM beta - in `drillcncjob` Tcl command added the usage of `RTree` path optimization and made it the default choice - finished the UI for adding a new parameter that is used in conjunction with the `laser` preprocessors: `laser minimum power` parameter which should help in doing a full power up/down cycle (should prolong the lifetime for the laser diode) - fixed some UI issues for the Milling and Drilling plugins when using a `laser` preprocessor +- finished implementing the new feature that add a new parameter `laser minimum power` for the Drillin, Milling Plugins and for the `cncjob` and `drillcncjob` Tcl commands: +- modified all the preprocessors that are for `laser` to use the new parameter: `laser minimum power` 29.01.2022 diff --git a/appObjects/FlatCAMGeometry.py b/appObjects/FlatCAMGeometry.py index 671b460f..622b8c17 100644 --- a/appObjects/FlatCAMGeometry.py +++ b/appObjects/FlatCAMGeometry.py @@ -971,6 +971,7 @@ class GeometryObject(FlatCAMObj, Geometry): def generatecncjob(self, outname=None, dia=None, offset=None, z_cut=None, z_move=None, feedrate=None, feedrate_z=None, feedrate_rapid=None, spindlespeed=None, dwell=None, dwelltime=None, + las_min_pwr=0.0, multidepth=None, dpp=None, toolchange=None, toolchangez=None, toolchangexy=None, extracut=None, extracut_length=None, startz=None, endz=None, endxy=None, pp=None, segx=None, segy=None, use_thread=True, plot=True): @@ -991,6 +992,7 @@ class GeometryObject(FlatCAMObj, Geometry): :param spindlespeed: Spindle speed (RPM) :param dwell: :param dwelltime: + :param las_min_pwr: Float. Set the power for a laser (when used due of a preprocessor) when not cutting :param multidepth: Bool: If True use the `dpp` parameter :param dpp: Depth for each pass when multidepth parameter is True. Positive value. :param toolchange: @@ -1057,6 +1059,7 @@ class GeometryObject(FlatCAMObj, Geometry): # int or None. spindlespeed = spindlespeed if spindlespeed else self.options['tools_mill_spindlespeed'] + las_min_pwr = las_min_pwr if las_min_pwr else self.options['tools_mill_min_power'] dwell = dwell if dwell else self.options["tools_mill_dwell"] dwelltime = dwelltime if dwelltime else float(self.options["tools_mill_dwelltime"]) @@ -1094,7 +1097,8 @@ class GeometryObject(FlatCAMObj, Geometry): res, start_gcode = job_obj.generate_from_geometry_2( self, tooldia=tooldia, offset=offset, tolerance=tol, z_cut=z_cut, z_move=z_move, feedrate=feedrate, feedrate_z=feedrate_z, feedrate_rapid=feedrate_rapid, spindlespeed=spindlespeed, dwell=dwell, - dwelltime=dwelltime, multidepth=multidepth, depthpercut=depthperpass, toolchange=toolchange, + dwelltime=dwelltime, laser_min_power=las_min_pwr, multidepth=multidepth, depthpercut=depthperpass, + toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy, extracut=extracut, extracut_length=extracut_length, startz=startz, endz=endz, endxy=endxy, pp_geometry_name=ppname_g, is_first=True) diff --git a/appPlugins/ToolDrilling.py b/appPlugins/ToolDrilling.py index fc67976b..bcc061eb 100644 --- a/appPlugins/ToolDrilling.py +++ b/appPlugins/ToolDrilling.py @@ -351,6 +351,8 @@ class ToolDrilling(AppTool, Excellon): "tools_drill_feedrate_rapid": self.ui.feedrate_rapid_entry, "tools_drill_spindlespeed": self.ui.spindlespeed_entry, + "tools_drill_min_power": self.ui.las_min_pwr_entry, + "tools_drill_dwell": self.ui.dwell_cb, "tools_drill_dwelltime": self.ui.dwelltime_entry, @@ -390,6 +392,7 @@ class ToolDrilling(AppTool, Excellon): "e_fr_rapid": "tools_drill_feedrate_rapid", "e_spindlespeed": "tools_drill_spindlespeed", + "e_minpower": "tools_drill_min_power", "e_dwell": "tools_drill_dwell", "e_dwelltime": "tools_drill_dwelltime", diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index ade4be40..2348784a 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -523,6 +523,7 @@ class ToolMilling(AppTool, Excellon): "tools_mill_spindlespeed": self.ui.spindlespeed_entry, "tools_mill_dwell": self.ui.dwell_cb, "tools_mill_dwelltime": self.ui.dwelltime_entry, + "tools_mill_min_power": self.ui.las_min_pwr_entry, } self.general_form_fields = { @@ -580,6 +581,7 @@ class ToolMilling(AppTool, Excellon): "mill_spindlespeed": "tools_mill_spindlespeed", "mill_dwell": "tools_mill_dwell", "mill_dwelltime": "tools_mill_dwelltime", + "mill_minpower":"tools_mill_min_power", # General Parameters "mill_toolchange": "tools_mill_toolchange", @@ -3123,6 +3125,7 @@ class ToolMilling(AppTool, Excellon): spindlespeed = tools_dict[tooluid_key]['data']["tools_mill_spindlespeed"] dwell = tools_dict[tooluid_key]['data']["tools_mill_dwell"] dwelltime = tools_dict[tooluid_key]['data']["tools_mill_dwelltime"] + laser_min_power = tools_dict[tooluid_key]['data']["tools_mill_min_power"] pp_geometry_name = tools_dict[tooluid_key]['data']["tools_mill_ppname_g"] spindledir = self.app.defaults['tools_mill_spindledir'] @@ -3149,6 +3152,7 @@ class ToolMilling(AppTool, Excellon): z_cut=z_cut, z_move=z_move, feedrate=feedrate, feedrate_z=feedrate_z, feedrate_rapid=feedrate_rapid, spindlespeed=spindlespeed, spindledir=spindledir, dwell=dwell, dwelltime=dwelltime, + laser_min_power=laser_min_power, multidepth=multidepth, depthpercut=depthpercut, extracut=extracut, extracut_length=extracut_length, startz=startz, endz=endz, endxy=endxy, toolchange=toolchange, toolchangez=toolchangez, toolchangexy=toolchangexy, diff --git a/camlib.py b/camlib.py index 9996d309..38953681 100644 --- a/camlib.py +++ b/camlib.py @@ -2792,6 +2792,7 @@ class CNCjob(Geometry): self.spindledir = spindledir self.dwell = dwell self.dwelltime = dwelltime + self.laser_min_power = 0.0 # For Autolevelling self.segx = float(segx) if segx is not None else 0.0 @@ -3245,7 +3246,7 @@ class CNCjob(Geometry): and the start gcode :rtype: tuple """ - log.debug("Creating CNC Job from Excellon for tool: %s" % str(tool)) + self.app.log.debug("Creating CNC Job from Excellon for tool: %s" % str(tool)) # detect if GCode is segmented for autolevelling or not # it does not matter for the Excellon codes because we are not going to autolevel GCode out of Excellon @@ -3325,6 +3326,8 @@ class CNCjob(Geometry): self.dwelltime = tool_dict['tools_drill_dwelltime'] self.spindledir = tool_dict['tools_drill_spindledir'] + self.laser_min_power = tool_dict['tools_drill_min_power'] + self.tooldia = tools[tool]["tooldia"] self.postdata['toolC'] = tools[tool]["tooldia"] self.toolchange = toolchange @@ -3769,6 +3772,8 @@ class CNCjob(Geometry): self.z_feedrate = float(tool_dict['tools_mill_feedrate_z']) self.feedrate_rapid = float(tool_dict['tools_mill_feedrate_rapid']) + self.laser_min_power = float(tool_dict['tools_mill_min_power']) + try: self.spindlespeed = float(tool_dict['tools_mill_spindlespeed']) except TypeError: @@ -3779,6 +3784,11 @@ class CNCjob(Geometry): except KeyError: self.spindledir = self.app.defaults["tools_mill_spindledir"] + try: + self.spindledir = tool_dict['tools_mill_spindledir'] + except KeyError: + self.spindledir = self.app.defaults["tools_mill_spindledir"] + self.dwell = tool_dict['tools_mill_dwell'] self.dwelltime = float(tool_dict['tools_mill_dwelltime']) @@ -5743,7 +5753,8 @@ class CNCjob(Geometry): def generate_from_geometry_2(self, geo_obj, append=True, tooldia=None, offset=0.0, tolerance=0, z_cut=None, z_move=None, feedrate=None, feedrate_z=None, feedrate_rapid=None, spindlespeed=None, - spindledir='CW', dwell=False, dwelltime=None, multidepth=False, depthpercut=None, + spindledir='CW', dwell=False, dwelltime=None, laser_min_power=0.0, + multidepth=False, depthpercut=None, toolchange=False, toolchangez=None, toolchangexy="0.0, 0.0", extracut=False, extracut_length=None, startz=None, endz=None, endxy='', pp_geometry_name=None, tool_no=1, is_first=False): @@ -5768,6 +5779,8 @@ class CNCjob(Geometry): :param spindledir: :param dwell: :param dwelltime: + :param laser_min_power: Float value. Used when the preprocessor cotanins 'laser' in its name. Control + the power when the laser is `OFF` :param multidepth: If True, use multiple passes to reach the desired depth. :param depthpercut: Maximum depth in each pass. :param toolchange: @@ -5908,6 +5921,8 @@ class CNCjob(Geometry): self.dwell = dwell self.dwelltime = float(dwelltime) if dwelltime is not None else self.app.defaults["tools_mill_dwelltime"] + self.laser_min_power = int(laser_min_power) + self.startz = float(startz) if startz is not None and startz != '' else self.app.defaults["tools_mill_startz"] self.z_end = float(endz) if endz is not None else self.app.defaults["tools_mill_endz"] diff --git a/preprocessors/GRBL_laser.py b/preprocessors/GRBL_laser.py index c7d4f462..d914a010 100644 --- a/preprocessors/GRBL_laser.py +++ b/preprocessors/GRBL_laser.py @@ -43,7 +43,8 @@ class GRBL_laser(PreProc): gcode += '(X range: ' + '{: >9s}'.format(xmin) + ' ... ' + '{: >9s}'.format(xmax) + ' ' + units + ')\n' gcode += '(Y range: ' + '{: >9s}'.format(ymin) + ' ... ' + '{: >9s}'.format(ymax) + ' ' + units + ')\n\n' - gcode += '(Laser Power - Spindle Speed: ' + str(p['spindlespeed']) + ')\n\n' + gcode += '(Laser Power - Spindle Speed: ' + str(p['spindlespeed']) + ')\n' + gcode += '(Laser Minimum Power: ' + str(p['laser_min_power']) + ')\n\n' gcode += ('G20' if p.units.upper() == 'IN' else 'G21') + "\n" gcode += 'G90\n' @@ -56,19 +57,28 @@ class GRBL_laser(PreProc): return '' def lift_code(self, p): - return 'M5' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' def down_code(self, p): if p.spindlespeed: return '%s S%s' % ('M3', str(p.spindlespeed)) else: - return 'M3' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' def toolchange_code(self, p): return '' def up_to_zero_code(self, p): - return 'M5' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' def position_code(self, p): # formula for skewing on x for example is: @@ -117,4 +127,7 @@ class GRBL_laser(PreProc): return '' def spindle_stop_code(self, p): - return 'M5' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' diff --git a/preprocessors/GRBL_laser_z.py b/preprocessors/GRBL_laser_z.py index 034bb0f4..751cf3bd 100644 --- a/preprocessors/GRBL_laser_z.py +++ b/preprocessors/GRBL_laser_z.py @@ -51,6 +51,7 @@ class GRBL_laser_z(PreProc): gcode += '(Feedrate: ' + str(p['feedrate']) + units + '/min' + ')\n' gcode += '(Z Focus: ' + str(p['z_move']) + units + ')\n' gcode += '(Laser Power: %s)\n' % str(p['spindlespeed']) + gcode += '(Laser Minimum Power: %s)\n' % str(p['laser_min_power']) gcode += '\n' gcode += '(X-Y End: ' + str(p['xy_end']) + units + ')\n' @@ -77,19 +78,28 @@ class GRBL_laser_z(PreProc): return gcode def lift_code(self, p): - return 'M5' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' def down_code(self, p): if p.spindlespeed: return '%s S%s' % ('M3', str(p.spindlespeed)) else: - return 'M3' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' def toolchange_code(self, p): return 'G0 Z' + self.coordinate_format % (p.coords_decimals, p.z_move) def up_to_zero_code(self, p): - return 'M5' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' def position_code(self, p): # formula for skewing on x for example is: @@ -138,4 +148,7 @@ class GRBL_laser_z(PreProc): return '' def spindle_stop_code(self, p): - return 'M5' + if float(p.laser_min_power) > 0.0: + return 'M03 S%s' % str(p.laser_min_power) + else: + return 'M5' diff --git a/preprocessors/Marlin_laser_FAN_pin.py b/preprocessors/Marlin_laser_FAN_pin.py index 3de9cc2e..7dbf4fd7 100644 --- a/preprocessors/Marlin_laser_FAN_pin.py +++ b/preprocessors/Marlin_laser_FAN_pin.py @@ -51,7 +51,8 @@ class Marlin_laser_FAN_pin(PreProc): gcode += ';X range: ' + '{: >9s}'.format(xmin) + ' ... ' + '{: >9s}'.format(xmax) + ' ' + units + '\n' gcode += ';Y range: ' + '{: >9s}'.format(ymin) + ' ... ' + '{: >9s}'.format(ymax) + ' ' + units + '\n\n' - gcode += ';Laser Power (Spindle Speed): ' + str(p['spindlespeed']) + '\n' + '\n' + gcode += ';Laser Power (Spindle Speed): %s\n' % str(p['spindlespeed']) + gcode += ';Laser Minimum Power: %s\n\n' % str(p['laser_min_power']) gcode += 'G20\n' if p.units.upper() == 'IN' else 'G21\n' gcode += 'G90' @@ -62,9 +63,12 @@ class Marlin_laser_FAN_pin(PreProc): return '' def lift_code(self, p): - gcode = 'M400\n' - gcode += 'M107' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M106 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M106 S0' + return gcode def down_code(self, p): if p.spindlespeed: @@ -76,9 +80,12 @@ class Marlin_laser_FAN_pin(PreProc): return '' def up_to_zero_code(self, p): - gcode = 'M400\n' - gcode += 'M107' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M106 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M106 S0' + return gcode def position_code(self, p): # formula for skewing on x for example is: @@ -132,6 +139,9 @@ class Marlin_laser_FAN_pin(PreProc): return '' def spindle_stop_code(self, p): - gcode = 'M400\n' - gcode += 'M106 S0' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M106 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M106 S0' + return gcode diff --git a/preprocessors/Marlin_laser_Spindle_pin.py b/preprocessors/Marlin_laser_Spindle_pin.py index 1e2ff861..cf7c4ec6 100644 --- a/preprocessors/Marlin_laser_Spindle_pin.py +++ b/preprocessors/Marlin_laser_Spindle_pin.py @@ -50,7 +50,8 @@ class Marlin_laser_Spindle_pin(PreProc): gcode += ';X range: ' + '{: >9s}'.format(xmin) + ' ... ' + '{: >9s}'.format(xmax) + ' ' + units + '\n' gcode += ';Y range: ' + '{: >9s}'.format(ymin) + ' ... ' + '{: >9s}'.format(ymax) + ' ' + units + '\n\n' - gcode += ';Laser Power (Spindle Speed): ' + str(p['spindlespeed']) + '\n' + '\n' + gcode += ';Laser Power (Spindle Speed): %s\n' % str(p['spindlespeed']) + gcode += ';Laser Minimum Power: %s\n\n' % str(p['laser_min_power']) gcode += 'G20\n' if p.units.upper() == 'IN' else 'G21\n' gcode += 'G90' @@ -61,24 +62,32 @@ class Marlin_laser_Spindle_pin(PreProc): return '' def lift_code(self, p): - gcode = 'M400\n' - gcode += 'M5' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M5' + return gcode def down_code(self, p): - sdir = {'CW': 'M3', 'CCW': 'M4'}[p.spindledir] if p.spindlespeed: - return '%s S%s' % (sdir, str(p.spindlespeed)) + return 'M3 S%s' % str(p.spindlespeed) else: - return sdir + return 'M3' def toolchange_code(self, p): return '' def up_to_zero_code(self, p): - gcode = 'M400\n' - gcode += 'M5' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M5' + return gcode def position_code(self, p): # formula for skewing on x for example is: @@ -133,6 +142,9 @@ class Marlin_laser_Spindle_pin(PreProc): return '' def spindle_stop_code(self, p): - gcode = 'M400\n' - gcode += 'M5' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M5' + return gcode diff --git a/preprocessors/Marlin_laser_z.py b/preprocessors/Marlin_laser_z.py index d1c8dd23..e8118d64 100644 --- a/preprocessors/Marlin_laser_z.py +++ b/preprocessors/Marlin_laser_z.py @@ -49,11 +49,20 @@ class Marlin_laser_z(PreProc): for tool, val in p['tools'].items(): gcode += ';Tool: %s -> ' % str(tool) + 'Power: %s' % \ str(val['data']["tools_mill_spindlespeed"]) + '\n' + gcode += '\n;LASER MIN POWER: \n' + for tool, val in p['tools'].items(): + if str(p['options']['type']) == 'Excellon': + gcode += ';Tool: %s -> ' % str(tool) + 'Power: %s' % \ + str(val['data']["tools_drill_min_power"]) + '\n' + else: + gcode += ';Tool: %s -> ' % str(tool) + 'Power: %s' % \ + str(val['data']["tools_mill_min_power"]) + '\n' else: gcode += ';Feedrate: %s %s/min\n' % (str(p['feedrate']), units) gcode += ';Feedrate rapids: %s %s/min\n\n' % (str(p['feedrate_rapid']), units) gcode += ';Z Focus: %s %s\n' % (str(p['z_move']), units) gcode += ';Laser Power: %s\n' % str(p['spindlespeed']) + gcode += ';Laser Minimum Power: %s\n\n' % str(p['laser_min_power']) gcode += '\n' if coords_xy is not None: @@ -89,9 +98,12 @@ class Marlin_laser_z(PreProc): return '' def lift_code(self, p): - gcode = 'M400\n' - gcode += 'M5' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M5' + return gcode def down_code(self, p): if p.spindlespeed: @@ -103,9 +115,12 @@ class Marlin_laser_z(PreProc): return 'G0 Z' + self.coordinate_format % (p.coords_decimals, p.z_move) def up_to_zero_code(self, p): - gcode = 'M400\n' - gcode += 'M5' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M5' + return gcode def position_code(self, p): # formula for skewing on x for example is: @@ -160,6 +175,9 @@ class Marlin_laser_z(PreProc): return '' def spindle_stop_code(self, p): - gcode = 'M400\n' - gcode += 'M5' - return gcode + if float(p.laser_min_power) > 0.0: + return 'M3 S%s' % str(p.laser_min_power) + else: + gcode = 'M400\n' + gcode += 'M5' + return gcode diff --git a/tclCommands/TclCommandCncjob.py b/tclCommands/TclCommandCncjob.py index 48a2d1cb..03b649db 100644 --- a/tclCommands/TclCommandCncjob.py +++ b/tclCommands/TclCommandCncjob.py @@ -43,6 +43,7 @@ class TclCommandCncjob(TclCommandSignaled): ('endxy', str), ('spindlespeed', int), ('dwelltime', float), + ('las_min_pwr', float), ('pp', str), ('muted', str), ('outname', str) @@ -76,6 +77,7 @@ class TclCommandCncjob(TclCommandSignaled): ('dwelltime', 'Time to pause to allow the spindle to reach the full speed.\n' 'If it is not used in command then it will not be included'), ('outname', 'Name of the resulting Geometry object.'), + ('las_min_pwr', 'Used with "laser" preprocessors. States the laser power when not cutting'), ('pp', 'Name of the Geometry preprocessor. No quotes, case sensitive'), ('muted', 'It will not put errors in the Shell. Can be True (1) or False (0)') ]), @@ -184,8 +186,12 @@ class TclCommandCncjob(TclCommandSignaled): self.raise_tcl_error("The entered value for 'endxy' needs to have the format x,y or " "in format (x, y) - no spaces allowed. But always two comma separated values.") + # Spindle speed args["spindlespeed"] = args["spindlespeed"] if "spindlespeed" in args and args["spindlespeed"] != 0 else None + # Laser minimum power + args["las_min_pwr"] = args["las_min_pwr"] if "las_min_pwr" in args else 0.0 + if 'dwelltime' in args: args["dwell"] = True if args['dwelltime'] is None: @@ -268,6 +274,7 @@ class TclCommandCncjob(TclCommandSignaled): local_tools_dict[tool_uid]['data']['tools_mill_spindlespeed'] = args["spindlespeed"] local_tools_dict[tool_uid]['data']['tools_mill_dwell'] = args["dwell"] local_tools_dict[tool_uid]['data']['tools_mill_dwelltime'] = args["dwelltime"] + local_tools_dict[tool_uid]['data']['tools_mill_min_power'] = args["las_min_pwr"] local_tools_dict[tool_uid]['data']['tools_mill_ppname_g'] = args["pp"] self.app.milling_tool.mtool_gen_cncjob( diff --git a/tclCommands/TclCommandDrillcncjob.py b/tclCommands/TclCommandDrillcncjob.py index a3019c10..35315bb7 100644 --- a/tclCommands/TclCommandDrillcncjob.py +++ b/tclCommands/TclCommandDrillcncjob.py @@ -42,6 +42,7 @@ class TclCommandDrillcncjob(TclCommandSignaled): ('endz', float), ('endxy', str), ('dwelltime', float), + ('las_min_pwr', float), ('pp', str), ('opt_type', str), ('diatol', float), @@ -76,6 +77,7 @@ class TclCommandDrillcncjob(TclCommandSignaled): 'like: 0.3,1.0). WARNING: no spaces allowed in the value.'), ('dwelltime', 'Time to pause to allow the spindle to reach the full speed.\n' 'If it is not used in command then it will not be included'), + ('las_min_pwr', 'Used with "laser" preprocessors. States the laser power when not cutting'), ('pp', 'This is the Excellon preprocessor name: case_sensitive, no_quotes'), ('opt_type', 'Name of move optimization type. B by default for Basic OR-Tools, M for Metaheuristic OR-Tools' 'T from Travelling Salesman Algorithm. B and M works only for 64bit version of FlatCAM and ' @@ -320,6 +322,9 @@ class TclCommandDrillcncjob(TclCommandSignaled): job_obj.dwell = self.app.defaults["tools_drill_dwell"] job_obj.dwelltime = self.app.defaults["tools_drill_dwelltime"] + # laser minimum power + job_obj.laser_min_power = float(args["las_min_pwr"]) if "las_min_pwr" in args else 0.0 + job_obj.coords_decimals = int(self.app.defaults["cncjob_coords_decimals"]) job_obj.fr_decimals = int(self.app.defaults["cncjob_fr_decimals"])