Просмотр исходного кода

- 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 лет назад
Родитель
Сommit
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
 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
 - 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 != '':
                 if self.xy_toolchange and self.xy_toolchange != '':
                     self.xy_toolchange = [float(eval(a)) for a in self.xy_toolchange.split(",")]
                     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' %
                     self.app.inform.emit('[ERROR]%s' %
                                          _("The Toolchange X,Y field in Edit -> Preferences has to be "
                                          _("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. "))
                                            "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,
     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,
             feedrate=None, feedrate_z=None, feedrate_rapid=None, spindlespeed=None, dwell=None, dwelltime=None,
             multidepth=None, dpp=None, toolchange=None, toolchangez=None, toolchangexy=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):
             use_thread=True, plot=True):
         """
         """
         Only used by the TCL Command Cncjob.
         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 dpp:             Depth for each pass when multidepth parameter is True
         :param toolchange:
         :param toolchange:
         :param toolchangez:
         :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:
         :param extracut_length:
         :param extracut_length:
         :param startz:
         :param startz:
         :param endz:
         :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 pp:              Name of the preprocessor
         :param segx:
         :param segx:
         :param segy:
         :param segy:
@@ -2152,10 +2155,21 @@ class GeometryObject(FlatCAMObj, Geometry):
 
 
         startz = startz if startz is not None else self.options["startz"]
         startz = startz if startz is not None else self.options["startz"]
         endz = endz if endz is not None else float(self.options["endz"])
         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"])
         toolchangez = toolchangez if toolchangez else float(self.options["toolchangez"])
+
         toolchangexy = toolchangexy if toolchangexy else self.options["toolchangexy"]
         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"]
         toolchange = toolchange if toolchange else self.options["toolchange"]
 
 
         offset = offset if offset else 0.0
         offset = offset if offset else 0.0

+ 30 - 6
tclCommands/TclCommandCncjob.py

@@ -37,9 +37,10 @@ class TclCommandCncjob(TclCommandSignaled):
         ('extracut_length', float),
         ('extracut_length', float),
         ('dpp', float),
         ('dpp', float),
         ('toolchangez', float),
         ('toolchangez', float),
-        ('toolchangexy', tuple),
+        ('toolchangexy', str),
         ('startz', float),
         ('startz', float),
         ('endz', float),
         ('endz', float),
+        ('endxy', str),
         ('spindlespeed', int),
         ('spindlespeed', int),
         ('dwelltime', float),
         ('dwelltime', float),
         ('pp', str),
         ('pp', str),
@@ -65,9 +66,12 @@ class TclCommandCncjob(TclCommandSignaled):
             ('dpp', 'If present then use multidepth cnc cut. Height of one layer for multidepth.'),
             ('dpp', 'If present then use multidepth cnc cut. Height of one layer for multidepth.'),
             ('toolchangez', 'Z distance for toolchange (example: 30.0).\n'
             ('toolchangez', 'Z distance for toolchange (example: 30.0).\n'
                             'If used in the command then a toolchange event will be included in gcode'),
                             '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.'),
             ('startz', 'Height before the first move.'),
             ('endz', 'Height where the last move will park.'),
             ('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).'),
             ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
             ('dwelltime', 'Time to pause to allow the spindle to reach the full speed.\n'
             ('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'),
                           '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"]
             self.app.defaults["geometry_startz"]
         args["endz"] = args["endz"] if "endz" in args and args["endz"] else self.app.defaults["geometry_endz"]
         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
         args["spindlespeed"] = args["spindlespeed"] if "spindlespeed" in args and args["spindlespeed"] != 0 else None
 
 
         if 'dwelltime' in args:
         if 'dwelltime' in args:
@@ -180,13 +195,21 @@ class TclCommandCncjob(TclCommandSignaled):
             if args["toolchangez"] is not None:
             if args["toolchangez"] is not None:
                 args["toolchangez"] = args["toolchangez"]
                 args["toolchangez"] = args["toolchangez"]
             else:
             else:
-                args["toolchangez"] = obj.options["toolchangez"]
+                args["toolchangez"] = self.app.defaults["geometry_toolchangez"]
         else:
         else:
             args["toolchange"] = self.app.defaults["geometry_toolchange"]
             args["toolchange"] = self.app.defaults["geometry_toolchange"]
             args["toolchangez"] = self.app.defaults["geometry_toolchangez"]
             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']
         del args['name']
 
 
@@ -195,7 +218,7 @@ class TclCommandCncjob(TclCommandSignaled):
                 continue
                 continue
             else:
             else:
                 if args[arg] is None:
                 if args[arg] is None:
-                    print(arg, args[arg])
+                    print("None parameters: %s is None" % arg)
                     if muted is False:
                     if muted is False:
                         self.raise_tcl_error('One of the command parameters that have to be not None, is None.\n'
                         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'
                                              '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']['toolchangexy'] = args["toolchangexy"]
                     local_tools_dict[tool_uid]['data']['startz'] = args["startz"]
                     local_tools_dict[tool_uid]['data']['startz'] = args["startz"]
                     local_tools_dict[tool_uid]['data']['endz'] = args["endz"]
                     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']['spindlespeed'] = args["spindlespeed"]
                     local_tools_dict[tool_uid]['data']['dwell'] = args["dwell"]
                     local_tools_dict[tool_uid]['data']['dwell'] = args["dwell"]
                     local_tools_dict[tool_uid]['data']['dwelltime'] = args["dwelltime"]
                     local_tools_dict[tool_uid]['data']['dwelltime'] = args["dwelltime"]

+ 21 - 10
tclCommands/TclCommandDrillcncjob.py

@@ -37,10 +37,10 @@ class TclCommandDrillcncjob(TclCommandSignaled):
         ('feedrate_rapid', float),
         ('feedrate_rapid', float),
         ('spindlespeed', int),
         ('spindlespeed', int),
         ('toolchangez', float),
         ('toolchangez', float),
-        ('toolchangexy', tuple),
+        ('toolchangexy', str),
         ('startz', float),
         ('startz', float),
         ('endz', float),
         ('endz', float),
-        ('endxy', tuple),
+        ('endxy', str),
         ('dwelltime', float),
         ('dwelltime', float),
         ('pp', str),
         ('pp', str),
         ('opt_type', str),
         ('opt_type', str),
@@ -68,10 +68,12 @@ class TclCommandDrillcncjob(TclCommandSignaled):
             ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
             ('spindlespeed', 'Speed of the spindle in rpm (example: 4000).'),
             ('toolchangez', 'Z distance for toolchange (example: 30.0).\n'
             ('toolchangez', 'Z distance for toolchange (example: 30.0).\n'
                             'If used in the command then a toolchange event will be included in gcode'),
                             '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).'),
             ('startz', 'The Z coordinate at job start (example: 30.0).'),
             ('endz', 'The Z coordinate at job end (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'
             ('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'),
                           'If it is not used in command then it will not be included'),
             ('pp', 'This is the Excellon preprocessor name: case_sensitive, no_quotes'),
             ('pp', 'This is the Excellon preprocessor name: case_sensitive, no_quotes'),
@@ -230,20 +232,29 @@ class TclCommandDrillcncjob(TclCommandSignaled):
                 toolchange = self.app.defaults["excellon_toolchange"]
                 toolchange = self.app.defaults["excellon_toolchange"]
                 toolchangez = float(self.app.defaults["excellon_toolchangez"])
                 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"]
             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"]:
             if "endxy" in args and args["endxy"]:
                 xy_end = args["endxy"]
                 xy_end = args["endxy"]
             else:
             else:
                 if self.app.defaults["excellon_endxy"]:
                 if self.app.defaults["excellon_endxy"]:
                     xy_end = self.app.defaults["excellon_endxy"]
                     xy_end = self.app.defaults["excellon_endxy"]
                 else:
                 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'
             opt_type = args["opt_type"] if "opt_type" in args and args["opt_type"] else 'B'