From 44f5da33260e65cd1d62cd3e5757c436e33224b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Sandvik=20Nilsson?= Date: Fri, 17 Jul 2015 09:49:24 +0200 Subject: [PATCH 1/2] Added parameter "spindlespeed" to cncjob and drillcncjob. Will generate gcode "M03 S4000" (4000 rpm), or "M03" if omitted. --- FlatCAMApp.py | 17 ++++++++++++----- FlatCAMGUI.py | 18 ++++++++++++++++++ FlatCAMObj.py | 22 ++++++++++++++++------ ObjectUI.py | 20 ++++++++++++++++++++ camlib.py | 24 +++++++++++++++++++----- 5 files changed, 85 insertions(+), 16 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index b138e4c7..4325b977 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -266,7 +266,8 @@ class App(QtCore.QObject): "zdownrate": None, "excellon_zeros": "L", "gerber_use_buffer_for_union": True, - "cncjob_coordinate_format": "X%.4fY%.4f" + "cncjob_coordinate_format": "X%.4fY%.4f", + "spindlespeed": None }) ############################### @@ -1809,7 +1810,8 @@ class App(QtCore.QObject): "zdownrate": CNCjob, "excellon_zeros": Excellon, "gerber_use_buffer_for_union": Gerber, - "cncjob_coordinate_format": CNCjob + "cncjob_coordinate_format": CNCjob, + "spindlespeed": CNCjob } for param in routes: @@ -2055,7 +2057,9 @@ class App(QtCore.QObject): 'outname': str, 'drillz': float, 'travelz': float, - 'feedrate': float} + 'feedrate': float, + 'spindlespeed': int + } for key in kwa: if key not in types: @@ -2085,7 +2089,8 @@ class App(QtCore.QObject): job_obj.z_cut = kwa["drillz"] job_obj.z_move = kwa["travelz"] job_obj.feedrate = kwa["feedrate"] - job_obj.generate_from_excellon_by_tool(obj, kwa["tools"]) + job_obj.spindlespeed = kwa["spindlespeed"] if "spindlespeed" in kwa else None + job_obj.generate_from_excellon_by_tool(obj, kwa["tools"], True) job_obj.gcode_parse() @@ -2133,7 +2138,9 @@ class App(QtCore.QObject): 'z_move': float, 'feedrate': float, 'tooldia': float, - 'outname': str} + 'outname': str, + 'spindlespeed': int + } for key in kwa: if key not in types: diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 5c3aaa3d..888f0c0f 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -580,6 +580,15 @@ class ExcellonOptionsGroupUI(OptionsGroupUI): self.feedrate_entry = LengthEntry() grid1.addWidget(self.feedrate_entry, 2, 1) + spdlabel = QtGui.QLabel('Spindle speed:') + spdlabel.setToolTip( + "Speed of the spindle\n" + "in RPM (optional)" + ) + grid1.addWidget(spdlabel, 3, 0) + self.spindlespeed_entry = LengthEntry() + grid1.addWidget(self.spindlespeed_entry, 3, 1) + class GeometryOptionsGroupUI(OptionsGroupUI): def __init__(self, parent=None): @@ -647,6 +656,15 @@ class GeometryOptionsGroupUI(OptionsGroupUI): self.cnctooldia_entry = LengthEntry() grid1.addWidget(self.cnctooldia_entry, 3, 1) + spdlabel = QtGui.QLabel('Spindle speed:') + spdlabel.setToolTip( + "Speed of the spindle\n" + "in RPM (optional)" + ) + grid1.addWidget(spdlabel, 4, 0) + self.cncspindlespeed_entry = LengthEntry() + grid1.addWidget(self.cncspindlespeed_entry, 4, 1) + ## Paint area self.paint_label = QtGui.QLabel('Paint Area:') self.paint_label.setToolTip( diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 3c76f3a5..43d4cd11 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -608,7 +608,8 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): # "toolselection": "" "tooldia": 0.1, "toolchange": False, - "toolchangez": 1.0 + "toolchangez": 1.0, + "spindlespeed": "" }) # TODO: Document this. @@ -664,7 +665,8 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): "feedrate": self.ui.feedrate_entry, "tooldia": self.ui.tooldia_entry, "toolchange": self.ui.toolchange_cb, - "toolchangez": self.ui.toolchangez_entry + "toolchangez": self.ui.toolchangez_entry, + "spindlespeed": self.ui.spindlespeed_entry }) assert isinstance(self.ui, ExcellonObjectUI) @@ -740,6 +742,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): job_obj.z_cut = self.options["drillz"] job_obj.z_move = self.options["travelz"] job_obj.feedrate = self.options["feedrate"] + job_obj.spindlespeed = self.options["spindlespeed"] # There could be more than one drill size... # job_obj.tooldia = # TODO: duplicate variable! # job_obj.options["tooldia"] = @@ -825,12 +828,12 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): ui_type = CNCObjectUI def __init__(self, name, units="in", kind="generic", z_move=0.1, - feedrate=3.0, z_cut=-0.002, tooldia=0.0): + feedrate=3.0, z_cut=-0.002, tooldia=0.0,spindlespeed=None): FlatCAMApp.App.log.debug("Creating CNCJob object...") CNCjob.__init__(self, units=units, kind=kind, z_move=z_move, - feedrate=feedrate, z_cut=z_cut, tooldia=tooldia) + feedrate=feedrate, z_cut=z_cut, tooldia=tooldia, spindlespeed=spindlespeed) FlatCAMObj.__init__(self, name) @@ -971,6 +974,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): "cutz": -0.002, "travelz": 0.1, "feedrate": 5.0, + "spindlespeed": "", "cnctooldia": 0.4 / 25.4, "painttooldia": 0.0625, "paintoverlap": 0.15, @@ -998,6 +1002,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): "cutz": self.ui.cutz_entry, "travelz": self.ui.travelz_entry, "feedrate": self.ui.cncfeedrate_entry, + "spindlespeed": self.ui.cncspindlespeed_entry, "cnctooldia": self.ui.cnctooldia_entry, "painttooldia": self.ui.painttooldia_entry, "paintoverlap": self.ui.paintoverlap_entry, @@ -1076,13 +1081,18 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): self.generatecncjob() def generatecncjob(self, z_cut=None, z_move=None, - feedrate=None, tooldia=None, outname=None): + feedrate=None, tooldia=None, outname=None, spindlespeed=None): outname = outname if outname is not None else self.options["name"] + "_cnc" z_cut = z_cut if z_cut is not None else self.options["cutz"] z_move = z_move if z_move is not None else self.options["travelz"] feedrate = feedrate if feedrate is not None else self.options["feedrate"] tooldia = tooldia if tooldia is not None else self.options["cnctooldia"] + + # To allow default value to be "" (optional in gui) and translate to None + if(not isinstance(spindlespeed, int)): + spindlespeed = self.options["spindlespeed"] if isinstance(self.options["spindlespeed"], int) else None + # Object initialization function for app.new_object() # RUNNING ON SEPARATE THREAD! @@ -1095,7 +1105,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): job_obj.z_cut = z_cut job_obj.z_move = z_move job_obj.feedrate = feedrate - + job_obj.spindlespeed = spindlespeed app_obj.progress.emit(40) # TODO: The tolerance should not be hard coded. Just for testing. job_obj.generate_from_geometry_2(self, tolerance=0.0005) diff --git a/ObjectUI.py b/ObjectUI.py index 3270d509..bb70f634 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -271,6 +271,16 @@ class GeometryObjectUI(ObjectUI): self.cnctooldia_entry = LengthEntry() grid1.addWidget(self.cnctooldia_entry, 3, 1) + # Spindlespeed + spdlabel = QtGui.QLabel('Spindle speed:') + spdlabel.setToolTip( + "Speed of the spindle\n" + "in RPM (optional)" + ) + grid1.addWidget(spdlabel, 4, 0) + self.cncspindlespeed_entry = LengthEntry() + grid1.addWidget(self.cncspindlespeed_entry, 4, 1) + self.generate_cnc_button = QtGui.QPushButton('Generate') self.generate_cnc_button.setToolTip( "Generate the CNC Job object." @@ -446,6 +456,16 @@ class ExcellonObjectUI(ObjectUI): grid1.addWidget(self.toolchangez_entry, 4, 1) self.ois_tcz = OptionalInputSection(self.toolchange_cb, [self.toolchangez_entry]) + # Spindlespeed + spdlabel = QtGui.QLabel('Spindle speed:') + spdlabel.setToolTip( + "Speed of the spindle\n" + "in RPM (optional)" + ) + grid1.addWidget(spdlabel, 5, 0) + self.spindlespeed_entry = LengthEntry() + grid1.addWidget(self.spindlespeed_entry, 5, 1) + choose_tools_label = QtGui.QLabel( "Select from the tools section above\n" "the tools you want to include." diff --git a/camlib.py b/camlib.py index 00da9048..1d6c7b7f 100644 --- a/camlib.py +++ b/camlib.py @@ -2506,7 +2506,8 @@ class CNCjob(Geometry): defaults = { "zdownrate": None, - "coordinate_format": "X%.4fY%.4f" + "coordinate_format": "X%.4fY%.4f", + "spindlespeed": None } def __init__(self, @@ -2516,7 +2517,8 @@ class CNCjob(Geometry): feedrate=3.0, z_cut=-0.002, tooldia=0.0, - zdownrate=None): + zdownrate=None, + spindlespeed=None): Geometry.__init__(self) self.kind = kind @@ -2540,6 +2542,9 @@ class CNCjob(Geometry): else: self.zdownrate = None + self.spindlespeed = spindlespeed + + # Attributes to be included in serialization # Always append to it because it carries contents # from Geometry. @@ -2605,7 +2610,10 @@ class CNCjob(Geometry): gcode += self.feedminutecode + "\n" gcode += "F%.2f\n" % self.feedrate gcode += "G00 Z%.4f\n" % self.z_move # Move to travel height - gcode += "M03\n" # Spindle start + if(self.spindlespeed != None): + gcode += "M03 S%d\n" % int(self.spindlespeed) # Spindle start with configured speed + else: + gcode += "M03\n" # Spindle start gcode += self.pausecode + "\n" for tool in points: @@ -2618,7 +2626,10 @@ class CNCjob(Geometry): gcode += "M6\n" # Tool change gcode += "(MSG, Change to tool dia=%.4f)\n" % exobj.tools[tool]["C"] gcode += "M0\n" # Temporary machine stop - gcode += "M3\n" # Spindle on clockwise + if(self.spindlespeed != None): + gcode += "M03 S%d\n" % int(self.spindlespeed) # Spindle start with configured speed + else: + gcode += "M03\n" # Spindle start # Drillling! for point in points[tool]: @@ -2682,7 +2693,10 @@ class CNCjob(Geometry): self.gcode += self.feedminutecode + "\n" self.gcode += "F%.2f\n" % self.feedrate self.gcode += "G00 Z%.4f\n" % self.z_move # Move (up) to travel height - self.gcode += "M03\n" # Spindle start + if(self.spindlespeed != None): + self.gcode += "M03 S%d\n" % int(self.spindlespeed) # Spindle start with configured speed + else: + self.gcode += "M03\n" # Spindle start self.gcode += self.pausecode + "\n" ## Iterate over geometry paths getting the nearest each time. From c36af7b348ab28c8b44c2d56035018d56e2879df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Sandvik=20Nilsson?= Date: Fri, 17 Jul 2015 10:32:54 +0200 Subject: [PATCH 2/2] Added help text for the new parameters --- FlatCAMApp.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 4325b977..83d7d95a 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -2434,13 +2434,14 @@ class App(QtCore.QObject): 'drillcncjob': { 'fcn': drillcncjob, 'help': "Drill CNC job.\n" + - "> drillcncjob -tools -drillz -travelz -feedrate -outname \n" + + "> drillcncjob -tools -drillz -travelz -feedrate -outname [-spindlespeed (int)]\n" + " name: Name of the object\n" + " tools: Comma separated indexes of tools (example: 1,3 or 2)\n" + " drillz: Drill depth into material (example: -2.0)\n" + " travelz: Travel distance above material (example: 2.0)\n" + " feedrate: Drilling feed rate\n" + - " outname: Name of object to create\n" + " outname: Name of object to create\n" + + " spindlespeed: Speed of the spindle in rpm (example: 4000)\n" }, 'scale': { 'fcn': lambda name, factor: self.collection.get_by_name(str(name)).scale(float(factor)), @@ -2463,12 +2464,13 @@ class App(QtCore.QObject): 'cncjob': { 'fcn': cncjob, 'help': 'Generates a CNC Job from a Geometry Object.\n' + - '> cncjob [-z_cut ] [-z_move ] [-feedrate ] [-tooldia ] [-outname ]\n' + + '> cncjob [-z_cut ] [-z_move ] [-feedrate ] [-tooldia ] [-spindlespeed (int)] [-outname ]\n' + ' name: Name of the source object\n' + ' z_cut: Z-axis cutting position\n' + ' z_move: Z-axis moving position\n' + ' feedrate: Moving speed when cutting\n' + ' tooldia: Tool diameter to show on screen\n' + + ' spindlespeed: Speed of the spindle in rpm (example: 4000)\n' + ' outname: Name of the output object' }, 'write_gcode': {