فهرست منبع

- added Tool Transform preferences in Edit -> Preferences and used them through out the app

Marius Stanciu 7 سال پیش
والد
کامیت
7c2d8ff28e
6فایلهای تغییر یافته به همراه293 افزوده شده و 60 حذف شده
  1. 33 5
      FlatCAMApp.py
  2. 64 43
      FlatCAMEditor.py
  3. 136 2
      FlatCAMGUI.py
  4. 5 2
      GUIElements.py
  5. 1 0
      README.md
  6. 54 8
      flatcamTools/ToolTransform.py

+ 33 - 5
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

+ 64 - 43
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()

+ 136 - 2
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("<b>Parameters:</b>")
+        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):

+ 5 - 2
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:"

+ 1 - 0
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
 

+ 54 - 8
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: