Преглед на файлове

- fixed recent issues introduced in Tcl command Drillcncjob
- updated the Cncjob to use the 'endxy' parameter which dictates the x,y position at the end of the job
- now the Tcl commands Drillcncjob and Cncjob can use the toolchangexy and endxy parameters with or without parenthesis (but no spaces allowed)

Marius Stanciu преди 5 години
родител
ревизия
6aacd4d978
променени са 5 файла, в които са добавени 76 реда и са изтрити 20 реда
  1. 7 0
      CHANGELOG.md
  2. 1 1
      camlib.py
  3. 17 3
      flatcamObjects/FlatCAMGeometry.py
  4. 30 6
      tclCommands/TclCommandCncjob.py
  5. 21 10
      tclCommands/TclCommandDrillcncjob.py

+ 7 - 0
CHANGELOG.md

@@ -7,6 +7,13 @@ CHANGELOG for FlatCAM beta
 
 =================================================
 
+12.05.2020
+
+- fixed recent issues introduced in Tcl command Drillcncjob
+- updated the Cncjob to use the 'endxy' parameter which dictates the x,y position at the end of the job
+- now the Tcl commands Drillcncjob and Cncjob can use the toolchangexy and endxy parameters with or without parenthesis (but no spaces allowed)
+
+
 11.05.2020
 
 - removed the labels in status bar that display X,Y positions and replaced it with a HUD display on canvas (combo key SHIFT+H) will toggle the display of the HUD

+ 1 - 1
camlib.py

@@ -2676,7 +2676,7 @@ class CNCjob(Geometry):
                 if self.xy_toolchange and self.xy_toolchange != '':
                     self.xy_toolchange = [float(eval(a)) for a in self.xy_toolchange.split(",")]
 
-                if self.xy_toolchange and len(self.xy_toolchange) < 2:
+                if self.xy_toolchange and len(self.xy_toolchange) != 2:
                     self.app.inform.emit('[ERROR]%s' %
                                          _("The Toolchange X,Y field in Edit -> Preferences has to be "
                                            "in the format (x, y) \nbut now there is only one value, not two. "))

+ 17 - 3
flatcamObjects/FlatCAMGeometry.py

@@ -2095,7 +2095,7 @@ class GeometryObject(FlatCAMObj, Geometry):
     def generatecncjob(self, outname=None, dia=None, offset=None, z_cut=None, z_move=None,
             feedrate=None, feedrate_z=None, feedrate_rapid=None, spindlespeed=None, dwell=None, dwelltime=None,
             multidepth=None, dpp=None, toolchange=None, toolchangez=None, toolchangexy=None,
-            extracut=None, extracut_length=None, startz=None, endz=None, pp=None, segx=None, segy=None,
+            extracut=None, extracut_length=None, startz=None, endz=None, endxy=None, pp=None, segx=None, segy=None,
             use_thread=True, plot=True):
         """
         Only used by the TCL Command Cncjob.
@@ -2118,11 +2118,14 @@ class GeometryObject(FlatCAMObj, Geometry):
         :param dpp:             Depth for each pass when multidepth parameter is True
         :param toolchange:
         :param toolchangez:
-        :param toolchangexy:
+        :param toolchangexy:    A sequence ox X,Y coordinates: a 2-length tuple or a string.
+                                Coordinates in X,Y plane for the Toolchange event
         :param extracut:
         :param extracut_length:
         :param startz:
         :param endz:
+        :param endxy:           A sequence ox X,Y coordinates: a 2-length tuple or a string.
+                                Coordinates in X, Y plane for the last move after ending the job.
         :param pp:              Name of the preprocessor
         :param segx:
         :param segy:
@@ -2152,10 +2155,21 @@ class GeometryObject(FlatCAMObj, Geometry):
 
         startz = startz if startz is not None else self.options["startz"]
         endz = endz if endz is not None else float(self.options["endz"])
-        endxy = self.options["endxy"]
+
+        endxy = endxy if endxy else self.options["endxy"]
+        if isinstance(endxy, str):
+            endxy = re.sub('[()\[\]]', '', endxy)
+            if endxy and endxy != '':
+                endxy = [float(eval(a)) for a in endxy.split(",")]
 
         toolchangez = toolchangez if toolchangez else float(self.options["toolchangez"])
+
         toolchangexy = toolchangexy if toolchangexy else self.options["toolchangexy"]
+        if isinstance(toolchangexy, str):
+            toolchangexy = re.sub('[()\[\]]', '', toolchangexy)
+            if toolchangexy and toolchangexy != '':
+                toolchangexy = [float(eval(a)) for a in toolchangexy.split(",")]
+
         toolchange = toolchange if toolchange else self.options["toolchange"]
 
         offset = offset if offset else 0.0

+ 30 - 6
tclCommands/TclCommandCncjob.py

@@ -37,9 +37,10 @@ class TclCommandCncjob(TclCommandSignaled):
         ('extracut_length', float),
         ('dpp', float),
         ('toolchangez', float),
-        ('toolchangexy', tuple),
+        ('toolchangexy', str),
         ('startz', float),
         ('endz', float),
+        ('endxy', str),
         ('spindlespeed', int),
         ('dwelltime', float),
         ('pp', str),
@@ -65,9 +66,12 @@ class TclCommandCncjob(TclCommandSignaled):
             ('dpp', 'If present then use multidepth cnc cut. Height of one layer for multidepth.'),
             ('toolchangez', 'Z distance for toolchange (example: 30.0).\n'
                             'If used in the command then a toolchange event will be included in gcode'),
-            ('toolchangexy', 'X, Y coordonates for toolchange in format (x, y) (example: (2.0, 3.1) ).'),
+            ('toolchangexy', 'The X,Y coordinates at Toolchange event in format (x, y) (example: (30.0, 15.2) or '
+                             'without parenthesis like: 0.3,1.0 - no spaces allowed in this case).'),
             ('startz', 'Height before the first move.'),
             ('endz', 'Height where the last move will park.'),
+            ('endxy', 'The X,Y coordinates at job end in format (x, y) (example: (30.0, 15.2) or without parenthesis'
+                      'like: 0.3,1.0 - no spaces allowed in this case).'),
             ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
             ('dwelltime', 'Time to pause to allow the spindle to reach the full speed.\n'
                           'If it is not used in command then it will not be included'),
@@ -161,6 +165,17 @@ class TclCommandCncjob(TclCommandSignaled):
             self.app.defaults["geometry_startz"]
         args["endz"] = args["endz"] if "endz" in args and args["endz"] else self.app.defaults["geometry_endz"]
 
+        if "endxy" in args and args["endxy"]:
+            args["endxy"] = args["endxy"]
+        else:
+            if self.app.defaults["geometry_endxy"]:
+                args["endxy"] = self.app.defaults["geometry_endxy"]
+            else:
+                args["endxy"] = '0, 0'
+        if len(eval(args["endxy"])) != 2:
+            self.raise_tcl_error("The entered value for 'endxy' needs to have the format x,y - no spaces or "
+                                 "in format (x, y) - spaces allowed. But always two comma separated values.")
+
         args["spindlespeed"] = args["spindlespeed"] if "spindlespeed" in args and args["spindlespeed"] != 0 else None
 
         if 'dwelltime' in args:
@@ -180,13 +195,21 @@ class TclCommandCncjob(TclCommandSignaled):
             if args["toolchangez"] is not None:
                 args["toolchangez"] = args["toolchangez"]
             else:
-                args["toolchangez"] = obj.options["toolchangez"]
+                args["toolchangez"] = self.app.defaults["geometry_toolchangez"]
         else:
             args["toolchange"] = self.app.defaults["geometry_toolchange"]
             args["toolchangez"] = self.app.defaults["geometry_toolchangez"]
 
-        args["toolchangexy"] = args["toolchangexy"] if "toolchangexy" in args and args["toolchangexy"] else \
-            self.app.defaults["geometry_toolchangexy"]
+        if "toolchangexy" in args and args["toolchangexy"]:
+            args["toolchangexy"] = args["toolchangexy"]
+        else:
+            if self.app.defaults["geometry_toolchangexy"]:
+                args["toolchangexy"] = self.app.defaults["geometry_toolchangexy"]
+            else:
+                args["toolchangexy"] = '0, 0'
+        if len(eval(args["toolchangexy"])) != 2:
+            self.raise_tcl_error("The entered value for 'toolchangexy' needs to have the format x,y - no spaces or "
+                                 "in format (x, y) - spaces allowed. But always two comma separated values.")
 
         del args['name']
 
@@ -195,7 +218,7 @@ class TclCommandCncjob(TclCommandSignaled):
                 continue
             else:
                 if args[arg] is None:
-                    print(arg, args[arg])
+                    print("None parameters: %s is None" % arg)
                     if muted is False:
                         self.raise_tcl_error('One of the command parameters that have to be not None, is None.\n'
                                              'The parameter that is None is in the default values found in the list \n'
@@ -234,6 +257,7 @@ class TclCommandCncjob(TclCommandSignaled):
                     local_tools_dict[tool_uid]['data']['toolchangexy'] = args["toolchangexy"]
                     local_tools_dict[tool_uid]['data']['startz'] = args["startz"]
                     local_tools_dict[tool_uid]['data']['endz'] = args["endz"]
+                    local_tools_dict[tool_uid]['data']['endxy'] = args["endxy"]
                     local_tools_dict[tool_uid]['data']['spindlespeed'] = args["spindlespeed"]
                     local_tools_dict[tool_uid]['data']['dwell'] = args["dwell"]
                     local_tools_dict[tool_uid]['data']['dwelltime'] = args["dwelltime"]

+ 21 - 10
tclCommands/TclCommandDrillcncjob.py

@@ -37,10 +37,10 @@ class TclCommandDrillcncjob(TclCommandSignaled):
         ('feedrate_rapid', float),
         ('spindlespeed', int),
         ('toolchangez', float),
-        ('toolchangexy', tuple),
+        ('toolchangexy', str),
         ('startz', float),
         ('endz', float),
-        ('endxy', tuple),
+        ('endxy', str),
         ('dwelltime', float),
         ('pp', str),
         ('opt_type', str),
@@ -68,10 +68,12 @@ class TclCommandDrillcncjob(TclCommandSignaled):
             ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
             ('toolchangez', 'Z distance for toolchange (example: 30.0).\n'
                             'If used in the command then a toolchange event will be included in gcode'),
-            ('toolchangexy', 'X, Y coordonates for toolchange in format (x, y) (example: (2.0, 3.1) ).'),
+            ('toolchangexy', 'The X,Y coordinates at Toolchange event in format (x, y) (example: (30.0, 15.2) or '
+                             'without parenthesis like: 0.3,1.0 - no spaces allowed in this case).'),
             ('startz', 'The Z coordinate at job start (example: 30.0).'),
             ('endz', 'The Z coordinate at job end (example: 30.0).'),
-            ('endxy', 'The X,Y coordinates at job end in format (x, y) (example: (30.0, 15.2)).'),
+            ('endxy', 'The X,Y coordinates at job end in format (x, y) (example: (30.0, 15.2) or without parenthesis'
+                      'like: 0.3,1.0 - no spaces allowed in this case).'),
             ('dwelltime', 'Time to pause to allow the spindle to reach the full speed.\n'
                           'If it is not used in command then it will not be included'),
             ('pp', 'This is the Excellon preprocessor name: case_sensitive, no_quotes'),
@@ -230,20 +232,29 @@ class TclCommandDrillcncjob(TclCommandSignaled):
                 toolchange = self.app.defaults["excellon_toolchange"]
                 toolchangez = float(self.app.defaults["excellon_toolchangez"])
 
-            xy_toolchange = args["toolchangexy"] if "toolchangexy" in args and args["toolchangexy"] else \
-                self.app.defaults["excellon_toolchangexy"]
-            xy_toolchange = ','.join([xy_toolchange[0], xy_toolchange[2]])
+            if "toolchangexy" in args and args["toolchangexy"]:
+                xy_toolchange = args["toolchangexy"]
+            else:
+                if self.app.defaults["excellon_toolchangexy"]:
+                    xy_toolchange = self.app.defaults["excellon_toolchangexy"]
+                else:
+                    xy_toolchange = '0, 0'
+            if len(eval(xy_toolchange)) != 2:
+                self.raise_tcl_error("The entered value for 'toolchangexy' needs to have the format x,y - no spaces or "
+                                     "in format (x, y) - spaces allowed. But always two comma separated values.")
 
             endz = args["endz"] if "endz" in args and args["endz"] is not None else self.app.defaults["excellon_endz"]
+
             if "endxy" in args and args["endxy"]:
                 xy_end = args["endxy"]
             else:
                 if self.app.defaults["excellon_endxy"]:
                     xy_end = self.app.defaults["excellon_endxy"]
                 else:
-                    xy_end = (0, 0)
-
-            xy_end = ','.join([xy_end[0], xy_end[2]])
+                    xy_end = '0, 0'
+            if len(eval(xy_end)) != 2:
+                self.raise_tcl_error("The entered value for 'xy_end' needs to have the format x,y - no spaces or "
+                                     "in format (x, y) - spaces allowed. But always two comma separated values.")
 
             opt_type = args["opt_type"] if "opt_type" in args and args["opt_type"] else 'B'