diff --git a/src/Mod/CAM/Path/Main/Gui/JobDlg.py b/src/Mod/CAM/Path/Main/Gui/JobDlg.py index 07cdc13661..439f934b0f 100644 --- a/src/Mod/CAM/Path/Main/Gui/JobDlg.py +++ b/src/Mod/CAM/Path/Main/Gui/JobDlg.py @@ -56,29 +56,7 @@ class JobCreate: DataObject = QtCore.Qt.ItemDataRole.UserRole def __init__(self, parent=None, sel=None): - # Warn user if current schema doesn't use minute for time in velocity - if not Path.Preferences.suppressVelocity(): - schemes = FreeCAD.Units.listSchemas() - for idx, val in enumerate(schemes): - if FreeCAD.ActiveDocument.UnitSystem == FreeCAD.Units.listSchemas(idx): - current_schema = FreeCAD.Units.listSchemas(idx) - if idx not in [2, 3, 6]: - msg = translate( - "CAM_Job", - "The currently selected unit schema: \n '{}' for this document\n Does not use 'minutes' for velocity values. \n \nCNC machines require feed rate to be expressed in \nunit/minute. To ensure correct G-code: \nSelect a minute-based schema in preferences.\nFor example:\n 'Metric, Small Parts & CNC'\n 'US Customary'\n 'Imperial Decimal'", - ).format(current_schema) - header = translate("CAM_Job", "Warning") - msgbox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, header, msg) - - msgbox.addButton(translate("CAM_Job", "Ok"), QtGui.QMessageBox.AcceptRole) - msgbox.addButton( - translate("CAM_Job", "Don't Show This Anymore"), - QtGui.QMessageBox.ActionRole, - ) - if msgbox.exec_() == 1: - from Path.Preferences import preferences - - preferences().SetBool("WarningSuppressVelocity", True) + self._warnUserIfNotUsingMinutes() self.dialog = FreeCADGui.PySideUic.loadUi(":/panels/DlgJobCreate.ui") self.itemsSolid = QtGui.QStandardItem(translate("CAM_Job", "Solids")) @@ -86,12 +64,65 @@ class JobCreate: self.itemsJob = QtGui.QStandardItem(translate("CAM_Job", "Jobs")) self.dialog.templateGroup.hide() self.dialog.modelGroup.hide() + # debugging support self.candidates = None self.delegate = None self.index = None self.model = None + def _warnUserIfNotUsingMinutes(self): + # Warn user if current schema doesn't use minute for time in velocity + if Path.Preferences.suppressVelocity(): + return + + # schemas in order of preference -- the first ones get proposed to the user + minute_based_schemes = list(map(FreeCAD.Units.listSchemas, [6, 3, 2])) + if FreeCAD.ActiveDocument.UnitSystem in minute_based_schemes: + return + + # NB: On macOS the header is ignored as per its UI guidelines. + header = translate("CAM_Job", "Warning: Incompatible Unit Schema") + info = translate( + "CAM_Job", + ( + "This document uses an improper unit schema " + "which can result in dangerous situations and machine crashes!" + ), + ) + details = translate( + "CAM_Job", + ( + "

This document's unit schema, '{}', " + "expresses velocity in values per second." + "\n" + "

Please change the unit schema in the document properties " + "to one that expresses feed rates per minute instead. " + "\n" + "For example: \n" + "

\n" + "\n" + "

Keeping the current unit schema can result in dangerous G-code errors. " + "For details please refer to the " + "Units section " + "of the CAM Workbench's wiki page." + ), + ).format(FreeCAD.ActiveDocument.UnitSystem, *minute_based_schemes[:2]) + msgbox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, header, info) + msgbox.setInformativeText(details) + msgbox.addButton(translate("CAM_Job", "Ok"), QtGui.QMessageBox.AcceptRole) + dont_show_again_button = msgbox.addButton( + translate("CAM_Job", "Don't show this warning again"), + QtGui.QMessageBox.ActionRole, + ) + + msgbox.exec_() + if msgbox.clickedButton() == dont_show_again_button: + Path.Preferences.preferences().SetBool(Path.Preferences.WarningSuppressVelocity, True) + def setupTitle(self, title): self.dialog.setWindowTitle(title)