- Gerber Editor - modifying it to work with the new geometric data structure
This commit is contained in:
parent
aaa81f22b2
commit
a614e2b73e
@ -2180,7 +2180,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
self.shapes.enabled = False
|
self.shapes.enabled = False
|
||||||
self.tool_shape.enabled = False
|
self.tool_shape.enabled = False
|
||||||
|
|
||||||
## List of selected shapes.
|
## List of selected geometric elements.
|
||||||
self.selected = []
|
self.selected = []
|
||||||
|
|
||||||
self.key = None # Currently pressed key
|
self.key = None # Currently pressed key
|
||||||
@ -2493,8 +2493,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
self.apsize_entry.set_value(size_val)
|
self.apsize_entry.set_value(size_val)
|
||||||
self.storage_dict[ap_id]['size'] = size_val
|
self.storage_dict[ap_id]['size'] = size_val
|
||||||
|
|
||||||
self.storage_dict[ap_id]['solid_geometry'] = []
|
self.storage_dict[ap_id]['geometry'] = []
|
||||||
self.storage_dict[ap_id]['follow_geometry'] = []
|
|
||||||
|
|
||||||
# self.olddia_newdia dict keeps the evidence on current aperture codes as keys and gets updated on values
|
# self.olddia_newdia dict keeps the evidence on current aperture codes as keys and gets updated on values
|
||||||
# each time a aperture code is edited or added
|
# each time a aperture code is edited or added
|
||||||
@ -2535,8 +2534,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
return
|
return
|
||||||
self.storage_dict[ap_id]['size'] = size_val
|
self.storage_dict[ap_id]['size'] = size_val
|
||||||
|
|
||||||
self.storage_dict[ap_id]['solid_geometry'] = []
|
self.storage_dict[ap_id]['geometry'] = []
|
||||||
self.storage_dict[ap_id]['follow_geometry'] = []
|
|
||||||
|
|
||||||
# self.olddia_newdia dict keeps the evidence on current aperture codes as keys and gets updated on values
|
# self.olddia_newdia dict keeps the evidence on current aperture codes as keys and gets updated on values
|
||||||
# each time a aperture code is edited or added
|
# each time a aperture code is edited or added
|
||||||
@ -2978,28 +2976,27 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
|
|
||||||
def job_thread(self, apid):
|
def job_thread(self, apid):
|
||||||
with self.app.proc_container.new(_("Adding aperture: %s geo ...") % str(apid)):
|
with self.app.proc_container.new(_("Adding aperture: %s geo ...") % str(apid)):
|
||||||
solid_storage_elem = []
|
storage_elem = []
|
||||||
follow_storage_elem = []
|
|
||||||
|
|
||||||
self.storage_dict[apid] = {}
|
self.storage_dict[apid] = {}
|
||||||
|
|
||||||
# add the Gerber geometry to editor storage
|
# add the Gerber geometry to editor storage
|
||||||
for k, v in self.gerber_obj.apertures[apid].items():
|
for k, v in self.gerber_obj.apertures[apid].items():
|
||||||
try:
|
try:
|
||||||
if k == 'solid_geometry':
|
if k == 'geometry':
|
||||||
for geo in v:
|
for el_dict in v:
|
||||||
if geo:
|
if el_dict:
|
||||||
self.add_gerber_shape(DrawToolShape(geo), solid_storage_elem)
|
new_el_dict = dict()
|
||||||
self.storage_dict[apid][k] = solid_storage_elem
|
if 'solid' in el_dict:
|
||||||
elif k == 'follow_geometry':
|
new_el_dict['solid'] =DrawToolShape(deepcopy(el_dict['solid']))
|
||||||
for geo in v:
|
if 'follow' in el_dict:
|
||||||
if geo is not None:
|
new_el_dict['follow'] =DrawToolShape(deepcopy(el_dict['follow']))
|
||||||
self.add_gerber_shape(DrawToolShape(geo), follow_storage_elem)
|
if 'clear' in el_dict:
|
||||||
self.storage_dict[apid][k] = follow_storage_elem
|
new_el_dict['clear'] =DrawToolShape(deepcopy(el_dict['clear']))
|
||||||
elif k == 'clear_geometry':
|
storage_elem.append(new_el_dict)
|
||||||
continue
|
self.add_gerber_shape(DrawToolShape(new_el_dict['solid']))
|
||||||
|
self.storage_dict[apid][k] = storage_elem
|
||||||
else:
|
else:
|
||||||
self.storage_dict[apid][k] = v
|
self.storage_dict[apid][k] = self.gerber_obj.apertures[apid][k]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.debug("FlatCAMGrbEditor.edit_fcgerber().job_thread() --> %s" % str(e))
|
log.debug("FlatCAMGrbEditor.edit_fcgerber().job_thread() --> %s" % str(e))
|
||||||
# Check promises and clear if exists
|
# Check promises and clear if exists
|
||||||
@ -3257,7 +3254,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
# Replot and reset tool.
|
# Replot and reset tool.
|
||||||
self.plot_all()
|
self.plot_all()
|
||||||
|
|
||||||
def add_gerber_shape(self, shape, storage):
|
def add_gerber_shape(self, shape):
|
||||||
"""
|
"""
|
||||||
Adds a shape to the shape storage.
|
Adds a shape to the shape storage.
|
||||||
|
|
||||||
@ -3269,7 +3266,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
|
|
||||||
if isinstance(shape, list):
|
if isinstance(shape, list):
|
||||||
for subshape in shape:
|
for subshape in shape:
|
||||||
self.add_gerber_shape(subshape, storage)
|
self.add_gerber_shape(subshape)
|
||||||
return
|
return
|
||||||
|
|
||||||
assert isinstance(shape, DrawToolShape), \
|
assert isinstance(shape, DrawToolShape), \
|
||||||
@ -3284,8 +3281,6 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
|
|
||||||
if isinstance(shape, DrawToolUtilityShape):
|
if isinstance(shape, DrawToolUtilityShape):
|
||||||
self.utility.append(shape)
|
self.utility.append(shape)
|
||||||
else:
|
|
||||||
storage.append(shape) # TODO: Check performance
|
|
||||||
|
|
||||||
def on_canvas_click(self, event):
|
def on_canvas_click(self, event):
|
||||||
"""
|
"""
|
||||||
@ -3590,20 +3585,21 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
|
|
||||||
for storage in self.storage_dict:
|
for storage in self.storage_dict:
|
||||||
try:
|
try:
|
||||||
for shape in self.storage_dict[storage]['solid_geometry']:
|
for elem in self.storage_dict[storage]['geometry']:
|
||||||
if shape.geo is None:
|
if elem['solid'].geo is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if shape in self.selected:
|
if elem['solid'] in self.selected:
|
||||||
self.plot_shape(geometry=shape.geo, color=self.app.defaults['global_sel_draw_color'],
|
self.plot_shape(geometry=elem['solid'].geo,
|
||||||
|
color=self.app.defaults['global_sel_draw_color'],
|
||||||
linewidth=2)
|
linewidth=2)
|
||||||
continue
|
continue
|
||||||
self.plot_shape(geometry=shape.geo, color=self.app.defaults['global_draw_color'])
|
self.plot_shape(geometry=elem['solid'].geo, color=self.app.defaults['global_draw_color'])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
for shape in self.utility:
|
for elem in self.utility:
|
||||||
self.plot_shape(geometry=shape.geo, linewidth=1)
|
self.plot_shape(geometry=elem['solid'].geo, linewidth=1)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self.shapes.redraw()
|
self.shapes.redraw()
|
||||||
@ -3708,28 +3704,28 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
self.build_ui()
|
self.build_ui()
|
||||||
self.app.inform.emit(_("[success] Done. Apertures geometry deleted."))
|
self.app.inform.emit(_("[success] Done. Apertures geometry deleted."))
|
||||||
|
|
||||||
def delete_shape(self, shape):
|
def delete_shape(self, geo_el):
|
||||||
self.is_modified = True
|
self.is_modified = True
|
||||||
|
|
||||||
if shape in self.utility:
|
if geo_el in self.utility:
|
||||||
self.utility.remove(shape)
|
self.utility.remove(geo_el)
|
||||||
return
|
return
|
||||||
|
|
||||||
for storage in self.storage_dict:
|
for storage in self.storage_dict:
|
||||||
try:
|
try:
|
||||||
if shape in self.storage_dict[storage]['solid_geometry']:
|
if geo_el in self.storage_dict[storage]['geometry']:
|
||||||
self.storage_dict[storage]['solid_geometry'].remove(shape)
|
self.storage_dict[storage]['geometry'].remove(geo_el)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
if shape in self.selected:
|
if geo_el in self.selected:
|
||||||
self.selected.remove(shape) # TODO: Check performance
|
self.selected.remove(geo_el) # TODO: Check performance
|
||||||
|
|
||||||
def delete_utility_geometry(self):
|
def delete_utility_geometry(self):
|
||||||
# for_deletion = [shape for shape in self.shape_buffer if shape.utility]
|
# for_deletion = [shape for shape in self.shape_buffer if shape.utility]
|
||||||
# for_deletion = [shape for shape in self.storage.get_objects() if shape.utility]
|
# for_deletion = [shape for shape in self.storage.get_objects() if shape.utility]
|
||||||
for_deletion = [shape for shape in self.utility]
|
for_deletion = [geo_el for geo_el in self.utility]
|
||||||
for shape in for_deletion:
|
for geo_el in for_deletion:
|
||||||
self.delete_shape(shape)
|
self.delete_shape(geo_el)
|
||||||
|
|
||||||
self.tool_shape.clear(update=True)
|
self.tool_shape.clear(update=True)
|
||||||
self.tool_shape.redraw()
|
self.tool_shape.redraw()
|
||||||
@ -3748,17 +3744,17 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
self.tools_gerber[toolname]["button"].setChecked(True)
|
self.tools_gerber[toolname]["button"].setChecked(True)
|
||||||
self.on_tool_select(toolname)
|
self.on_tool_select(toolname)
|
||||||
|
|
||||||
def set_selected(self, shape):
|
def set_selected(self, geo_el):
|
||||||
|
|
||||||
# Remove and add to the end.
|
# Remove and add to the end.
|
||||||
if shape in self.selected:
|
if geo_el in self.selected:
|
||||||
self.selected.remove(shape)
|
self.selected.remove(geo_el)
|
||||||
|
|
||||||
self.selected.append(shape)
|
self.selected.append(geo_el)
|
||||||
|
|
||||||
def set_unselected(self, shape):
|
def set_unselected(self, geo_el):
|
||||||
if shape in self.selected:
|
if geo_el in self.selected:
|
||||||
self.selected.remove(shape)
|
self.selected.remove(geo_el)
|
||||||
|
|
||||||
def on_array_type_combo(self):
|
def on_array_type_combo(self):
|
||||||
if self.array_type_combo.currentIndex() == 0:
|
if self.array_type_combo.currentIndex() == 0:
|
||||||
@ -3827,17 +3823,27 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
# I populated the combobox such that the index coincide with the join styles value (whcih is really an INT)
|
# I populated the combobox such that the index coincide with the join styles value (whcih is really an INT)
|
||||||
join_style = self.buffer_corner_cb.currentIndex() + 1
|
join_style = self.buffer_corner_cb.currentIndex() + 1
|
||||||
|
|
||||||
def buffer_recursion(geom, selection):
|
def buffer_recursion(geom_el, selection):
|
||||||
if type(geom) == list or type(geom) is MultiPolygon:
|
if type(geom_el) == list:
|
||||||
geoms = list()
|
geoms = list()
|
||||||
for local_geom in geom:
|
for local_geom in geom_el:
|
||||||
geoms.append(buffer_recursion(local_geom, selection=selection))
|
geoms.append(buffer_recursion(local_geom, selection=selection))
|
||||||
return geoms
|
return geoms
|
||||||
else:
|
else:
|
||||||
if geom in selection:
|
if geom_el in selection:
|
||||||
return DrawToolShape(geom.geo.buffer(buff_value, join_style=join_style))
|
buffered_geom_el = dict()
|
||||||
|
if 'solid' in geom_el:
|
||||||
|
buffered_geom_el['solid'] = DrawToolShape(geom_el['solid'].geo.buffer(buff_value,
|
||||||
|
join_style=join_style))
|
||||||
|
if 'follow' in geom_el:
|
||||||
|
buffered_geom_el['follow'] = DrawToolShape(geom_el['follow'].geo.buffer(buff_value,
|
||||||
|
join_style=join_style))
|
||||||
|
if 'clear' in geom_el:
|
||||||
|
buffered_geom_el['clear'] = DrawToolShape(geom_el['clear'].geo.buffer(buff_value,
|
||||||
|
join_style=join_style))
|
||||||
|
return buffered_geom_el
|
||||||
else:
|
else:
|
||||||
return geom
|
return geom_el
|
||||||
|
|
||||||
if not self.apertures_table.selectedItems():
|
if not self.apertures_table.selectedItems():
|
||||||
self.app.inform.emit(_(
|
self.app.inform.emit(_(
|
||||||
@ -3849,9 +3855,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
try:
|
try:
|
||||||
apid = self.apertures_table.item(x.row(), 1).text()
|
apid = self.apertures_table.item(x.row(), 1).text()
|
||||||
|
|
||||||
temp_storage = deepcopy(buffer_recursion(self.storage_dict[apid]['solid_geometry'], self.selected))
|
temp_storage = deepcopy(buffer_recursion(self.storage_dict[apid]['geometry'], self.selected))
|
||||||
self.storage_dict[apid]['solid_geometry'] = []
|
self.storage_dict[apid]['geometry'] = []
|
||||||
self.storage_dict[apid]['solid_geometry'] = temp_storage
|
self.storage_dict[apid]['geometry'] = temp_storage
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.debug("FlatCAMGrbEditor.buffer() --> %s" % str(e))
|
log.debug("FlatCAMGrbEditor.buffer() --> %s" % str(e))
|
||||||
@ -3874,17 +3880,28 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
"Add it and retry."))
|
"Add it and retry."))
|
||||||
return
|
return
|
||||||
|
|
||||||
def scale_recursion(geom, selection):
|
def scale_recursion(geom_el, selection):
|
||||||
if type(geom) == list or type(geom) is MultiPolygon:
|
if type(geom_el) == list:
|
||||||
geoms = list()
|
geoms = list()
|
||||||
for local_geom in geom:
|
for local_geom in geom_el:
|
||||||
geoms.append(scale_recursion(local_geom, selection=selection))
|
geoms.append(scale_recursion(local_geom, selection=selection))
|
||||||
return geoms
|
return geoms
|
||||||
else:
|
else:
|
||||||
if geom in selection:
|
if geom_el in selection:
|
||||||
return DrawToolShape(affinity.scale(geom.geo, scale_factor, scale_factor, origin='center'))
|
scaled_geom_el = dict()
|
||||||
|
if 'solid' in geom_el:
|
||||||
|
scaled_geom_el['solid'] = DrawToolShape(
|
||||||
|
affinity.scale(geom_el['solid'].geo, scale_factor, scale_factor, origin='center'))
|
||||||
|
if 'follow' in geom_el:
|
||||||
|
scaled_geom_el['follow'] = DrawToolShape(
|
||||||
|
affinity.scale(geom_el['follow'].geo, scale_factor, scale_factor, origin='center'))
|
||||||
|
if 'clear' in geom_el:
|
||||||
|
scaled_geom_el['clear'] = DrawToolShape(
|
||||||
|
affinity.scale(geom_el['clear'].geo, scale_factor, scale_factor, origin='center'))
|
||||||
|
|
||||||
|
return scaled_geom_el
|
||||||
else:
|
else:
|
||||||
return geom
|
return geom_el
|
||||||
|
|
||||||
if not self.apertures_table.selectedItems():
|
if not self.apertures_table.selectedItems():
|
||||||
self.app.inform.emit(_(
|
self.app.inform.emit(_(
|
||||||
@ -3896,9 +3913,9 @@ class FlatCAMGrbEditor(QtCore.QObject):
|
|||||||
try:
|
try:
|
||||||
apid = self.apertures_table.item(x.row(), 1).text()
|
apid = self.apertures_table.item(x.row(), 1).text()
|
||||||
|
|
||||||
temp_storage = deepcopy(scale_recursion(self.storage_dict[apid]['solid_geometry'], self.selected))
|
temp_storage = deepcopy(scale_recursion(self.storage_dict[apid]['geometry'], self.selected))
|
||||||
self.storage_dict[apid]['solid_geometry'] = []
|
self.storage_dict[apid]['geometry'] = []
|
||||||
self.storage_dict[apid]['solid_geometry'] = temp_storage
|
self.storage_dict[apid]['geometry'] = temp_storage
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.debug("FlatCAMGrbEditor.on_scale() --> %s" % str(e))
|
log.debug("FlatCAMGrbEditor.on_scale() --> %s" % str(e))
|
||||||
@ -4581,21 +4598,22 @@ class TransformEditorTool(FlatCAMTool):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def on_rotate_action(self, num):
|
def on_rotate_action(self, num):
|
||||||
shape_list = self.draw_app.selected
|
elem_list = self.draw_app.selected
|
||||||
xminlist = []
|
xminlist = []
|
||||||
yminlist = []
|
yminlist = []
|
||||||
xmaxlist = []
|
xmaxlist = []
|
||||||
ymaxlist = []
|
ymaxlist = []
|
||||||
|
|
||||||
if not shape_list:
|
if not elem_list:
|
||||||
self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!"))
|
self.app.inform.emit(_("[WARNING_NOTCL] No shape selected. Please Select a shape to rotate!"))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
with self.app.proc_container.new(_("Appying Rotate")):
|
with self.app.proc_container.new(_("Appying Rotate")):
|
||||||
try:
|
try:
|
||||||
# first get a bounding box to fit all
|
# first get a bounding box to fit all; we use only the 'solids' as those should provide the biggest
|
||||||
for sha in shape_list:
|
# bounding box
|
||||||
xmin, ymin, xmax, ymax = sha.bounds()
|
for geo_el in elem_list:
|
||||||
|
xmin, ymin, xmax, ymax = geo_el..bounds()
|
||||||
xminlist.append(xmin)
|
xminlist.append(xmin)
|
||||||
yminlist.append(ymin)
|
yminlist.append(ymin)
|
||||||
xmaxlist.append(xmax)
|
xmaxlist.append(xmax)
|
||||||
|
Loading…
Reference in New Issue
Block a user