diff --git a/FlatCAMApp.py b/FlatCAMApp.py index d5377245..e5b43acb 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -2979,6 +2979,7 @@ class App(QtCore.QObject): self.image_tool = ToolImage(self) self.image_tool.install(icon=QtGui.QIcon('share/image32.png'), pos=self.ui.menufileimport, separator=True) + self.pcb_wizard_tool = PcbWizard(self) self.pcb_wizard_tool.install(icon=QtGui.QIcon('share/drill32.png'), pos=self.ui.menufileimport) diff --git a/README.md b/README.md index 2776f97d..161c536f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,11 @@ CAD program, and create G-Code for Isolation routing. ================================================= +5.10.2019 + +- remade the Tool Calculators to use the QSpinBox in order to simplify the user interaction and remove possible errors +- remade: Tool Cutout, Tool 2Sided, Tool Image, Panelize Tool, NCC Tool, Paint Tool to use the QSpinBox GUI elements + 4.10.2019 - updated the Film Tool and added the ability to generate Punched Positive films (holes in the pads) when a Gerber file is the film's source. The punch holes source can be either an Excellon file or the pads center diff --git a/flatcamTools/ToolCalculators.py b/flatcamTools/ToolCalculators.py index 98637c95..5a3f200b 100644 --- a/flatcamTools/ToolCalculators.py +++ b/flatcamTools/ToolCalculators.py @@ -30,6 +30,7 @@ class ToolCalculator(FlatCAMTool): FlatCAMTool.__init__(self, app) self.app = app + self.decimals = 6 # ## Title title_label = QtWidgets.QLabel("%s" % self.toolName) @@ -63,13 +64,14 @@ class ToolCalculator(FlatCAMTool): grid_units_layout.addWidget(inch_label, 0, 1) self.inch_entry = FCEntry() + # self.inch_entry.setFixedWidth(70) - self.inch_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + # self.inch_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.inch_entry.setToolTip(_("Here you enter the value to be converted from INCH to MM")) self.mm_entry = FCEntry() # self.mm_entry.setFixedWidth(130) - self.mm_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + # self.mm_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.mm_entry.setToolTip(_("Here you enter the value to be converted from MM to INCH")) grid_units_layout.addWidget(self.mm_entry, 1, 0) @@ -90,31 +92,35 @@ class ToolCalculator(FlatCAMTool): self.layout.addLayout(form_layout) self.tipDia_label = QtWidgets.QLabel('%s:' % _("Tip Diameter")) - self.tipDia_entry = FCEntry() - # self.tipDia_entry.setFixedWidth(70) - self.tipDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.tipDia_entry = FCDoubleSpinner() + self.tipDia_entry.set_precision(self.decimals) + + # self.tipDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tipDia_label.setToolTip( _("This is the tool tip diameter.\n" "It is specified by manufacturer.") ) self.tipAngle_label = QtWidgets.QLabel('%s:' % _("Tip Angle")) - self.tipAngle_entry = FCEntry() - # self.tipAngle_entry.setFixedWidth(70) - self.tipAngle_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.tipAngle_entry = FCSpinner() + + # self.tipAngle_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.tipAngle_label.setToolTip(_("This is the angle of the tip of the tool.\n" "It is specified by manufacturer.")) self.cutDepth_label = QtWidgets.QLabel('%s:' % _("Cut Z")) - self.cutDepth_entry = FCEntry() - # self.cutDepth_entry.setFixedWidth(70) - self.cutDepth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.cutDepth_entry = FCDoubleSpinner() + self.cutDepth_entry.setMinimum(-1e10) # to allow negative numbers without actually adding a real limit + self.cutDepth_entry.set_precision(self.decimals) + + # self.cutDepth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.cutDepth_label.setToolTip(_("This is the depth to cut into the material.\n" "In the CNCJob is the CutZ parameter.")) self.effectiveToolDia_label = QtWidgets.QLabel('%s:' % _("Tool Diameter")) - self.effectiveToolDia_entry = FCEntry() - # self.effectiveToolDia_entry.setFixedWidth(70) - self.effectiveToolDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.effectiveToolDia_entry = FCDoubleSpinner() + self.effectiveToolDia_entry.set_precision(self.decimals) + + # self.effectiveToolDia_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.effectiveToolDia_label.setToolTip(_("This is the tool diameter to be entered into\n" "FlatCAM Gerber section.\n" "In the CNCJob section it is called >Tool dia<.")) @@ -132,9 +138,8 @@ class ToolCalculator(FlatCAMTool): _("Calculate either the Cut Z or the effective tool diameter,\n " "depending on which is desired and which is known. ") ) - self.empty_label = QtWidgets.QLabel(" ") - form_layout.addRow(self.empty_label, self.calculate_vshape_button) + self.layout.addWidget(self.calculate_vshape_button) # #################################### # ## ElectroPlating Tool Calculator ## @@ -156,48 +161,54 @@ class ToolCalculator(FlatCAMTool): self.layout.addLayout(plate_form_layout) self.pcblengthlabel = QtWidgets.QLabel('%s:' % _("Board Length")) - self.pcblength_entry = FCEntry() - # self.pcblengthlabel.setFixedWidth(70) - self.pcblength_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.pcblength_entry = FCDoubleSpinner() + self.pcblength_entry.set_precision(self.decimals) + + # self.pcblength_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.pcblengthlabel.setToolTip(_('This is the board length. In centimeters.')) self.pcbwidthlabel = QtWidgets.QLabel('%s:' % _("Board Width")) - self.pcbwidth_entry = FCEntry() - # self.pcbwidthlabel.setFixedWidth(70) - self.pcbwidth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.pcbwidth_entry = FCDoubleSpinner() + self.pcbwidth_entry.set_precision(self.decimals) + + # self.pcbwidth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.pcbwidthlabel.setToolTip(_('This is the board width.In centimeters.')) self.cdensity_label = QtWidgets.QLabel('%s:' % _("Current Density")) - self.cdensity_entry = FCEntry() - # self.cdensity_entry.setFixedWidth(70) - self.cdensity_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.cdensity_entry = FCDoubleSpinner() + self.cdensity_entry.set_precision(self.decimals) + + # self.cdensity_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.cdensity_label.setToolTip(_("Current density to pass through the board. \n" "In Amps per Square Feet ASF.")) self.growth_label = QtWidgets.QLabel('%s:' % _("Copper Growth")) - self.growth_entry = FCEntry() - # self.growth_entry.setFixedWidth(70) - self.growth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.growth_entry = FCDoubleSpinner() + self.growth_entry.set_precision(self.decimals) + + # self.growth_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.growth_label.setToolTip(_("How thick the copper growth is intended to be.\n" "In microns.")) # self.growth_entry.setEnabled(False) self.cvaluelabel = QtWidgets.QLabel('%s:' % _("Current Value")) - self.cvalue_entry = FCEntry() - # self.cvaluelabel.setFixedWidth(70) - self.cvalue_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.cvalue_entry = FCDoubleSpinner() + self.cvalue_entry.set_precision(self.decimals) + + # self.cvalue_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.cvaluelabel.setToolTip(_('This is the current intensity value\n' 'to be set on the Power Supply. In Amps.')) - self.cvalue_entry.setDisabled(True) + self.cvalue_entry.setReadOnly(True) self.timelabel = QtWidgets.QLabel('%s:' % _("Time")) - self.time_entry = FCEntry() - # self.timelabel.setFixedWidth(70) - self.time_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.time_entry = FCDoubleSpinner() + self.time_entry.set_precision(self.decimals) + + # self.time_entry.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.timelabel.setToolTip(_('This is the calculated time required for the procedure.\n' 'In minutes.')) - self.time_entry.setDisabled(True) + self.time_entry.setReadOnly(True) plate_form_layout.addRow(self.pcblengthlabel, self.pcblength_entry) plate_form_layout.addRow(self.pcbwidthlabel, self.pcbwidth_entry) @@ -213,16 +224,14 @@ class ToolCalculator(FlatCAMTool): _("Calculate the current intensity value and the procedure time,\n" "depending on the parameters above") ) - self.empty_label_2 = QtWidgets.QLabel(" ") - - plate_form_layout.addRow(self.empty_label_2, self.calculate_plate_button) + self.layout.addWidget(self.calculate_plate_button) self.layout.addStretch() self.units = '' # ## Signals - self.cutDepth_entry.textChanged.connect(self.on_calculate_tool_dia) + self.cutDepth_entry.valueChanged.connect(self.on_calculate_tool_dia) self.cutDepth_entry.editingFinished.connect(self.on_calculate_tool_dia) self.tipDia_entry.editingFinished.connect(self.on_calculate_tool_dia) self.tipAngle_entry.editingFinished.connect(self.on_calculate_tool_dia) @@ -268,8 +277,8 @@ class ToolCalculator(FlatCAMTool): self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() # ## Initialize form - self.mm_entry.set_value('0') - self.inch_entry.set_value('0') + self.mm_entry.set_value('%.*f' % (self.decimals, 0)) + self.inch_entry.set_value('%.*f' % (self.decimals, 0)) length = self.app.defaults["tools_calc_electro_length"] width = self.app.defaults["tools_calc_electro_width"] @@ -300,114 +309,30 @@ class ToolCalculator(FlatCAMTool): # effective_diameter = tip_diameter + (2 * part_of_real_dia_left_side) # effective diameter = tip_diameter + (2 * depth_of_cut * tangent(half_tip_angle)) - try: - tip_diameter = float(self.tipDia_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - tip_diameter = float(self.tipDia_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + tip_diameter = float(self.tipDia_entry.get_value()) - try: - half_tip_angle = float(self.tipAngle_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - half_tip_angle = float(self.tipAngle_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + half_tip_angle = float(self.tipAngle_entry.get_value()) half_tip_angle /= 2 - try: - cut_depth = float(self.cutDepth_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - cut_depth = float(self.cutDepth_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + cut_depth = float(self.cutDepth_entry.get_value()) + cut_depth = -cut_depth if cut_depth < 0 else cut_depth tool_diameter = tip_diameter + (2 * cut_depth * math.tan(math.radians(half_tip_angle))) - self.effectiveToolDia_entry.set_value("%.4f" % tool_diameter) + self.effectiveToolDia_entry.set_value("%.*f" % (self.decimals, tool_diameter)) def on_calculate_inch_units(self): - try: - mm_val = float(self.mm_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - mm_val = float(self.mm_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return - self.inch_entry.set_value('%.6f' % (mm_val / 25.4)) + mm_val = float(self.mm_entry.get_value()) + self.inch_entry.set_value('%.*f' % (self.decimals,(mm_val / 25.4))) def on_calculate_mm_units(self): - try: - inch_val = float(self.inch_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - inch_val = float(self.inch_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return - self.mm_entry.set_value('%.6f' % (inch_val * 25.4)) + inch_val = float(self.inch_entry.get_value()) + self.mm_entry.set_value('%.*f' % (self.decimals,(inch_val * 25.4))) def on_calculate_eplate(self): - - try: - length = float(self.pcblength_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - length = float(self.pcblength_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return - - try: - width = float(self.pcbwidth_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - width = float(self.pcbwidth_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return - - try: - density = float(self.cdensity_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - density = float(self.cdensity_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return - - try: - copper = float(self.growth_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - copper = float(self.growth_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + length = float(self.pcblength_entry.get_value()) + width = float(self.pcbwidth_entry.get_value()) + density = float(self.cdensity_entry.get_value()) + copper = float(self.growth_entry.get_value()) calculated_current = (length * width * density) * 0.0021527820833419 calculated_time = copper * 2.142857142857143 * float(20 / density) diff --git a/flatcamTools/ToolCutOut.py b/flatcamTools/ToolCutOut.py index 1e908568..26a62df3 100644 --- a/flatcamTools/ToolCutOut.py +++ b/flatcamTools/ToolCutOut.py @@ -22,6 +22,7 @@ class CutOut(FlatCAMTool): self.app = app self.canvas = app.plotcanvas + self.decimals = 4 # Title title_label = QtWidgets.QLabel("%s" % self.toolName) @@ -87,7 +88,9 @@ class CutOut(FlatCAMTool): form_layout.addRow(self.kindlabel, self.obj_kind_combo) # Tool Diameter - self.dia = FCEntry() + self.dia = FCDoubleSpinner() + self.dia.set_precision(self.decimals) + self.dia_label = QtWidgets.QLabel('%s:' % _("Tool dia")) self.dia_label.setToolTip( _("Diameter of the tool used to cutout\n" @@ -96,7 +99,9 @@ class CutOut(FlatCAMTool): form_layout.addRow(self.dia_label, self.dia) # Margin - self.margin = FCEntry() + self.margin = FCDoubleSpinner() + self.margin.set_precision(self.decimals) + self.margin_label = QtWidgets.QLabel('%s:' % _("Margin:")) self.margin_label.setToolTip( _("Margin over bounds. A positive value here\n" @@ -106,7 +111,9 @@ class CutOut(FlatCAMTool): form_layout.addRow(self.margin_label, self.margin) # Gapsize - self.gapsize = FCEntry() + self.gapsize = FCDoubleSpinner() + self.gapsize.set_precision(self.decimals) + self.gapsize_label = QtWidgets.QLabel('%s:' % _("Gap size:")) self.gapsize_label.setToolTip( _("The size of the bridge gaps in the cutout\n" @@ -381,17 +388,7 @@ class CutOut(FlatCAMTool): _("There is no object selected for Cutout.\nSelect one and try again.")) return - try: - dia = float(self.dia.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - dia = float(self.dia.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Tool diameter value is missing or wrong format. Add it and retry.")) - return - + dia = float(self.dia.get_value()) if 0 in {dia}: self.app.inform.emit('[WARNING_NOTCL] %s' % _("Tool Diameter is zero value. Change it to a positive real number.")) @@ -402,27 +399,8 @@ class CutOut(FlatCAMTool): except ValueError: return - try: - margin = float(self.margin.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - margin = float(self.margin.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Margin value is missing or wrong format. Add it and retry.")) - return - - try: - gapsize = float(self.gapsize.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - gapsize = float(self.gapsize.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Gap size value is missing or wrong format. Add it and retry.")) - return + margin = float(self.margin.get_value()) + gapsize = float(self.gapsize.get_value()) try: gaps = self.gaps.get_value() @@ -579,17 +557,7 @@ class CutOut(FlatCAMTool): if cutout_obj is None: self.app.inform.emit('[ERROR_NOTCL] %s: %s' % (_("Object not found"), str(name))) - try: - dia = float(self.dia.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - dia = float(self.dia.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Tool diameter value is missing or wrong format. Add it and retry.")) - return - + dia = float(self.dia.get_value()) if 0 in {dia}: self.app.inform.emit('[ERROR_NOTCL] %s' % _("Tool Diameter is zero value. Change it to a positive real number.")) @@ -600,27 +568,8 @@ class CutOut(FlatCAMTool): except ValueError: return - try: - margin = float(self.margin.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - margin = float(self.margin.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Margin value is missing or wrong format. Add it and retry.")) - return - - try: - gapsize = float(self.gapsize.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - gapsize = float(self.gapsize.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Gap size value is missing or wrong format. Add it and retry.")) - return + margin = float(self.margin.get_value()) + gapsize = float(self.gapsize.get_value()) try: gaps = self.gaps.get_value() @@ -749,32 +698,13 @@ class CutOut(FlatCAMTool): self.app.inform.emit(_("Click on the selected geometry object perimeter to create a bridge gap ...")) self.app.geo_editor.tool_shape.enabled = True - try: - self.cutting_dia = float(self.dia.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - self.cutting_dia = float(self.dia.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Tool diameter value is missing or wrong format. Add it and retry.")) - return - + self.cutting_dia = float(self.dia.get_value()) if 0 in {self.cutting_dia}: self.app.inform.emit('[ERROR_NOTCL] %s' % _("Tool Diameter is zero value. Change it to a positive real number.")) return "Tool Diameter is zero value. Change it to a positive real number." - try: - self.cutting_gapsize = float(self.gapsize.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - self.cutting_gapsize = float(self.gapsize.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Gap size value is missing or wrong format. Add it and retry.")) - return + self.cutting_gapsize = float(self.gapsize.get_value()) name = self.man_object_combo.currentText() # Get Geometry source object to be used as target for Manual adding Gaps @@ -800,7 +730,6 @@ class CutOut(FlatCAMTool): self.mm = self.app.plotcanvas.graph_event_connect('mouse_move', self.on_mouse_move) self.mr = self.app.plotcanvas.graph_event_connect('mouse_release', self.on_mouse_click_release) - def on_manual_cutout(self, click_pos): name = self.man_object_combo.currentText() @@ -851,17 +780,7 @@ class CutOut(FlatCAMTool): "Select a Gerber file and try again.")) return - try: - dia = float(self.dia.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - dia = float(self.dia.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Tool diameter value is missing or wrong format. Add it and retry.")) - return - + dia = float(self.dia.get_value()) if 0 in {dia}: self.app.inform.emit('[ERROR_NOTCL] %s' % _("Tool Diameter is zero value. Change it to a positive real number.")) @@ -872,17 +791,7 @@ class CutOut(FlatCAMTool): except ValueError: return - try: - margin = float(self.margin.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - margin = float(self.margin.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Margin value is missing or wrong format. Add it and retry.")) - return - + margin = float(self.margin.get_value()) convex_box = self.convex_box.get_value() def geo_init(geo_obj, app_obj): diff --git a/flatcamTools/ToolDblSided.py b/flatcamTools/ToolDblSided.py index b72fb9d4..0b58c94e 100644 --- a/flatcamTools/ToolDblSided.py +++ b/flatcamTools/ToolDblSided.py @@ -19,6 +19,7 @@ class DblSidedTool(FlatCAMTool): def __init__(self, app): FlatCAMTool.__init__(self, app) + self.decimals = 4 # ## Title title_label = QtWidgets.QLabel("%s" % self.toolName) @@ -219,25 +220,30 @@ class DblSidedTool(FlatCAMTool): grid_lay3.addWidget(self.alignment_holes, 0, 0) grid_lay3.addWidget(self.add_drill_point_button, 0, 1) + grid0 = QtWidgets.QGridLayout() + self.layout.addLayout(grid0) + grid0.setColumnStretch(0, 0) + grid0.setColumnStretch(1, 1) + # ## Drill diameter for alignment holes self.dt_label = QtWidgets.QLabel("%s:" % _('Alignment Drill Diameter')) self.dt_label.setToolTip( _("Diameter of the drill for the " "alignment holes.") ) - self.layout.addWidget(self.dt_label) + grid0.addWidget(self.dt_label, 0, 0, 1, 2) - hlay = QtWidgets.QHBoxLayout() - self.layout.addLayout(hlay) + # Drill diameter value + self.drill_dia = FCDoubleSpinner() + self.drill_dia.set_precision(self.decimals) - self.drill_dia = FCEntry() self.dd_label = QtWidgets.QLabel('%s:' % _("Drill dia")) self.dd_label.setToolTip( _("Diameter of the drill for the " "alignment holes.") ) - hlay.addWidget(self.dd_label) - hlay.addWidget(self.drill_dia) + grid0.addWidget(self.dd_label, 1, 0) + grid0.addWidget(self.drill_dia, 1, 1) hlay2 = QtWidgets.QHBoxLayout() self.layout.addLayout(hlay2) diff --git a/flatcamTools/ToolImage.py b/flatcamTools/ToolImage.py index 9fadcea4..2e40f898 100644 --- a/flatcamTools/ToolImage.py +++ b/flatcamTools/ToolImage.py @@ -8,7 +8,7 @@ from FlatCAMTool import FlatCAMTool -from flatcamGUI.GUIElements import RadioSet, FCComboBox, IntEntry +from flatcamGUI.GUIElements import RadioSet, FCComboBox, FCSpinner from PyQt5 import QtGui, QtWidgets import gettext @@ -59,11 +59,9 @@ class ToolImage(FlatCAMTool): ti_form_layout.addRow(self.tf_type_obj_combo_label, self.tf_type_obj_combo) # DPI value of the imported image - self.dpi_entry = IntEntry() + self.dpi_entry = FCSpinner() self.dpi_label = QtWidgets.QLabel('%s:' % _("DPI value")) - self.dpi_label.setToolTip( - _("Specify a DPI value for the image.") - ) + self.dpi_label.setToolTip(_("Specify a DPI value for the image.") ) ti_form_layout.addRow(self.dpi_label, self.dpi_entry) self.emty_lbl = QtWidgets.QLabel("") @@ -86,7 +84,9 @@ class ToolImage(FlatCAMTool): ti2_form_layout.addRow(self.image_type_label, self.image_type) # Mask value of the imported image when image monochrome - self.mask_bw_entry = IntEntry() + self.mask_bw_entry = FCSpinner() + self.mask_bw_entry.set_range(0, 255) + self.mask_bw_label = QtWidgets.QLabel("%s B/W:" % _('Mask value')) self.mask_bw_label.setToolTip( _("Mask for monochrome image.\n" @@ -99,7 +99,9 @@ class ToolImage(FlatCAMTool): ti2_form_layout.addRow(self.mask_bw_label, self.mask_bw_entry) # Mask value of the imported image for RED color when image color - self.mask_r_entry = IntEntry() + self.mask_r_entry = FCSpinner() + self.mask_r_entry.set_range(0, 255) + self.mask_r_label = QtWidgets.QLabel("%s R:" % _('Mask value')) self.mask_r_label.setToolTip( _("Mask for RED color.\n" @@ -110,7 +112,9 @@ class ToolImage(FlatCAMTool): ti2_form_layout.addRow(self.mask_r_label, self.mask_r_entry) # Mask value of the imported image for GREEN color when image color - self.mask_g_entry = IntEntry() + self.mask_g_entry = FCSpinner() + self.mask_g_entry.set_range(0, 255) + self.mask_g_label = QtWidgets.QLabel("%s G:" % _('Mask value')) self.mask_g_label.setToolTip( _("Mask for GREEN color.\n" @@ -121,7 +125,9 @@ class ToolImage(FlatCAMTool): ti2_form_layout.addRow(self.mask_g_label, self.mask_g_entry) # Mask value of the imported image for BLUE color when image color - self.mask_b_entry = IntEntry() + self.mask_b_entry = FCSpinner() + self.mask_b_entry.set_range(0, 255) + self.mask_b_label = QtWidgets.QLabel("%s B:" % _('Mask value')) self.mask_b_label.setToolTip( _("Mask for BLUE color.\n" @@ -132,15 +138,11 @@ class ToolImage(FlatCAMTool): ti2_form_layout.addRow(self.mask_b_label, self.mask_b_entry) # Buttons - hlay = QtWidgets.QHBoxLayout() - self.layout.addLayout(hlay) - hlay.addStretch() - self.import_button = QtWidgets.QPushButton(_("Import image")) self.import_button.setToolTip( _("Open a image of raster type and then import it in FlatCAM.") ) - hlay.addWidget(self.import_button) + self.layout.addWidget(self.import_button) self.layout.addStretch() diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index 5c34ef7b..dcc9f394 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -27,6 +27,7 @@ class NonCopperClear(FlatCAMTool, Gerber): def __init__(self, app): self.app = app + self.decimals = 4 FlatCAMTool.__init__(self, app) Gerber.__init__(self, steps_per_circle=self.app.defaults["gerber_circle_steps"]) @@ -213,14 +214,18 @@ class NonCopperClear(FlatCAMTool, Gerber): self.addtool_entry_lbl.setToolTip( _("Diameter for the new tool to add in the Tool Table") ) - self.addtool_entry = FCEntry2() + self.addtool_entry = FCDoubleSpinner() + self.addtool_entry.set_precision(self.decimals) + form.addRow(self.addtool_entry_lbl, self.addtool_entry) # Tip Dia self.tipdialabel = QtWidgets.QLabel('%s:' % _('V-Tip Dia')) self.tipdialabel.setToolTip( _("The tip diameter for V-Shape Tool")) - self.tipdia_entry = LengthEntry() + self.tipdia_entry = FCDoubleSpinner() + self.tipdia_entry.set_precision(self.decimals) + form.addRow(self.tipdialabel, self.tipdia_entry) # Tip Angle @@ -228,7 +233,9 @@ class NonCopperClear(FlatCAMTool, Gerber): self.tipanglelabel.setToolTip( _("The tip angle for V-Shape Tool.\n" "In degree.")) - self.tipangle_entry = LengthEntry() + self.tipangle_entry = FCDoubleSpinner() + self.tipangle_entry.set_precision(self.decimals) + form.addRow(self.tipanglelabel, self.tipangle_entry) grid2 = QtWidgets.QGridLayout() @@ -271,7 +278,10 @@ class NonCopperClear(FlatCAMTool, Gerber): _("Depth of cut into material. Negative value.\n" "In FlatCAM units.") ) - self.cutz_entry = FloatEntry() + self.cutz_entry = FCDoubleSpinner() + self.cutz_entry.set_precision(self.decimals) + self.cutz_entry.set_range(-99999, -0.00000000000001) + self.cutz_entry.setToolTip( _("Depth of cut into material. Negative value.\n" "In FlatCAM units.") @@ -305,7 +315,9 @@ class NonCopperClear(FlatCAMTool, Gerber): _("Bounding box margin.") ) grid3.addWidget(nccmarginlabel, 3, 0) - self.ncc_margin_entry = FCEntry() + self.ncc_margin_entry = FCDoubleSpinner() + self.ncc_margin_entry.set_precision(self.decimals) + grid3.addWidget(self.ncc_margin_entry, 3, 1) # Method @@ -488,15 +500,12 @@ class NonCopperClear(FlatCAMTool, Gerber): # store here solid_geometry when there are tool with isolation job self.solid_geometry = [] - # the number of decimals for the tools used in this FlatCAM Tool - self.decimals = 4 - self.select_method = None self.tool_type_item_options = [] self.addtool_btn.clicked.connect(self.on_tool_add) - self.addtool_entry.returnPressed.connect(self.on_tool_add) + self.addtool_entry.editingFinished.connect(self.on_tool_add) self.deltool_btn.clicked.connect(self.on_tool_delete) self.generate_ncc_button.clicked.connect(self.on_ncc_click) @@ -958,7 +967,7 @@ class NonCopperClear(FlatCAMTool, Gerber): for k, v in self.ncc_tools.items(): for tool_v in v.keys(): if tool_v == 'tooldia': - tool_dias.append(float('%.*f' % self.decimals, (v[tool_v]))) + tool_dias.append(float('%.*f' % (self.decimals, (v[tool_v])))) if float('%.*f' % (self.decimals, tool_dia)) in tool_dias: if muted is None: diff --git a/flatcamTools/ToolPaint.py b/flatcamTools/ToolPaint.py index 2c2c6deb..d3891ef0 100644 --- a/flatcamTools/ToolPaint.py +++ b/flatcamTools/ToolPaint.py @@ -26,6 +26,7 @@ class ToolPaint(FlatCAMTool, Gerber): def __init__(self, app): self.app = app + self.decimals = 4 FlatCAMTool.__init__(self, app) Geometry.__init__(self, geo_steps_per_circle=self.app.defaults["geometry_circle_steps"]) @@ -156,19 +157,14 @@ class ToolPaint(FlatCAMTool, Gerber): form.addRow(self.order_label, self.order_radio) # ### Add a new Tool ## ## - hlay = QtWidgets.QHBoxLayout() - self.tools_box.addLayout(hlay) - self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia')) self.addtool_entry_lbl.setToolTip( _("Diameter for the new tool.") ) - self.addtool_entry = FCEntry2() + self.addtool_entry = FCDoubleSpinner() + self.addtool_entry.set_precision(self.decimals) - # hlay.addWidget(self.addtool_label) - # hlay.addStretch() - hlay.addWidget(self.addtool_entry_lbl) - hlay.addWidget(self.addtool_entry) + form.addRow(self.addtool_entry_lbl, self.addtool_entry) grid2 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid2) @@ -200,6 +196,8 @@ class ToolPaint(FlatCAMTool, Gerber): grid3 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid3) + grid3.setColumnStretch(0, 0) + grid3.setColumnStretch(1, 1) # Overlap ovlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate')) @@ -230,7 +228,9 @@ class ToolPaint(FlatCAMTool, Gerber): "be painted.") ) grid3.addWidget(marginlabel, 2, 0) - self.paintmargin_entry = FCEntry() + self.paintmargin_entry = FCDoubleSpinner() + self.paintmargin_entry.set_precision(self.decimals) + grid3.addWidget(self.paintmargin_entry, 2, 1) # Method @@ -376,9 +376,6 @@ class ToolPaint(FlatCAMTool, Gerber): self.sel_rect = [] - # Number of decimals for tools used in this Tool - self.decimals = 4 - # store here the default data for Geometry Data self.default_data = {} self.default_data.update({ @@ -417,7 +414,7 @@ class ToolPaint(FlatCAMTool, Gerber): # ## Signals self.addtool_btn.clicked.connect(self.on_tool_add) - self.addtool_entry.returnPressed.connect(self.on_tool_add) + self.addtool_entry.editingFinished.connect(self.on_tool_add) # self.copytool_btn.clicked.connect(lambda: self.on_tool_copy()) self.tools_table.itemChanged.connect(self.on_tool_edit) self.deltool_btn.clicked.connect(self.on_tool_delete) diff --git a/flatcamTools/ToolPanelize.py b/flatcamTools/ToolPanelize.py index 3fd90dc1..a6739d36 100644 --- a/flatcamTools/ToolPanelize.py +++ b/flatcamTools/ToolPanelize.py @@ -143,7 +143,7 @@ class Panelize(FlatCAMTool): form_layout.addRow(panel_data_label) # Spacing Columns - self.spacing_columns = FCEntry() + self.spacing_columns = FCSpinner() self.spacing_columns_label = QtWidgets.QLabel('%s:' % _("Spacing cols")) self.spacing_columns_label.setToolTip( _("Spacing between columns of the desired panel.\n" @@ -152,7 +152,7 @@ class Panelize(FlatCAMTool): form_layout.addRow(self.spacing_columns_label, self.spacing_columns) # Spacing Rows - self.spacing_rows = FCEntry() + self.spacing_rows = FCSpinner() self.spacing_rows_label = QtWidgets.QLabel('%s:' % _("Spacing rows")) self.spacing_rows_label.setToolTip( _("Spacing between rows of the desired panel.\n" @@ -161,7 +161,7 @@ class Panelize(FlatCAMTool): form_layout.addRow(self.spacing_rows_label, self.spacing_rows) # Columns - self.columns = FCEntry() + self.columns = FCSpinner() self.columns_label = QtWidgets.QLabel('%s:' % _("Columns")) self.columns_label.setToolTip( _("Number of columns of the desired panel") @@ -169,7 +169,7 @@ class Panelize(FlatCAMTool): form_layout.addRow(self.columns_label, self.columns) # Rows - self.rows = FCEntry() + self.rows = FCSpinner() self.rows_label = QtWidgets.QLabel('%s:' % _("Rows")) self.rows_label.setToolTip( _("Number of rows of the desired panel") @@ -200,7 +200,7 @@ class Panelize(FlatCAMTool): ) form_layout.addRow(self.constrain_cb) - self.x_width_entry = FCEntry() + self.x_width_entry = FCSpinner() self.x_width_lbl = QtWidgets.QLabel('%s:' % _("Width (DX)")) self.x_width_lbl.setToolTip( _("The width (DX) within which the panel must fit.\n" @@ -208,7 +208,7 @@ class Panelize(FlatCAMTool): ) form_layout.addRow(self.x_width_lbl, self.x_width_entry) - self.y_height_entry = FCEntry() + self.y_height_entry = FCSpinner() self.y_height_lbl = QtWidgets.QLabel('%s:' % _("Height (DY)")) self.y_height_lbl.setToolTip( _("The height (DY)within which the panel must fit.\n" @@ -386,77 +386,20 @@ class Panelize(FlatCAMTool): self.outname = name + '_panelized' - try: - spacing_columns = float(self.spacing_columns.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - spacing_columns = float(self.spacing_columns.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + spacing_columns = float(self.spacing_columns.get_value()) spacing_columns = spacing_columns if spacing_columns is not None else 0 - try: - spacing_rows = float(self.spacing_rows.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - spacing_rows = float(self.spacing_rows.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + spacing_rows = float(self.spacing_rows.get_value()) spacing_rows = spacing_rows if spacing_rows is not None else 0 - try: - rows = int(self.rows.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - rows = float(self.rows.get_value().replace(',', '.')) - rows = int(rows) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + rows = int(self.rows.get_value()) rows = rows if rows is not None else 1 - try: - columns = int(self.columns.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - columns = float(self.columns.get_value().replace(',', '.')) - columns = int(columns) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + columns = int(self.columns.get_value()) columns = columns if columns is not None else 1 - try: - constrain_dx = float(self.x_width_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - constrain_dx = float(self.x_width_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return - - try: - constrain_dy = float(self.y_height_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return - try: - constrain_dy = float(self.y_height_entry.get_value().replace(',', '.')) - except ValueError: - self.app.inform.emit('[ERROR_NOTCL] %s' % - _("Wrong value format entered, use a number.")) - return + constrain_dx = float(self.x_width_entry.get_value()) + constrain_dy = float(self.y_height_entry.get_value()) panel_type = str(self.panel_type_radio.get_value()) diff --git a/share/distance_min16.png b/share/distance_min16.png index 4de09c90..0071d4f3 100644 Binary files a/share/distance_min16.png and b/share/distance_min16.png differ diff --git a/share/distance_min32.png b/share/distance_min32.png index f11b9653..856c900b 100644 Binary files a/share/distance_min32.png and b/share/distance_min32.png differ