소스 검색

- refactoring in camlib.py. Made sure that some conditions are met, if some of the parameters are None then return failure. Modifications in generate_from_geometry_2 and generate_from_multitool_geometry methods

Marius Stanciu 5 년 전
부모
커밋
2c2db0efe2
2개의 변경된 파일56개의 추가작업 그리고 64개의 파일을 삭제
  1. 4 0
      CHANGELOG.md
  2. 52 64
      camlib.py

+ 4 - 0
CHANGELOG.md

@@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
 
 =================================================
 
+7.06.2020
+
+- refactoring in camlib.py. Made sure that some conditions are met, if some of the parameters are None then return failure. Modifications in generate_from_geometry_2 and generate_from_multitool_geometry methods
+
 6.06.2020
 
 - NCC Tool - added a message to warn the user that he needs at least one tool with clearing operation

+ 52 - 64
camlib.py

@@ -3745,23 +3745,28 @@ class CNCjob(Geometry):
         flat_geometry = self.flatten(temp_solid_geometry, pathonly=True)
         log.debug("%d paths" % len(flat_geometry))
 
-        self.tooldia = float(tooldia) if tooldia else None
+        try:
+            self.tooldia = float(tooldia)
+        except Exception as e:
+            self.app.inform.emit('[ERROR] %s\n%s' % (_("Failed."), str(e)))
+            return 'fail'
+
         self.z_cut = float(z_cut) if z_cut else None
         self.z_move = float(z_move) if z_move is not None else None
 
-        self.feedrate = float(feedrate) if feedrate else None
-        self.z_feedrate = float(feedrate_z) if feedrate_z is not None else None
-        self.feedrate_rapid = float(feedrate_rapid) if feedrate_rapid else None
+        self.feedrate = float(feedrate) if feedrate else  self.app.defaults["geometry_feedrate"]
+        self.z_feedrate = float(feedrate_z) if feedrate_z is not None else  self.app.defaults["geometry_feedrate_z"]
+        self.feedrate_rapid = float(feedrate_rapid) if feedrate_rapid else  self.app.defaults["geometry_feedrate_rapid"]
 
         self.spindlespeed = int(spindlespeed) if spindlespeed != 0 else None
         self.spindledir = spindledir
         self.dwell = dwell
-        self.dwelltime = float(dwelltime) if dwelltime else None
+        self.dwelltime = float(dwelltime) if dwelltime else  self.app.defaults["geometry_dwelltime"]
 
-        self.startz = float(startz) if startz is not None else None
-        self.z_end = float(endz) if endz is not None else None
+        self.startz = float(startz) if startz is not None else  self.app.defaults["geometry_startz"]
+        self.z_end = float(endz) if endz is not None else  self.app.defaults["geometry_endz"]
 
-        self.xy_end = re.sub('[()\[\]]', '', str(endxy)) if endxy else None
+        self.xy_end = re.sub('[()\[\]]', '', str(endxy)) if endxy else  self.app.defaults["geometry_endxy"]
 
         if self.xy_end and self.xy_end != '':
             self.xy_end = [float(eval(a)) for a in self.xy_end.split(",")]
@@ -3771,10 +3776,10 @@ class CNCjob(Geometry):
                                                    "in the format (x, y) but now there is only one value, not two."))
             return 'fail'
 
-        self.z_depthpercut = float(depthpercut) if depthpercut else None
+        self.z_depthpercut = float(depthpercut) if depthpercut else self.app.defaults["geometry_depthperpass"]
         self.multidepth = multidepth
 
-        self.z_toolchange = float(toolchangez) if toolchangez is not None else None
+        self.z_toolchange = float(toolchangez) if toolchangez is not None else self.app.defaults["geometry_toolchangez"]
 
         # it servers in the preprocessor file
         self.tool = tool_no
@@ -3783,7 +3788,8 @@ class CNCjob(Geometry):
             if toolchangexy == '':
                 self.xy_toolchange = None
             else:
-                self.xy_toolchange = re.sub('[()\[\]]', '', str(toolchangexy)) if toolchangexy else None
+                self.xy_toolchange = re.sub('[()\[\]]', '', str(toolchangexy)) \
+                    if toolchangexy else self.app.defaults["geometry_toolchangexy"]
 
                 if self.xy_toolchange and self.xy_toolchange != '':
                     self.xy_toolchange = [float(eval(a)) for a in self.xy_toolchange.split(",")]
@@ -3802,9 +3808,9 @@ class CNCjob(Geometry):
 
         if self.z_cut is None:
             if 'laser' not in self.pp_geometry_name:
-                self.app.inform.emit('[ERROR_NOTCL] %s' %
-                                     _("Cut_Z parameter is None or zero. Most likely a bad combinations of "
-                                       "other parameters."))
+                self.app.inform.emit(
+                    '[ERROR_NOTCL] %s' % _("Cut_Z parameter is None or zero. Most likely a bad combinations of "
+                                           "other parameters."))
                 return 'fail'
             else:
                 self.z_cut = 0
@@ -3959,9 +3965,7 @@ class CNCjob(Geometry):
                     total_cut = total_cut + geo.length
 
                     self.gcode += self.create_gcode_single_pass(geo, current_tooldia, extracut, extracut_length,
-                                                                tolerance,
-                                                                z_move=z_move, postproc=p,
-                                                                old_point=current_pt)
+                                                                tolerance, z_move=z_move, old_point=current_pt)
 
                 # --------- Multi-pass ---------
                 else:
@@ -3976,8 +3980,7 @@ class CNCjob(Geometry):
                     total_cut += (geo.length * nr_cuts)
 
                     self.gcode += self.create_gcode_multi_pass(geo, current_tooldia, extracut, extracut_length,
-                                                               tolerance,
-                                                               z_move=z_move, postproc=p,
+                                                               tolerance,  z_move=z_move, postproc=p,
                                                                old_point=current_pt)
 
                 # calculate the total distance
@@ -4009,14 +4012,12 @@ class CNCjob(Geometry):
         )
         return self.gcode
 
-    def generate_from_geometry_2(
-            self, geometry, append=True, tooldia=None, offset=0.0, tolerance=0, z_cut=None, z_move=None,
-            feedrate=None, feedrate_z=None, feedrate_rapid=None,
-            spindlespeed=None, spindledir='CW', dwell=False, dwelltime=None,
-            multidepth=False, depthpercut=None,
-            toolchange=False, toolchangez=None, toolchangexy="0.0, 0.0",
-            extracut=False, extracut_length=None, startz=None, endz=None, endxy='',
-            pp_geometry_name=None, tool_no=1):
+    def generate_from_geometry_2(self, geometry, append=True, tooldia=None, offset=0.0, tolerance=0, z_cut=None,
+                                 z_move=None, feedrate=None, feedrate_z=None, feedrate_rapid=None, spindlespeed=None,
+                                 spindledir='CW', dwell=False, dwelltime=None, multidepth=False, depthpercut=None,
+                                 toolchange=False, toolchangez=None, toolchangexy="0.0, 0.0", extracut=False,
+                                 extracut_length=None, startz=None, endz=None, endxy='', pp_geometry_name=None,
+                                 tool_no=1):
         """
         Second algorithm to generate from Geometry.
 
@@ -4126,7 +4127,7 @@ class CNCjob(Geometry):
         flat_geometry = self.flatten(temp_solid_geometry, pathonly=True)
         log.debug("%d paths" % len(flat_geometry))
 
-        default_dia = 0.01
+        default_dia = None
         if isinstance(self.app.defaults["geometry_cnctooldia"], float):
             default_dia = self.app.defaults["geometry_cnctooldia"]
         else:
@@ -4142,6 +4143,10 @@ class CNCjob(Geometry):
         except ValueError:
             self.tooldia = [float(el) for el in tooldia.split(',') if el != ''] if tooldia is not None else default_dia
 
+        if self.tooldia is None:
+            self.app.inform.emit('[ERROR] %s' % _("Failed."))
+            return 'fail'
+
         self.z_cut = float(z_cut) if z_cut is not None else self.app.defaults["geometry_cutz"]
         self.z_move = float(z_move) if z_move is not None else self.app.defaults["geometry_travelz"]
 
@@ -4186,11 +4191,9 @@ class CNCjob(Geometry):
                     self.xy_toolchange = [float(eval(a)) for a in self.xy_toolchange.split(",")]
 
                 if 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) \n"
-                          "but now there is only one value, not two. ")
-                    )
+                    msg = _("The Toolchange X,Y field in Edit -> Preferences has to be in the format (x, y)\n"
+                            "but now there is only one value, not two.")
+                    self.app.inform.emit('[ERROR] %s' % msg)
                     return 'fail'
         except Exception as e:
             log.debug("camlib.CNCJob.generate_from_geometry_2() --> %s" % str(e))
@@ -4369,9 +4372,7 @@ class CNCjob(Geometry):
                     # calculate the cut distance
                     total_cut += geo.length
                     self.gcode += self.create_gcode_single_pass(geo, current_tooldia, extracut, self.extracut_length,
-                                                                tolerance,
-                                                                z_move=z_move, postproc=p,
-                                                                old_point=current_pt)
+                                                                tolerance, z_move=z_move, old_point=current_pt)
 
                 # --------- Multi-pass ---------
                 else:
@@ -4386,8 +4387,7 @@ class CNCjob(Geometry):
                     total_cut += (geo.length * nr_cuts)
 
                     self.gcode += self.create_gcode_multi_pass(geo, current_tooldia, extracut, self.extracut_length,
-                                                               tolerance,
-                                                               z_move=z_move, postproc=p,
+                                                               tolerance, z_move=z_move, postproc=p,
                                                                old_point=current_pt)
 
                 # calculate the travel distance
@@ -4611,8 +4611,7 @@ class CNCjob(Geometry):
             gcode += self.doformat(p.lift_code)
         return gcode
 
-    def create_gcode_single_pass(self, geometry, cdia, extracut, extracut_length, tolerance, z_move, postproc,
-                                 old_point=(0, 0)):
+    def create_gcode_single_pass(self, geometry, cdia, extracut, extracut_length, tolerance, z_move, old_point=(0, 0)):
         """
         # G-code. Note: self.linear2gcode() and self.point2gcode() will lower and raise the tool every time.
 
@@ -4628,8 +4627,6 @@ class CNCjob(Geometry):
         :type tolerance:            float
         :param z_move:              Travel Z
         :type z_move:               float
-        :param postproc:            Preprocessor class
-        :type postproc:             class
         :param old_point:           Previous point
         :type old_point:            tuple
         :return:                    Gcode
@@ -4638,19 +4635,15 @@ class CNCjob(Geometry):
         # p = postproc
 
         if type(geometry) == LineString or type(geometry) == LinearRing:
-            if extracut is False:
-                gcode_single_pass = self.linear2gcode(geometry, z_move=z_move, dia=cdia, tolerance=tolerance,
+            if extracut is False or not geometry.is_ring:
+                gcode_single_pass = self.linear2gcode(geometry, cdia, z_move=z_move, tolerance=tolerance,
                                                       old_point=old_point)
             else:
-                if geometry.is_ring:
-                    gcode_single_pass = self.linear2gcode_extra(geometry, extracut_length, tolerance=tolerance,
-                                                                z_move=z_move, dia=cdia,
-                                                                old_point=old_point)
-                else:
-                    gcode_single_pass = self.linear2gcode(geometry, tolerance=tolerance, z_move=z_move, dia=cdia,
-                                                          old_point=old_point)
+                gcode_single_pass = self.linear2gcode_extra(geometry, cdia, extracut_length, tolerance=tolerance,
+                                                            z_move=z_move, old_point=old_point)
+
         elif type(geometry) == Point:
-            gcode_single_pass = self.point2gcode(geometry, dia=cdia, z_move=z_move, old_point=old_point)
+            gcode_single_pass = self.point2gcode(geometry, cdia, z_move=z_move, old_point=old_point)
         else:
             log.warning("G-code generation not implemented for %s" % (str(type(geometry))))
             return
@@ -4708,22 +4701,17 @@ class CNCjob(Geometry):
             # at the first point if the tool is down (in the material).  So, an extra G00 should show up but
             # is inconsequential.
             if type(geometry) == LineString or type(geometry) == LinearRing:
-                if extracut is False:
-                    gcode_multi_pass += self.linear2gcode(geometry, tolerance=tolerance, z_cut=depth, up=False,
-                                                          z_move=z_move, dia=cdia, old_point=old_point)
+                if extracut is False or not geometry.is_ring:
+                    gcode_multi_pass += self.linear2gcode(geometry, cdia, tolerance=tolerance, z_cut=depth, up=False,
+                                                          z_move=z_move, old_point=old_point)
                 else:
-                    if geometry.is_ring:
-                        gcode_multi_pass += self.linear2gcode_extra(geometry, extracut_length, tolerance=tolerance,
-                                                                    dia=cdia, z_move=z_move, z_cut=depth, up=False,
-                                                                    old_point=old_point)
-                    else:
-                        gcode_multi_pass += self.linear2gcode(geometry, tolerance=tolerance, z_cut=depth, up=False,
-                                                              dia=cdia, z_move=z_move,
-                                                              old_point=old_point)
+                    gcode_multi_pass += self.linear2gcode_extra(geometry, cdia, extracut_length, tolerance=tolerance,
+                                                                z_move=z_move, z_cut=depth, up=False,
+                                                                old_point=old_point)
 
             # Ignore multi-pass for points.
             elif type(geometry) == Point:
-                gcode_multi_pass += self.point2gcode(geometry, dia=cdia, z_move=z_move, old_point=old_point)
+                gcode_multi_pass += self.point2gcode(geometry, cdia, z_move=z_move, old_point=old_point)
                 break  # Ignoring ...
             else:
                 log.warning("G-code generation not implemented for %s" % (str(type(geometry))))