I haven't had time to do any testing myself, but looked at the code and seems fine.

This commit is contained in:
jpcgt 2015-06-01 21:08:16 -05:00
commit d7fd72ec00
4 changed files with 87 additions and 18 deletions

View File

@ -181,6 +181,7 @@ class App(QtCore.QObject):
"gerber_isotooldia": self.defaults_form.gerber_group.iso_tool_dia_entry,
"gerber_isopasses": self.defaults_form.gerber_group.iso_width_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_cutoutmargin": self.defaults_form.gerber_group.cutout_margin_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_isopasses": self.options_form.gerber_group.iso_width_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_cutoutmargin": self.options_form.gerber_group.cutout_margin_entry,
"gerber_cutoutgapsize": self.options_form.gerber_group.cutout_gap_entry,
@ -332,6 +334,7 @@ class App(QtCore.QObject):
"gerber_isotooldia": 0.016,
"gerber_isopasses": 1,
"gerber_isooverlap": 0.15,
"gerber_combine_passes": True,
"gerber_cutouttooldia": 0.07,
"gerber_cutoutmargin": 0.1,
"gerber_cutoutgapsize": 0.15,
@ -1186,9 +1189,10 @@ class App(QtCore.QObject):
# self.options2form()
def on_delete(self):
"""
Delete the currently selected FlatCAMObj.
Delete the currently selected FlatCAMObjs.
:return: None
"""
@ -1196,10 +1200,13 @@ class App(QtCore.QObject):
self.log.debug("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
try:
#name = copy(self.collection.get_active().options["name"])
# Shouldn't need to copy. String are immutable.
name = self.collection.get_active().options["name"]
except AttributeError:
self.log.debug("Nothing selected for deletion")
@ -2094,7 +2101,8 @@ class App(QtCore.QObject):
types = {'dia': float,
'passes': int,
'overlap': float,
'outname': str}
'outname': str,
'combine': int}
for key in kwa:
if key not in types:
@ -2215,6 +2223,23 @@ class App(QtCore.QObject):
return "Object not found: %s" % obj_name
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():
output = ''
@ -2373,10 +2398,11 @@ class App(QtCore.QObject):
'isolate': {
'fcn': isolate,
'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"
" 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': {
'fcn': cutout,
@ -2480,6 +2506,14 @@ class App(QtCore.QObject):
'> geo_union <name>\n' +
' 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': {
'fcn': add_rectangle,
'help': 'Creates a rectange in the given Geometry object.\n' +

View File

@ -405,6 +405,12 @@ class GerberOptionsGroupUI(OptionsGroupUI):
grid1.addWidget(overlabel, 2, 0)
self.iso_overlap_entry = FloatEntry()
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
self.board_cutout_label = QtGui.QLabel("<b>Board cutout:</b>")

View File

@ -262,6 +262,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
"isotooldia": 0.016,
"isopasses": 1,
"isooverlap": 0.15,
"combine_passes": True,
"cutouttooldia": 0.07,
"cutoutmargin": 0.2,
"cutoutgapsize": 0.15,
@ -298,6 +299,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
"isotooldia": self.ui.iso_tool_dia_entry,
"isopasses": self.ui.iso_width_entry,
"isooverlap": self.ui.iso_overlap_entry,
"combine_passes":self.ui.combine_passes_cb,
"cutouttooldia": self.ui.cutout_tooldia_entry,
"cutoutmargin": self.ui.cutout_margin_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?
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.
@ -425,36 +427,55 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
:param outname: Base name of the output object
:return: None
"""
if dia is None:
dia = self.options["isotooldia"]
if passes is None:
passes = int(self.options["isopasses"])
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 = outname or base_name
for i in range(passes):
offset = (2 * i + 1) / 2.0 * dia - i * overlap
if passes > 1:
iso_name = base_name + str(i + 1)
else:
iso_name = base_name
if (combine):
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)
geo_obj.solid_geometry = []
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"])
# TODO: Do something if this is None. Offer changing name?
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):
if self.muted_ui:
return

View File

@ -560,6 +560,14 @@ class GerberObjectUI(ObjectUI):
self.iso_overlap_entry = FloatEntry()
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.setToolTip(
"Create the Geometry Object\n"