- 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

This commit is contained in:
Marius Stanciu 2020-06-07 14:52:06 +03:00 committed by Marius
parent ea1b47bf89
commit 2c2db0efe2
2 changed files with 56 additions and 64 deletions

View File

@ -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 6.06.2020
- NCC Tool - added a message to warn the user that he needs at least one tool with clearing operation - NCC Tool - added a message to warn the user that he needs at least one tool with clearing operation

116
camlib.py
View File

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