From 7c2d8ff28e0377e7125397743cdbcd03b5dcb6fb Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 18 Feb 2019 22:48:28 +0200 Subject: [PATCH] - added Tool Transform preferences in Edit -> Preferences and used them through out the app --- FlatCAMApp.py | 38 ++++++++-- FlatCAMEditor.py | 107 +++++++++++++++----------- FlatCAMGUI.py | 138 +++++++++++++++++++++++++++++++++- GUIElements.py | 7 +- README.md | 1 + flatcamTools/ToolTransform.py | 62 +++++++++++++-- 6 files changed, 293 insertions(+), 60 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 91dfd76a..ae3553aa 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -465,7 +465,20 @@ class App(QtCore.QObject): "tools_calc_electro_length": self.tools_defaults_form.tools_calculators_group.pcblength_entry, "tools_calc_electro_width": self.tools_defaults_form.tools_calculators_group.pcbwidth_entry, "tools_calc_electro_cdensity": self.tools_defaults_form.tools_calculators_group.cdensity_entry, - "tools_calc_electro_growth": self.tools_defaults_form.tools_calculators_group.growth_entry + "tools_calc_electro_growth": self.tools_defaults_form.tools_calculators_group.growth_entry, + + "tools_transform_rotate": self.tools_defaults_form.tools_transform_group.rotate_entry, + "tools_transform_skew_x": self.tools_defaults_form.tools_transform_group.skewx_entry, + "tools_transform_skew_y": self.tools_defaults_form.tools_transform_group.skewy_entry, + "tools_transform_scale_x": self.tools_defaults_form.tools_transform_group.scalex_entry, + "tools_transform_scale_y": self.tools_defaults_form.tools_transform_group.scaley_entry, + "tools_transform_scale_link": self.tools_defaults_form.tools_transform_group.link_cb, + "tools_transform_scale_reference": self.tools_defaults_form.tools_transform_group.reference_cb, + "tools_transform_offset_x": self.tools_defaults_form.tools_transform_group.offx_entry, + "tools_transform_offset_y": self.tools_defaults_form.tools_transform_group.offy_entry, + "tools_transform_mirror_reference": self.tools_defaults_form.tools_transform_group.mirror_reference_cb, + "tools_transform_mirror_point": self.tools_defaults_form.tools_transform_group.flip_ref_entry + } # loads postprocessors self.postprocessors = load_postprocessors(self) @@ -675,7 +688,19 @@ class App(QtCore.QObject): "tools_calc_electro_length": 10.0, "tools_calc_electro_width": 10.0, "tools_calc_electro_cdensity":13.0, - "tools_calc_electro_growth": 10.0 + "tools_calc_electro_growth": 10.0, + + "tools_transform_rotate": 90, + "tools_transform_skew_x": 0.0, + "tools_transform_skew_y": 0.0, + "tools_transform_scale_x": 1.0, + "tools_transform_scale_y": 1.0, + "tools_transform_scale_link": True, + "tools_transform_scale_reference": True, + "tools_transform_offset_x": 0.0, + "tools_transform_offset_y": 0.0, + "tools_transform_mirror_reference": False, + "tools_transform_mirror_point": (0, 0) }) ############################### @@ -4015,7 +4040,8 @@ class App(QtCore.QObject): else: if silent is False: rotatebox = FCInputDialog(title="Transform", text="Enter the Angle value:", - min=-360, max=360, decimals=3) + min=-360, max=360, decimals=4, + init_val=float(self.defaults['tools_transform_rotate'])) num, ok = rotatebox.get_value() else: num = preset @@ -4059,7 +4085,8 @@ class App(QtCore.QObject): self.inform.emit("[WARNING_NOTCL] No object selected to Skew/Shear on X axis.") else: skewxbox = FCInputDialog(title="Transform", text="Enter the Angle value:", - min=-360, max=360, decimals=3) + min=-360, max=360, decimals=4, + init_val=float(self.defaults['tools_transform_skew_x'])) num, ok = skewxbox.get_value() if ok: # first get a bounding box to fit all @@ -4089,7 +4116,8 @@ class App(QtCore.QObject): self.inform.emit("[WARNING_NOTCL] No object selected to Skew/Shear on Y axis.") else: skewybox = FCInputDialog(title="Transform", text="Enter the Angle value:", - min=-360, max=360, decimals=3) + min=-360, max=360, decimals=4, + init_val=float(self.defaults['tools_transform_skew_y'])) num, ok = skewybox.get_value() if ok: # first get a bounding box to fit all diff --git a/FlatCAMEditor.py b/FlatCAMEditor.py index 8ee314d8..214f62dc 100644 --- a/FlatCAMEditor.py +++ b/FlatCAMEditor.py @@ -972,45 +972,61 @@ class TransformEditorTool(FlatCAMTool): FlatCAMTool.install(self, icon, separator, shortcut='ALT+T', **kwargs) def set_tool_ui(self): - ## Init GUI - # if self.app.defaults["tools_painttooldia"]: - # self.painttooldia_entry.set_value(self.app.defaults["tools_painttooldia"]) - # else: - # self.painttooldia_entry.set_value(0.0) - # - # if self.app.defaults["tools_paintoverlap"]: - # self.paintoverlap_entry.set_value(self.app.defaults["tools_paintoverlap"]) - # else: - # self.paintoverlap_entry.set_value(0.0) - # - # if self.app.defaults["tools_paintmargin"]: - # self.paintmargin_entry.set_value(self.app.defaults["tools_paintmargin"]) - # else: - # self.paintmargin_entry.set_value(0.0) - # - # if self.app.defaults["tools_paintmethod"]: - # self.paintmethod_combo.set_value(self.app.defaults["tools_paintmethod"]) - # else: - # self.paintmethod_combo.set_value("seed") - # - # if self.app.defaults["tools_pathconnect"]: - # self.pathconnect_cb.set_value(self.app.defaults["tools_pathconnect"]) - # else: - # self.pathconnect_cb.set_value(False) - # - # if self.app.defaults["tools_paintcontour"]: - # self.paintcontour_cb.set_value(self.app.defaults["tools_paintcontour"]) - # else: - # self.paintcontour_cb.set_value(False) ## Initialize form - self.rotate_entry.set_value('0') - self.skewx_entry.set_value('0') - self.skewy_entry.set_value('0') - self.scalex_entry.set_value('1') - self.scaley_entry.set_value('1') - self.offx_entry.set_value('0') - self.offy_entry.set_value('0') - self.flip_ref_cb.setChecked(False) + if self.app.defaults["tools_transform_rotate"]: + self.rotate_entry.set_value(self.app.defaults["tools_transform_rotate"]) + else: + self.rotate_entry.set_value(0.0) + + if self.app.defaults["tools_transform_skew_x"]: + self.skewx_entry.set_value(self.app.defaults["tools_transform_skew_x"]) + else: + self.skewx_entry.set_value(0.0) + + if self.app.defaults["tools_transform_skew_y"]: + self.skewy_entry.set_value(self.app.defaults["tools_transform_skew_y"]) + else: + self.skewy_entry.set_value(0.0) + + if self.app.defaults["tools_transform_scale_x"]: + self.scalex_entry.set_value(self.app.defaults["tools_transform_scale_x"]) + else: + self.scalex_entry.set_value(1.0) + + if self.app.defaults["tools_transform_scale_y"]: + self.scaley_entry.set_value(self.app.defaults["tools_transform_scale_y"]) + else: + self.scaley_entry.set_value(1.0) + + if self.app.defaults["tools_transform_scale_link"]: + self.scale_link_cb.set_value(self.app.defaults["tools_transform_scale_link"]) + else: + self.scale_link_cb.set_value(True) + + if self.app.defaults["tools_transform_scale_reference"]: + self.scale_zero_ref_cb.set_value(self.app.defaults["tools_transform_scale_reference"]) + else: + self.scale_zero_ref_cb.set_value(True) + + if self.app.defaults["tools_transform_offset_x"]: + self.offx_entry.set_value(self.app.defaults["tools_transform_offset_x"]) + else: + self.offx_entry.set_value(0.0) + + if self.app.defaults["tools_transform_offset_y"]: + self.offy_entry.set_value(self.app.defaults["tools_transform_offset_y"]) + else: + self.offy_entry.set_value(0.0) + + if self.app.defaults["tools_transform_mirror_reference"]: + self.flip_ref_cb.set_value(self.app.defaults["tools_transform_mirror_reference"]) + else: + self.flip_ref_cb.set_value(False) + + if self.app.defaults["tools_transform_mirror_point"]: + self.flip_ref_entry.set_value(self.app.defaults["tools_transform_mirror_point"]) + else: + self.flip_ref_entry.set_value((0, 0)) def template(self): if not self.fcdraw.selected: @@ -1452,7 +1468,8 @@ class TransformEditorTool(FlatCAMTool): def on_rotate_key(self): val_box = FCInputDialog(title="Rotate ...", text='Enter an Angle Value (degrees):', - min=-359.9999, max=360.0000, decimals=4) + min=-359.9999, max=360.0000, decimals=4, + init_val=float(self.app.defaults['tools_transform_rotate'])) val_box.setWindowIcon(QtGui.QIcon('share/rotate.png')) val, ok = val_box.get_value() @@ -1470,7 +1487,8 @@ class TransformEditorTool(FlatCAMTool): val_box = FCInputDialog(title="Offset on X axis ...", text=('Enter a distance Value (%s):' % str(units)), - min=-9999.9999, max=10000.0000, decimals=4) + min=-9999.9999, max=10000.0000, decimals=4, + init_val=float(self.app.defaults['tools_transform_offset_x'])) val_box.setWindowIcon(QtGui.QIcon('share/offsetx32.png')) val, ok = val_box.get_value() @@ -1488,7 +1506,8 @@ class TransformEditorTool(FlatCAMTool): val_box = FCInputDialog(title="Offset on Y axis ...", text=('Enter a distance Value (%s):' % str(units)), - min=-9999.9999, max=10000.0000, decimals=4) + min=-9999.9999, max=10000.0000, decimals=4, + init_val=float(self.app.defaults['tools_transform_offset_y'])) val_box.setWindowIcon(QtGui.QIcon('share/offsety32.png')) val, ok = val_box.get_value() @@ -1504,7 +1523,8 @@ class TransformEditorTool(FlatCAMTool): def on_skewx_key(self): val_box = FCInputDialog(title="Skew on X axis ...", text='Enter an Angle Value (degrees):', - min=-359.9999, max=360.0000, decimals=4) + min=-359.9999, max=360.0000, decimals=4, + init_val=float(self.app.defaults['tools_transform_skew_x'])) val_box.setWindowIcon(QtGui.QIcon('share/skewX.png')) val, ok = val_box.get_value() @@ -1520,7 +1540,8 @@ class TransformEditorTool(FlatCAMTool): def on_skewy_key(self): val_box = FCInputDialog(title="Skew on Y axis ...", text='Enter an Angle Value (degrees):', - min=-359.9999, max=360.0000, decimals=4) + min=-359.9999, max=360.0000, decimals=4, + init_val=float(self.app.defaults['tools_transform_skew_y'])) val_box.setWindowIcon(QtGui.QIcon('share/skewY.png')) val, ok = val_box.get_value() diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 7d59480f..8be89029 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -1699,7 +1699,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # Rotate Object by 90 degree CCW if key == QtCore.Qt.Key_R: - self.app.on_rotate(silent=True, preset=-90) + self.app.on_rotate(silent=True, preset=-self.app.defaults['tools_transform_rotate']) return # Run a Script @@ -1875,7 +1875,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): # Rotate Object by 90 degree CW if key == QtCore.Qt.Key_R: - self.app.on_rotate(silent=True, preset=90) + self.app.on_rotate(silent=True, preset=self.app.defaults['tools_transform_rotate']) # Shell toggle if key == QtCore.Qt.Key_S: @@ -2563,6 +2563,9 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.tools_calculators_group = ToolsCalculatorsPrefGroupUI() self.tools_calculators_group.setMinimumWidth(220) + self.tools_transform_group = ToolsTransformPrefGroupUI() + self.tools_transform_group.setMinimumWidth(200) + self.vlay = QtWidgets.QVBoxLayout() self.vlay.addWidget(self.tools_ncc_group) self.vlay.addWidget(self.tools_paint_group) @@ -2576,9 +2579,13 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay2.addWidget(self.tools_panelize_group) self.vlay2.addWidget(self.tools_calculators_group) + self.vlay3 = QtWidgets.QVBoxLayout() + self.vlay3.addWidget(self.tools_transform_group) + self.layout.addLayout(self.vlay) self.layout.addLayout(self.vlay1) self.layout.addLayout(self.vlay2) + self.layout.addLayout(self.vlay3) self.layout.addStretch() @@ -4972,6 +4979,133 @@ class ToolsCalculatorsPrefGroupUI(OptionsGroupUI): self.layout.addStretch() +class ToolsTransformPrefGroupUI(OptionsGroupUI): + def __init__(self, parent=None): + + super(ToolsTransformPrefGroupUI, self).__init__(self) + + self.setTitle(str("Transform Tool Options")) + + ## Transformations + self.transform_label = QtWidgets.QLabel("Parameters:") + self.transform_label.setToolTip( + "Various transformations that can be applied\n" + "on a FlatCAM object." + ) + self.layout.addWidget(self.transform_label) + + grid0 = QtWidgets.QGridLayout() + self.layout.addLayout(grid0) + + ## Rotate Angle + self.rotate_entry = FCEntry() + self.rotate_label = QtWidgets.QLabel("Rotate Angle:") + self.rotate_label.setToolTip( + "Angle for rotation. In degrees." + ) + grid0.addWidget(self.rotate_label, 0, 0) + grid0.addWidget(self.rotate_entry, 0, 1) + + ## Skew/Shear Angle on X axis + self.skewx_entry = FCEntry() + self.skewx_label = QtWidgets.QLabel("Skew_X angle:") + self.skewx_label.setToolTip( + "Angle for Skew/Shear on X axis. In degrees." + ) + grid0.addWidget(self.skewx_label, 1, 0) + grid0.addWidget(self.skewx_entry, 1, 1) + + ## Skew/Shear Angle on Y axis + self.skewy_entry = FCEntry() + self.skewy_label = QtWidgets.QLabel("Skew_Y angle:") + self.skewy_label.setToolTip( + "Angle for Skew/Shear on Y axis. In degrees." + ) + grid0.addWidget(self.skewy_label, 2, 0) + grid0.addWidget(self.skewy_entry, 2, 1) + + ## Scale factor on X axis + self.scalex_entry = FCEntry() + self.scalex_label = QtWidgets.QLabel("Scale_X factor:") + self.scalex_label.setToolTip( + "Factor for scaling on X axis." + ) + grid0.addWidget(self.scalex_label, 3, 0) + grid0.addWidget(self.scalex_entry, 3, 1) + + ## Scale factor on X axis + self.scaley_entry = FCEntry() + self.scaley_label = QtWidgets.QLabel("Scale_Y factor:") + self.scaley_label.setToolTip( + "Factor for scaling on Y axis." + ) + grid0.addWidget(self.scaley_label, 4, 0) + grid0.addWidget(self.scaley_entry, 4, 1) + + ## Link Scale factors + self.link_cb = FCCheckBox("Link") + self.link_cb.setToolTip( + "Scale the selected object(s)\n" + "using the Scale_X factor for both axis." + ) + grid0.addWidget(self.link_cb, 5, 0) + + ## Scale Reference + self.reference_cb = FCCheckBox("Scale Reference") + self.reference_cb.setToolTip( + "Scale the selected object(s)\n" + "using the origin reference when checked,\n" + "and the center of the biggest bounding box\n" + "of the selected objects when unchecked." + ) + grid0.addWidget(self.reference_cb, 5, 1) + + ## Offset distance on X axis + self.offx_entry = FCEntry() + self.offx_label = QtWidgets.QLabel("Offset_X val:") + self.offx_label.setToolTip( + "Distance to offset on X axis. In current units." + ) + grid0.addWidget(self.offx_label, 6, 0) + grid0.addWidget(self.offx_entry, 6, 1) + + ## Offset distance on Y axis + self.offy_entry = FCEntry() + self.offy_label = QtWidgets.QLabel("Offset_Y val:") + self.offy_label.setToolTip( + "Distance to offset on Y axis. In current units." + ) + grid0.addWidget(self.offy_label, 7, 0) + grid0.addWidget(self.offy_entry, 7, 1) + + ## Mirror (Flip) Reference Point + self.mirror_reference_cb = FCCheckBox("Mirror Reference") + self.mirror_reference_cb.setToolTip( + "Flip the selected object(s)\n" + "around the point in Point Entry Field.\n" + "\n" + "The point coordinates can be captured by\n" + "left click on canvas together with pressing\n" + "SHIFT key. \n" + "Then click Add button to insert coordinates.\n" + "Or enter the coords in format (x, y) in the\n" + "Point Entry field and click Flip on X(Y)") + grid0.addWidget(self.mirror_reference_cb, 8, 1) + + self.flip_ref_label = QtWidgets.QLabel(" Mirror Ref. Point:") + self.flip_ref_label.setToolTip( + "Coordinates in format (x, y) used as reference for mirroring.\n" + "The 'x' in (x, y) will be used when using Flip on X and\n" + "the 'y' in (x, y) will be used when using Flip on Y and" + ) + self.flip_ref_entry = EvalEntry2("(0, 0)") + + grid0.addWidget(self.flip_ref_label, 9, 0) + grid0.addWidget(self.flip_ref_entry, 9, 1) + + self.layout.addStretch() + + class FlatCAMActivityView(QtWidgets.QWidget): def __init__(self, parent=None): diff --git a/GUIElements.py b/GUIElements.py index 6eaac17d..f14e4dcf 100644 --- a/GUIElements.py +++ b/GUIElements.py @@ -490,7 +490,8 @@ class FCComboBox(QtWidgets.QComboBox): class FCInputDialog(QtWidgets.QInputDialog): - def __init__(self, parent=None, ok=False, val=None, title=None, text=None, min=None, max=None, decimals=None): + def __init__(self, parent=None, ok=False, val=None, title=None, text=None, min=None, max=None, decimals=None, + init_val=None): super(FCInputDialog, self).__init__(parent) self.allow_empty = ok self.empty_val = val @@ -498,6 +499,8 @@ class FCInputDialog(QtWidgets.QInputDialog): self.val = 0.0 self.ok = '' + self.init_value = init_val if init_val else 0.0 + if title is None: self.title = 'title' else: @@ -521,7 +524,7 @@ class FCInputDialog(QtWidgets.QInputDialog): def get_value(self): self.val, self.ok = self.getDouble(self, self.title, self.text, min=self.min, - max=self.max, decimals=self.decimals) + max=self.max, decimals=self.decimals, value=self.init_value) return [self.val, self.ok] # "Transform", "Enter the Angle value:" diff --git a/README.md b/README.md index 1798678e..5ca2309f 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ CAD program, and create G-Code for Isolation routing. - added key shortcuts for the shape transformations within Geometry Editor: X, Y keys for Flip(mirror), SHIFT+X, SHIFT+Y combo keys for Skew and ALT+X, ALT+Y combo keys for Offset - adjusted the plotcanvas.zomm_fit() function so the objects are better fit into view (with a border around) - modified the GUI in Objects Selected Tab to accommodate 2 different modes: basic and Advanced. In Basic mode, some of the functionality's are hidden from the user. +- added Tool Transform preferences in Edit -> Preferences and used them through out the app 17.02.2019 diff --git a/flatcamTools/ToolTransform.py b/flatcamTools/ToolTransform.py index 60b2d4af..2540f9bb 100644 --- a/flatcamTools/ToolTransform.py +++ b/flatcamTools/ToolTransform.py @@ -379,14 +379,60 @@ class ToolTransform(FlatCAMTool): def set_tool_ui(self): ## Initialize form - self.rotate_entry.set_value('0') - self.skewx_entry.set_value('0') - self.skewy_entry.set_value('0') - self.scalex_entry.set_value('1') - self.scaley_entry.set_value('1') - self.offx_entry.set_value('0') - self.offy_entry.set_value('0') - self.flip_ref_cb.setChecked(False) + if self.app.defaults["tools_transform_rotate"]: + self.rotate_entry.set_value(self.app.defaults["tools_transform_rotate"]) + else: + self.rotate_entry.set_value(0.0) + + if self.app.defaults["tools_transform_skew_x"]: + self.skewx_entry.set_value(self.app.defaults["tools_transform_skew_x"]) + else: + self.skewx_entry.set_value(0.0) + + if self.app.defaults["tools_transform_skew_y"]: + self.skewy_entry.set_value(self.app.defaults["tools_transform_skew_y"]) + else: + self.skewy_entry.set_value(0.0) + + if self.app.defaults["tools_transform_scale_x"]: + self.scalex_entry.set_value(self.app.defaults["tools_transform_scale_x"]) + else: + self.scalex_entry.set_value(1.0) + + if self.app.defaults["tools_transform_scale_y"]: + self.scaley_entry.set_value(self.app.defaults["tools_transform_scale_y"]) + else: + self.scaley_entry.set_value(1.0) + + if self.app.defaults["tools_transform_scale_link"]: + self.scale_link_cb.set_value(self.app.defaults["tools_transform_scale_link"]) + else: + self.scale_link_cb.set_value(True) + + if self.app.defaults["tools_transform_scale_reference"]: + self.scale_zero_ref_cb.set_value(self.app.defaults["tools_transform_scale_reference"]) + else: + self.scale_zero_ref_cb.set_value(True) + + if self.app.defaults["tools_transform_offset_x"]: + self.offx_entry.set_value(self.app.defaults["tools_transform_offset_x"]) + else: + self.offx_entry.set_value(0.0) + + if self.app.defaults["tools_transform_offset_y"]: + self.offy_entry.set_value(self.app.defaults["tools_transform_offset_y"]) + else: + self.offy_entry.set_value(0.0) + + if self.app.defaults["tools_transform_mirror_reference"]: + self.flip_ref_cb.set_value(self.app.defaults["tools_transform_mirror_reference"]) + else: + self.flip_ref_cb.set_value(False) + + if self.app.defaults["tools_transform_mirror_point"]: + self.flip_ref_entry.set_value(self.app.defaults["tools_transform_mirror_point"]) + else: + self.flip_ref_entry.set_value((0,0)) def on_rotate(self): try: