- minor UI changes for Gerber UI
- after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected - fixed offset, rotate, scale, skew for follow_geometry. Fixed the move tool also. - fixed offset, rotate, scale, skew for 'solid_geometry' inside the self.apertures.
This commit is contained in:
parent
9f60df850e
commit
d79d6cf2bc
|
@ -365,6 +365,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
Represents Gerber code.
|
Represents Gerber code.
|
||||||
"""
|
"""
|
||||||
optionChanged = QtCore.pyqtSignal(str)
|
optionChanged = QtCore.pyqtSignal(str)
|
||||||
|
replotApertures = QtCore.pyqtSignal()
|
||||||
|
|
||||||
ui_type = GerberObjectUI
|
ui_type = GerberObjectUI
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -481,9 +483,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
FlatCAMObj.set_ui(self, ui)
|
FlatCAMObj.set_ui(self, ui)
|
||||||
|
|
||||||
FlatCAMApp.App.log.debug("FlatCAMGerber.set_ui()")
|
FlatCAMApp.App.log.debug("FlatCAMGerber.set_ui()")
|
||||||
|
|
||||||
|
self.replotApertures.connect(self.on_replot_apertures)
|
||||||
|
|
||||||
self.form_fields.update({
|
self.form_fields.update({
|
||||||
"plot": self.ui.plot_cb,
|
"plot": self.ui.plot_cb,
|
||||||
"multicolored": self.ui.multicolored_cb,
|
"multicolored": self.ui.multicolored_cb,
|
||||||
|
@ -694,12 +697,12 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
|
|
||||||
def on_mark_cb_click_table(self):
|
def on_mark_cb_click_table(self):
|
||||||
self.ui_disconnect()
|
self.ui_disconnect()
|
||||||
cw = self.sender()
|
# cw = self.sender()
|
||||||
cw_index = self.ui.apertures_table.indexAt(cw.pos())
|
# cw_index = self.ui.apertures_table.indexAt(cw.pos())
|
||||||
cw_row = cw_index.row()
|
# cw_row = cw_index.row()
|
||||||
check_row = 0
|
check_row = 0
|
||||||
|
|
||||||
self.mark_shapes.clear(update=True)
|
self.clear_plot_apertures()
|
||||||
for aperture in self.apertures:
|
for aperture in self.apertures:
|
||||||
# find the apertures_table row associated with the aperture
|
# find the apertures_table row associated with the aperture
|
||||||
for row in range(self.ui.apertures_table.rowCount()):
|
for row in range(self.ui.apertures_table.rowCount()):
|
||||||
|
@ -742,7 +745,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
# self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
|
# self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
|
||||||
self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True)
|
self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True)
|
||||||
else:
|
else:
|
||||||
self.mark_shapes.clear(update=True)
|
self.clear_plot_apertures()
|
||||||
|
|
||||||
self.ui_connect()
|
self.ui_connect()
|
||||||
|
|
||||||
|
@ -1056,7 +1059,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
# on hide disable all mark plots
|
# on hide disable all mark plots
|
||||||
for row in range(self.ui.apertures_table.rowCount()):
|
for row in range(self.ui.apertures_table.rowCount()):
|
||||||
self.ui.apertures_table.cellWidget(row, 5).set_value(False)
|
self.ui.apertures_table.cellWidget(row, 5).set_value(False)
|
||||||
self.mark_shapes.clear(update=True)
|
self.clear_plot_apertures()
|
||||||
|
|
||||||
def on_scale_aperture_click(self, signal):
|
def on_scale_aperture_click(self, signal):
|
||||||
try:
|
try:
|
||||||
|
@ -1322,10 +1325,19 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
|
||||||
self.app.progress.emit(100)
|
self.app.progress.emit(100)
|
||||||
|
|
||||||
except (ObjectDeleted, AttributeError):
|
except (ObjectDeleted, AttributeError):
|
||||||
self.mark_shapes.clear(update=True)
|
self.clear_plot_apertures()
|
||||||
|
|
||||||
self.app.worker_task.emit({'fcn': job_thread, 'params': [self]})
|
self.app.worker_task.emit({'fcn': job_thread, 'params': [self]})
|
||||||
|
|
||||||
|
def clear_plot_apertures(self):
|
||||||
|
self.mark_shapes.clear(update=True)
|
||||||
|
|
||||||
|
def clear_mark_all(self):
|
||||||
|
self.ui.mark_all_cb.set_value(False)
|
||||||
|
|
||||||
|
def on_replot_apertures(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
return {
|
return {
|
||||||
"options": self.options,
|
"options": self.options,
|
||||||
|
|
|
@ -398,7 +398,7 @@ class GerberObjectUI(ObjectUI):
|
||||||
self.generate_iso_button.setFixedWidth(90)
|
self.generate_iso_button.setFixedWidth(90)
|
||||||
hlay_1.addWidget(self.generate_iso_button)
|
hlay_1.addWidget(self.generate_iso_button)
|
||||||
|
|
||||||
hlay_1.addStretch()
|
# hlay_1.addStretch()
|
||||||
|
|
||||||
self.generate_ext_iso_button = QtWidgets.QPushButton('Ext Geo')
|
self.generate_ext_iso_button = QtWidgets.QPushButton('Ext Geo')
|
||||||
self.generate_ext_iso_button.setToolTip(
|
self.generate_ext_iso_button.setToolTip(
|
||||||
|
@ -406,7 +406,7 @@ class GerberObjectUI(ObjectUI):
|
||||||
"for isolation routing containing\n"
|
"for isolation routing containing\n"
|
||||||
"only the exteriors geometry."
|
"only the exteriors geometry."
|
||||||
)
|
)
|
||||||
# self.generate_ext_iso_button.setFixedWidth(60)
|
# self.generate_ext_iso_button.setFixedWidth(100)
|
||||||
hlay_1.addWidget(self.generate_ext_iso_button)
|
hlay_1.addWidget(self.generate_ext_iso_button)
|
||||||
|
|
||||||
self.generate_int_iso_button = QtWidgets.QPushButton('Int Geo')
|
self.generate_int_iso_button = QtWidgets.QPushButton('Int Geo')
|
||||||
|
@ -415,7 +415,7 @@ class GerberObjectUI(ObjectUI):
|
||||||
"for isolation routing containing\n"
|
"for isolation routing containing\n"
|
||||||
"only the interiors geometry."
|
"only the interiors geometry."
|
||||||
)
|
)
|
||||||
# self.generate_int_iso_button.setFixedWidth(60)
|
# self.generate_ext_iso_button.setFixedWidth(90)
|
||||||
hlay_1.addWidget(self.generate_int_iso_button)
|
hlay_1.addWidget(self.generate_int_iso_button)
|
||||||
|
|
||||||
# when the follow checkbox is checked then the exteriors and interiors isolation generation buttons
|
# when the follow checkbox is checked then the exteriors and interiors isolation generation buttons
|
||||||
|
|
10
README.md
10
README.md
|
@ -9,6 +9,16 @@ CAD program, and create G-Code for Isolation routing.
|
||||||
|
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
3.03.2019
|
||||||
|
|
||||||
|
- minor UI changes for Gerber UI
|
||||||
|
- after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected
|
||||||
|
|
||||||
|
02.03.2019
|
||||||
|
|
||||||
|
- fixed offset, rotate, scale, skew for follow_geometry. Fixed the move tool also.
|
||||||
|
- fixed offset, rotate, scale, skew for 'solid_geometry' inside the self.apertures.
|
||||||
|
|
||||||
28.02.2019
|
28.02.2019
|
||||||
|
|
||||||
- added a change that when a double click is performed in a object on canvas resulting in a selection, if the notebook is hidden then it will be displayed
|
- added a change that when a double click is performed in a object on canvas resulting in a selection, if the notebook is hidden then it will be displayed
|
||||||
|
|
34
camlib.py
34
camlib.py
|
@ -3227,6 +3227,7 @@ class Gerber (Geometry):
|
||||||
yfactor, origin=(px, py))
|
yfactor, origin=(px, py))
|
||||||
|
|
||||||
self.solid_geometry = scale_geom(self.solid_geometry)
|
self.solid_geometry = scale_geom(self.solid_geometry)
|
||||||
|
self.follow_geometry = scale_geom(self.follow_geometry)
|
||||||
|
|
||||||
# we need to scale the geometry stored in the Gerber apertures, too
|
# we need to scale the geometry stored in the Gerber apertures, too
|
||||||
try:
|
try:
|
||||||
|
@ -3237,6 +3238,7 @@ class Gerber (Geometry):
|
||||||
|
|
||||||
self.app.inform.emit("[success]Gerber Scale done.")
|
self.app.inform.emit("[success]Gerber Scale done.")
|
||||||
|
|
||||||
|
|
||||||
## solid_geometry ???
|
## solid_geometry ???
|
||||||
# It's a cascaded union of objects.
|
# It's a cascaded union of objects.
|
||||||
# self.solid_geometry = affinity.scale(self.solid_geometry, factor,
|
# self.solid_geometry = affinity.scale(self.solid_geometry, factor,
|
||||||
|
@ -3281,8 +3283,16 @@ class Gerber (Geometry):
|
||||||
return affinity.translate(obj, xoff=dx, yoff=dy)
|
return affinity.translate(obj, xoff=dx, yoff=dy)
|
||||||
|
|
||||||
## Solid geometry
|
## Solid geometry
|
||||||
# self.solid_geometry = affinity.translate(self.solid_geometry, xoff=dx, yoff=dy)
|
|
||||||
self.solid_geometry = offset_geom(self.solid_geometry)
|
self.solid_geometry = offset_geom(self.solid_geometry)
|
||||||
|
self.follow_geometry = offset_geom(self.follow_geometry)
|
||||||
|
|
||||||
|
# we need to offset the geometry stored in the Gerber apertures, too
|
||||||
|
try:
|
||||||
|
for apid in self.apertures:
|
||||||
|
self.apertures[apid]['solid_geometry'] = offset_geom(self.apertures[apid]['solid_geometry'])
|
||||||
|
except Exception as e:
|
||||||
|
log.debug('FlatCAMGeometry.offset() --> %s' % str(e))
|
||||||
|
|
||||||
self.app.inform.emit("[success]Gerber Offset done.")
|
self.app.inform.emit("[success]Gerber Offset done.")
|
||||||
|
|
||||||
def mirror(self, axis, point):
|
def mirror(self, axis, point):
|
||||||
|
@ -3320,6 +3330,14 @@ class Gerber (Geometry):
|
||||||
return affinity.scale(obj, xscale, yscale, origin=(px, py))
|
return affinity.scale(obj, xscale, yscale, origin=(px, py))
|
||||||
|
|
||||||
self.solid_geometry = mirror_geom(self.solid_geometry)
|
self.solid_geometry = mirror_geom(self.solid_geometry)
|
||||||
|
self.follow_geometry = mirror_geom(self.follow_geometry)
|
||||||
|
|
||||||
|
# we need to mirror the geometry stored in the Gerber apertures, too
|
||||||
|
try:
|
||||||
|
for apid in self.apertures:
|
||||||
|
self.apertures[apid]['solid_geometry'] = mirror_geom(self.apertures[apid]['solid_geometry'])
|
||||||
|
except Exception as e:
|
||||||
|
log.debug('FlatCAMGeometry.mirror() --> %s' % str(e))
|
||||||
|
|
||||||
# It's a cascaded union of objects.
|
# It's a cascaded union of objects.
|
||||||
# self.solid_geometry = affinity.scale(self.solid_geometry,
|
# self.solid_geometry = affinity.scale(self.solid_geometry,
|
||||||
|
@ -3353,7 +3371,14 @@ class Gerber (Geometry):
|
||||||
return affinity.skew(obj, angle_x, angle_y, origin=(px, py))
|
return affinity.skew(obj, angle_x, angle_y, origin=(px, py))
|
||||||
|
|
||||||
self.solid_geometry = skew_geom(self.solid_geometry)
|
self.solid_geometry = skew_geom(self.solid_geometry)
|
||||||
|
self.follow_geometry = skew_geom(self.follow_geometry)
|
||||||
|
|
||||||
|
# we need to skew the geometry stored in the Gerber apertures, too
|
||||||
|
try:
|
||||||
|
for apid in self.apertures:
|
||||||
|
self.apertures[apid]['solid_geometry'] = skew_geom(self.apertures[apid]['solid_geometry'])
|
||||||
|
except Exception as e:
|
||||||
|
log.debug('FlatCAMGeometry.skew() --> %s' % str(e))
|
||||||
# self.solid_geometry = affinity.skew(self.solid_geometry, angle_x, angle_y, origin=(px, py))
|
# self.solid_geometry = affinity.skew(self.solid_geometry, angle_x, angle_y, origin=(px, py))
|
||||||
|
|
||||||
def rotate(self, angle, point):
|
def rotate(self, angle, point):
|
||||||
|
@ -3376,7 +3401,14 @@ class Gerber (Geometry):
|
||||||
return affinity.rotate(obj, angle, origin=(px, py))
|
return affinity.rotate(obj, angle, origin=(px, py))
|
||||||
|
|
||||||
self.solid_geometry = rotate_geom(self.solid_geometry)
|
self.solid_geometry = rotate_geom(self.solid_geometry)
|
||||||
|
self.follow_geometry = rotate_geom(self.follow_geometry)
|
||||||
|
|
||||||
|
# we need to rotate the geometry stored in the Gerber apertures, too
|
||||||
|
try:
|
||||||
|
for apid in self.apertures:
|
||||||
|
self.apertures[apid]['solid_geometry'] = rotate_geom(self.apertures[apid]['solid_geometry'])
|
||||||
|
except Exception as e:
|
||||||
|
log.debug('FlatCAMGeometry.rotate() --> %s' % str(e))
|
||||||
# self.solid_geometry = affinity.rotate(self.solid_geometry, angle, origin=(px, py))
|
# self.solid_geometry = affinity.rotate(self.solid_geometry, angle, origin=(px, py))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -122,8 +122,12 @@ class ToolMove(FlatCAMTool):
|
||||||
else:
|
else:
|
||||||
for sel_obj in obj_list:
|
for sel_obj in obj_list:
|
||||||
|
|
||||||
|
# offset
|
||||||
sel_obj.offset((dx, dy))
|
sel_obj.offset((dx, dy))
|
||||||
sel_obj.plot()
|
sel_obj.plot()
|
||||||
|
sel_obj.clear_plot_apertures()
|
||||||
|
sel_obj.clear_mark_all()
|
||||||
|
|
||||||
# Update the object bounding box options
|
# Update the object bounding box options
|
||||||
a,b,c,d = sel_obj.bounds()
|
a,b,c,d = sel_obj.bounds()
|
||||||
sel_obj.options['xmin'] = a
|
sel_obj.options['xmin'] = a
|
||||||
|
|
|
@ -163,7 +163,7 @@ class Properties(FlatCAMTool):
|
||||||
printed_value = 'Present' if v else 'None'
|
printed_value = 'Present' if v else 'None'
|
||||||
self.addChild(geo_tool, [str(k), printed_value], True)
|
self.addChild(geo_tool, [str(k), printed_value], True)
|
||||||
elif k == 'data':
|
elif k == 'data':
|
||||||
tool_data = self.addParent(geo_tool, str(k).capilalize(),
|
tool_data = self.addParent(geo_tool, str(k).capitalize(),
|
||||||
color=QtGui.QColor("#000000"), font=font)
|
color=QtGui.QColor("#000000"), font=font)
|
||||||
for data_k, data_v in v.items():
|
for data_k, data_v in v.items():
|
||||||
self.addChild(tool_data, [str(data_k), str(data_v)], True)
|
self.addChild(tool_data, [str(data_k), str(data_v)], True)
|
||||||
|
|
Loading…
Reference in New Issue