From 6f884f4d646055d5384a1b336bfffe2961b59327 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Fri, 8 Oct 2021 01:53:36 +0300 Subject: [PATCH] - the Plugins object combo boxes are no longer updated on object selection on Project tab generally but only for the Plugin that is current, if any - in Corner Markers Plugin I added a new feature, ability to insert existing markers into external objects. Finished the work for external Gerbers and work in progress for the external Geometry --- CHANGELOG.md | 5 + appObjects/FlatCAMGerber.py | 3 + appPlugins/ToolCorners.py | 299 +++++++++++++++++++++++++++++++++--- appPlugins/ToolCutOut.py | 25 +-- appPlugins/ToolDblSided.py | 29 ++-- appPlugins/ToolDrilling.py | 23 ++- appPlugins/ToolFilm.py | 29 ++-- appPlugins/ToolFollow.py | 4 - appPlugins/ToolLevelling.py | 23 ++- appPlugins/ToolMilling.py | 31 ++-- appPlugins/ToolNCC.py | 23 ++- appPlugins/ToolPaint.py | 23 ++- appPlugins/ToolPanelize.py | 33 ++-- appPlugins/ToolSub.py | 25 +-- 14 files changed, 453 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a708f62a..b12148d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ CHANGELOG for FlatCAM beta ================================================= +8.10.2021 + +- the Plugins object combo boxes are no longer updated on object selection on Project tab generally but only for the Plugin that is current, if any +- in Corner Markers Plugin I added a new feature, ability to insert existing markers into external objects. Finished the work for external Gerbers and work in progress for the external Geometry + 7.10.2021 - updated the Turkish translation files (by Mehmet Kaya) diff --git a/appObjects/FlatCAMGerber.py b/appObjects/FlatCAMGerber.py index e13d8186..f201fafb 100644 --- a/appObjects/FlatCAMGerber.py +++ b/appObjects/FlatCAMGerber.py @@ -459,6 +459,7 @@ class GerberObject(FlatCAMObj, Gerber): if not self.options["noncopperrounded"]: bounding_box = bounding_box.envelope non_copper = bounding_box.difference(self.solid_geometry) + non_copper = flatten_shapely_geometry(non_copper) if non_copper is None or non_copper.is_empty: app_obj.inform.emit("[ERROR_NOTCL] %s" % _("Operation could not be done.")) @@ -489,6 +490,8 @@ class GerberObject(FlatCAMObj, Gerber): if bounding_box is None or bounding_box.is_empty: app_obj.inform.emit("[ERROR_NOTCL] %s" % _("Operation could not be done.")) return "fail" + + bounding_box = flatten_shapely_geometry(bounding_box) geo_obj.solid_geometry = bounding_box self.app.app_obj.new_object("geometry", name, geo_init) diff --git a/appPlugins/ToolCorners.py b/appPlugins/ToolCorners.py index f307c533..be544559 100644 --- a/appPlugins/ToolCorners.py +++ b/appPlugins/ToolCorners.py @@ -42,7 +42,8 @@ class ToolCorners(AppTool): self.units = '' # here we store the locations of the selected corners - self.points = {} + self.points = LoudDict() + self.points.set_change_callback(self.on_points_changed) # ############################################################################# # ######################### Tool GUI ########################################## @@ -66,6 +67,33 @@ class ToolCorners(AppTool): self.handlers_connected = False + def on_insert_type_changed(self, val): + obj_type = 2 if val == 'geo' else 0 + self.ui.obj_insert_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex())) + self.ui.obj_insert_combo.setCurrentIndex(0) + self.ui.obj_insert_combo.obj_type = { + "grb": "gerber", "geo": "geometry" + }[self.ui.insert_type_radio.get_value()] + + def on_object_selection_changed(self, current, previous): + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break + + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind + + if kind in ['gerber', 'geometry']: + obj_type = {'gerber': 'grb', 'geometry': 'geo'}[kind] + self.ui.insert_type_radio.set_value(obj_type) + self.ui.obj_insert_combo.set_value(name) + except Exception: + pass + def run(self, toggle=True): self.app.defaults.report_usage("ToolCorners()") @@ -136,6 +164,10 @@ class ToolCorners(AppTool): self.ui.drill_button.clicked.connect(self.on_create_drill_object) self.ui.check_button.clicked.connect(self.on_create_check_object) self.ui.mode_radio.activated_custom.connect(self.on_selection_changed) + self.ui.insert_type_radio.activated_custom.connect(self.on_insert_type_changed) + self.app.proj_selection_changed.connect(self.on_object_selection_changed) + + self.ui.insert_markers_button.clicked.connect(self.on_insert_markers_in_external_objects) def set_tool_ui(self): self.units = self.app.app_units @@ -153,6 +185,11 @@ class ToolCorners(AppTool): self.ui.drill_dia_entry.set_value(self.app.defaults["tools_corners_drill_dia"]) self.ui.mode_radio.set_value("a") + self.ui.insert_type_radio.set_value(val="grb") + + self.points.clear() + self.on_points_changed() + # SELECT THE CURRENT OBJECT obj = self.app.collection.get_active() if obj and obj.kind == 'gerber': @@ -195,6 +232,10 @@ class ToolCorners(AppTool): self.ui.drill_button.hide() self.ui.check_label.hide() self.ui.check_button.hide() + + self.ui.insert_label.hide() + self.ui.insert_frame.hide() + self.ui.insert_markers_button.hide() else: self.ui.level.setText('%s' % _('Advanced')) self.ui.level.setStyleSheet(""" @@ -210,6 +251,10 @@ class ToolCorners(AppTool): self.ui.check_label.show() self.ui.check_button.show() + self.ui.insert_label.show() + self.ui.insert_frame.show() + self.ui.insert_markers_button.show() + def on_toggle_all(self, val): self.ui.bl_cb.set_value(val) self.ui.br_cb.set_value(val) @@ -318,6 +363,18 @@ class ToolCorners(AppTool): :return: None """ + geo_list = self.create_marker_geometry(points_storage) + if geo_list == "fail" or not geo_list: + return "fail" + + assert isinstance(geo_list, list), 'Geometry list should be a list but the type is: %s' % str(type(geo_list)) + new_name = '%s_%s' % (str(self.grb_object.options['name']), 'corners') + + return_val = self.generate_gerber_obj_with_markers(new_grb_obj=g_obj, marker_geometry=geo_list, outname=new_name) + + return return_val + + def create_marker_geometry(self, points_storage): marker_type = self.ui.type_radio.get_value() line_thickness = self.ui.thick_entry.get_value() margin = self.ui.margin_entry.get_value() @@ -431,7 +488,23 @@ class ToolCorners(AppTool): self.app.log.warning("Not enough points.") return "fail" - new_apertures = deepcopy(g_obj.tools) + return geo_list + + def generate_gerber_obj_with_markers(self, new_grb_obj, marker_geometry, outname): + """ + + :param new_grb_obj: a Gerber App object + :type new_grb_obj: + :param marker_geometry: a list of Shapely geometries + :type marker_geometry: list + :param outname: the name for the new Gerber object + :type outname: str + :return: + :rtype: + """ + line_thickness = self.ui.thick_entry.get_value() + + new_apertures = deepcopy(new_grb_obj.tools) aperture_found = None for ap_id, ap_val in new_apertures.items(): @@ -441,7 +514,7 @@ class ToolCorners(AppTool): geo_buff_list = [] if aperture_found: - for geo in geo_list: + for geo in marker_geometry: geo_buff = geo.buffer(line_thickness / 2.0, resolution=self.grb_steps_per_circle, join_style=2) geo_buff_list.append(geo_buff) @@ -455,12 +528,12 @@ class ToolCorners(AppTool): new_apid = 10 new_apertures[new_apid] = { - 'type': 'C', - 'size': line_thickness, - 'geometry': [] + 'type': 'C', + 'size': line_thickness, + 'geometry': [] } - for geo in geo_list: + for geo in marker_geometry: geo_buff = geo.buffer(line_thickness / 2.0, resolution=self.grb_steps_per_circle, join_style=3) geo_buff_list.append(geo_buff) @@ -468,11 +541,11 @@ class ToolCorners(AppTool): new_apertures[new_apid]['geometry'].append(deepcopy(dict_el)) s_list = [] - if g_obj.solid_geometry: - if isinstance(g_obj.solid_geometry, MultiPolygon): - work_geo = g_obj.solid_geometry.geoms + if new_grb_obj.solid_geometry: + if isinstance(new_grb_obj.solid_geometry, MultiPolygon): + work_geo = new_grb_obj.solid_geometry.geoms else: - work_geo = g_obj.solid_geometry + work_geo = new_grb_obj.solid_geometry try: for poly in work_geo: s_list.append(poly) @@ -489,20 +562,18 @@ class ToolCorners(AppTool): except TypeError: s_list.append(geo_buff_list) - outname = '%s_%s' % (str(self.grb_object.options['name']), 'corners') - def initialize(grb_obj, app_obj): grb_obj.options = LoudDict() - for opt in g_obj.options: + for opt in new_grb_obj.options: if opt != 'name': - grb_obj.options[opt] = deepcopy(g_obj.options[opt]) + grb_obj.options[opt] = deepcopy(new_grb_obj.options[opt]) grb_obj.options['name'] = outname grb_obj.multitool = False grb_obj.multigeo = False - grb_obj.follow = deepcopy(g_obj.follow) + grb_obj.follow = deepcopy(new_grb_obj.follow) grb_obj.tools = new_apertures grb_obj.solid_geometry = flatten_shapely_geometry(unary_union(s_list)) - grb_obj.follow_geometry = flatten_shapely_geometry(g_obj.follow_geometry + geo_list) + grb_obj.follow_geometry = flatten_shapely_geometry(new_grb_obj.follow_geometry + marker_geometry) grb_obj.source_file = app_obj.f_handlers.export_gerber(obj_name=outname, filename=None, local_use=grb_obj, use_thread=False) @@ -511,6 +582,93 @@ class ToolCorners(AppTool): return ret + def generate_geo_obj_with_markers(self, new_geo_obj, marker_geometry, outname): + """ + + :param new_geo_obj: a Geometry App object + :type new_geo_obj: + :param marker_geometry: a list of Shapely geometries + :type marker_geometry: list + :param outname: the name for the new Geometry object + :type outname: str + :return: + :rtype: + """ + tooldia = self.ui.thick_entry.get_value() + + new_tools = deepcopy(new_geo_obj.tools) + tool_found = None + for tool, tool_dict in new_tools.items(): + if tool_dict['tooldia'] == tooldia: + tool_found = tool + break + + geo_buff_list = [] + if tool_found: + new_tools[tool_found]['solid_geometry'] += marker_geometry + else: + obj_tools = list(new_tools.keys()) + if obj_tools: + new_tool = max(obj_tools) + 1 + else: + new_tool = 1 + + new_data = {} + for opt_key in self.app.options: + if opt_key.find('geometry' + "_") == 0: + oname = opt_key[len('geometry') + 1:] + new_data[oname] = self.app.options[opt_key] + for opt_key in self.app.options: + if opt_key.find('tools_') == 0: + new_data[opt_key] = self.app.options[opt_key] + + new_tools = { + new_tool: { + 'tooldia': tooldia, + 'data': deepcopy(new_data), + 'solid_geometry': marker_geometry + } + } + + s_list = [] + if new_geo_obj.solid_geometry: + if isinstance(new_geo_obj.solid_geometry, MultiPolygon): + work_geo = new_geo_obj.solid_geometry.geoms + else: + work_geo = new_geo_obj.solid_geometry + try: + for poly in work_geo: + s_list.append(poly) + except TypeError: + s_list.append(work_geo) + + geo_buff_list = flatten_shapely_geometry(geo_buff_list) + + try: + for poly in geo_buff_list + marker_geometry: + s_list.append(poly) + except TypeError: + s_list.append(geo_buff_list) + + def initialize(geo_obj, app_obj): + geo_obj.options = LoudDict() + for opt in new_geo_obj.options: + if opt != 'name' and opt in geo_obj.options: + geo_obj.options[opt] = deepcopy(app_obj.options[opt]) + geo_obj.options['name'] = outname + + # Propagate options + geo_obj.options["tools_mill_tooldia"] = app_obj.defaults["tools_mill_tooldia"] + geo_obj.solid_geometry = flatten_shapely_geometry(unary_union(s_list)) + + geo_obj.multitool = False + geo_obj.multigeo = False + geo_obj.tools = new_tools + + ret = self.app.app_obj.new_object('geometry', outname, initialize, plot=True, autoselected=False) + + return ret + def on_create_drill_object(self): self.app.call_source = "corners_tool" @@ -737,6 +895,60 @@ class ToolCorners(AppTool): else: self.app.inform.emit('[success] %s' % _("Excellon object with corner drills created.")) + def on_insert_markers_in_external_objects(self): + obj_type = self.ui.insert_type_radio.get_value() # values in ["grb", "geo"] + + geo_list = self.create_marker_geometry(self.points) + if geo_list == "fail" or not geo_list: + self.app.inform.emit('[ERROR_NOTCL] %s' % _("Failed.")) + return + assert isinstance(geo_list, list), 'Geometry list should be a list but the type is: %s' % str( + type(geo_list)) + + if obj_type == 'grb': + # get the Gerber object on which the corner marker will be inserted + selection_index = self.ui.obj_insert_combo.currentIndex() + model_index = self.app.collection.index(selection_index, 0, self.ui.obj_insert_combo.rootModelIndex()) + + try: + new_grb_obj = model_index.internalPointer().obj + except Exception as e: + self.app.log.error("ToolCorners.on_insert_markers_in_external_objects() Gerber --> %s" % str(e)) + self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no Gerber object loaded ...")) + self.app.call_source = "app" + return + + new_name = '%s_%s' % (str(new_grb_obj.options['name']), 'corners') + return_val = self.generate_gerber_obj_with_markers(new_grb_obj=new_grb_obj, marker_geometry=geo_list, + outname=new_name) + else: + # get the Geometry object on which the corner marker will be inserted + geo_obj_name = self.ui.obj_insert_combo.get_value() + + try: + new_geo_obj = self.app.collection.get_by_name(geo_obj_name) + except Exception as e: + self.app.log.error("ToolCorners.on_insert_markers_in_external_objects() Geometry --> %s" % str(e)) + self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no Geometry object available.")) + self.app.call_source = "app" + return + + new_name = '%s_%s' % (str(new_geo_obj.options['name']), 'corners') + return_val = self.generate_geo_obj_with_markers(new_geo_obj=new_geo_obj, marker_geometry=geo_list, + outname=new_name) + if return_val == "fail": + self.app.inform.emit('[ERROR_NOTCL] %s' % _("Failed.")) + else: + self.app.inform.emit('[success] %s' % _("Done.")) + + def on_points_changed(self, *args): + if self.points: + self.ui.insert_frame.setDisabled(False) + self.ui.insert_markers_button.setDisabled(False) + else: + self.ui.insert_frame.setDisabled(True) + self.ui.insert_markers_button.setDisabled(True) + def replot(self, obj, run_thread=True): def worker_task(): with self.app.proc_container.new('%s ...' % _("Plotting")): @@ -1049,7 +1261,7 @@ class CornersUI: self.add_marker_button = FCButton(_("Add Marker")) self.add_marker_button.setIcon(QtGui.QIcon(self.app.resource_location + '/corners_32.png')) self.add_marker_button.setToolTip( - _("Will add corner markers to the selected Gerber file.") + _("Will add corner markers to the selected object.") ) self.add_marker_button.setStyleSheet(""" QPushButton @@ -1086,8 +1298,6 @@ class CornersUI: grid_drill.addWidget(self.drill_dia_label, 0, 0) grid_drill.addWidget(self.drill_dia_entry, 0, 1) - FCGridLayout.set_common_column_size([grid_sel, param_grid, grid_loc, grid_drill], 0) - # ## Create an Excellon object self.drill_button = FCButton(_("Create Excellon Object")) self.drill_button.setIcon(QtGui.QIcon(self.app.resource_location + '/drill32.png')) @@ -1105,7 +1315,6 @@ class CornersUI: # ############################################################################################################# # Check in Locations Frame # ############################################################################################################# - # Check in corners self.check_label = FCLabel('%s' % _('Check in Locations')) self.tools_box.addWidget(self.check_label) @@ -1126,6 +1335,54 @@ class CornersUI: """) self.tools_box.addWidget(self.check_button) + # ############################################################################################################# + # Insert Markers Frame + # ############################################################################################################# + self.insert_label = FCLabel('%s' % _('Insert Markers')) + self.tools_box.addWidget(self.insert_label) + + self.insert_frame = FCFrame() + self.tools_box.addWidget(self.insert_frame) + + insert_grid = FCGridLayout(v_spacing=5, h_spacing=3) + self.insert_frame.setLayout(insert_grid) + + self.insert_type_label = FCLabel('%s:' % _("Type")) + self.insert_type_label.setToolTip( + _("Specify the type of object where the markers are inserted.") + ) + + # Type of object into which to insert the markers + self.insert_type_radio = RadioSet([{'label': _('Gerber'), 'value': 'grb'}, + {'label': _('Geometry'), 'value': 'geo'}]) + + insert_grid.addWidget(self.insert_type_label, 0, 0) + insert_grid.addWidget(self.insert_type_radio, 0, 1) + + # The object into which to insert existing markers + self.obj_insert_combo = FCComboBox() + self.obj_insert_combo.setModel(self.app.collection) + self.obj_insert_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) + self.obj_insert_combo.is_last = False + + insert_grid.addWidget(self.obj_insert_combo, 2, 0, 1, 2) + + # Insert Markers + self.insert_markers_button = FCButton(_("Insert Marker")) + self.insert_markers_button.setIcon(QtGui.QIcon(self.app.resource_location + '/corners_32.png')) + self.insert_markers_button.setToolTip( + _("Will add corner markers to the selected object.") + ) + self.insert_markers_button.setStyleSheet(""" + QPushButton + { + font-weight: bold; + } + """) + self.tools_box.addWidget(self.insert_markers_button) + + FCGridLayout.set_common_column_size([grid_sel, param_grid, grid_loc, grid_drill, insert_grid], 0) + self.layout.addStretch(1) # ## Reset Tool diff --git a/appPlugins/ToolCutOut.py b/appPlugins/ToolCutOut.py index 3deb1685..647bffd1 100644 --- a/appPlugins/ToolCutOut.py +++ b/appPlugins/ToolCutOut.py @@ -112,17 +112,24 @@ class CutOut(AppTool): self.ui.convex_box_cb.setDisabled(True) def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind in ['gerber', 'geometry']: - obj_type = {'gerber': 'grb', 'geometry': 'geo'}[kind] - self.ui.type_obj_radio.set_value(obj_type) + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind - self.ui.obj_combo.set_value(name) - except IndexError: - pass + if kind in ['gerber', 'geometry']: + obj_type = {'gerber': 'grb', 'geometry': 'geo'}[kind] + self.ui.type_obj_radio.set_value(obj_type) + + self.ui.obj_combo.set_value(name) + except IndexError: + pass def run(self, toggle=True): self.app.defaults.report_usage("ToolCutOut()") diff --git a/appPlugins/ToolDblSided.py b/appPlugins/ToolDblSided.py index 2b063cb8..d3dddd5e 100644 --- a/appPlugins/ToolDblSided.py +++ b/appPlugins/ToolDblSided.py @@ -271,20 +271,27 @@ class DblSidedTool(AppTool): "grb": "Gerber", "exc": "Excellon", "geo": "Geometry"}[val] def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind in ['gerber', 'excellon', 'geometry']: - index = {'gerber': 0, 'excellon': 1, 'geometry': 2}[kind] - self.ui.object_type_combo.set_value(index) + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind - obj_type = {'gerber': 'grb', 'excellon': 'exc', 'geometry': 'geo'}[kind] - self.ui.box_type_radio.set_value(obj_type) + if kind in ['gerber', 'excellon', 'geometry']: + index = {'gerber': 0, 'excellon': 1, 'geometry': 2}[kind] + self.ui.object_type_combo.set_value(index) - self.ui.object_combo.set_value(name) - except Exception as err: - self.app.log.error("DblSidedTool.on_object_selection_changed() --> %s" % str(err)) + obj_type = {'gerber': 'grb', 'excellon': 'exc', 'geometry': 'geo'}[kind] + self.ui.box_type_radio.set_value(obj_type) + + self.ui.object_combo.set_value(name) + except Exception as err: + self.app.log.error("DblSidedTool.on_object_selection_changed() --> %s" % str(err)) def on_create_alignment_holes(self): align_type = self.ui.align_type_radio.get_value() diff --git a/appPlugins/ToolDrilling.py b/appPlugins/ToolDrilling.py index a125d1cd..9f21e50a 100644 --- a/appPlugins/ToolDrilling.py +++ b/appPlugins/ToolDrilling.py @@ -968,14 +968,21 @@ class ToolDrilling(AppTool, Excellon): self.ui.generate_cnc_button.setDisabled(False) def on_object_selection_changed(self, current, previous): - try: - sel_obj = current.indexes()[0].internalPointer().obj - name = sel_obj.options['name'] - kind = sel_obj.kind - if kind in ['geometry', 'excellon']: - self.ui.object_combo.set_value(name) - except Exception: - pass + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break + + if found_idx: + try: + sel_obj = current.indexes()[0].internalPointer().obj + name = sel_obj.options['name'] + kind = sel_obj.kind + if kind in ['geometry', 'excellon']: + self.ui.object_combo.set_value(name) + except Exception: + pass def ui_connect(self): diff --git a/appPlugins/ToolFilm.py b/appPlugins/ToolFilm.py index 42532c58..e9e89883 100644 --- a/appPlugins/ToolFilm.py +++ b/appPlugins/ToolFilm.py @@ -79,19 +79,26 @@ class Film(AppTool): }[self.ui.tf_type_obj_combo.get_value()] def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind in ['gerber', 'geometry']: - obj_type = {'gerber': 'grb', 'geometry': 'geo'}[kind] - self.ui.tf_type_obj_combo.set_value(obj_type) - self.ui.tf_type_box_combo.set_value(obj_type) + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind - self.ui.tf_object_combo.set_value(name) - self.ui.tf_box_combo.set_value(name) - except Exception: - pass + if kind in ['gerber', 'geometry']: + obj_type = {'gerber': 'grb', 'geometry': 'geo'}[kind] + self.ui.tf_type_obj_combo.set_value(obj_type) + self.ui.tf_type_box_combo.set_value(obj_type) + + self.ui.tf_object_combo.set_value(name) + self.ui.tf_box_combo.set_value(name) + except Exception: + pass def run(self, toggle=True): self.app.defaults.report_usage("ToolFilm()") diff --git a/appPlugins/ToolFollow.py b/appPlugins/ToolFollow.py index 84d56690..8ece35d8 100644 --- a/appPlugins/ToolFollow.py +++ b/appPlugins/ToolFollow.py @@ -321,10 +321,6 @@ class ToolFollow(AppTool, Gerber): new_obj.tools = { 1: { 'tooldia': app_obj.dec_format(float(tools_list[0]), self.decimals), - 'offset': 'Path', - 'offset_value': 0.0, - 'type': 'Rough', - 'tool_type': 'C1', 'data': deepcopy(new_data), 'solid_geometry': new_obj.solid_geometry } diff --git a/appPlugins/ToolLevelling.py b/appPlugins/ToolLevelling.py index ce2730dd..f8ba257b 100644 --- a/appPlugins/ToolLevelling.py +++ b/appPlugins/ToolLevelling.py @@ -360,15 +360,22 @@ class ToolLevelling(AppTool, CNCjob): self.ui.al_frame.setDisabled(True) def on_object_selection_changed(self, current, previous): - try: - sel_obj = current.indexes()[0].internalPointer().obj - name = sel_obj.options['name'] - kind = sel_obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind == 'cncjob': - self.ui.object_combo.set_value(name) - except IndexError: - pass + if found_idx: + try: + sel_obj = current.indexes()[0].internalPointer().obj + name = sel_obj.options['name'] + kind = sel_obj.kind + + if kind == 'cncjob': + self.ui.object_combo.set_value(name) + except IndexError: + pass def change_level(self, level): """ diff --git a/appPlugins/ToolMilling.py b/appPlugins/ToolMilling.py index a576f88e..53002d61 100644 --- a/appPlugins/ToolMilling.py +++ b/appPlugins/ToolMilling.py @@ -1340,19 +1340,26 @@ class ToolMilling(AppTool, Excellon): self.ui.generate_cnc_button.setDisabled(True) def on_object_selection_changed(self, current, previous): - try: - sel_obj = current.indexes()[0].internalPointer().obj - name = sel_obj.options['name'] - kind = sel_obj.kind - if kind == 'excellon': - self.ui.target_radio.set_value('exc') - self.ui.object_combo.set_value(name) + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind == 'geometry': - self.ui.target_radio.set_value('geo') - self.ui.object_combo.set_value(name) - except Exception: - pass + if found_idx: + try: + sel_obj = current.indexes()[0].internalPointer().obj + name = sel_obj.options['name'] + kind = sel_obj.kind + if kind == 'excellon': + self.ui.target_radio.set_value('exc') + self.ui.object_combo.set_value(name) + + if kind == 'geometry': + self.ui.target_radio.set_value('geo') + self.ui.object_combo.set_value(name) + except Exception: + pass def on_job_changed(self, idx): if self.ui.target_radio.get_value() == 'geo': diff --git a/appPlugins/ToolNCC.py b/appPlugins/ToolNCC.py index 1f3c4ef9..e69a3596 100644 --- a/appPlugins/ToolNCC.py +++ b/appPlugins/ToolNCC.py @@ -516,16 +516,23 @@ class NonCopperClear(AppTool, Gerber): return def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind in ['gerber', 'geometry']: - self.ui.type_obj_radio.set_value(kind) + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind - self.ui.object_combo.set_value(name) - except Exception: - pass + if kind in ['gerber', 'geometry']: + self.ui.type_obj_radio.set_value(kind) + + self.ui.object_combo.set_value(name) + except Exception: + pass def on_toggle_all_rows(self): """ diff --git a/appPlugins/ToolPaint.py b/appPlugins/ToolPaint.py index 2362deeb..afaa1128 100644 --- a/appPlugins/ToolPaint.py +++ b/appPlugins/ToolPaint.py @@ -533,16 +533,23 @@ class ToolPaint(AppTool, Gerber): self.update_ui() def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind in ['gerber', 'geometry']: - self.ui.type_obj_radio.set_value(kind) + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind - self.ui.obj_combo.set_value(name) - except Exception: - pass + if kind in ['gerber', 'geometry']: + self.ui.type_obj_radio.set_value(kind) + + self.ui.obj_combo.set_value(name) + except Exception: + pass def update_ui(self): self.blockSignals(True) diff --git a/appPlugins/ToolPanelize.py b/appPlugins/ToolPanelize.py index 0429ec15..ccb137bd 100644 --- a/appPlugins/ToolPanelize.py +++ b/appPlugins/ToolPanelize.py @@ -242,22 +242,29 @@ class Panelize(AppTool): self.ui.box_combo.setDisabled(True) def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind in ['gerber', 'excellon', 'geometry']: - obj_type = { - "gerber": _("Gerber"), "excellon": _("Excellon"), "geometry": _("Geometry") - }[kind] + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind - self.ui.type_obj_combo.set_value(obj_type) - self.ui.type_box_combo.set_value(obj_type) + if kind in ['gerber', 'excellon', 'geometry']: + obj_type = { + "gerber": _("Gerber"), "excellon": _("Excellon"), "geometry": _("Geometry") + }[kind] - self.ui.object_combo.set_value(name) - self.ui.box_combo.set_value(name) - except Exception: - pass + self.ui.type_obj_combo.set_value(obj_type) + self.ui.type_box_combo.set_value(obj_type) + + self.ui.object_combo.set_value(name) + self.ui.box_combo.set_value(name) + except Exception: + pass def change_level(self, level): """ diff --git a/appPlugins/ToolSub.py b/appPlugins/ToolSub.py index 4c8db88c..bf678f6e 100644 --- a/appPlugins/ToolSub.py +++ b/appPlugins/ToolSub.py @@ -165,16 +165,23 @@ class ToolSub(AppTool): self.app.ui.notebook.setTabText(2, _("Subtract")) def on_object_selection_changed(self, current, previous): - try: - name = current.indexes()[0].internalPointer().obj.options['name'] - kind = current.indexes()[0].internalPointer().obj.kind + found_idx = None + for tab_idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.tabText(tab_idx) == self.ui.pluginName: + found_idx = True + break - if kind == 'gerber': - self.ui.target_gerber_combo.set_value(name) - if kind == 'geometry': - self.ui.target_geo_combo.set_value(name) - except Exception: - pass + if found_idx: + try: + name = current.indexes()[0].internalPointer().obj.options['name'] + kind = current.indexes()[0].internalPointer().obj.kind + + if kind == 'gerber': + self.ui.target_gerber_combo.set_value(name) + if kind == 'geometry': + self.ui.target_geo_combo.set_value(name) + except Exception: + pass def connect_signals_at_init(self): self.ui.level.toggled.connect(self.on_level_changed)