From 8aaeee23fd4eda645138107014b5ba93ef9688de Mon Sep 17 00:00:00 2001 From: mquezada Date: Wed, 16 May 2018 16:05:23 -0400 Subject: [PATCH 1/8] Fix model reference for test. --- ObjectCollection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectCollection.py b/ObjectCollection.py index 82ccef5b..a28e7afc 100644 --- a/ObjectCollection.py +++ b/ObjectCollection.py @@ -289,7 +289,7 @@ class ObjectCollection(): :param name: Name of the FlatCAM Object :return: None """ - iobj = self.createIndex(self.get_names().index(name), 0) # Column 0 + iobj = self.model.createIndex(self.get_names().index(name), 0) # Column 0 self.view.selectionModel().select(iobj, QtGui.QItemSelectionModel.Select) def set_inactive(self, name): @@ -300,7 +300,7 @@ class ObjectCollection(): :param name: Name of the FlatCAM Object :return: None """ - iobj = self.createIndex(self.get_names().index(name), 0) # Column 0 + iobj = self.model.createIndex(self.get_names().index(name), 0) # Column 0 self.view.selectionModel().select(iobj, QtGui.QItemSelectionModel.Deselect) def set_all_inactive(self): From bdc2d8cc593381c3d5d46362558effc23c030f0f Mon Sep 17 00:00:00 2001 From: Jakob Staudt Date: Thu, 24 May 2018 11:52:02 +0200 Subject: [PATCH 2/8] Added postprocessing GUI and Code --- FlatCAMObj.py | 6 ++++-- ObjectUI.py | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index f37ff471..89997ef8 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -1044,6 +1044,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): "tooldia": self.ui.tooldia_entry, "append": self.ui.append_text, "prepend": self.ui.prepend_text, + "postprocess": self.ui.process_script, "dwell": self.ui.dwell_cb, "dwelltime": self.ui.dwelltime_entry }) @@ -1073,8 +1074,9 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): preamble = str(self.ui.prepend_text.get_value()) postamble = str(self.ui.append_text.get_value()) + processor = str(self.ui.process_script.get_value()) - self.export_gcode(filename, preamble=preamble, postamble=postamble) + self.export_gcode(filename, preamble=preamble, postamble=postamble, processor=processor) def dwell_generator(self, lines): """ @@ -1110,7 +1112,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): raise StopIteration - def export_gcode(self, filename, preamble='', postamble=''): + def export_gcode(self, filename, preamble='', postamble='', processor=''): lines = StringIO(self.gcode) diff --git a/ObjectUI.py b/ObjectUI.py index 1bf20bf7..1e80be65 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -196,6 +196,17 @@ class CNCObjectUI(ObjectUI): self.append_text = FCTextArea() self.custom_box.addWidget(self.append_text) + processorlabel = QtGui.QLabel('Postprocessing-Script:') + processorlabel.setToolTip( + "Enter a Postprocessing Script here.\n" + "It gets applied to the G-Code after it\n" + "is generated." + ) + self.custom_box.addWidget(processorlabel) + self.processing_script = FCTextArea() + self.custom_box.addWidget(self.processing_script) + + # Dwell grid1 = QtGui.QGridLayout() self.custom_box.addLayout(grid1) @@ -814,4 +825,4 @@ class GerberObjectUI(ObjectUI): # # # if __name__ == '__main__': -# main() \ No newline at end of file +# main() From 6877d0cd9b551bceb76f0cff24183be2e75765a4 Mon Sep 17 00:00:00 2001 From: Jakob Staudt Date: Thu, 24 May 2018 11:57:42 +0200 Subject: [PATCH 3/8] Added postprocessing GUI and Code --- FlatCAMObj.py | 2 +- ObjectUI.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 89997ef8..b8c12945 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -1074,7 +1074,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): preamble = str(self.ui.prepend_text.get_value()) postamble = str(self.ui.append_text.get_value()) - processor = str(self.ui.process_script.get_value()) + processor = str(self.ui.process_script.get_value()) self.export_gcode(filename, preamble=preamble, postamble=postamble, processor=processor) diff --git a/ObjectUI.py b/ObjectUI.py index 1e80be65..611a8bc4 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -203,8 +203,8 @@ class CNCObjectUI(ObjectUI): "is generated." ) self.custom_box.addWidget(processorlabel) - self.processing_script = FCTextArea() - self.custom_box.addWidget(self.processing_script) + self.process_script = FCTextArea() + self.custom_box.addWidget(self.process_script) # Dwell From 20bc6b4da5894ccf5fd1db9d5627e53a151188d2 Mon Sep 17 00:00:00 2001 From: Jakob Staudt Date: Thu, 24 May 2018 10:04:47 +0000 Subject: [PATCH 4/8] Fixed Indentation Error in line 1077 --- FlatCAMObj.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index b8c12945..bea692b5 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -1074,7 +1074,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): preamble = str(self.ui.prepend_text.get_value()) postamble = str(self.ui.append_text.get_value()) - processor = str(self.ui.process_script.get_value()) + processor = str(self.ui.process_script.get_value()) self.export_gcode(filename, preamble=preamble, postamble=postamble, processor=processor) From c34c59f8704f2b0447b22f12b9f98129d08051b3 Mon Sep 17 00:00:00 2001 From: Jakob Staudt Date: Thu, 24 May 2018 10:16:48 +0000 Subject: [PATCH 5/8] Changed Indentation to Spaces --- FlatCAMObj.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index bea692b5..56a4e695 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -1044,7 +1044,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): "tooldia": self.ui.tooldia_entry, "append": self.ui.append_text, "prepend": self.ui.prepend_text, - "postprocess": self.ui.process_script, + "postprocess": self.ui.process_script, "dwell": self.ui.dwell_cb, "dwelltime": self.ui.dwelltime_entry }) @@ -1074,7 +1074,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): preamble = str(self.ui.prepend_text.get_value()) postamble = str(self.ui.append_text.get_value()) - processor = str(self.ui.process_script.get_value()) + processor = str(self.ui.process_script.get_value()) self.export_gcode(filename, preamble=preamble, postamble=postamble, processor=processor) From fca9f0ca88d4ff0b1e9b0d99619b7f8dcbfafdfd Mon Sep 17 00:00:00 2001 From: mquezada Date: Sat, 26 May 2018 19:43:01 -0400 Subject: [PATCH 6/8] Double clicking on the object label in the Project list view should select the object and take user to Selected tab. --- ObjectCollection.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ObjectCollection.py b/ObjectCollection.py index a28e7afc..a4d8c32a 100644 --- a/ObjectCollection.py +++ b/ObjectCollection.py @@ -70,7 +70,6 @@ class ObjectCollection(): self.model = QtGui.QStandardItemModel(self.view) self.view.setModel(self.model) self.model.itemChanged.connect(self.on_item_changed) - #self.view.setModel(self) self.click_modifier = None @@ -164,6 +163,10 @@ class ObjectCollection(): # Create the model item to insert into the QListView icon = QtGui.QIcon(self.icons[obj.kind])#self.icons["gerber"]) item = QtGui.QStandardItem(icon, name) + # Item is not editable, so that double click + # does not allow cell value modification. + item.setEditable(False) + # The item is checkable, to add the checkbox. item.setCheckable(True) if obj.options["plot"] == True: item.setCheckState(2)#Qt.Checked) From aff21d7cb02a36659ac289708a11c2c1a05b2021 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 30 May 2018 08:02:03 +0300 Subject: [PATCH 7/8] - changed the default way to copy the coordinates to clipboard. Before, at each mouse click on canvaas the coordinates were copied to clipboard. Now for the same feet it require to have the CTRL key pressed while clicking on canvas for the coordinates to be copied. --- FlatCAMApp.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index ea230c41..e3b0ddf8 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -1639,8 +1639,9 @@ class App(QtCore.QObject): try: App.log.debug('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % ( event.button, event.x, event.y, event.xdata, event.ydata)) - - self.clipboard.setText(self.defaults["point_clipboard_format"] % (event.xdata, event.ydata)) + modifiers = QtGui.QApplication.keyboardModifiers() + if modifiers == QtCore.Qt.ControlModifier: + self.clipboard.setText(self.defaults["point_clipboard_format"] % (event.xdata, event.ydata)) except Exception, e: App.log.debug("Outside plot?") From c85a142759ae760512c52d700305c6eda6bbdc08 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 30 May 2018 22:52:50 +0300 Subject: [PATCH 8/8] - fixing issue #254 - replaced (as per advice from @jpcgt) the lines with app.info call to using a signal which is safe to use in a threaded environment, app.inform.emit() --- DblSidedTool.py | 2 +- FlatCAMApp.py | 4 ++-- FlatCAMDraw.py | 14 +++++++------- FlatCAMObj.py | 14 +++++++------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/DblSidedTool.py b/DblSidedTool.py index 7446dd8b..4e52a4ba 100644 --- a/DblSidedTool.py +++ b/DblSidedTool.py @@ -165,7 +165,7 @@ class DblSidedTool(FlatCAMTool): if not isinstance(fcobj, FlatCAMGerber) and \ not isinstance(fcobj, FlatCAMExcellon) and \ not isinstance(fcobj, FlatCAMGeometry): - self.info("ERROR: Only Gerber, Excellon and Geometry objects can be mirrored.") + self.app.inform.emit("ERROR: Only Gerber, Excellon and Geometry objects can be mirrored.") return axis = self.mirror_axis.get_value() diff --git a/FlatCAMApp.py b/FlatCAMApp.py index ea230c41..85763ab1 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -693,7 +693,7 @@ class App(QtCore.QObject): :return: None """ if not isinstance(self.collection.get_active(), FlatCAMGeometry): - self.info("Select a Geometry Object to edit.") + self.inform.emit("Select a Geometry Object to edit.") return self.ui.updategeo_btn.setEnabled(True) @@ -708,7 +708,7 @@ class App(QtCore.QObject): """ geo = self.collection.get_active() if not isinstance(geo, FlatCAMGeometry): - self.info("Select a Geometry Object to update.") + self.inform.emit("Select a Geometry Object to update.") return self.draw.update_fcgeometry(geo) diff --git a/FlatCAMDraw.py b/FlatCAMDraw.py index 57c1fdb6..86bd9725 100644 --- a/FlatCAMDraw.py +++ b/FlatCAMDraw.py @@ -983,7 +983,7 @@ class FlatCAMDraw(QtCore.QObject): self.tools[t]["button"].setChecked(False) self.active_tool = self.tools[tool]["constructor"](self) - self.app.info(self.active_tool.start_msg) + self.app.inform.emit(self.active_tool.start_msg) else: self.app.log.debug("%s is NOT checked." % tool) for t in self.tools: @@ -1002,7 +1002,7 @@ class FlatCAMDraw(QtCore.QObject): if self.active_tool is not None and event.button is 1: # Dispatch event to active_tool msg = self.active_tool.click(self.snap(event.xdata, event.ydata)) - self.app.info(msg) + self.app.inform.emit(msg) # If it is a shape generating tool if isinstance(self.active_tool, FCShapeTool) and self.active_tool.complete: @@ -1114,14 +1114,14 @@ class FlatCAMDraw(QtCore.QObject): self.active_tool.make() if self.active_tool.complete: self.on_shape_complete() - self.app.info("Done.") + self.app.inform.emit("Done.") return ### Abort the current action if event.key == 'escape': # TODO: ...? #self.on_tool_select("select") - self.app.info("Cancelled.") + self.app.inform.emit("Cancelled.") self.delete_utility_geometry() @@ -1141,14 +1141,14 @@ class FlatCAMDraw(QtCore.QObject): self.move_btn.setChecked(True) self.on_tool_select('move') self.active_tool.set_origin(self.snap(event.xdata, event.ydata)) - self.app.info("Click on target point.") + self.app.inform.emit("Click on target point.") ### Copy if event.key == 'c': self.copy_btn.setChecked(True) self.on_tool_select('copy') self.active_tool.set_origin(self.snap(event.xdata, event.ydata)) - self.app.info("Click on target point.") + self.app.inform.emit("Click on target point.") ### Snap if event.key == 'g': @@ -1165,7 +1165,7 @@ class FlatCAMDraw(QtCore.QObject): if self.active_tool is not None: response = self.active_tool.on_key(event.key) if response is not None: - self.app.info(response) + self.app.inform.emit(response) def on_canvas_key_release(self, event): self.key = None diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 12038e1b..443e803d 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -101,7 +101,7 @@ class FlatCAMObj(QtCore.QObject): old_name = copy(self.options["name"]) new_name = self.ui.name_entry.get_value() self.options["name"] = self.ui.name_entry.get_value() - self.app.info("Name changed from %s to %s" % (old_name, new_name)) + self.app.inform.emit("Name changed from %s to %s" % (old_name, new_name)) def on_offset_button_click(self): self.app.report_usage("obj_on_offset_button") @@ -473,7 +473,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # Propagate options follow_obj.options["cnctooldia"] = self.options["isotooldia"] follow_obj.solid_geometry = self.solid_geometry - app_obj.info("Follow geometry created: %s" % follow_obj.options["name"]) + app_obj.inform.emit("Follow geometry created: %s" % follow_obj.options["name"]) # TODO: Do something if this is None. Offer changing name? self.app.new_object("geometry", follow_name, follow_init) @@ -519,7 +519,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): elif type(geom) is Polygon: geom = Polygon(geom.exterior.coords[::-1], geom.interiors) else: - raise "Unexpected Geometry" + raise str("Unexpected Geometry") return geom if combine: @@ -534,7 +534,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): offset = (2 * i + 1) / 2.0 * dia - i * overlap * dia geom = generate_envelope (offset, i == 0) geo_obj.solid_geometry.append(geom) - app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"]) + app_obj.inform.emit("Isolation geometry created: %s" % geo_obj.options["name"]) # TODO: Do something if this is None. Offer changing name? self.app.new_object("geometry", iso_name, iso_init) @@ -553,7 +553,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # Propagate options geo_obj.options["cnctooldia"] = self.options["isotooldia"] geo_obj.solid_geometry = generate_envelope (offset, i == 0) - app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"]) + app_obj.inform.emit("Isolation geometry created: %s" % geo_obj.options["name"]) # TODO: Do something if this is None. Offer changing name? self.app.new_object("geometry", iso_name, iso_init) @@ -1294,11 +1294,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): return if self.options["selectmethod"] == "single": - self.app.info("Click inside the desired polygon.") + self.app.inform.emit("Click inside the desired polygon.") # To be called after clicking on the plot. def doit(event): - self.app.info("Painting polygon...") + self.app.inform.emit("Painting polygon...") self.app.plotcanvas.mpl_disconnect(subscription) point = [event.xdata, event.ydata] self.paint_poly_single_click(point, tooldia, overlap,