I haven't had time to do any testing myself, but looked at the code and seems fine.
This commit is contained in:
@@ -181,6 +181,7 @@ class App(QtCore.QObject):
|
|||||||
"gerber_isotooldia": self.defaults_form.gerber_group.iso_tool_dia_entry,
|
"gerber_isotooldia": self.defaults_form.gerber_group.iso_tool_dia_entry,
|
||||||
"gerber_isopasses": self.defaults_form.gerber_group.iso_width_entry,
|
"gerber_isopasses": self.defaults_form.gerber_group.iso_width_entry,
|
||||||
"gerber_isooverlap": self.defaults_form.gerber_group.iso_overlap_entry,
|
"gerber_isooverlap": self.defaults_form.gerber_group.iso_overlap_entry,
|
||||||
|
"gerber_combine_passes": self.defaults_form.gerber_group.combine_passes_cb,
|
||||||
"gerber_cutouttooldia": self.defaults_form.gerber_group.cutout_tooldia_entry,
|
"gerber_cutouttooldia": self.defaults_form.gerber_group.cutout_tooldia_entry,
|
||||||
"gerber_cutoutmargin": self.defaults_form.gerber_group.cutout_margin_entry,
|
"gerber_cutoutmargin": self.defaults_form.gerber_group.cutout_margin_entry,
|
||||||
"gerber_cutoutgapsize": self.defaults_form.gerber_group.cutout_gap_entry,
|
"gerber_cutoutgapsize": self.defaults_form.gerber_group.cutout_gap_entry,
|
||||||
@@ -296,6 +297,7 @@ class App(QtCore.QObject):
|
|||||||
"gerber_isotooldia": self.options_form.gerber_group.iso_tool_dia_entry,
|
"gerber_isotooldia": self.options_form.gerber_group.iso_tool_dia_entry,
|
||||||
"gerber_isopasses": self.options_form.gerber_group.iso_width_entry,
|
"gerber_isopasses": self.options_form.gerber_group.iso_width_entry,
|
||||||
"gerber_isooverlap": self.options_form.gerber_group.iso_overlap_entry,
|
"gerber_isooverlap": self.options_form.gerber_group.iso_overlap_entry,
|
||||||
|
"gerber_combine_passes": self.options_form.gerber_group.combine_passes_cb,
|
||||||
"gerber_cutouttooldia": self.options_form.gerber_group.cutout_tooldia_entry,
|
"gerber_cutouttooldia": self.options_form.gerber_group.cutout_tooldia_entry,
|
||||||
"gerber_cutoutmargin": self.options_form.gerber_group.cutout_margin_entry,
|
"gerber_cutoutmargin": self.options_form.gerber_group.cutout_margin_entry,
|
||||||
"gerber_cutoutgapsize": self.options_form.gerber_group.cutout_gap_entry,
|
"gerber_cutoutgapsize": self.options_form.gerber_group.cutout_gap_entry,
|
||||||
@@ -332,6 +334,7 @@ class App(QtCore.QObject):
|
|||||||
"gerber_isotooldia": 0.016,
|
"gerber_isotooldia": 0.016,
|
||||||
"gerber_isopasses": 1,
|
"gerber_isopasses": 1,
|
||||||
"gerber_isooverlap": 0.15,
|
"gerber_isooverlap": 0.15,
|
||||||
|
"gerber_combine_passes": True,
|
||||||
"gerber_cutouttooldia": 0.07,
|
"gerber_cutouttooldia": 0.07,
|
||||||
"gerber_cutoutmargin": 0.1,
|
"gerber_cutoutmargin": 0.1,
|
||||||
"gerber_cutoutgapsize": 0.15,
|
"gerber_cutoutgapsize": 0.15,
|
||||||
@@ -1186,9 +1189,10 @@ class App(QtCore.QObject):
|
|||||||
|
|
||||||
# self.options2form()
|
# self.options2form()
|
||||||
|
|
||||||
|
|
||||||
def on_delete(self):
|
def on_delete(self):
|
||||||
"""
|
"""
|
||||||
Delete the currently selected FlatCAMObj.
|
Delete the currently selected FlatCAMObjs.
|
||||||
|
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
@@ -1196,10 +1200,13 @@ class App(QtCore.QObject):
|
|||||||
self.log.debug("on_delete()")
|
self.log.debug("on_delete()")
|
||||||
self.report_usage("on_delete")
|
self.report_usage("on_delete")
|
||||||
|
|
||||||
|
while (self.collection.get_active()):
|
||||||
|
self.delete_first_selected()
|
||||||
|
|
||||||
|
|
||||||
|
def delete_first_selected(self):
|
||||||
# Keep this for later
|
# Keep this for later
|
||||||
try:
|
try:
|
||||||
#name = copy(self.collection.get_active().options["name"])
|
|
||||||
# Shouldn't need to copy. String are immutable.
|
|
||||||
name = self.collection.get_active().options["name"]
|
name = self.collection.get_active().options["name"]
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
self.log.debug("Nothing selected for deletion")
|
self.log.debug("Nothing selected for deletion")
|
||||||
@@ -2094,7 +2101,8 @@ class App(QtCore.QObject):
|
|||||||
types = {'dia': float,
|
types = {'dia': float,
|
||||||
'passes': int,
|
'passes': int,
|
||||||
'overlap': float,
|
'overlap': float,
|
||||||
'outname': str}
|
'outname': str,
|
||||||
|
'combine': int}
|
||||||
|
|
||||||
for key in kwa:
|
for key in kwa:
|
||||||
if key not in types:
|
if key not in types:
|
||||||
@@ -2215,6 +2223,23 @@ class App(QtCore.QObject):
|
|||||||
return "Object not found: %s" % obj_name
|
return "Object not found: %s" % obj_name
|
||||||
|
|
||||||
obj.union()
|
obj.union()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def join_geometries (obj_name, *obj_names):
|
||||||
|
objs = []
|
||||||
|
for obj_n in obj_names:
|
||||||
|
obj = self.collection.get_by_name(str(obj_n))
|
||||||
|
if obj is None:
|
||||||
|
return "Object not found: %s" % obj_n
|
||||||
|
else:
|
||||||
|
objs.append (obj)
|
||||||
|
|
||||||
|
def initialize(obj, app):
|
||||||
|
FlatCAMGeometry.merge(objs, obj)
|
||||||
|
|
||||||
|
if objs is not None:
|
||||||
|
self.new_object("geometry", obj_name, initialize)
|
||||||
|
|
||||||
def make_docs():
|
def make_docs():
|
||||||
output = ''
|
output = ''
|
||||||
@@ -2373,10 +2398,11 @@ class App(QtCore.QObject):
|
|||||||
'isolate': {
|
'isolate': {
|
||||||
'fcn': isolate,
|
'fcn': isolate,
|
||||||
'help': "Creates isolation routing geometry for the given Gerber.\n" +
|
'help': "Creates isolation routing geometry for the given Gerber.\n" +
|
||||||
"> isolate <name> [-dia <d>] [-passes <p>] [-overlap <o>]\n" +
|
"> isolate <name> [-dia <d>] [-passes <p>] [-overlap <o>] [-combine 0|1]\n" +
|
||||||
" name: Name of the object\n"
|
" name: Name of the object\n"
|
||||||
" dia: Tool diameter\n passes: # of tool width\n" +
|
" dia: Tool diameter\n passes: # of tool width\n" +
|
||||||
" overlap: Fraction of tool diameter to overlap passes"
|
" overlap: Fraction of tool diameter to overlap passes" +
|
||||||
|
" combine: combine all passes into one geometry"
|
||||||
},
|
},
|
||||||
'cutout': {
|
'cutout': {
|
||||||
'fcn': cutout,
|
'fcn': cutout,
|
||||||
@@ -2480,6 +2506,14 @@ class App(QtCore.QObject):
|
|||||||
'> geo_union <name>\n' +
|
'> geo_union <name>\n' +
|
||||||
' name: Name of the geometry object.'
|
' name: Name of the geometry object.'
|
||||||
},
|
},
|
||||||
|
'join_geometries': {
|
||||||
|
'fcn': join_geometries,
|
||||||
|
'help': 'Runs a merge operation (join) on the geometry ' +
|
||||||
|
'objects.' +
|
||||||
|
'> join_geometries <out_name> <obj_name_0>....\n' +
|
||||||
|
' out_name: Name of the new geometry object.' +
|
||||||
|
' obj_name_0... names of the objects to join'
|
||||||
|
},
|
||||||
'add_rect': {
|
'add_rect': {
|
||||||
'fcn': add_rectangle,
|
'fcn': add_rectangle,
|
||||||
'help': 'Creates a rectange in the given Geometry object.\n' +
|
'help': 'Creates a rectange in the given Geometry object.\n' +
|
||||||
|
|||||||
@@ -405,6 +405,12 @@ class GerberOptionsGroupUI(OptionsGroupUI):
|
|||||||
grid1.addWidget(overlabel, 2, 0)
|
grid1.addWidget(overlabel, 2, 0)
|
||||||
self.iso_overlap_entry = FloatEntry()
|
self.iso_overlap_entry = FloatEntry()
|
||||||
grid1.addWidget(self.iso_overlap_entry, 2, 1)
|
grid1.addWidget(self.iso_overlap_entry, 2, 1)
|
||||||
|
|
||||||
|
self.combine_passes_cb = FCCheckBox(label='Combine Passes')
|
||||||
|
self.combine_passes_cb.setToolTip(
|
||||||
|
"Combine all passes into one object"
|
||||||
|
)
|
||||||
|
grid1.addWidget(self.combine_passes_cb, 3, 0)
|
||||||
|
|
||||||
## Board cuttout
|
## Board cuttout
|
||||||
self.board_cutout_label = QtGui.QLabel("<b>Board cutout:</b>")
|
self.board_cutout_label = QtGui.QLabel("<b>Board cutout:</b>")
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
|||||||
"isotooldia": 0.016,
|
"isotooldia": 0.016,
|
||||||
"isopasses": 1,
|
"isopasses": 1,
|
||||||
"isooverlap": 0.15,
|
"isooverlap": 0.15,
|
||||||
|
"combine_passes": True,
|
||||||
"cutouttooldia": 0.07,
|
"cutouttooldia": 0.07,
|
||||||
"cutoutmargin": 0.2,
|
"cutoutmargin": 0.2,
|
||||||
"cutoutgapsize": 0.15,
|
"cutoutgapsize": 0.15,
|
||||||
@@ -298,6 +299,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
|||||||
"isotooldia": self.ui.iso_tool_dia_entry,
|
"isotooldia": self.ui.iso_tool_dia_entry,
|
||||||
"isopasses": self.ui.iso_width_entry,
|
"isopasses": self.ui.iso_width_entry,
|
||||||
"isooverlap": self.ui.iso_overlap_entry,
|
"isooverlap": self.ui.iso_overlap_entry,
|
||||||
|
"combine_passes":self.ui.combine_passes_cb,
|
||||||
"cutouttooldia": self.ui.cutout_tooldia_entry,
|
"cutouttooldia": self.ui.cutout_tooldia_entry,
|
||||||
"cutoutmargin": self.ui.cutout_margin_entry,
|
"cutoutmargin": self.ui.cutout_margin_entry,
|
||||||
"cutoutgapsize": self.ui.cutout_gap_entry,
|
"cutoutgapsize": self.ui.cutout_gap_entry,
|
||||||
@@ -415,7 +417,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
|||||||
# TODO: Do something if this is None. Offer changing name?
|
# TODO: Do something if this is None. Offer changing name?
|
||||||
self.app.new_object("geometry", follow_name, follow_init)
|
self.app.new_object("geometry", follow_name, follow_init)
|
||||||
|
|
||||||
def isolate(self, dia=None, passes=None, overlap=None, outname=None):
|
def isolate(self, dia=None, passes=None, overlap=None, outname=None, combine=None):
|
||||||
"""
|
"""
|
||||||
Creates an isolation routing geometry object in the project.
|
Creates an isolation routing geometry object in the project.
|
||||||
|
|
||||||
@@ -425,36 +427,55 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
|||||||
:param outname: Base name of the output object
|
:param outname: Base name of the output object
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if dia is None:
|
if dia is None:
|
||||||
dia = self.options["isotooldia"]
|
dia = self.options["isotooldia"]
|
||||||
if passes is None:
|
if passes is None:
|
||||||
passes = int(self.options["isopasses"])
|
passes = int(self.options["isopasses"])
|
||||||
if overlap is None:
|
if overlap is None:
|
||||||
overlap = self.options["isooverlap"] * dia
|
overlap = self.options["isooverlap"]
|
||||||
|
if combine is None:
|
||||||
|
combine = self.options["combine_passes"]
|
||||||
|
else:
|
||||||
|
combine = bool(combine)
|
||||||
|
|
||||||
base_name = self.options["name"] + "_iso"
|
base_name = self.options["name"] + "_iso"
|
||||||
base_name = outname or base_name
|
base_name = outname or base_name
|
||||||
|
|
||||||
for i in range(passes):
|
if (combine):
|
||||||
|
iso_name = base_name
|
||||||
offset = (2 * i + 1) / 2.0 * dia - i * overlap
|
|
||||||
if passes > 1:
|
|
||||||
iso_name = base_name + str(i + 1)
|
|
||||||
else:
|
|
||||||
iso_name = base_name
|
|
||||||
|
|
||||||
# TODO: This is ugly. Create way to pass data into init function.
|
# TODO: This is ugly. Create way to pass data into init function.
|
||||||
def iso_init(geo_obj, app_obj):
|
def iso_init(geo_obj, app_obj):
|
||||||
# Propagate options
|
# Propagate options
|
||||||
geo_obj.options["cnctooldia"] = self.options["isotooldia"]
|
geo_obj.options["cnctooldia"] = self.options["isotooldia"]
|
||||||
|
geo_obj.solid_geometry = []
|
||||||
geo_obj.solid_geometry = self.isolation_geometry(offset)
|
for i in range(passes):
|
||||||
|
offset = (2 * i + 1) / 2.0 * dia - i * overlap * dia
|
||||||
|
geo_obj.solid_geometry.append(self.isolation_geometry(offset))
|
||||||
app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
|
app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
|
||||||
|
|
||||||
# TODO: Do something if this is None. Offer changing name?
|
# TODO: Do something if this is None. Offer changing name?
|
||||||
self.app.new_object("geometry", iso_name, iso_init)
|
self.app.new_object("geometry", iso_name, iso_init)
|
||||||
|
|
||||||
|
else:
|
||||||
|
for i in range(passes):
|
||||||
|
|
||||||
|
offset = (2 * i + 1) / 2.0 * dia - i * overlap * dia
|
||||||
|
if passes > 1:
|
||||||
|
iso_name = base_name + str(i + 1)
|
||||||
|
else:
|
||||||
|
iso_name = base_name
|
||||||
|
|
||||||
|
# TODO: This is ugly. Create way to pass data into init function.
|
||||||
|
def iso_init(geo_obj, app_obj):
|
||||||
|
# Propagate options
|
||||||
|
geo_obj.options["cnctooldia"] = self.options["isotooldia"]
|
||||||
|
geo_obj.solid_geometry = self.isolation_geometry(offset)
|
||||||
|
app_obj.info("Isolation geometry created: %s" % geo_obj.options["name"])
|
||||||
|
|
||||||
|
# TODO: Do something if this is None. Offer changing name?
|
||||||
|
self.app.new_object("geometry", iso_name, iso_init)
|
||||||
|
|
||||||
def on_plot_cb_click(self, *args):
|
def on_plot_cb_click(self, *args):
|
||||||
if self.muted_ui:
|
if self.muted_ui:
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -560,6 +560,14 @@ class GerberObjectUI(ObjectUI):
|
|||||||
self.iso_overlap_entry = FloatEntry()
|
self.iso_overlap_entry = FloatEntry()
|
||||||
grid1.addWidget(self.iso_overlap_entry, 2, 1)
|
grid1.addWidget(self.iso_overlap_entry, 2, 1)
|
||||||
|
|
||||||
|
# combine all passes CB
|
||||||
|
self.combine_passes_cb = FCCheckBox(label='Combine Passes')
|
||||||
|
self.combine_passes_cb.setToolTip(
|
||||||
|
"Combine all passes into one object"
|
||||||
|
)
|
||||||
|
grid1.addWidget(self.combine_passes_cb, 3, 0)
|
||||||
|
|
||||||
|
|
||||||
self.generate_iso_button = QtGui.QPushButton('Generate Geometry')
|
self.generate_iso_button = QtGui.QPushButton('Generate Geometry')
|
||||||
self.generate_iso_button.setToolTip(
|
self.generate_iso_button.setToolTip(
|
||||||
"Create the Geometry Object\n"
|
"Create the Geometry Object\n"
|
||||||
|
|||||||
Reference in New Issue
Block a user