From d79d6cf2bc1e14973880b23c6631bfe89dcb100c Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 3 Mar 2019 16:35:15 +0200 Subject: [PATCH] - minor UI changes for Gerber UI - after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected - fixed offset, rotate, scale, skew for follow_geometry. Fixed the move tool also. - fixed offset, rotate, scale, skew for 'solid_geometry' inside the self.apertures. --- FlatCAMObj.py | 28 ++++++++++++++++++++-------- ObjectUI.py | 6 +++--- README.md | 10 ++++++++++ camlib.py | 34 +++++++++++++++++++++++++++++++++- flatcamTools/ToolMove.py | 4 ++++ flatcamTools/ToolProperties.py | 2 +- 6 files changed, 71 insertions(+), 13 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index b0947f79..00fe02b3 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -365,6 +365,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber): Represents Gerber code. """ optionChanged = QtCore.pyqtSignal(str) + replotApertures = QtCore.pyqtSignal() + ui_type = GerberObjectUI @staticmethod @@ -481,9 +483,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber): :return: None """ FlatCAMObj.set_ui(self, ui) - FlatCAMApp.App.log.debug("FlatCAMGerber.set_ui()") + self.replotApertures.connect(self.on_replot_apertures) + self.form_fields.update({ "plot": self.ui.plot_cb, "multicolored": self.ui.multicolored_cb, @@ -694,12 +697,12 @@ class FlatCAMGerber(FlatCAMObj, Gerber): def on_mark_cb_click_table(self): self.ui_disconnect() - cw = self.sender() - cw_index = self.ui.apertures_table.indexAt(cw.pos()) - cw_row = cw_index.row() + # cw = self.sender() + # cw_index = self.ui.apertures_table.indexAt(cw.pos()) + # cw_row = cw_index.row() check_row = 0 - self.mark_shapes.clear(update=True) + self.clear_plot_apertures() for aperture in self.apertures: # find the apertures_table row associated with the aperture for row in range(self.ui.apertures_table.rowCount()): @@ -742,7 +745,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True) self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True) else: - self.mark_shapes.clear(update=True) + self.clear_plot_apertures() self.ui_connect() @@ -1056,7 +1059,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber): # on hide disable all mark plots for row in range(self.ui.apertures_table.rowCount()): self.ui.apertures_table.cellWidget(row, 5).set_value(False) - self.mark_shapes.clear(update=True) + self.clear_plot_apertures() def on_scale_aperture_click(self, signal): try: @@ -1322,10 +1325,19 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.app.progress.emit(100) except (ObjectDeleted, AttributeError): - self.mark_shapes.clear(update=True) + self.clear_plot_apertures() self.app.worker_task.emit({'fcn': job_thread, 'params': [self]}) + def clear_plot_apertures(self): + self.mark_shapes.clear(update=True) + + def clear_mark_all(self): + self.ui.mark_all_cb.set_value(False) + + def on_replot_apertures(self): + pass + def serialize(self): return { "options": self.options, diff --git a/ObjectUI.py b/ObjectUI.py index 663d7d6a..3ccda693 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -398,7 +398,7 @@ class GerberObjectUI(ObjectUI): self.generate_iso_button.setFixedWidth(90) hlay_1.addWidget(self.generate_iso_button) - hlay_1.addStretch() + # hlay_1.addStretch() self.generate_ext_iso_button = QtWidgets.QPushButton('Ext Geo') self.generate_ext_iso_button.setToolTip( @@ -406,7 +406,7 @@ class GerberObjectUI(ObjectUI): "for isolation routing containing\n" "only the exteriors geometry." ) - # self.generate_ext_iso_button.setFixedWidth(60) + # self.generate_ext_iso_button.setFixedWidth(100) hlay_1.addWidget(self.generate_ext_iso_button) self.generate_int_iso_button = QtWidgets.QPushButton('Int Geo') @@ -415,7 +415,7 @@ class GerberObjectUI(ObjectUI): "for isolation routing containing\n" "only the interiors geometry." ) - # self.generate_int_iso_button.setFixedWidth(60) + # self.generate_ext_iso_button.setFixedWidth(90) hlay_1.addWidget(self.generate_int_iso_button) # when the follow checkbox is checked then the exteriors and interiors isolation generation buttons diff --git a/README.md b/README.md index 0397d089..7eb56532 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,16 @@ CAD program, and create G-Code for Isolation routing. ================================================= +3.03.2019 + +- minor UI changes for Gerber UI +- after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected + +02.03.2019 + +- fixed offset, rotate, scale, skew for follow_geometry. Fixed the move tool also. +- fixed offset, rotate, scale, skew for 'solid_geometry' inside the self.apertures. + 28.02.2019 - added a change that when a double click is performed in a object on canvas resulting in a selection, if the notebook is hidden then it will be displayed diff --git a/camlib.py b/camlib.py index c8be1178..ec254868 100644 --- a/camlib.py +++ b/camlib.py @@ -3227,6 +3227,7 @@ class Gerber (Geometry): yfactor, origin=(px, py)) self.solid_geometry = scale_geom(self.solid_geometry) + self.follow_geometry = scale_geom(self.follow_geometry) # we need to scale the geometry stored in the Gerber apertures, too try: @@ -3237,6 +3238,7 @@ class Gerber (Geometry): self.app.inform.emit("[success]Gerber Scale done.") + ## solid_geometry ??? # It's a cascaded union of objects. # self.solid_geometry = affinity.scale(self.solid_geometry, factor, @@ -3281,8 +3283,16 @@ class Gerber (Geometry): return affinity.translate(obj, xoff=dx, yoff=dy) ## Solid geometry - # self.solid_geometry = affinity.translate(self.solid_geometry, xoff=dx, yoff=dy) self.solid_geometry = offset_geom(self.solid_geometry) + self.follow_geometry = offset_geom(self.follow_geometry) + + # we need to offset the geometry stored in the Gerber apertures, too + try: + for apid in self.apertures: + self.apertures[apid]['solid_geometry'] = offset_geom(self.apertures[apid]['solid_geometry']) + except Exception as e: + log.debug('FlatCAMGeometry.offset() --> %s' % str(e)) + self.app.inform.emit("[success]Gerber Offset done.") def mirror(self, axis, point): @@ -3320,6 +3330,14 @@ class Gerber (Geometry): return affinity.scale(obj, xscale, yscale, origin=(px, py)) self.solid_geometry = mirror_geom(self.solid_geometry) + self.follow_geometry = mirror_geom(self.follow_geometry) + + # we need to mirror the geometry stored in the Gerber apertures, too + try: + for apid in self.apertures: + self.apertures[apid]['solid_geometry'] = mirror_geom(self.apertures[apid]['solid_geometry']) + except Exception as e: + log.debug('FlatCAMGeometry.mirror() --> %s' % str(e)) # It's a cascaded union of objects. # self.solid_geometry = affinity.scale(self.solid_geometry, @@ -3353,7 +3371,14 @@ class Gerber (Geometry): return affinity.skew(obj, angle_x, angle_y, origin=(px, py)) self.solid_geometry = skew_geom(self.solid_geometry) + self.follow_geometry = skew_geom(self.follow_geometry) + # we need to skew the geometry stored in the Gerber apertures, too + try: + for apid in self.apertures: + self.apertures[apid]['solid_geometry'] = skew_geom(self.apertures[apid]['solid_geometry']) + except Exception as e: + log.debug('FlatCAMGeometry.skew() --> %s' % str(e)) # self.solid_geometry = affinity.skew(self.solid_geometry, angle_x, angle_y, origin=(px, py)) def rotate(self, angle, point): @@ -3376,7 +3401,14 @@ class Gerber (Geometry): return affinity.rotate(obj, angle, origin=(px, py)) self.solid_geometry = rotate_geom(self.solid_geometry) + self.follow_geometry = rotate_geom(self.follow_geometry) + # we need to rotate the geometry stored in the Gerber apertures, too + try: + for apid in self.apertures: + self.apertures[apid]['solid_geometry'] = rotate_geom(self.apertures[apid]['solid_geometry']) + except Exception as e: + log.debug('FlatCAMGeometry.rotate() --> %s' % str(e)) # self.solid_geometry = affinity.rotate(self.solid_geometry, angle, origin=(px, py)) diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py index 9f920af4..123a6517 100644 --- a/flatcamTools/ToolMove.py +++ b/flatcamTools/ToolMove.py @@ -122,8 +122,12 @@ class ToolMove(FlatCAMTool): else: for sel_obj in obj_list: + # offset sel_obj.offset((dx, dy)) sel_obj.plot() + sel_obj.clear_plot_apertures() + sel_obj.clear_mark_all() + # Update the object bounding box options a,b,c,d = sel_obj.bounds() sel_obj.options['xmin'] = a diff --git a/flatcamTools/ToolProperties.py b/flatcamTools/ToolProperties.py index 448958b7..c440d72c 100644 --- a/flatcamTools/ToolProperties.py +++ b/flatcamTools/ToolProperties.py @@ -163,7 +163,7 @@ class Properties(FlatCAMTool): printed_value = 'Present' if v else 'None' self.addChild(geo_tool, [str(k), printed_value], True) elif k == 'data': - tool_data = self.addParent(geo_tool, str(k).capilalize(), + tool_data = self.addParent(geo_tool, str(k).capitalize(), color=QtGui.QColor("#000000"), font=font) for data_k, data_v in v.items(): self.addChild(tool_data, [str(data_k), str(data_v)], True)