Przeglądaj źródła

- in legacy graphic engine, fixed a bug that when deleting an object all objects where deleted
- added a new TclCommand named set_origin which will set the origin for all loaded objects to zero if the -auto True argument is used and to a certain x,y location if the format is: set_origin 5,7

Marius Stanciu 6 lat temu
rodzic
commit
edbb690d1b
6 zmienionych plików z 150 dodań i 31 usunięć
  1. 56 28
      FlatCAMApp.py
  2. 1 2
      FlatCAMObj.py
  3. 2 0
      README.md
  4. 1 1
      camlib.py
  5. 89 0
      tclCommands/TclCommandSetOrigin.py
  6. 1 0
      tclCommands/__init__.py

+ 56 - 28
FlatCAMApp.py

@@ -2107,11 +2107,11 @@ class App(QtCore.QObject):
                                   'join_geometry', 'list_sys', 'listsys', 'milld', 'mills', 'milldrills', 'millslots',
                                   'join_geometry', 'list_sys', 'listsys', 'milld', 'mills', 'milldrills', 'millslots',
                                   'mirror', 'ncc',
                                   'mirror', 'ncc',
                                   'ncc_clear', 'ncr', 'new', 'new_geometry', 'non_copper_regions', 'offset',
                                   'ncc_clear', 'ncr', 'new', 'new_geometry', 'non_copper_regions', 'offset',
-                                  'open_excellon', 'open_gcode', 'open_gerber', 'open_project', 'options', 'paint',
-                                  'pan', 'panel', 'panelize', 'plot_all', 'plot_objects', 'quit_flatcam',
+                                  'open_excellon', 'open_gcode', 'open_gerber', 'open_project', 'options', 'origin',
+                                  'paint', 'pan', 'panel', 'panelize', 'plot_all', 'plot_objects', 'quit_flatcam',
                                   'save', 'save_project',
                                   'save', 'save_project',
-                                  'save_sys', 'scale',
-                                  'set_active', 'set_sys', 'setsys', 'skew', 'subtract_poly', 'subtract_rectangle',
+                                  'save_sys', 'scale', 'set_active', 'set_origin', 'set_sys',
+                                  'setsys', 'skew', 'subtract_poly', 'subtract_rectangle',
                                   'version', 'write_gcode'
                                   'version', 'write_gcode'
                                   ]
                                   ]
 
 
@@ -2488,6 +2488,7 @@ class App(QtCore.QObject):
         self.mp = None
         self.mp = None
         self.mm = None
         self.mm = None
         self.mr = None
         self.mr = None
+        self.mp_zc = None
 
 
         # when True, the app has to return from any thread
         # when True, the app has to return from any thread
         self.abort_flag = False
         self.abort_flag = False
@@ -6781,16 +6782,56 @@ class App(QtCore.QObject):
             pass
             pass
         self.replot_signal[list].connect(origin_replot)
         self.replot_signal[list].connect(origin_replot)
 
 
-    def on_set_zero_click(self, event):
-        # this function will be available only for mouse left click
+    def on_set_zero_click(self, event, location=None, noplot=False, use_thread=True):
+        """
 
 
-        if self.is_legacy is False:
-            event_pos = event.pos
-        else:
-            event_pos = (event.xdata, event.ydata)
+        :param event:
+        :param location:
+        :param noplot:
+        :param use_thread:
+        :return:
+        """
+        noplot_sig = noplot
+
+        def worker_task():
+            with self.proc_container.new(_("Setting Origin...")):
+                for obj in self.collection.get_list():
+                    obj.offset((x, y))
+                    self.object_changed.emit(obj)
+
+                    # Update the object bounding box options
+                    a, b, c, d = obj.bounds()
+                    obj.options['xmin'] = a
+                    obj.options['ymin'] = b
+                    obj.options['xmax'] = c
+                    obj.options['ymax'] = d
+                self.inform.emit('[success] %s...' %
+                                 _('Origin set'))
+                if noplot_sig is False:
+                    self.replot_signal.emit([])
+
+        if location is not None:
+            if len(location) != 2:
+                self.inform.emit('[ERROR_NOTCL] %s...' %
+                                 _("Origin coordinates specified but incomplete."))
+                return 'fail'
+
+            x, y = location
+
+            if use_thread is True:
+                self.worker_task.emit({'fcn': worker_task, 'params': []})
+            else:
+                worker_task()
+            self.should_we_save = True
+            return
 
 
-        pos_canvas = self.plotcanvas.translate_coords(event_pos)
         if event.button == 1:
         if event.button == 1:
+            if self.is_legacy is False:
+                event_pos = event.pos
+            else:
+                event_pos = (event.xdata, event.ydata)
+            pos_canvas = self.plotcanvas.translate_coords(event_pos)
+
             if self.grid_status() == True:
             if self.grid_status() == True:
                 pos = self.geo_editor.snap(pos_canvas[0], pos_canvas[1])
                 pos = self.geo_editor.snap(pos_canvas[0], pos_canvas[1])
             else:
             else:
@@ -6799,23 +6840,10 @@ class App(QtCore.QObject):
             x = 0 - pos[0]
             x = 0 - pos[0]
             y = 0 - pos[1]
             y = 0 - pos[1]
 
 
-            def worker_task():
-                with self.proc_container.new(_("Setting Origin...")):
-                    for obj in self.collection.get_list():
-                        obj.offset((x, y))
-                        self.object_changed.emit(obj)
-
-                        # Update the object bounding box options
-                        a, b, c, d = obj.bounds()
-                        obj.options['xmin'] = a
-                        obj.options['ymin'] = b
-                        obj.options['xmax'] = c
-                        obj.options['ymax'] = d
-                    self.inform.emit('[success]%s...' %
-                                     _('Origin set'))
-                    self.replot_signal.emit([])
-
-            self.worker_task.emit({'fcn': worker_task, 'params': []})
+            if use_thread is True:
+                self.worker_task.emit({'fcn': worker_task, 'params': []})
+            else:
+                worker_task()
             self.should_we_save = True
             self.should_we_save = True
 
 
     def on_jump_to(self, custom_location=None, fit_center=True):
     def on_jump_to(self, custom_location=None, fit_center=True):

+ 1 - 2
FlatCAMObj.py

@@ -85,8 +85,7 @@ class FlatCAMObj(QtCore.QObject):
         if self.app.is_legacy is False:
         if self.app.is_legacy is False:
             self.shapes = self.app.plotcanvas.new_shape_group()
             self.shapes = self.app.plotcanvas.new_shape_group()
         else:
         else:
-            # dont't give an axis name to this one or it will delete the old object when loading a new one
-            self.shapes = ShapeCollectionLegacy(obj=self, app=self.app)
+            self.shapes = ShapeCollectionLegacy(obj=self, app=self.app, name=name)
 
 
         # self.mark_shapes = self.app.plotcanvas.new_shape_collection(layers=2)
         # self.mark_shapes = self.app.plotcanvas.new_shape_collection(layers=2)
         self.mark_shapes = {}
         self.mark_shapes = {}

+ 2 - 0
README.md

@@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing.
 
 
 - in legacy graphic engine, fixed bug that made the old object disappear when a new object was loaded
 - in legacy graphic engine, fixed bug that made the old object disappear when a new object was loaded
 - in legacy graphic engine, fixed bug that crashed the app when creating a new project
 - in legacy graphic engine, fixed bug that crashed the app when creating a new project
+- in legacy graphic engine, fixed a bug that when deleting an object all objects where deleted
+- added a new TclCommand named set_origin which will set the origin for all loaded objects to zero if the -auto True argument is used and to a certain x,y location if the format is: set_origin 5,7
 
 
 22.09.2019
 22.09.2019
 
 

+ 1 - 1
camlib.py

@@ -5041,7 +5041,7 @@ class Excellon(Geometry):
     def bounds(self):
     def bounds(self):
         """
         """
         Returns coordinates of rectangular bounds
         Returns coordinates of rectangular bounds
-        of Gerber geometry: (xmin, ymin, xmax, ymax).
+        of Excellon geometry: (xmin, ymin, xmax, ymax).
         """
         """
         # fixed issue of getting bounds only for one level lists of objects
         # fixed issue of getting bounds only for one level lists of objects
         # now it can get bounds for nested lists of objects
         # now it can get bounds for nested lists of objects

+ 89 - 0
tclCommands/TclCommandSetOrigin.py

@@ -0,0 +1,89 @@
+from tclCommands.TclCommand import TclCommand
+from ObjectCollection import *
+
+from camlib import get_bounds
+
+import gettext
+import FlatCAMTranslation as fcTranslate
+import builtins
+
+fcTranslate.apply_language('strings')
+if '_' not in builtins.__dict__:
+    _ = gettext.gettext
+
+
+class TclCommandSetOrigin(TclCommand):
+    """
+    Tcl shell command to clear the text in the Tcl Shell browser.
+
+    example:
+
+    """
+
+    # List of all command aliases, to be able use old names for backward compatibility (add_poly, add_polygon)
+    aliases = ['set_origin', 'origin']
+
+    # Dictionary of types from Tcl command, needs to be ordered
+    arg_names = collections.OrderedDict([
+        ('loc', str)
+    ])
+
+    # Dictionary of types from Tcl command, needs to be ordered , this  is  for options  like -optionname value
+    option_types = collections.OrderedDict([
+        ('auto', bool)
+    ])
+
+    # array of mandatory options for current Tcl command: required = {'name','outname'}
+    required = []
+
+    # structured help for current command, args needs to be ordered
+    help = {
+        'main': "Will set the origin at the specified x,y location.",
+        'args': collections.OrderedDict([
+            ('loc', 'Location to offset all the selected objects. No spaces between x and y pair. Use like this: 2,3'),
+            ('auto', 'If set to 1 it will set the origin to the minimum x, y of the object selection bounding box.'
+                     '-auto=1 is not correct but -auto 1 or -auto True is correct.')
+        ]),
+        'examples': ['set_origin 3,2', 'set_origin -auto 1']
+    }
+
+    def execute(self, args, unnamed_args):
+        """
+
+        :param args:
+        :param unnamed_args:
+        :return:
+        """
+
+        print(args)
+        loc = list()
+        if 'auto' in args:
+            if args['auto'] == 1:
+                objs = self.app.collection.get_list()
+                minx, miny, __, ___ = get_bounds(objs)
+
+                loc.append(0 - minx)
+                loc.append(0 - miny)
+            else:
+                loc = [0, 0]
+        elif 'loc' in args:
+            try:
+                location = [float(eval(coord)) for coord in str(args['loc']).split(",") if coord != '']
+            except AttributeError as e:
+                log.debug("TclCommandSetOrigin.execute --> %s" % str(e))
+                location = (0, 0)
+
+            loc.append(location[0])
+            loc.append(location[1])
+
+            if len(location) != 2:
+                self.raise_tcl_error('%s: %s' % (
+                    _("Expected a pair of (x, y) coordinates. Got"), str(len(location))))
+                return 'fail'
+        else:
+            loc = [0, 0]
+
+        self.app.on_set_zero_click(event=None, location=loc, noplot=True, use_thread=False)
+        self.app.inform.emit('[success] Tcl %s: %s' %
+                             (_('Origin set by offsetting all loaded objects with '),
+                              '{0:.4f}, {0:.4f}'.format(loc[0], loc[1])))

+ 1 - 0
tclCommands/__init__.py

@@ -53,6 +53,7 @@ import tclCommands.TclCommandSaveProject
 import tclCommands.TclCommandSaveSys
 import tclCommands.TclCommandSaveSys
 import tclCommands.TclCommandScale
 import tclCommands.TclCommandScale
 import tclCommands.TclCommandSetActive
 import tclCommands.TclCommandSetActive
+import tclCommands.TclCommandSetOrigin
 import tclCommands.TclCommandSetSys
 import tclCommands.TclCommandSetSys
 import tclCommands.TclCommandSkew
 import tclCommands.TclCommandSkew
 import tclCommands.TclCommandSubtractPoly
 import tclCommands.TclCommandSubtractPoly