From cff078710725f6c99b6e40502aa9c4525a3aa0dd Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 22 Oct 2019 16:17:13 +0300 Subject: [PATCH] - finished the GUI layout for the Calibrate Excellon Tool --- FlatCAMObj.py | 20 +-- README.md | 1 + flatcamTools/ToolCalibrateExcellon.py | 189 +++++++++++++++++++++----- 3 files changed, 169 insertions(+), 41 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index d6c5d242..7433c445 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -1472,18 +1472,18 @@ class FlatCAMGerber(FlatCAMObj, Gerber): if self.app.is_legacy is False: def random_color(): - color = np.random.rand(4) - color[3] = 1 - return color + r_color = np.random.rand(4) + r_color[3] = 1 + return r_color else: def random_color(): while True: - color = np.random.rand(4) - color[3] = 1 + r_color = np.random.rand(4) + r_color[3] = 1 new_color = '#' - for idx in range(len(color)): - new_color += '%x' % int(color[idx] * 255) + for idx in range(len(r_color)): + new_color += '%x' % int(r_color[idx] * 255) # do it until a valid color is generated # a valid color has the # symbol, another 6 chars for the color and the last 2 chars for alpha # for a total of 9 chars @@ -2259,9 +2259,9 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): self.tot_slot_cnt += slot_cnt - id = QtWidgets.QTableWidgetItem('%d' % int(tool_no)) - id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - self.ui.tools_table.setItem(self.tool_row, 0, id) # Tool name/id + exc_id = QtWidgets.QTableWidgetItem('%d' % int(tool_no)) + exc_id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + self.ui.tools_table.setItem(self.tool_row, 0, exc_id) # Tool name/id # Make sure that the drill diameter when in MM is with no more than 2 decimals # There are no drill bits in MM with more than 3 decimals diameter diff --git a/README.md b/README.md index c386ce94..4eeb6cd1 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ CAD program, and create G-Code for Isolation routing. 22.10.2019 - working on the Calibrate Excellon Tool +- finished the GUI layout for the Calibrate Excellon Tool 21.10.2019 diff --git a/flatcamTools/ToolCalibrateExcellon.py b/flatcamTools/ToolCalibrateExcellon.py index f8db255f..f1d0625e 100644 --- a/flatcamTools/ToolCalibrateExcellon.py +++ b/flatcamTools/ToolCalibrateExcellon.py @@ -6,12 +6,17 @@ # ########################################################## from PyQt5 import QtWidgets, QtCore + from FlatCAMTool import FlatCAMTool -from flatcamGUI.GUIElements import FCDoubleSpinner, EvalEntry -import math +from flatcamGUI.GUIElements import FCDoubleSpinner, EvalEntry, FCCheckBox + from shapely.geometry import Point from shapely.geometry.base import * +import math +from datetime import datetime +import logging + import gettext import FlatCAMTranslation as fcTranslate import builtins @@ -20,6 +25,8 @@ fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext +log = logging.getLogger('base') + class ToolCalibrateExcellon(FlatCAMTool): @@ -45,11 +52,11 @@ class ToolCalibrateExcellon(FlatCAMTool): self.layout.addWidget(title_label) # ## 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) + 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.exc_object_combo = QtWidgets.QComboBox() self.exc_object_combo.setModel(self.app.collection) @@ -58,19 +65,64 @@ class ToolCalibrateExcellon(FlatCAMTool): self.excobj_label = QtWidgets.QLabel("%s:" % _("EXCELLON")) self.excobj_label.setToolTip( - _("Excellon Object to be mirrored.") + _("Excellon Object to be used as a source for reference points.") ) - grid_lay.addWidget(self.excobj_label, 0, 0) - grid_lay.addWidget(self.exc_object_combo, 0, 1, 1, 2) - grid_lay.addWidget(QtWidgets.QLabel(''), 1, 0) + i_grid_lay.addWidget(self.excobj_label, 0, 0) + i_grid_lay.addWidget(self.exc_object_combo, 0, 1, 1, 2) + i_grid_lay.addWidget(QtWidgets.QLabel(''), 1, 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, 1, 0, 1, 3) + + # Travel Z entry + travelz_lbl = QtWidgets.QLabel('%s:' % _("Travel Z")) + + 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, 2, 0) + i_grid_lay.addWidget(self.travelz_entry, 2, 1, 1, 2) + + # Verification Z entry + verz_lbl = QtWidgets.QLabel('%s:' % _("Verification Z")) + + 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, 3, 0) + i_grid_lay.addWidget(self.verz_entry, 3, 1, 1, 2) + + # Zero the Z of the verification tool + self.zeroz_cb = FCCheckBox('%s' % _("Zero Z tool")) + self.zeroz_cb.setToolTip( + _("Include a secquence to zero the height (Z)\n" + "of the verification tool.") + ) + i_grid_lay.addWidget(self.zeroz_cb, 4, 0, 1, 3) + + i_grid_lay.addWidget(QtWidgets.QLabel(''), 5, 0, 1, 3) + + # ## 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) 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, 2, 0, 1, 2) + grid_lay.addWidget(self.points_table_label, 2, 0, 1, 3) # BOTTOM LEFT self.bottom_left_lbl = QtWidgets.QLabel('%s' % _('Bottom Left')) @@ -83,7 +135,7 @@ class ToolCalibrateExcellon(FlatCAMTool): self.bottom_left_coordx_lbl = QtWidgets.QLabel('%s' % _('X')) grid_lay.addWidget(self.bottom_left_coordx_lbl, 4, 0) self.bottom_left_coordx_tgt = EvalEntry() - self.bottom_left_coordx_tgt.setDisabled(True) + self.bottom_left_coordx_tgt.setReadOnly(True) grid_lay.addWidget(self.bottom_left_coordx_tgt, 4, 1) self.bottom_left_coordx_found = EvalEntry() grid_lay.addWidget(self.bottom_left_coordx_found, 4, 2) @@ -91,7 +143,7 @@ class ToolCalibrateExcellon(FlatCAMTool): self.bottom_left_coordy_lbl = QtWidgets.QLabel('%s' % _('Y')) grid_lay.addWidget(self.bottom_left_coordy_lbl, 5, 0) self.bottom_left_coordy_tgt = EvalEntry() - self.bottom_left_coordy_tgt.setDisabled(True) + self.bottom_left_coordy_tgt.setReadOnly(True) grid_lay.addWidget(self.bottom_left_coordy_tgt, 5, 1) self.bottom_left_coordy_found = EvalEntry() grid_lay.addWidget(self.bottom_left_coordy_found, 5, 2) @@ -112,7 +164,7 @@ class ToolCalibrateExcellon(FlatCAMTool): self.bottom_right_coordx_lbl = QtWidgets.QLabel('%s' % _('X')) grid_lay.addWidget(self.bottom_right_coordx_lbl, 7, 0) self.bottom_right_coordx_tgt = EvalEntry() - self.bottom_right_coordx_tgt.setDisabled(True) + self.bottom_right_coordx_tgt.setReadOnly(True) grid_lay.addWidget(self.bottom_right_coordx_tgt, 7, 1) self.bottom_right_coordx_found = EvalEntry() grid_lay.addWidget(self.bottom_right_coordx_found, 7, 2) @@ -120,12 +172,11 @@ class ToolCalibrateExcellon(FlatCAMTool): self.bottom_right_coordy_lbl = QtWidgets.QLabel('%s' % _('Y')) grid_lay.addWidget(self.bottom_right_coordy_lbl, 8, 0) self.bottom_right_coordy_tgt = EvalEntry() - self.bottom_right_coordy_tgt.setDisabled(True) + self.bottom_right_coordy_tgt.setReadOnly(True) grid_lay.addWidget(self.bottom_right_coordy_tgt, 8, 1) self.bottom_right_coordy_found = EvalEntry() grid_lay.addWidget(self.bottom_right_coordy_found, 8, 2) - # TOP LEFT self.top_left_lbl = QtWidgets.QLabel('%s' % _('Top Left')) grid_lay.addWidget(self.top_left_lbl, 9, 0) @@ -137,7 +188,7 @@ class ToolCalibrateExcellon(FlatCAMTool): self.top_left_coordx_lbl = QtWidgets.QLabel('%s' % _('X')) grid_lay.addWidget(self.top_left_coordx_lbl, 10, 0) self.top_left_coordx_tgt = EvalEntry() - self.top_left_coordx_tgt.setDisabled(True) + self.top_left_coordx_tgt.setReadOnly(True) grid_lay.addWidget(self.top_left_coordx_tgt, 10, 1) self.top_left_coordx_found = EvalEntry() grid_lay.addWidget(self.top_left_coordx_found, 10, 2) @@ -145,7 +196,7 @@ class ToolCalibrateExcellon(FlatCAMTool): self.top_left_coordy_lbl = QtWidgets.QLabel('%s' % _('Y')) grid_lay.addWidget(self.top_left_coordy_lbl, 11, 0) self.top_left_coordy_tgt = EvalEntry() - self.top_left_coordy_tgt.setDisabled(True) + self.top_left_coordy_tgt.setReadOnly(True) grid_lay.addWidget(self.top_left_coordy_tgt, 11, 1) self.top_left_coordy_found = EvalEntry() grid_lay.addWidget(self.top_left_coordy_found, 11, 2) @@ -161,7 +212,7 @@ class ToolCalibrateExcellon(FlatCAMTool): self.top_right_coordx_lbl = QtWidgets.QLabel('%s' % _('X')) grid_lay.addWidget(self.top_right_coordx_lbl, 13, 0) self.top_right_coordx_tgt = EvalEntry() - self.top_right_coordx_tgt.setDisabled(True) + self.top_right_coordx_tgt.setReadOnly(True) grid_lay.addWidget(self.top_right_coordx_tgt, 13, 1) self.top_right_coordx_found = EvalEntry() grid_lay.addWidget(self.top_right_coordx_found, 13, 2) @@ -169,16 +220,17 @@ class ToolCalibrateExcellon(FlatCAMTool): self.top_right_coordy_lbl = QtWidgets.QLabel('%s' % _('Y')) grid_lay.addWidget(self.top_right_coordy_lbl, 14, 0) self.top_right_coordy_tgt = EvalEntry() - self.top_right_coordy_tgt.setDisabled(True) + self.top_right_coordy_tgt.setReadOnly(True) grid_lay.addWidget(self.top_right_coordy_tgt, 14, 1) self.top_right_coordy_found = EvalEntry() grid_lay.addWidget(self.top_right_coordy_found, 14, 2) + # STEP 1 # 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 squares of\n" - "the Excellon object.") + "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) @@ -192,6 +244,7 @@ class ToolCalibrateExcellon(FlatCAMTool): grid_lay.addWidget(self.start_button, 16, 0, 1, 3) + # STEP 2 # step_2 = QtWidgets.QLabel('%s' % _("STEP 2")) step_2.setToolTip( _("Generate GCode file to locate and align the PCB by using\n" @@ -208,6 +261,7 @@ class ToolCalibrateExcellon(FlatCAMTool): grid_lay.addWidget(self.gcode_button, 18, 0, 1, 3) + # STEP 3 # step_3 = QtWidgets.QLabel('%s' % _("STEP 3")) step_3.setToolTip( _("Calculate Scale and Skew factors based on the differences (delta)\n" @@ -232,7 +286,10 @@ class ToolCalibrateExcellon(FlatCAMTool): self.scalex_label.setToolTip( _("Factor for Scale action over X axis.") ) - self.scalex_entry = EvalEntry() + self.scalex_entry = FCDoubleSpinner() + self.scalex_entry.set_range(0, 9999.9999) + self.scalex_entry.set_precision(self.decimals) + self.scalex_entry.setSingleStep(0.1) grid_lay.addWidget(self.scalex_label, 22, 0) grid_lay.addWidget(self.scalex_entry, 22, 1, 1, 2) @@ -241,7 +298,10 @@ class ToolCalibrateExcellon(FlatCAMTool): self.scaley_label.setToolTip( _("Factor for Scale action over Y axis.") ) - self.scaley_entry = EvalEntry() + self.scaley_entry = FCDoubleSpinner() + self.scaley_entry.set_range(0, 9999.9999) + self.scaley_entry.set_precision(self.decimals) + self.scaley_entry.setSingleStep(0.1) grid_lay.addWidget(self.scaley_label, 23, 0) grid_lay.addWidget(self.scaley_entry, 23, 1, 1, 2) @@ -254,7 +314,10 @@ class ToolCalibrateExcellon(FlatCAMTool): _("Angle for Skew action, in degrees.\n" "Float number between -360 and 359.") ) - self.skewx_entry = EvalEntry() + self.skewx_entry = FCDoubleSpinner() + self.skewx_entry.set_range(-360, 360) + self.skewx_entry.set_precision(self.decimals) + self.skewx_entry.setSingleStep(0.1) grid_lay.addWidget(self.skewx_label, 25, 0) grid_lay.addWidget(self.skewx_entry, 25, 1, 1, 2) @@ -264,11 +327,15 @@ class ToolCalibrateExcellon(FlatCAMTool): _("Angle for Skew action, in degrees.\n" "Float number between -360 and 359.") ) - self.skewy_entry = EvalEntry() + self.skewy_entry = FCDoubleSpinner() + self.skewy_entry.set_range(-360, 360) + self.skewy_entry.set_precision(self.decimals) + self.skewy_entry.setSingleStep(0.1) grid_lay.addWidget(self.skewy_label, 26, 0) grid_lay.addWidget(self.skewy_entry, 26, 1, 1, 2) + # STEP 4 # step_4 = QtWidgets.QLabel('%s' % _("STEP 4")) step_4.setToolTip( _("Generate verification GCode file adjusted with\n" @@ -276,14 +343,57 @@ class ToolCalibrateExcellon(FlatCAMTool): ) grid_lay.addWidget(step_4, 27, 0, 1, 3) - # ## GCode Button - self.gcode_button = QtWidgets.QPushButton(_("Generate Adjusted GCode")) - self.gcode_button.setToolTip( + # ## Adjusted GCode Button + self.adj_gcode_button = QtWidgets.QPushButton(_("Generate Adjusted GCode")) + self.adj_gcode_button.setToolTip( _("Generate verification GCode file adjusted with\n" "the factors above.") ) - grid_lay.addWidget(self.gcode_button, 28, 0, 1, 3) + grid_lay.addWidget(self.adj_gcode_button, 28, 0, 1, 3) + # STEP 5 # + step_5 = QtWidgets.QLabel('%s' % _("STEP 5")) + step_5.setToolTip( + _("Ajust the Excellon and Cutout Geometry objects\n" + "with the factors determined, and verified, above.") + ) + grid_lay.addWidget(step_5, 29, 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.setToolTip( + _("Excellon Object to be adjusted.") + ) + + grid_lay.addWidget(self.adj_excobj_label, 30, 0) + grid_lay.addWidget(self.adj_exc_object_combo, 30, 1, 1, 2) + + 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.setToolTip( + _("Geometry Object to be adjusted.") + ) + + grid_lay.addWidget(self.adj_geoobj_label, 31, 0) + grid_lay.addWidget(self.adj_geo_object_combo, 31, 1, 1, 2) + + # ## Adjust Objects Button + self.adj_obj_button = QtWidgets.QPushButton(_("Adjust Objects")) + self.adj_obj_button.setToolTip( + _("Adjust (scale and / or skew) the objects\n" + "with the factors determined above.") + ) + grid_lay.addWidget(self.adj_obj_button, 32, 0, 1, 3) + + grid_lay.addWidget(QtWidgets.QLabel(''), 33, 0) self.layout.addStretch() self.mr = None @@ -393,6 +503,23 @@ class ToolCalibrateExcellon(FlatCAMTool): self.app.inform.emit('[success] %s' % _("Done. All four points have been acquired.")) self.disconnect_cal_events() + def generate_verification_gcode(self): + pass + + def gcode_header(self): + log.debug("ToolCalibrateExcellon.gcode_header()") + time_str = "{:%A, %d %B %Y at %H:%M}".format(datetime.now()) + + gcode = '(G-CODE GENERATED BY FLATCAM v%s - www.flatcam.org - Version Date: %s)\n' % \ + (str(self.app.version), str(self.app.version_date)) + '\n' + + gcode += '(Name: ' + _('Verification GCode') + ')\n' + + gcode += '(Units: ' + self.units.upper() + ')\n' + "\n" + gcode += '(Created on ' + time_str + ')\n' + '\n' + + return gcode + def disconnect_cal_events(self): self.app.mr = self.canvas.graph_event_connect('mouse_release', self.app.on_mouse_click_release_over_plot)