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)