- in Doublesided Tool added some UI for Excellon hole snapping

This commit is contained in:
Marius Stanciu 2020-08-18 15:30:33 +03:00
parent 45479eee8d
commit d1733f1e1d
4 changed files with 110 additions and 44 deletions

View File

@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
=================================================
18.08.2020
- in Doublesided Tool added some UI for Excellon hole snapping
17.08.2020
- in CNCJob UI Autolevelling - GRBL GUI controls are now organized in a tab widget

View File

@ -80,13 +80,21 @@ class Tools2sidedPrefGroupUI(OptionsGroupUI):
grid0.addWidget(self.mirror_axis_radio, 3, 1)
# ## Axis Location
self.axis_location_radio = RadioSet([{'label': _('Point'), 'value': 'point'},
{'label': _('Box'), 'value': 'box'}])
self.axis_location_radio = RadioSet(
[
{'label': _('Point'), 'value': 'point'},
{'label': _('Box'), 'value': 'box'},
{'label': _('Hole Snap'), 'value': 'hole'},
]
)
self.axloc_label = QtWidgets.QLabel('%s:' % _("Axis Ref"))
self.axloc_label.setToolTip(
_("The axis should pass through a <b>point</b> or cut\n "
"a specified <b>box</b> (in a FlatCAM object) through \n"
"the center.")
_("The coordinates used as reference for the mirror operation.\n"
"Can be:\n"
"- Point -> a set of coordinates (x,y) around which the object is mirrored\n"
"- Box -> a set of coordinates (x, y) obtained from the center of the\n"
"bounding box of another object selected below\n"
"- Hole Snap-> a point defined by the center of a drill hone in a Excellon object")
)
grid0.addWidget(self.axloc_label, 4, 0)

View File

@ -691,12 +691,13 @@ class CNCJobObject(FlatCAMObj, CNCjob):
self.mouse_events_connected = True
# self.calculate_voronoi_diagram()
self.calculate_voronoi_diagram()
self.build_al_table_sig.emit()
# def calculate_voronoi_diagram(self):
# return voronoi_diagram()
def calculate_voronoi_diagram(self):
pass
# return voronoi_diagram()
# To be called after clicking on the plot.
def on_mouse_click_release(self, event):

View File

@ -2,7 +2,7 @@
from PyQt5 import QtWidgets, QtCore, QtGui
from appTool import AppTool
from appGUI.GUIElements import RadioSet, FCDoubleSpinner, EvalEntry, FCEntry, FCButton, FCComboBox
from appGUI.GUIElements import RadioSet, FCDoubleSpinner, EvalEntry, FCEntry, FCButton, FCComboBox, FCCheckBox
from numpy import Inf
@ -335,15 +335,20 @@ class DblSidedTool(AppTool):
self.ui.alignment_holes.set_value(self.drill_values)
def on_toggle_pointbox(self):
if self.ui.axis_location.get_value() == "point":
val = self.ui.axis_location.get_value()
if val == "point":
self.ui.point_entry.show()
self.ui.add_point_button.show()
self.ui.box_type_label.hide()
self.ui.box_type_radio.hide()
self.ui.box_combo.hide()
self.ui.exc_hole_lbl.hide()
self.ui.exc_combo.hide()
self.ui.pick_hole_button.hide()
self.ui.align_ref_label_val.set_value(self.ui.point_entry.get_value())
else:
elif val == 'box':
self.ui.point_entry.hide()
self.ui.add_point_button.hide()
@ -351,7 +356,22 @@ class DblSidedTool(AppTool):
self.ui.box_type_radio.show()
self.ui.box_combo.show()
self.ui.exc_hole_lbl.hide()
self.ui.exc_combo.hide()
self.ui.pick_hole_button.hide()
self.ui.align_ref_label_val.set_value("Box centroid")
elif val == 'hole':
self.ui.point_entry.show()
self.ui.add_point_button.hide()
self.ui.box_type_label.hide()
self.ui.box_type_radio.hide()
self.ui.box_combo.hide()
self.ui.exc_hole_lbl.show()
self.ui.exc_combo.show()
self.ui.pick_hole_button.show()
def on_bbox_coordinates(self):
@ -605,10 +625,16 @@ class DsidedUI:
"Can be:\n"
"- Point -> a set of coordinates (x,y) around which the object is mirrored\n"
"- Box -> a set of coordinates (x, y) obtained from the center of the\n"
"bounding box of another object selected below")
"bounding box of another object selected below\n"
"- Hole Snap -> a point defined by the center of a drill hone in a Excellon object")
)
self.axis_location = RadioSet(
[
{'label': _('Point'), 'value': 'point'},
{'label': _('Box'), 'value': 'box'},
{'label': _('Hole Snap'), 'value': 'hole'},
]
)
self.axis_location = RadioSet([{'label': _('Point'), 'value': 'point'},
{'label': _('Box'), 'value': 'box'}])
grid_lay1.addWidget(self.axloc_label, 4, 0)
grid_lay1.addWidget(self.axis_location, 4, 1, 1, 2)
@ -636,11 +662,38 @@ class DsidedUI:
grid_lay1.addWidget(self.point_entry, 7, 0, 1, 2)
grid_lay1.addWidget(self.add_point_button, 7, 2)
self.exc_hole_lbl = QtWidgets.QLabel('%s:' % _("Excellon"))
self.exc_hole_lbl.setToolTip(
_("Object that holds holes that can be picked as reference for mirroing.")
)
# Excellon Object that holds the holes
self.exc_combo = FCComboBox()
self.exc_combo.setModel(self.app.collection)
self.exc_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex()))
self.exc_combo.is_last = True
self.exc_hole_lbl.hide()
self.exc_combo.hide()
grid_lay1.addWidget(self.exc_hole_lbl, 10, 0)
grid_lay1.addWidget(self.exc_combo, 10, 1, 1, 2)
self.pick_hole_button = FCButton(_("Pick hole"))
self.pick_hole_button.setToolTip(
_("Click inside a drill hole that belong to the selected Excellon object,\n"
"and the hole center coordinates will be copied to the Point field.")
)
self.pick_hole_button.hide()
grid_lay1.addWidget(self.pick_hole_button, 12, 0, 1, 3)
# ## Grid Layout
grid_lay2 = QtWidgets.QGridLayout()
grid_lay2.setColumnStretch(0, 0)
grid_lay2.setColumnStretch(1, 1)
self.layout.addLayout(grid_lay2)
grid_lay3 = QtWidgets.QGridLayout()
grid_lay3.setColumnStretch(0, 0)
grid_lay3.setColumnStretch(1, 1)
self.layout.addLayout(grid_lay3)
self.box_type_label = QtWidgets.QLabel('%s:' % _("Reference Object"))
self.box_type_label.setToolTip(
@ -657,8 +710,8 @@ class DsidedUI:
self.box_type_label.hide()
self.box_type_radio.hide()
grid_lay2.addWidget(self.box_type_label, 0, 0, 1, 2)
grid_lay2.addWidget(self.box_type_radio, 1, 0, 1, 2)
grid_lay3.addWidget(self.box_type_label, 0, 0, 1, 2)
grid_lay3.addWidget(self.box_type_radio, 1, 0, 1, 2)
# Object used as BOX reference
self.box_combo = FCComboBox()
@ -668,14 +721,14 @@ class DsidedUI:
self.box_combo.hide()
grid_lay2.addWidget(self.box_combo, 3, 0, 1, 2)
grid_lay3.addWidget(self.box_combo, 3, 0, 1, 2)
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
grid_lay2.addWidget(separator_line, 4, 0, 1, 2)
grid_lay3.addWidget(separator_line, 4, 0, 1, 2)
grid_lay2.addWidget(QtWidgets.QLabel(""), 5, 0, 1, 2)
grid_lay3.addWidget(QtWidgets.QLabel(""), 5, 0, 1, 2)
# ## Title Bounds Values
self.bv_label = QtWidgets.QLabel("<b>%s:</b>" % _('Bounds Values'))
@ -683,7 +736,7 @@ class DsidedUI:
_("Select on canvas the object(s)\n"
"for which to calculate bounds values.")
)
grid_lay2.addWidget(self.bv_label, 6, 0, 1, 2)
grid_lay3.addWidget(self.bv_label, 6, 0, 1, 2)
# Xmin value
self.xmin_entry = FCDoubleSpinner(callback=self.confirmation_message)
@ -696,8 +749,8 @@ class DsidedUI:
)
self.xmin_entry.setReadOnly(True)
grid_lay2.addWidget(self.xmin_btn, 7, 0)
grid_lay2.addWidget(self.xmin_entry, 7, 1)
grid_lay3.addWidget(self.xmin_btn, 7, 0)
grid_lay3.addWidget(self.xmin_entry, 7, 1)
# Ymin value
self.ymin_entry = FCDoubleSpinner(callback=self.confirmation_message)
@ -710,8 +763,8 @@ class DsidedUI:
)
self.ymin_entry.setReadOnly(True)
grid_lay2.addWidget(self.ymin_btn, 8, 0)
grid_lay2.addWidget(self.ymin_entry, 8, 1)
grid_lay3.addWidget(self.ymin_btn, 8, 0)
grid_lay3.addWidget(self.ymin_entry, 8, 1)
# Xmax value
self.xmax_entry = FCDoubleSpinner(callback=self.confirmation_message)
@ -724,8 +777,8 @@ class DsidedUI:
)
self.xmax_entry.setReadOnly(True)
grid_lay2.addWidget(self.xmax_btn, 9, 0)
grid_lay2.addWidget(self.xmax_entry, 9, 1)
grid_lay3.addWidget(self.xmax_btn, 9, 0)
grid_lay3.addWidget(self.xmax_entry, 9, 1)
# Ymax value
self.ymax_entry = FCDoubleSpinner(callback=self.confirmation_message)
@ -738,8 +791,8 @@ class DsidedUI:
)
self.ymax_entry.setReadOnly(True)
grid_lay2.addWidget(self.ymax_btn, 10, 0)
grid_lay2.addWidget(self.ymax_entry, 10, 1)
grid_lay3.addWidget(self.ymax_btn, 10, 0)
grid_lay3.addWidget(self.ymax_entry, 10, 1)
# Center point value
self.center_entry = FCEntry()
@ -752,8 +805,8 @@ class DsidedUI:
)
self.center_entry.setReadOnly(True)
grid_lay2.addWidget(self.center_btn, 12, 0)
grid_lay2.addWidget(self.center_entry, 12, 1)
grid_lay3.addWidget(self.center_btn, 12, 0)
grid_lay3.addWidget(self.center_entry, 12, 1)
# Calculate Bounding box
self.calculate_bb_button = QtWidgets.QPushButton(_("Calculate Bounds Values"))
@ -768,14 +821,14 @@ class DsidedUI:
font-weight: bold;
}
""")
grid_lay2.addWidget(self.calculate_bb_button, 13, 0, 1, 2)
grid_lay3.addWidget(self.calculate_bb_button, 13, 0, 1, 2)
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
grid_lay2.addWidget(separator_line, 14, 0, 1, 2)
grid_lay3.addWidget(separator_line, 14, 0, 1, 2)
grid_lay2.addWidget(QtWidgets.QLabel(""), 15, 0, 1, 2)
grid_lay3.addWidget(QtWidgets.QLabel(""), 15, 0, 1, 2)
# ## Alignment holes
self.alignment_label = QtWidgets.QLabel("<b>%s:</b>" % _('PCB Alignment'))
@ -784,7 +837,7 @@ class DsidedUI:
"specified alignment holes and their mirror\n"
"images.")
)
grid_lay2.addWidget(self.alignment_label, 25, 0, 1, 2)
grid_lay3.addWidget(self.alignment_label, 25, 0, 1, 2)
# ## Drill diameter for alignment holes
self.dt_label = QtWidgets.QLabel("%s:" % _('Drill Diameter'))
@ -799,8 +852,8 @@ class DsidedUI:
self.drill_dia.set_precision(self.decimals)
self.drill_dia.set_range(0.0000, 9999.9999)
grid_lay2.addWidget(self.dt_label, 26, 0)
grid_lay2.addWidget(self.drill_dia, 26, 1)
grid_lay3.addWidget(self.dt_label, 26, 0)
grid_lay3.addWidget(self.drill_dia, 26, 1)
# ## Alignment Axis
self.align_ax_label = QtWidgets.QLabel('%s:' % _("Align Axis"))
@ -810,8 +863,8 @@ class DsidedUI:
self.align_axis_radio = RadioSet([{'label': 'X', 'value': 'X'},
{'label': 'Y', 'value': 'Y'}])
grid_lay2.addWidget(self.align_ax_label, 27, 0)
grid_lay2.addWidget(self.align_axis_radio, 27, 1)
grid_lay3.addWidget(self.align_ax_label, 27, 0)
grid_lay3.addWidget(self.align_axis_radio, 27, 1)
# ## Alignment Reference Point
self.align_ref_label = QtWidgets.QLabel('%s:' % _("Reference"))
@ -829,8 +882,8 @@ class DsidedUI:
)
self.align_ref_label_val.setDisabled(True)
grid_lay2.addWidget(self.align_ref_label, 28, 0)
grid_lay2.addWidget(self.align_ref_label_val, 28, 1)
grid_lay3.addWidget(self.align_ref_label, 28, 0)
grid_lay3.addWidget(self.align_ref_label_val, 28, 1)
grid_lay4 = QtWidgets.QGridLayout()
self.layout.addLayout(grid_lay4)