From bc524684ab8bb0ab4e0bb0e8411ea4bf6c4b5008 Mon Sep 17 00:00:00 2001 From: phdussud Date: Tue, 26 May 2015 16:48:09 -0700 Subject: [PATCH] Implemented issue #137 --- FlatCAMApp.py | 11 ++++++++--- FlatCAMGUI.py | 6 ++++++ FlatCAMObj.py | 45 +++++++++++++++++++++++++++++++++------------ ObjectUI.py | 8 ++++++++ 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index b93d9324..d4044ff9 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -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, @@ -2098,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: @@ -2394,10 +2398,11 @@ class App(QtCore.QObject): 'isolate': { 'fcn': isolate, 'help': "Creates isolation routing geometry for the given Gerber.\n" + - "> isolate [-dia ] [-passes

] [-overlap ]\n" + + "> isolate [-dia ] [-passes

] [-overlap ] [-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, diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index ae1b46b4..5c3aaa3d 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -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("Board cutout:") diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 971cfbbd..3b4dd36c 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -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 diff --git a/ObjectUI.py b/ObjectUI.py index d0b6a6bc..3270d509 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -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"