From 3201359c8ab3c9d4ab7cf132fcad453051431ce4 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 8 Dec 2019 15:12:05 +0200 Subject: [PATCH] - Calibrate Tool - working on it --- FlatCAMObj.py | 13 +- README.md | 5 + flatcamGUI/GUIElements.py | 11 + flatcamGUI/ObjectUI.py | 5 +- flatcamTools/ToolCalibrate.py | 392 +++++++++++++++++++++------------- 5 files changed, 270 insertions(+), 156 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 2f8bb66c..3c26defd 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -4354,7 +4354,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): if row is None: try: current_row = self.ui.geo_tools_table.currentRow() - except Exception as e: + except Exception: current_row = 0 else: current_row = row @@ -4375,6 +4375,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): log.debug("Tool missing. Add a tool in Geo Tool Table. %s" % str(e)) return + # update the QLabel that shows for which Tool we have the parameters in the UI form + self.ui.tool_data_label.setText( + "%s: %s %d" % (_('Parameters for'), _("Tool"), tooluid) + ) + # update the form with the V-Shape fields if V-Shape selected in the geo_tool_table # also modify the Cut Z form entry to reflect the calculated Cut Z from values got from V-Shape Fields try: @@ -5382,8 +5387,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): # variables to display the percentage of work done self.geo_len = 0 try: - for g in self.solid_geometry: - self.geo_len += 1 + self.geo_len = len(self.solid_geometry) except TypeError: self.geo_len = 1 self.old_disp_number = 0 @@ -5395,7 +5399,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): return self.app.proc_container.new_text = '' - self.app.inform.emit('[success] %s' % _("Geometry Scale done.")) + if xfactor != 1 and yfactor != 1: + self.app.inform.emit('[success] %s' % _("Geometry Scale done.")) def offset(self, vect): """ diff --git a/README.md b/README.md index 360a55d2..1a8eaf21 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing. ================================================= +8.12.2019 + +- Calibrate Tool - rearranged the GUI +- in Geometry UI made sure that the Label that points to the Tool parameters show clearly that those parameters apply only for the selected tool + 7.12.2019 - renamed Calibrate Excellon Tool to a simpler Calibrate Tool diff --git a/flatcamGUI/GUIElements.py b/flatcamGUI/GUIElements.py index beed5e3d..d960d024 100644 --- a/flatcamGUI/GUIElements.py +++ b/flatcamGUI/GUIElements.py @@ -1193,6 +1193,17 @@ class FCButton(QtWidgets.QPushButton): self.setText(str(val)) +class FCLabel(QtWidgets.QLabel): + def __init__(self, parent=None): + super(FCLabel, self).__init__(parent) + + def get_value(self): + return self.text() + + def set_value(self, val): + self.setText(str(val)) + + class FCMenu(QtWidgets.QMenu): def __init__(self): super().__init__() diff --git a/flatcamGUI/ObjectUI.py b/flatcamGUI/ObjectUI.py index 36e87d2a..cc9db63a 100644 --- a/flatcamGUI/ObjectUI.py +++ b/flatcamGUI/ObjectUI.py @@ -1267,7 +1267,8 @@ class GeometryObjectUI(ObjectUI): # Create CNC Job ### # ################## # ### Tools Data ## ## - self.tool_data_label = QtWidgets.QLabel('%s' % _('Tool Data')) + self.tool_data_label = QtWidgets.QLabel( + "%s: %s %d" % (_('Parameters for'), _("Tool"), int(1))) self.tool_data_label.setToolTip( _( "The data used for creating GCode.\n" @@ -1592,7 +1593,7 @@ class GeometryObjectUI(ObjectUI): self.grid3.addWidget(warning_lbl, 19, 0, 1, 2) # Button - self.generate_cnc_button = QtWidgets.QPushButton(_('Generate')) + self.generate_cnc_button = QtWidgets.QPushButton(_('Generate CNCJob object')) self.generate_cnc_button.setToolTip( _("Generate the CNC Job object.") ) diff --git a/flatcamTools/ToolCalibrate.py b/flatcamTools/ToolCalibrate.py index 45e8277d..24821116 100644 --- a/flatcamTools/ToolCalibrate.py +++ b/flatcamTools/ToolCalibrate.py @@ -8,7 +8,8 @@ from PyQt5 import QtWidgets, QtCore, QtGui from FlatCAMTool import FlatCAMTool -from flatcamGUI.GUIElements import FCDoubleSpinner, EvalEntry, FCCheckBox, OptionalInputSection, FCTable, FCComboBox +from flatcamGUI.GUIElements import FCDoubleSpinner, EvalEntry, FCCheckBox, OptionalInputSection +from flatcamGUI.GUIElements import FCTable, FCComboBox, RadioSet from flatcamEditors.FlatCAMTextEditor import TextEditor from shapely.geometry import Point @@ -52,116 +53,69 @@ class ToolCalibrate(FlatCAMTool): """) self.layout.addWidget(title_label) - # ## Grid Layout - i_grid_lay = QtWidgets.QGridLayout() - self.layout.addLayout(i_grid_lay) - i_grid_lay.setColumnStretch(0, 0) - i_grid_lay.setColumnStretch(1, 1) - i_grid_lay.setColumnStretch(2, 1) - - self.obj_type_label = QtWidgets.QLabel("%s:" % _("Object Type")) - - self.obj_type_combo = FCComboBox() - self.obj_type_combo.addItem(_("Gerber")) - self.obj_type_combo.addItem(_("Excellon")) - self.obj_type_combo.setCurrentIndex(1) - - i_grid_lay.addWidget(self.obj_type_label, 0, 0) - i_grid_lay.addWidget(self.obj_type_combo, 0, 1, 1,2) - - self.object_combo = FCComboBox() - self.object_combo.setModel(self.app.collection) - self.object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex())) - self.object_combo.setCurrentIndex(1) - - self.excobj_label = QtWidgets.QLabel("%s:" % _("Target Object")) - self.excobj_label.setToolTip( - _("FlatCAM Object to be used as a source for reference points.") - ) - - i_grid_lay.addWidget(self.excobj_label, 1, 0, 1, 3) - i_grid_lay.addWidget(self.object_combo, 2, 0, 1, 3) - i_grid_lay.addWidget(QtWidgets.QLabel(''), 3, 0) - - self.gcode_title_label = QtWidgets.QLabel('%s' % _('GCode Parameters')) - self.gcode_title_label.setToolTip( - _("Parameters used when creating the GCode in this tool.") - ) - i_grid_lay.addWidget(self.gcode_title_label, 4, 0, 1, 3) - - # Travel Z entry - travelz_lbl = QtWidgets.QLabel('%s:' % _("Travel Z")) - travelz_lbl.setToolTip( - _("Height (Z) for travelling between the points.") - ) - - self.travelz_entry = FCDoubleSpinner() - self.travelz_entry.set_range(-9999.9999, 9999.9999) - self.travelz_entry.set_precision(self.decimals) - self.travelz_entry.setSingleStep(0.1) - - i_grid_lay.addWidget(travelz_lbl, 5, 0) - i_grid_lay.addWidget(self.travelz_entry, 5, 1, 1, 2) - - # Verification Z entry - verz_lbl = QtWidgets.QLabel('%s:' % _("Verification Z")) - verz_lbl.setToolTip( - _("Height (Z) for checking the point.") - ) - - self.verz_entry = FCDoubleSpinner() - self.verz_entry.set_range(-9999.9999, 9999.9999) - self.verz_entry.set_precision(self.decimals) - self.verz_entry.setSingleStep(0.1) - - i_grid_lay.addWidget(verz_lbl, 6, 0) - i_grid_lay.addWidget(self.verz_entry, 6, 1, 1, 2) - - # Zero the Z of the verification tool - self.zeroz_cb = FCCheckBox('%s' % _("Zero Z tool")) - self.zeroz_cb.setToolTip( - _("Include a sequence to zero the height (Z)\n" - "of the verification tool.") - ) - - i_grid_lay.addWidget(self.zeroz_cb, 7, 0, 1, 3) - - # Toochange Z entry - toolchangez_lbl = QtWidgets.QLabel('%s:' % _("Toolchange Z")) - toolchangez_lbl.setToolTip( - _("Height (Z) for mounting the verification probe.") - ) - - self.toolchangez_entry = FCDoubleSpinner() - self.toolchangez_entry.set_range(0.0000, 9999.9999) - self.toolchangez_entry.set_precision(self.decimals) - self.toolchangez_entry.setSingleStep(0.1) - - i_grid_lay.addWidget(toolchangez_lbl, 8, 0) - i_grid_lay.addWidget(self.toolchangez_entry, 8, 1, 1, 2) - - self.z_ois = OptionalInputSection(self.zeroz_cb, [toolchangez_lbl, self.toolchangez_entry]) - - i_grid_lay.addWidget(QtWidgets.QLabel(''), 9, 0, 1, 3) + self.layout.addWidget(QtWidgets.QLabel('')) # ## Grid Layout grid_lay = QtWidgets.QGridLayout() self.layout.addLayout(grid_lay) grid_lay.setColumnStretch(0, 0) grid_lay.setColumnStretch(1, 1) - grid_lay.setColumnStretch(2, 1) + grid_lay.setColumnStretch(2, 0) + + step_1 = QtWidgets.QLabel('%s' % _("STEP 1: Acquire Calibration Points")) + step_1.setToolTip( + _("Pick four points by clicking inside the drill holes.\n" + "Those four points should be in the four\n" + "(as much as possible) corners of the Excellon object.") + ) + grid_lay.addWidget(step_1, 0, 0, 1, 3) + + self.cal_source_lbl = QtWidgets.QLabel("%s:" % _("Source Type")) + self.cal_source_lbl.setToolTip(_("The source of calibration points.\n" + "It can be:\n" + "- Object -> click a hole geo for Excellon or a pad for Gerber\n" + "- Free -> click freely on canvas to acquire the calibration points")) + self.cal_source_radio = RadioSet([{'label': _('Object'), 'value': 'object'}, + {'label': _('Free'), 'value': 'free'}], + stretch=False) + + grid_lay.addWidget(self.cal_source_lbl, 1, 0) + grid_lay.addWidget(self.cal_source_radio, 1, 1, 1, 2) + + self.obj_type_label = QtWidgets.QLabel("%s:" % _("Object Type")) + + self.obj_type_combo = FCComboBox() + self.obj_type_combo.addItem(_("Gerber")) + self.obj_type_combo.addItem(_("Excellon")) + self.obj_type_combo.setCurrentIndex(1) + + grid_lay.addWidget(self.obj_type_label, 2, 0) + grid_lay.addWidget(self.obj_type_combo, 2, 1, 1, 2) + + self.object_combo = FCComboBox() + self.object_combo.setModel(self.app.collection) + self.object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex())) + self.object_combo.setCurrentIndex(1) + + self.object_label = QtWidgets.QLabel("%s:" % _("Source object selection")) + self.object_label.setToolTip( + _("FlatCAM Object to be used as a source for reference points.") + ) + + grid_lay.addWidget(self.object_label, 3, 0, 1, 3) + grid_lay.addWidget(self.object_combo, 4, 0, 1, 3) self.points_table_label = QtWidgets.QLabel('%s' % _('Calibration Points')) self.points_table_label.setToolTip( _("Contain the expected calibration points and the\n" "ones measured.") ) - grid_lay.addWidget(self.points_table_label, 1, 0, 1, 3) + grid_lay.addWidget(self.points_table_label, 5, 0, 1, 3) self.points_table = FCTable() self.points_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) # self.points_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) - grid_lay.addWidget(self.points_table, 2, 0, 9, 3) + grid_lay.addWidget(self.points_table, 6, 0, 1, 3) self.points_table.setColumnCount(4) self.points_table.setHorizontalHeaderLabels( @@ -299,18 +253,11 @@ class ToolCalibrate(FlatCAMTool): self.points_table.setMinimumHeight(self.points_table.getHeight() + 2) self.points_table.setMaximumHeight(self.points_table.getHeight() + 3) - step_1 = QtWidgets.QLabel('%s' % _("STEP 1")) - step_1.setToolTip( - _("Pick four points by clicking inside the drill holes.\n" - "Those four points should be in the four\n" - "(as much as possible) corners of the Excellon object.") - ) - grid_lay.addWidget(step_1, 15, 0, 1, 3) - - # ## Start Button - self.start_button = QtWidgets.QPushButton(_("Acquire Calibration Points")) + # ## Get Points Button + self.start_button = QtWidgets.QPushButton(_("Get Points")) self.start_button.setToolTip( - _("Pick four points by clicking inside the drill holes.\n" + _("Pick four points by clicking on canvas if the source choice\n" + "is 'free' or inside the object geometry if the source is 'object'.\n" "Those four points should be in the four squares of\n" "the object.") ) @@ -320,15 +267,81 @@ class ToolCalibrate(FlatCAMTool): font-weight: bold; } """) - grid_lay.addWidget(self.start_button, 16, 0, 1, 3) + grid_lay.addWidget(self.start_button, 7, 0, 1, 3) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid_lay.addWidget(separator_line, 8, 0, 1, 3) + + grid_lay.addWidget(QtWidgets.QLabel(''), 9, 0) # STEP 2 # - step_2 = QtWidgets.QLabel('%s' % _("STEP 2")) + step_2 = QtWidgets.QLabel('%s' % _("STEP 2: Verification GCode")) step_2.setToolTip( _("Generate GCode file to locate and align the PCB by using\n" "the four points acquired above.") ) - grid_lay.addWidget(step_2, 17, 0, 1, 3) + grid_lay.addWidget(step_2, 10, 0, 1, 3) + + self.gcode_title_label = QtWidgets.QLabel('%s' % _('GCode Parameters')) + self.gcode_title_label.setToolTip( + _("Parameters used when creating the GCode in this tool.") + ) + grid_lay.addWidget(self.gcode_title_label, 11, 0, 1, 3) + + # Travel Z entry + travelz_lbl = QtWidgets.QLabel('%s:' % _("Travel Z")) + travelz_lbl.setToolTip( + _("Height (Z) for travelling between the points.") + ) + + self.travelz_entry = FCDoubleSpinner() + self.travelz_entry.set_range(-9999.9999, 9999.9999) + self.travelz_entry.set_precision(self.decimals) + self.travelz_entry.setSingleStep(0.1) + + grid_lay.addWidget(travelz_lbl, 12, 0) + grid_lay.addWidget(self.travelz_entry, 12, 1, 1, 2) + + # Verification Z entry + verz_lbl = QtWidgets.QLabel('%s:' % _("Verification Z")) + verz_lbl.setToolTip( + _("Height (Z) for checking the point.") + ) + + self.verz_entry = FCDoubleSpinner() + self.verz_entry.set_range(-9999.9999, 9999.9999) + self.verz_entry.set_precision(self.decimals) + self.verz_entry.setSingleStep(0.1) + + grid_lay.addWidget(verz_lbl, 13, 0) + grid_lay.addWidget(self.verz_entry, 13, 1, 1, 2) + + # Zero the Z of the verification tool + self.zeroz_cb = FCCheckBox('%s' % _("Zero Z tool")) + self.zeroz_cb.setToolTip( + _("Include a sequence to zero the height (Z)\n" + "of the verification tool.") + ) + + grid_lay.addWidget(self.zeroz_cb, 14, 0, 1, 3) + + # Toochange Z entry + toolchangez_lbl = QtWidgets.QLabel('%s:' % _("Toolchange Z")) + toolchangez_lbl.setToolTip( + _("Height (Z) for mounting the verification probe.") + ) + + self.toolchangez_entry = FCDoubleSpinner() + self.toolchangez_entry.set_range(0.0000, 9999.9999) + self.toolchangez_entry.set_precision(self.decimals) + self.toolchangez_entry.setSingleStep(0.1) + + grid_lay.addWidget(toolchangez_lbl, 15, 0) + grid_lay.addWidget(self.toolchangez_entry, 15, 1, 1, 2) + + self.z_ois = OptionalInputSection(self.zeroz_cb, [toolchangez_lbl, self.toolchangez_entry]) # ## GCode Button self.gcode_button = QtWidgets.QPushButton(_("Generate GCode")) @@ -342,10 +355,17 @@ class ToolCalibrate(FlatCAMTool): font-weight: bold; } """) - grid_lay.addWidget(self.gcode_button, 18, 0, 1, 3) + grid_lay.addWidget(self.gcode_button, 16, 0, 1, 3) + + separator_line1 = QtWidgets.QFrame() + separator_line1.setFrameShape(QtWidgets.QFrame.HLine) + separator_line1.setFrameShadow(QtWidgets.QFrame.Sunken) + grid_lay.addWidget(separator_line1, 17, 0, 1, 3) + + grid_lay.addWidget(QtWidgets.QLabel(''), 18, 0, 1, 3) # STEP 3 # - step_3 = QtWidgets.QLabel('%s' % _("STEP 3")) + step_3 = QtWidgets.QLabel('%s' % _("STEP 3: Adjustments")) step_3.setToolTip( _("Calculate Scale and Skew factors based on the differences (delta)\n" "found when checking the PCB pattern. The differences must be filled\n" @@ -368,7 +388,7 @@ class ToolCalibrate(FlatCAMTool): """) grid_lay.addWidget(self.generate_factors_button, 20, 0, 1, 3) - scale_lbl = QtWidgets.QLabel('%s' % _("Scale")) + scale_lbl = QtWidgets.QLabel('%s' % _("Scale Factors")) grid_lay.addWidget(scale_lbl, 21, 0, 1, 3) self.scalex_label = QtWidgets.QLabel(_("Factor X:")) @@ -395,7 +415,7 @@ class ToolCalibrate(FlatCAMTool): grid_lay.addWidget(self.scaley_label, 23, 0) grid_lay.addWidget(self.scaley_entry, 23, 1, 1, 2) - self.scale_button = QtWidgets.QPushButton(_("Scale")) + self.scale_button = QtWidgets.QPushButton(_("Apply Scale Factors")) self.scale_button.setToolTip( _("Apply Scale factors on the calibration points.") ) @@ -407,7 +427,7 @@ class ToolCalibrate(FlatCAMTool): """) grid_lay.addWidget(self.scale_button, 24, 0, 1, 3) - skew_lbl = QtWidgets.QLabel('%s' % _("Skew")) + skew_lbl = QtWidgets.QLabel('%s' % _("Skew Factors")) grid_lay.addWidget(skew_lbl, 25, 0, 1, 3) self.skewx_label = QtWidgets.QLabel(_("Angle X:")) @@ -436,7 +456,7 @@ class ToolCalibrate(FlatCAMTool): grid_lay.addWidget(self.skewy_label, 27, 0) grid_lay.addWidget(self.skewy_entry, 27, 1, 1, 2) - self.skew_button = QtWidgets.QPushButton(_("Skew")) + self.skew_button = QtWidgets.QPushButton(_("Apply Skew Factors")) self.skew_button.setToolTip( _("Apply Skew factors on the calibration points.") ) @@ -448,13 +468,20 @@ class ToolCalibrate(FlatCAMTool): """) grid_lay.addWidget(self.skew_button, 28, 0, 1, 3) + separator_line1 = QtWidgets.QFrame() + separator_line1.setFrameShape(QtWidgets.QFrame.HLine) + separator_line1.setFrameShadow(QtWidgets.QFrame.Sunken) + grid_lay.addWidget(separator_line1, 29, 0, 1, 3) + + grid_lay.addWidget(QtWidgets.QLabel(''), 30, 0, 1, 3) + # STEP 4 # - step_4 = QtWidgets.QLabel('%s' % _("STEP 4")) + step_4 = QtWidgets.QLabel('%s' % _("STEP 4: Adjusted GCode")) step_4.setToolTip( _("Generate verification GCode file adjusted with\n" "the factors above.") ) - grid_lay.addWidget(step_4, 29, 0, 1, 3) + grid_lay.addWidget(step_4, 31, 0, 1, 3) # ## Adjusted GCode Button self.adj_gcode_button = QtWidgets.QPushButton(_("Generate Adjusted GCode")) @@ -468,44 +495,51 @@ class ToolCalibrate(FlatCAMTool): font-weight: bold; } """) - grid_lay.addWidget(self.adj_gcode_button, 30, 0, 1, 3) + grid_lay.addWidget(self.adj_gcode_button, 32, 0, 1, 3) + + separator_line1 = QtWidgets.QFrame() + separator_line1.setFrameShape(QtWidgets.QFrame.HLine) + separator_line1.setFrameShadow(QtWidgets.QFrame.Sunken) + grid_lay.addWidget(separator_line1, 33, 0, 1, 3) + + grid_lay.addWidget(QtWidgets.QLabel(''), 34, 0, 1, 3) # STEP 5 # - step_5 = QtWidgets.QLabel('%s' % _("STEP 5")) + step_5 = QtWidgets.QLabel('%s' % _("STEP 5: Calibrate FlatCAM Objects")) step_5.setToolTip( - _("Ajust the Excellon and Cutout Geometry objects\n" + _("Adjust the Excellon and Cutout Geometry objects\n" "with the factors determined, and verified, above.") ) - grid_lay.addWidget(step_5, 31, 0, 1, 3) + grid_lay.addWidget(step_5, 35, 0, 1, 3) self.adj_exc_object_combo = QtWidgets.QComboBox() self.adj_exc_object_combo.setModel(self.app.collection) self.adj_exc_object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex())) self.adj_exc_object_combo.setCurrentIndex(1) - self.adj_excobj_label = QtWidgets.QLabel("%s:" % _("EXCELLON")) + self.adj_excobj_label = QtWidgets.QLabel("%s:" % _("EXCELLON")) self.adj_excobj_label.setToolTip( _("Excellon Object to be adjusted.") ) - grid_lay.addWidget(self.adj_excobj_label, 32, 0) - grid_lay.addWidget(self.adj_exc_object_combo, 32, 1, 1, 2) + grid_lay.addWidget(self.adj_excobj_label, 36, 0, 1, 3) + grid_lay.addWidget(self.adj_exc_object_combo, 37, 0, 1, 3) self.adj_geo_object_combo = QtWidgets.QComboBox() self.adj_geo_object_combo.setModel(self.app.collection) self.adj_geo_object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex())) self.adj_geo_object_combo.setCurrentIndex(1) - self.adj_geoobj_label = QtWidgets.QLabel("%s:" % _("GEOMETRY")) + self.adj_geoobj_label = QtWidgets.QLabel("%s:" % _("GEOMETRY")) self.adj_geoobj_label.setToolTip( _("Geometry Object to be adjusted.") ) - grid_lay.addWidget(self.adj_geoobj_label, 33, 0) - grid_lay.addWidget(self.adj_geo_object_combo, 33, 1, 1, 2) + grid_lay.addWidget(self.adj_geoobj_label, 38, 0, 1, 3) + grid_lay.addWidget(self.adj_geo_object_combo, 39, 0, 1, 3) # ## Adjust Objects Button - self.adj_obj_button = QtWidgets.QPushButton(_("Adjust Objects")) + self.adj_obj_button = QtWidgets.QPushButton(_("Calibrate")) self.adj_obj_button.setToolTip( _("Adjust (scale and/or skew) the objects\n" "with the factors determined above.") @@ -516,9 +550,14 @@ class ToolCalibrate(FlatCAMTool): font-weight: bold; } """) - grid_lay.addWidget(self.adj_obj_button, 34, 0, 1, 3) + grid_lay.addWidget(self.adj_obj_button, 40, 0, 1, 3) - grid_lay.addWidget(QtWidgets.QLabel(''), 35, 0) + separator_line2 = QtWidgets.QFrame() + separator_line2.setFrameShape(QtWidgets.QFrame.HLine) + separator_line2.setFrameShadow(QtWidgets.QFrame.Sunken) + grid_lay.addWidget(separator_line2, 41, 0, 1, 3) + + grid_lay.addWidget(QtWidgets.QLabel(''), 42, 0, 1, 3) self.layout.addStretch() @@ -552,6 +591,8 @@ class ToolCalibrate(FlatCAMTool): self.generate_factors_button.clicked.connect(self.calculate_factors) self.reset_button.clicked.connect(self.set_tool_ui) + self.cal_source_radio.activated_custom.connect(self.on_cal_source_radio) + self.obj_type_combo.currentIndexChanged.connect(self.on_obj_type_combo) def run(self, toggle=True): @@ -596,6 +637,18 @@ class ToolCalibrate(FlatCAMTool): self.object_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex())) self.object_combo.setCurrentIndex(0) + def on_cal_source_radio(self, val): + if val == 'object': + self.obj_type_label.setDisabled(False) + self.obj_type_combo.setDisabled(False) + self.object_label.setDisabled(False) + self.object_combo.setDisabled(False) + else: + self.obj_type_label.setDisabled(True) + self.obj_type_combo.setDisabled(True) + self.object_label.setDisabled(True) + self.object_combo.setDisabled(True) + def on_start_collect_points(self): # disengage the grid snapping since it will be hard to find the drills on grid if self.app.ui.grid_snap_btn.isChecked(): @@ -611,13 +664,16 @@ class ToolCalibrate(FlatCAMTool): else: self.canvas.graph_event_disconnect(self.app.mr) - selection_index = self.object_combo.currentIndex() - model_index = self.app.collection.index(selection_index, 0, self.object_combo.rootModelIndex()) - try: - self.target_obj = model_index.internalPointer().obj - except Exception: - self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no target object loaded ...")) - return + if self.cal_source_radio.get_value() == 'object': + selection_index = self.object_combo.currentIndex() + model_index = self.app.collection.index(selection_index, 0, self.object_combo.rootModelIndex()) + try: + self.target_obj = model_index.internalPointer().obj + except Exception: + self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no target object loaded ...")) + return + + self.reset_calibration_points() self.app.inform.emit(_("Click inside the First drill point. Bottom Left...")) @@ -631,21 +687,42 @@ class ToolCalibrate(FlatCAMTool): pos_canvas = self.canvas.translate_coords(event_pos) click_pt = Point([pos_canvas[0], pos_canvas[1]]) - if self.target_obj.kind.lower() == 'excellon': - for tool, tool_dict in self.target_obj.tools.items(): - for geo in tool_dict['solid_geometry']: - if click_pt.within(geo): - center_pt = geo.centroid - self.click_points.append( - ( - float('%.*f' % (self.decimals, center_pt.x)), - float('%.*f' % (self.decimals, center_pt.y)) + if self.cal_source_radio.get_value() == 'object': + if self.target_obj.kind.lower() == 'excellon': + for tool, tool_dict in self.target_obj.tools.items(): + for geo in tool_dict['solid_geometry']: + if click_pt.within(geo): + center_pt = geo.centroid + self.click_points.append( + ( + float('%.*f' % (self.decimals, center_pt.x)), + float('%.*f' % (self.decimals, center_pt.y)) + ) ) - ) - self.check_points() + self.check_points() + else: + for apid, apid_val in self.target_obj.apertures.items(): + for geo_el in apid_val['geometry']: + if 'solid' in geo_el: + if click_pt.within(geo_el['solid']): + print(type(geo_el['follow'])) + if isinstance(geo_el['follow'], Point): + center_pt = geo_el['solid'].centroid + self.click_points.append( + ( + float('%.*f' % (self.decimals, center_pt.x)), + float('%.*f' % (self.decimals, center_pt.y)) + ) + ) + self.check_points() else: - for tool, tool_dict in self.target_obj.apertures.items(): - pass + self.click_points.append( + ( + float('%.*f' % (self.decimals, click_pt.x)), + float('%.*f' % (self.decimals, click_pt.y)) + ) + ) + self.check_points() def check_points(self): if len(self.click_points) == 1: @@ -670,6 +747,21 @@ class ToolCalibrate(FlatCAMTool): if self.grid_status_memory is True: self.app.ui.grid_snap_btn.trigger() + def reset_calibration_points(self): + self.click_points = list() + + self.bottom_left_coordx_tgt.set_value('') + self.bottom_left_coordy_tgt.set_value('') + + self.bottom_right_coordx_tgt.set_value('') + self.bottom_right_coordy_tgt.set_value('') + + self.top_left_coordx_tgt.set_value('') + self.top_left_coordy_tgt.set_value('') + + self.top_right_coordx_tgt.set_value('') + self.top_right_coordy_tgt.set_value('') + def gcode_header(self): log.debug("ToolCalibrate.gcode_header()") time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now())