Geometry advanced options

This commit is contained in:
David Robertson
2020-05-09 18:21:50 +01:00
parent 6a6674c368
commit 2e54dc6920
4 changed files with 144 additions and 254 deletions

View File

@@ -2,7 +2,7 @@ from typing import Union, Sequence, List
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from flatcamGUI.GUIElements import RadioSet, FCCheckBox, FCButton, FCComboBox, FCEntry, FCSpinner, FCColorEntry, \ from flatcamGUI.GUIElements import RadioSet, FCCheckBox, FCButton, FCComboBox, FCEntry, FCSpinner, FCColorEntry, \
FCSliderWithSpinner, FCDoubleSpinner FCSliderWithSpinner, FCDoubleSpinner, FloatEntry
import gettext import gettext
import FlatCAMTranslation as fcTranslate import FlatCAMTranslation as fcTranslate
@@ -64,12 +64,15 @@ class BasicOptionUI(OptionUI):
class LineEntryOptionUI(BasicOptionUI): class LineEntryOptionUI(BasicOptionUI):
def __init__(self, option: str, label_text: str, **kwargs):
super().__init__(option=option, label_text=label_text, **kwargs)
def build_entry_widget(self) -> QtWidgets.QWidget: def build_entry_widget(self) -> QtWidgets.QWidget:
return FCEntry() return FCEntry()
# Not sure why this is needed over DoubleSpinnerOptionUI
class FloatEntryOptionUI(BasicOptionUI):
def build_entry_widget(self) -> QtWidgets.QWidget:
return FloatEntry()
class RadioSetOptionUI(BasicOptionUI): class RadioSetOptionUI(BasicOptionUI):

View File

@@ -142,24 +142,6 @@ class PreferencesUIManager:
self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry, self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry,
# Geometry Advanced Options
"geometry_toolchangexy": self.ui.geometry_defaults_form.geometry_adv_opt_group.toolchangexy_entry,
"geometry_startz": self.ui.geometry_defaults_form.geometry_adv_opt_group.gstartz_entry,
"geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_rapid_entry,
"geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
"geometry_extracut_length": self.ui.geometry_defaults_form.geometry_adv_opt_group.e_cut_entry,
"geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry,
"geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_probe_entry,
"geometry_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio,
"geometry_f_plunge": self.ui.geometry_defaults_form.geometry_adv_opt_group.fplunge_cb,
"geometry_segx": self.ui.geometry_defaults_form.geometry_adv_opt_group.segx_entry,
"geometry_segy": self.ui.geometry_defaults_form.geometry_adv_opt_group.segy_entry,
"geometry_area_exclusion": self.ui.geometry_defaults_form.geometry_adv_opt_group.exclusion_cb,
"geometry_area_shape": self.ui.geometry_defaults_form.geometry_adv_opt_group.area_shape_radio,
"geometry_area_strategy": self.ui.geometry_defaults_form.geometry_adv_opt_group.strategy_radio,
"geometry_area_overz": self.ui.geometry_defaults_form.geometry_adv_opt_group.over_z_entry,
# CNCJob General # CNCJob General
"cncjob_plot": self.ui.cncjob_defaults_form.cncjob_gen_group.plot_cb, "cncjob_plot": self.ui.cncjob_defaults_form.cncjob_gen_group.plot_cb,
"cncjob_plot_kind": self.ui.cncjob_defaults_form.cncjob_gen_group.cncplot_method_radio, "cncjob_plot_kind": self.ui.cncjob_defaults_form.cncjob_gen_group.cncplot_method_radio,

View File

@@ -1,245 +1,150 @@
from PyQt5 import QtWidgets from flatcamGUI.preferences.OptionUI import *
from PyQt5.QtCore import QSettings from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI2
from flatcamGUI.GUIElements import FCEntry, FloatEntry, FCDoubleSpinner, FCCheckBox, RadioSet, FCLabel
from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
import gettext import gettext
import FlatCAMTranslation as fcTranslate import FlatCAMTranslation as fcTranslate
import builtins import builtins
fcTranslate.apply_language('strings') fcTranslate.apply_language('strings')
if '_' not in builtins.__dict__: if '_' not in builtins.__dict__:
_ = gettext.gettext _ = gettext.gettext
settings = QSettings("Open Source", "FlatCAM")
if settings.contains("machinist"):
machinist_setting = settings.value('machinist', type=int)
else:
machinist_setting = 0
class GeometryAdvOptPrefGroupUI(OptionsGroupUI2):
class GeometryAdvOptPrefGroupUI(OptionsGroupUI): def __init__(self, decimals=4, **kwargs):
def __init__(self, decimals=4, parent=None):
super(GeometryAdvOptPrefGroupUI, self).__init__(self, parent=parent)
self.setTitle(str(_("Geometry Adv. Options")))
self.decimals = decimals self.decimals = decimals
super().__init__(**kwargs)
self.setTitle(str(_("Geometry Adv. Options")))
# ------------------------------ def build_options(self) -> [OptionUI]:
# ## Advanced Options return [
# ------------------------------ HeadingOptionUI(
self.geo_label = QtWidgets.QLabel('<b>%s:</b>' % _('Advanced Options')) label_text="Advanced Options",
self.geo_label.setToolTip( label_tooltip="A list of Geometry advanced parameters.\n"
_("A list of Geometry advanced parameters.\n"
"Those parameters are available only for\n" "Those parameters are available only for\n"
"Advanced App. Level.") "Advanced App. Level."
) ),
self.layout.addWidget(self.geo_label) LineEntryOptionUI(
option="geometry_toolchangexy",
grid1 = QtWidgets.QGridLayout() label_text="Toolchange X-Y",
self.layout.addLayout(grid1) label_tooltip="Toolchange X,Y position."
),
# Toolchange X,Y FloatEntryOptionUI(
toolchange_xy_label = QtWidgets.QLabel('%s:' % _('Toolchange X-Y')) option="geometry_startz",
toolchange_xy_label.setToolTip( label_text="Start Z",
_("Toolchange X,Y position.") label_tooltip="Height of the tool just after starting the work.\n"
) "Delete the value if you don't need this feature."
grid1.addWidget(toolchange_xy_label, 1, 0) ),
self.toolchangexy_entry = FCEntry() DoubleSpinnerOptionUI(
grid1.addWidget(self.toolchangexy_entry, 1, 1) option="geometry_feedrate_rapid",
label_text="Feedrate Rapids",
# Start move Z label_tooltip="Cutting speed in the XY plane\n"
startzlabel = QtWidgets.QLabel('%s:' % _('Start Z'))
startzlabel.setToolTip(
_("Height of the tool just after starting the work.\n"
"Delete the value if you don't need this feature.")
)
grid1.addWidget(startzlabel, 2, 0)
self.gstartz_entry = FloatEntry()
grid1.addWidget(self.gstartz_entry, 2, 1)
# Feedrate rapids
fr_rapid_label = QtWidgets.QLabel('%s:' % _('Feedrate Rapids'))
fr_rapid_label.setToolTip(
_("Cutting speed in the XY plane\n"
"(in units per minute).\n" "(in units per minute).\n"
"This is for the rapid move G00.\n" "This is for the rapid move G00.\n"
"It is useful only for Marlin,\n" "It is useful only for Marlin,\n"
"ignore for any other cases.") "ignore for any other cases.",
) min_value=0, max_value=99999.9999, step=10, decimals=self.decimals
self.feedrate_rapid_entry = FCDoubleSpinner() ),
self.feedrate_rapid_entry.set_range(0, 99999.9999) CheckboxOptionUI(
self.feedrate_rapid_entry.set_precision(self.decimals) option="geometry_extracut",
self.feedrate_rapid_entry.setSingleStep(0.1) label_text="Re-cut",
self.feedrate_rapid_entry.setWrapping(True) label_tooltip="In order to remove possible\n"
grid1.addWidget(fr_rapid_label, 4, 0)
grid1.addWidget(self.feedrate_rapid_entry, 4, 1)
# End move extra cut
self.extracut_cb = FCCheckBox('%s' % _('Re-cut'))
self.extracut_cb.setToolTip(
_("In order to remove possible\n"
"copper leftovers where first cut\n" "copper leftovers where first cut\n"
"meet with last cut, we generate an\n" "meet with last cut, we generate an\n"
"extended cut over the first cut section.") "extended cut over the first cut section."
) ),
DoubleSpinnerOptionUI(
self.e_cut_entry = FCDoubleSpinner() option="geometry_extracut_length",
self.e_cut_entry.set_range(0, 99999) label_text="Re-cut length",
self.e_cut_entry.set_precision(self.decimals) label_tooltip="In order to remove possible\n"
self.e_cut_entry.setSingleStep(0.1)
self.e_cut_entry.setWrapping(True)
self.e_cut_entry.setToolTip(
_("In order to remove possible\n"
"copper leftovers where first cut\n" "copper leftovers where first cut\n"
"meet with last cut, we generate an\n" "meet with last cut, we generate an\n"
"extended cut over the first cut section.") "extended cut over the first cut section.",
) min_value=0, max_value=99999, step=0.1, decimals=self.decimals
grid1.addWidget(self.extracut_cb, 5, 0) ),
grid1.addWidget(self.e_cut_entry, 5, 1) DoubleSpinnerOptionUI(
option="geometry_z_pdepth",
# Probe depth label_text="Probe Z depth",
self.pdepth_label = QtWidgets.QLabel('%s:' % _("Probe Z depth")) label_tooltip="The maximum depth that the probe is allowed\n"
self.pdepth_label.setToolTip( "to probe. Negative value, in current units.",
_("The maximum depth that the probe is allowed\n" min_value=-99999, max_value=0.0, step=0.1, decimals=self.decimals
"to probe. Negative value, in current units.") ),
) DoubleSpinnerOptionUI(
self.pdepth_entry = FCDoubleSpinner() option="geometry_feedrate_probe",
self.pdepth_entry.set_range(-99999, 0.0000) label_text="Feedrate Probe",
self.pdepth_entry.set_precision(self.decimals) label_tooltip="The feedrate used while the probe is probing.",
self.pdepth_entry.setSingleStep(0.1) min_value=0, max_value=99999.9999, step=0.1, decimals=self.decimals
self.pdepth_entry.setWrapping(True) ),
RadioSetOptionUI(
grid1.addWidget(self.pdepth_label, 6, 0) option="geometry_spindledir",
grid1.addWidget(self.pdepth_entry, 6, 1) label_text="Spindle direction",
label_tooltip="This sets the direction that the spindle is rotating.\n"
# Probe feedrate
self.feedrate_probe_label = QtWidgets.QLabel('%s:' % _("Feedrate Probe"))
self.feedrate_probe_label.setToolTip(
_("The feedrate used while the probe is probing.")
)
self.feedrate_probe_entry = FCDoubleSpinner()
self.feedrate_probe_entry.set_range(0, 99999.9999)
self.feedrate_probe_entry.set_precision(self.decimals)
self.feedrate_probe_entry.setSingleStep(0.1)
self.feedrate_probe_entry.setWrapping(True)
grid1.addWidget(self.feedrate_probe_label, 7, 0)
grid1.addWidget(self.feedrate_probe_entry, 7, 1)
# Spindle direction
spindle_dir_label = QtWidgets.QLabel('%s:' % _('Spindle direction'))
spindle_dir_label.setToolTip(
_("This sets the direction that the spindle is rotating.\n"
"It can be either:\n" "It can be either:\n"
"- CW = clockwise or\n" "- CW = clockwise or\n"
"- CCW = counter clockwise") "- CCW = counter clockwise",
) choices=[{'label': _('CW'), 'value': 'CW'},
{'label': _('CCW'), 'value': 'CCW'}]
self.spindledir_radio = RadioSet([{'label': _('CW'), 'value': 'CW'}, ),
{'label': _('CCW'), 'value': 'CCW'}]) CheckboxOptionUI(
grid1.addWidget(spindle_dir_label, 8, 0) option="geometry_f_plunge",
grid1.addWidget(self.spindledir_radio, 8, 1) label_text="Fast Plunge",
label_tooltip="By checking this, the vertical move from\n"
# Fast Move from Z Toolchange
self.fplunge_cb = FCCheckBox('%s' % _('Fast Plunge'))
self.fplunge_cb.setToolTip(
_("By checking this, the vertical move from\n"
"Z_Toolchange to Z_move is done with G0,\n" "Z_Toolchange to Z_move is done with G0,\n"
"meaning the fastest speed available.\n" "meaning the fastest speed available.\n"
"WARNING: the move is done at Toolchange X,Y coords.") "WARNING: the move is done at Toolchange X,Y coords."
) ),
grid1.addWidget(self.fplunge_cb, 9, 0, 1, 2) DoubleSpinnerOptionUI(
option="geometry_segx",
# Size of trace segment on X axis label_text="Segment X size",
segx_label = QtWidgets.QLabel('%s:' % _("Segment X size")) label_tooltip="The size of the trace segment on the X axis.\n"
segx_label.setToolTip(
_("The size of the trace segment on the X axis.\n"
"Useful for auto-leveling.\n" "Useful for auto-leveling.\n"
"A value of 0 means no segmentation on the X axis.") "A value of 0 means no segmentation on the X axis.",
) min_value=0, max_value=99999, step=0.1, decimals=self.decimals
self.segx_entry = FCDoubleSpinner() ),
self.segx_entry.set_range(0, 99999) DoubleSpinnerOptionUI(
self.segx_entry.set_precision(self.decimals) option="geometry_segy",
self.segx_entry.setSingleStep(0.1) label_text="Segment Y size",
self.segx_entry.setWrapping(True) label_tooltip="The size of the trace segment on the Y axis.\n"
grid1.addWidget(segx_label, 10, 0)
grid1.addWidget(self.segx_entry, 10, 1)
# Size of trace segment on Y axis
segy_label = QtWidgets.QLabel('%s:' % _("Segment Y size"))
segy_label.setToolTip(
_("The size of the trace segment on the Y axis.\n"
"Useful for auto-leveling.\n" "Useful for auto-leveling.\n"
"A value of 0 means no segmentation on the Y axis.") "A value of 0 means no segmentation on the Y axis.",
) min_value=0, max_value=99999, step=0.1, decimals=self.decimals
self.segy_entry = FCDoubleSpinner() ),
self.segy_entry.set_range(0, 99999)
self.segy_entry.set_precision(self.decimals)
self.segy_entry.setSingleStep(0.1)
self.segy_entry.setWrapping(True)
grid1.addWidget(segy_label, 11, 0) HeadingOptionUI(
grid1.addWidget(self.segy_entry, 11, 1) label_text="Area Exclusion",
label_tooltip="Area exclusion parameters.\n"
# -----------------------------
# --- Area Exclusion ----------
# -----------------------------
self.adv_label = QtWidgets.QLabel('<b>%s:</b>' % _('Area Exclusion'))
self.adv_label.setToolTip(
_("Area exclusion parameters.\n"
"Those parameters are available only for\n" "Those parameters are available only for\n"
"Advanced App. Level.") "Advanced App. Level."
) ),
grid1.addWidget(self.adv_label, 12, 0, 1, 2) CheckboxOptionUI(
option="geometry_area_exclusion",
# Exclusion Area CB label_text="Exclusion areas",
self.exclusion_cb = FCCheckBox('%s:' % _("Exclusion areas")) label_tooltip="Include exclusion areas.\n"
self.exclusion_cb.setToolTip(
_(
"Include exclusion areas.\n"
"In those areas the travel of the tools\n" "In those areas the travel of the tools\n"
"is forbidden." "is forbidden."
) ),
) RadioSetOptionUI(
grid1.addWidget(self.exclusion_cb, 13, 0, 1, 2) option="geometry_area_shape",
label_text="Shape",
# Area Selection shape label_tooltip="The kind of selection shape used for area selection.",
self.area_shape_label = QtWidgets.QLabel('%s:' % _("Shape")) choices=[{'label': _("Square"), 'value': 'square'},
self.area_shape_label.setToolTip( {'label': _("Polygon"), 'value': 'polygon'}]
_("The kind of selection shape used for area selection.") ),
) RadioSetOptionUI(
option="geometry_area_strategy",
self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'}, label_text="Strategy",
{'label': _("Polygon"), 'value': 'polygon'}]) label_tooltip="The strategy followed when encountering an exclusion area.\n"
grid1.addWidget(self.area_shape_label, 14, 0)
grid1.addWidget(self.area_shape_radio, 14, 1)
# Chose Strategy
self.strategy_label = FCLabel('%s:' % _("Strategy"))
self.strategy_label.setToolTip(_("The strategy followed when encountering an exclusion area.\n"
"Can be:\n" "Can be:\n"
"- Over -> when encountering the area, the tool will go to a set height\n" "- Over -> when encountering the area, the tool will go to a set height\n"
"- Around -> will avoid the exclusion area by going around the area")) "- Around -> will avoid the exclusion area by going around the area",
self.strategy_radio = RadioSet([{'label': _('Over'), 'value': 'over'}, choices=[{'label': _('Over'), 'value': 'over'},
{'label': _('Around'), 'value': 'around'}]) {'label': _('Around'), 'value': 'around'}]
),
grid1.addWidget(self.strategy_label, 15, 0) DoubleSpinnerOptionUI(
grid1.addWidget(self.strategy_radio, 15, 1) option="geometry_area_overz",
label_text="Over Z",
# Over Z label_tooltip="The height Z to which the tool will rise in order to avoid\n"
self.over_z_label = FCLabel('%s:' % _("Over Z")) "an interdiction area.",
self.over_z_label.setToolTip(_("The height Z to which the tool will rise in order to avoid\n" min_value=0.0, max_value=9999.9999, step=0.5, decimals=self.decimals
"an interdiction area.")) )
self.over_z_entry = FCDoubleSpinner() ]
self.over_z_entry.set_range(0.000, 9999.9999)
self.over_z_entry.set_precision(self.decimals)
grid1.addWidget(self.over_z_label, 18, 0)
grid1.addWidget(self.over_z_entry, 18, 1)
self.layout.addStretch()

View File

@@ -1,4 +1,4 @@
from PyQt5.QtCore import Qt, QSettings from PyQt5.QtCore import QSettings
from flatcamGUI.GUIElements import OptionalInputSection from flatcamGUI.GUIElements import OptionalInputSection
from flatcamGUI.preferences import machinist_setting from flatcamGUI.preferences import machinist_setting