- finished the GUI layout for the Calibrate Excellon Tool

This commit is contained in:
Marius Stanciu 2019-10-22 16:17:13 +03:00
parent ee6e6c424a
commit cff0787107
3 changed files with 169 additions and 41 deletions

View File

@ -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

View File

@ -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

View File

@ -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("<b>%s:</b>" % _("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('<b>%s</b>' % _('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('<b>%s</b>' % _('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('<b>%s</b>' % _('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('<b>%s</b>' % _('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('<b>%s</b>' % _("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('<b>%s</b>' % _("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('<b>%s</b>' % _("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('<b>%s</b>' % _("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('<b>%s</b>' % _("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("<b>%s:</b>" % _("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("<b>%s:</b>" % _("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)