- Tool Cutout - done handling the gaps thickness control for the rectangular cutout; TODO: check all app for the usage of geometry_spindledir and geometry_optimization_type defaults in tools and in options

This commit is contained in:
Marius Stanciu
2020-08-05 17:37:24 +03:00
parent b5f77eac1b
commit 14a9710a43
2 changed files with 66 additions and 7 deletions

View File

@@ -11,6 +11,7 @@ CHANGELOG for FlatCAM beta
- Tool Cutout - more work in gaps thickness control feature - Tool Cutout - more work in gaps thickness control feature
- Tool Cutout - added some icons to buttons - Tool Cutout - added some icons to buttons
- Tool Cutout - done handling the gaps thickness control for the rectangular cutout; TODO: check all app for the usage of geometry_spindledir and geometry_optimization_type defaults in tools and in options
4.08.2020 4.08.2020

View File

@@ -191,6 +191,7 @@ class CutOut(AppTool):
"spindlespeed": self.app.defaults["geometry_spindlespeed"], "spindlespeed": self.app.defaults["geometry_spindlespeed"],
"dwell": self.app.defaults["geometry_dwell"], "dwell": self.app.defaults["geometry_dwell"],
"dwelltime": float(self.app.defaults["geometry_dwelltime"]), "dwelltime": float(self.app.defaults["geometry_dwelltime"]),
"spindledir": self.app.defaults["geometry_spindledir"],
"ppname_g": self.app.defaults["geometry_ppname_g"], "ppname_g": self.app.defaults["geometry_ppname_g"],
"extracut": self.app.defaults["geometry_extracut"], "extracut": self.app.defaults["geometry_extracut"],
"extracut_length": float(self.app.defaults["geometry_extracut_length"]), "extracut_length": float(self.app.defaults["geometry_extracut_length"]),
@@ -203,6 +204,7 @@ class CutOut(AppTool):
"area_shape": self.app.defaults["geometry_area_shape"], "area_shape": self.app.defaults["geometry_area_shape"],
"area_strategy": self.app.defaults["geometry_area_strategy"], "area_strategy": self.app.defaults["geometry_area_strategy"],
"area_overz": float(self.app.defaults["geometry_area_overz"]), "area_overz": float(self.app.defaults["geometry_area_overz"]),
"optimization_type": self.app.defaults["geometry_optimization_type"],
# NCC # NCC
"tools_nccoperation": self.app.defaults["tools_nccoperation"], "tools_nccoperation": self.app.defaults["tools_nccoperation"],
@@ -518,6 +520,8 @@ class CutOut(AppTool):
def geo_init(geo_obj, app_obj): def geo_init(geo_obj, app_obj):
solid_geo = [] solid_geo = []
gaps_solid_geo = None
object_geo = cutout_obj.solid_geometry object_geo = cutout_obj.solid_geometry
def cutout_rect_handler(geom): def cutout_rect_handler(geom):
@@ -604,6 +608,10 @@ class CutOut(AppTool):
geo = geo.buffer(margin - abs(dia / 2)) geo = geo.buffer(margin - abs(dia / 2))
solid_geo = cutout_rect_handler(geom=geo) solid_geo = cutout_rect_handler(geom=geo)
if self.ui.thin_cb.get_value():
gaps_solid_geo = self.invert_cutout(geo, solid_geo)
else: else:
if cutout_obj.kind == 'geometry': if cutout_obj.kind == 'geometry':
try: try:
@@ -617,6 +625,11 @@ class CutOut(AppTool):
geom_struct = box(xmin, ymin, xmax, ymax) geom_struct = box(xmin, ymin, xmax, ymax)
solid_geo += cutout_rect_handler(geom=geom_struct) solid_geo += cutout_rect_handler(geom=geom_struct)
if self.ui.thin_cb.get_value():
try:
gaps_solid_geo += self.invert_cutout(geom_struct, solid_geo)
except TypeError:
gaps_solid_geo.append(self.invert_cutout(geom_struct, solid_geo))
elif cutout_obj.kind == 'gerber' and margin >= 0: elif cutout_obj.kind == 'gerber' and margin >= 0:
try: try:
__ = iter(object_geo) __ = iter(object_geo)
@@ -631,6 +644,11 @@ class CutOut(AppTool):
geom_struct = geom_struct.buffer(margin + abs(dia / 2)) geom_struct = geom_struct.buffer(margin + abs(dia / 2))
solid_geo += cutout_rect_handler(geom=geom_struct) solid_geo += cutout_rect_handler(geom=geom_struct)
if self.ui.thin_cb.get_value():
try:
gaps_solid_geo += self.invert_cutout(geom_struct, solid_geo)
except TypeError:
gaps_solid_geo.append(self.invert_cutout(geom_struct, solid_geo))
elif cutout_obj.kind == 'gerber' and margin < 0: elif cutout_obj.kind == 'gerber' and margin < 0:
app_obj.inform.emit( app_obj.inform.emit(
'[WARNING_NOTCL] %s' % _("Rectangular cutout with negative margin is not possible.")) '[WARNING_NOTCL] %s' % _("Rectangular cutout with negative margin is not possible."))
@@ -655,7 +673,7 @@ class CutOut(AppTool):
'offset_value': 0.0, 'offset_value': 0.0,
'type': _('Rough'), 'type': _('Rough'),
'tool_type': 'C1', 'tool_type': 'C1',
'data': self.default_data, 'data': deepcopy(self.default_data),
'solid_geometry': geo_obj.solid_geometry 'solid_geometry': geo_obj.solid_geometry
} }
}) })
@@ -665,6 +683,23 @@ class CutOut(AppTool):
geo_obj.tools[1]['data']['multidepth'] = self.ui.mpass_cb.get_value() geo_obj.tools[1]['data']['multidepth'] = self.ui.mpass_cb.get_value()
geo_obj.tools[1]['data']['depthperpass'] = self.ui.maxdepth_entry.get_value() geo_obj.tools[1]['data']['depthperpass'] = self.ui.maxdepth_entry.get_value()
if gaps_solid_geo is not None:
geo_obj.tools.update({
2: {
'tooldia': str(dia),
'offset': 'Path',
'offset_value': 0.0,
'type': _('Rough'),
'tool_type': 'C1',
'data': deepcopy(self.default_data),
'solid_geometry': gaps_solid_geo
}
})
geo_obj.tools[2]['data']['name'] = outname
geo_obj.tools[2]['data']['cutz'] = self.ui.thin_depth_entry.get_value()
geo_obj.tools[2]['data']['multidepth'] = self.ui.mpass_cb.get_value()
geo_obj.tools[2]['data']['depthperpass'] = self.ui.maxdepth_entry.get_value()
outname = cutout_obj.options["name"] + "_cutout" outname = cutout_obj.options["name"] + "_cutout"
ret = self.app.app_obj.new_object('geometry', outname, geo_init) ret = self.app.app_obj.new_object('geometry', outname, geo_init)
@@ -1138,7 +1173,7 @@ class CutOut(AppTool):
points = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)] points = [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]
# pathonly should be allways True, otherwise polygons are not subtracted # pathonly should be always True, otherwise polygons are not subtracted
flat_geometry = CutOut.flatten(geometry=solid_geo) flat_geometry = CutOut.flatten(geometry=solid_geo)
log.debug("%d paths" % len(flat_geometry)) log.debug("%d paths" % len(flat_geometry))
@@ -1154,6 +1189,26 @@ class CutOut(AppTool):
return unary_union(diffs) return unary_union(diffs)
@staticmethod
def invert_cutout(target_geo, subtractor_geo):
"""
:param target_geo:
:param subtractor_geo:
:return:
"""
flat_geometry = CutOut.flatten(geometry=target_geo)
toolgeo = cascaded_union(subtractor_geo)
diffs = []
for target in flat_geometry:
if type(target) == LineString or type(target) == LinearRing:
diffs.append(target.difference(toolgeo))
else:
log.warning("Not implemented.")
return unary_union(diffs)
@staticmethod @staticmethod
def intersect_poly_with_geo(solid_geo, pts, margin): def intersect_poly_with_geo(solid_geo, pts, margin):
""" """
@@ -1432,17 +1487,20 @@ class CutoutUI:
# Thin gaps # Thin gaps
self.thin_cb = FCCheckBox('%s:' % _("Thin gaps")) self.thin_cb = FCCheckBox('%s:' % _("Thin gaps"))
self.thin_cb.setToolTip( self.thin_cb.setToolTip(
_("Active only when multi depth is active.\n" _("Active only when multi depth is active (negative value)\n"
"If checked, the gaps will start at the specified depth.")) "If checked, it will mill de gaps until the specified depth."))
self.thin_depth_entry = FCDoubleSpinner(callback=self.confirmation_message) self.thin_depth_entry = FCDoubleSpinner(callback=self.confirmation_message)
self.thin_depth_entry.set_precision(self.decimals) self.thin_depth_entry.set_precision(self.decimals)
self.thin_depth_entry.setRange(0, 9999.9999) if machinist_setting == 0:
self.thin_depth_entry.setRange(-9999.9999, -0.00001)
else:
self.thin_depth_entry.setRange(-9999.9999, 9999.9999)
self.thin_depth_entry.setSingleStep(0.1) self.thin_depth_entry.setSingleStep(0.1)
self.thin_depth_entry.setToolTip( self.thin_depth_entry.setToolTip(
_("Active only when multi depth is active.\n" _("Active only when multi depth is active (negative value)\n"
"If checked, the gaps will start at the specified depth.")) "If checked, it will mill de gaps until the specified depth."))
grid0.addWidget(self.thin_cb, 12, 0) grid0.addWidget(self.thin_cb, 12, 0)
grid0.addWidget(self.thin_depth_entry, 12, 1) grid0.addWidget(self.thin_depth_entry, 12, 1)