CAM: apply precommit
This commit is contained in:
@@ -185,9 +185,7 @@ class CamoticsSimulation(QtCore.QObject):
|
||||
self.SIM.set_resolution("high")
|
||||
|
||||
bb = self.job.Stock.Shape.BoundBox
|
||||
self.SIM.set_workpiece(
|
||||
min=(bb.XMin, bb.YMin, bb.ZMin), max=(bb.XMax, bb.YMax, bb.ZMax)
|
||||
)
|
||||
self.SIM.set_workpiece(min=(bb.XMin, bb.YMin, bb.ZMin), max=(bb.XMax, bb.YMax, bb.ZMax))
|
||||
|
||||
for t in self.job.Tools.Group:
|
||||
self.SIM.set_tool(
|
||||
@@ -272,9 +270,7 @@ class CamoticsSimulation(QtCore.QObject):
|
||||
"files": [],
|
||||
}
|
||||
|
||||
unitstring = (
|
||||
"imperial" if FreeCAD.Units.getSchema() in [2, 3, 5, 7] else "metric"
|
||||
)
|
||||
unitstring = "imperial" if FreeCAD.Units.getSchema() in [2, 3, 5, 7] else "metric"
|
||||
|
||||
camoticstemplate["units"] = unitstring
|
||||
camoticstemplate["resolution-mode"] = "medium"
|
||||
|
||||
@@ -151,9 +151,7 @@ class CommandPathFixture:
|
||||
return {
|
||||
"Pixmap": "CAM_Datums",
|
||||
"MenuText": QT_TRANSLATE_NOOP("CAM_Fixture", "Fixture"),
|
||||
"ToolTip": QT_TRANSLATE_NOOP(
|
||||
"CAM_Fixture", "Creates a Fixture Offset"
|
||||
),
|
||||
"ToolTip": QT_TRANSLATE_NOOP("CAM_Fixture", "Creates a Fixture Offset"),
|
||||
}
|
||||
|
||||
def IsActive(self):
|
||||
|
||||
@@ -36,9 +36,7 @@ translate = FreeCAD.Qt.translate
|
||||
class GCodeHighlighter(QtGui.QSyntaxHighlighter):
|
||||
def __init__(self, parent=None):
|
||||
def convertcolor(c):
|
||||
return QtGui.QColor(
|
||||
int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF)
|
||||
)
|
||||
return QtGui.QColor(int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF))
|
||||
|
||||
super(GCodeHighlighter, self).__init__(parent)
|
||||
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Editor")
|
||||
@@ -62,25 +60,18 @@ class GCodeHighlighter(QtGui.QSyntaxHighlighter):
|
||||
self.highlightingRules = []
|
||||
numberFormat = QtGui.QTextCharFormat()
|
||||
numberFormat.setForeground(colors[0])
|
||||
self.highlightingRules.append(
|
||||
(QtCore.QRegularExpression("[\\-0-9\\.]"), numberFormat)
|
||||
)
|
||||
self.highlightingRules.append((QtCore.QRegularExpression("[\\-0-9\\.]"), numberFormat))
|
||||
keywordFormat = QtGui.QTextCharFormat()
|
||||
keywordFormat.setForeground(colors[1])
|
||||
keywordFormat.setFontWeight(QtGui.QFont.Bold)
|
||||
keywordPatterns = ["\\bG[0-9]+\\b", "\\bM[0-9]+\\b"]
|
||||
self.highlightingRules.extend(
|
||||
[
|
||||
(QtCore.QRegularExpression(pattern), keywordFormat)
|
||||
for pattern in keywordPatterns
|
||||
]
|
||||
[(QtCore.QRegularExpression(pattern), keywordFormat) for pattern in keywordPatterns]
|
||||
)
|
||||
speedFormat = QtGui.QTextCharFormat()
|
||||
speedFormat.setFontWeight(QtGui.QFont.Bold)
|
||||
speedFormat.setForeground(colors[2])
|
||||
self.highlightingRules.append(
|
||||
(QtCore.QRegularExpression("\\bF[0-9\\.]+\\b"), speedFormat)
|
||||
)
|
||||
self.highlightingRules.append((QtCore.QRegularExpression("\\bF[0-9\\.]+\\b"), speedFormat))
|
||||
|
||||
def highlightBlock(self, text):
|
||||
|
||||
@@ -108,9 +99,7 @@ class GCodeEditorDialog(QtGui.QDialog):
|
||||
|
||||
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/CAM")
|
||||
c = p.GetUnsigned("DefaultHighlightPathColor", 4286382335)
|
||||
Q = QtGui.QColor(
|
||||
int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF)
|
||||
)
|
||||
Q = QtGui.QColor(int((c >> 24) & 0xFF), int((c >> 16) & 0xFF), int((c >> 8) & 0xFF))
|
||||
highlightcolor = (
|
||||
Q.red() / 255.0,
|
||||
Q.green() / 255.0,
|
||||
@@ -118,9 +107,7 @@ class GCodeEditorDialog(QtGui.QDialog):
|
||||
Q.alpha() / 255.0,
|
||||
)
|
||||
|
||||
self.selectionobj = FreeCAD.ActiveDocument.addObject(
|
||||
"Path::Feature", "selection"
|
||||
)
|
||||
self.selectionobj = FreeCAD.ActiveDocument.addObject("Path::Feature", "selection")
|
||||
self.selectionobj.ViewObject.LineWidth = 4
|
||||
self.selectionobj.ViewObject.NormalColor = highlightcolor
|
||||
|
||||
@@ -281,23 +268,19 @@ class CommandPathInspect:
|
||||
selection = FreeCADGui.Selection.getSelection()
|
||||
if len(selection) != 1:
|
||||
FreeCAD.Console.PrintError(
|
||||
translate("CAM_Inspect", "Please select exactly one path object")
|
||||
+ "\n"
|
||||
translate("CAM_Inspect", "Please select exactly one path object") + "\n"
|
||||
)
|
||||
return
|
||||
if not (selection[0].isDerivedFrom("Path::Feature")):
|
||||
FreeCAD.Console.PrintError(
|
||||
translate("CAM_Inspect", "Please select exactly one path object")
|
||||
+ "\n"
|
||||
translate("CAM_Inspect", "Please select exactly one path object") + "\n"
|
||||
)
|
||||
return
|
||||
|
||||
# if everything is ok, execute
|
||||
FreeCADGui.addModule("Path.Main.Gui.Inspect")
|
||||
FreeCADGui.doCommand(
|
||||
"Path.Main.Gui.Inspect.show(FreeCAD.ActiveDocument."
|
||||
+ selection[0].Name
|
||||
+ ")"
|
||||
"Path.Main.Gui.Inspect.show(FreeCAD.ActiveDocument." + selection[0].Name + ")"
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -254,9 +254,7 @@ class ViewProvider:
|
||||
return self.openTaskPanel("Model")
|
||||
if obj == self.obj.Stock:
|
||||
return self.openTaskPanel("Stock")
|
||||
Path.Log.info(
|
||||
"Expected a specific object to edit - %s not recognized" % obj.Label
|
||||
)
|
||||
Path.Log.info("Expected a specific object to edit - %s not recognized" % obj.Label)
|
||||
return self.openTaskPanel()
|
||||
|
||||
def uneditObject(self, obj=None):
|
||||
@@ -356,9 +354,7 @@ class MaterialDialog(QtWidgets.QDialog):
|
||||
|
||||
self.setWindowTitle("Assign Material")
|
||||
|
||||
self.materialTree = FreeCADGui.UiLoader().createWidget(
|
||||
"MatGui::MaterialTreeWidget"
|
||||
)
|
||||
self.materialTree = FreeCADGui.UiLoader().createWidget("MatGui::MaterialTreeWidget")
|
||||
self.materialTreeWidget = MatGui.MaterialTreeWidget(self.materialTree)
|
||||
|
||||
material_filter = Materials.MaterialFilter()
|
||||
@@ -440,9 +436,7 @@ class StockEdit(object):
|
||||
stock.ViewObject.Proxy.onEdit(_OpenCloseResourceEditor)
|
||||
|
||||
def setLengthField(self, widget, prop):
|
||||
widget.setText(
|
||||
FreeCAD.Units.Quantity(prop.Value, FreeCAD.Units.Length).UserString
|
||||
)
|
||||
widget.setText(FreeCAD.Units.Quantity(prop.Value, FreeCAD.Units.Length).UserString)
|
||||
|
||||
# the following members must be overwritten by subclasses
|
||||
def editorFrame(self):
|
||||
@@ -576,17 +570,11 @@ class StockCreateBoxEdit(StockEdit):
|
||||
try:
|
||||
if self.IsStock(obj):
|
||||
if "length" in fields:
|
||||
obj.Stock.Length = FreeCAD.Units.Quantity(
|
||||
self.form.stockBoxLength.text()
|
||||
)
|
||||
obj.Stock.Length = FreeCAD.Units.Quantity(self.form.stockBoxLength.text())
|
||||
if "width" in fields:
|
||||
obj.Stock.Width = FreeCAD.Units.Quantity(
|
||||
self.form.stockBoxWidth.text()
|
||||
)
|
||||
obj.Stock.Width = FreeCAD.Units.Quantity(self.form.stockBoxWidth.text())
|
||||
if "height" in fields:
|
||||
obj.Stock.Height = FreeCAD.Units.Quantity(
|
||||
self.form.stockBoxHeight.text()
|
||||
)
|
||||
obj.Stock.Height = FreeCAD.Units.Quantity(self.form.stockBoxHeight.text())
|
||||
else:
|
||||
Path.Log.error("Stock not a box!")
|
||||
except Exception:
|
||||
@@ -602,15 +590,9 @@ class StockCreateBoxEdit(StockEdit):
|
||||
|
||||
def setupUi(self, obj):
|
||||
self.setFields(obj)
|
||||
self.form.stockBoxLength.textChanged.connect(
|
||||
lambda: self.getFields(obj, ["length"])
|
||||
)
|
||||
self.form.stockBoxWidth.textChanged.connect(
|
||||
lambda: self.getFields(obj, ["width"])
|
||||
)
|
||||
self.form.stockBoxHeight.textChanged.connect(
|
||||
lambda: self.getFields(obj, ["height"])
|
||||
)
|
||||
self.form.stockBoxLength.textChanged.connect(lambda: self.getFields(obj, ["length"]))
|
||||
self.form.stockBoxWidth.textChanged.connect(lambda: self.getFields(obj, ["width"]))
|
||||
self.form.stockBoxHeight.textChanged.connect(lambda: self.getFields(obj, ["height"]))
|
||||
|
||||
|
||||
class StockCreateCylinderEdit(StockEdit):
|
||||
@@ -626,13 +608,9 @@ class StockCreateCylinderEdit(StockEdit):
|
||||
try:
|
||||
if self.IsStock(obj):
|
||||
if "radius" in fields:
|
||||
obj.Stock.Radius = FreeCAD.Units.Quantity(
|
||||
self.form.stockCylinderRadius.text()
|
||||
)
|
||||
obj.Stock.Radius = FreeCAD.Units.Quantity(self.form.stockCylinderRadius.text())
|
||||
if "height" in fields:
|
||||
obj.Stock.Height = FreeCAD.Units.Quantity(
|
||||
self.form.stockCylinderHeight.text()
|
||||
)
|
||||
obj.Stock.Height = FreeCAD.Units.Quantity(self.form.stockCylinderHeight.text())
|
||||
else:
|
||||
Path.Log.error(translate("CAM_Job", "Stock not a cylinder!"))
|
||||
except Exception:
|
||||
@@ -647,12 +625,8 @@ class StockCreateCylinderEdit(StockEdit):
|
||||
|
||||
def setupUi(self, obj):
|
||||
self.setFields(obj)
|
||||
self.form.stockCylinderRadius.textChanged.connect(
|
||||
lambda: self.getFields(obj, ["radius"])
|
||||
)
|
||||
self.form.stockCylinderHeight.textChanged.connect(
|
||||
lambda: self.getFields(obj, ["height"])
|
||||
)
|
||||
self.form.stockCylinderRadius.textChanged.connect(lambda: self.getFields(obj, ["radius"]))
|
||||
self.form.stockCylinderHeight.textChanged.connect(lambda: self.getFields(obj, ["height"]))
|
||||
|
||||
|
||||
class StockFromExistingEdit(StockEdit):
|
||||
@@ -671,9 +645,7 @@ class StockFromExistingEdit(StockEdit):
|
||||
and obj.Stock.Objects[0] == stock
|
||||
):
|
||||
if stock:
|
||||
stock = PathJob.createResourceClone(
|
||||
obj, stock, self.StockLabelPrefix, "Stock"
|
||||
)
|
||||
stock = PathJob.createResourceClone(obj, stock, self.StockLabelPrefix, "Stock")
|
||||
stock.ViewObject.Visibility = True
|
||||
PathStock.SetupStockObject(stock, PathStock.StockType.Unknown)
|
||||
stock.Proxy.execute(stock)
|
||||
@@ -724,26 +696,18 @@ class TaskPanel:
|
||||
self.obj = vobj.Object
|
||||
self.deleteOnReject = deleteOnReject
|
||||
self.form = FreeCADGui.PySideUic.loadUi(":/panels/PathEdit.ui")
|
||||
self.template = PathJobDlg.JobTemplateExport(
|
||||
self.obj, self.form.jobBox.widget(1)
|
||||
)
|
||||
self.template = PathJobDlg.JobTemplateExport(self.obj, self.form.jobBox.widget(1))
|
||||
self.name = self.obj.Name
|
||||
|
||||
vUnit = FreeCAD.Units.Quantity(1, FreeCAD.Units.Velocity).getUserPreferred()[2]
|
||||
self.form.toolControllerList.horizontalHeaderItem(1).setText("#")
|
||||
self.form.toolControllerList.horizontalHeaderItem(2).setText(
|
||||
translate(
|
||||
"Path", "H", "H is horizontal feed rate. Must be as short as possible"
|
||||
)
|
||||
translate("Path", "H", "H is horizontal feed rate. Must be as short as possible")
|
||||
)
|
||||
self.form.toolControllerList.horizontalHeaderItem(3).setText(
|
||||
translate(
|
||||
"Path", "V", "V is vertical feed rate. Must be as short as possible"
|
||||
)
|
||||
)
|
||||
self.form.toolControllerList.horizontalHeader().setResizeMode(
|
||||
0, QtGui.QHeaderView.Stretch
|
||||
translate("Path", "V", "V is vertical feed rate. Must be as short as possible")
|
||||
)
|
||||
self.form.toolControllerList.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)
|
||||
self.form.toolControllerList.horizontalHeaderItem(1).setToolTip(
|
||||
translate("Path", "Tool number") + " "
|
||||
)
|
||||
@@ -763,9 +727,7 @@ class TaskPanel:
|
||||
self.form.toolControllerList.resizeColumnsToContents()
|
||||
|
||||
currentPostProcessor = self.obj.PostProcessor
|
||||
postProcessors = Path.Preferences.allEnabledPostProcessors(
|
||||
["", currentPostProcessor]
|
||||
)
|
||||
postProcessors = Path.Preferences.allEnabledPostProcessors(["", currentPostProcessor])
|
||||
for post in postProcessors:
|
||||
self.form.postProcessor.addItem(post)
|
||||
# update the enumeration values, just to make sure all selections are valid
|
||||
@@ -773,9 +735,7 @@ class TaskPanel:
|
||||
self.obj.PostProcessor = currentPostProcessor
|
||||
|
||||
self.postProcessorDefaultTooltip = self.form.postProcessor.toolTip()
|
||||
self.postProcessorArgsDefaultTooltip = (
|
||||
self.form.postProcessorArguments.toolTip()
|
||||
)
|
||||
self.postProcessorArgsDefaultTooltip = self.form.postProcessorArguments.toolTip()
|
||||
|
||||
# Populate the other comboboxes with enums from the job class
|
||||
comboToPropertyMap = [("orderBy", "OrderOutputBy")]
|
||||
@@ -790,12 +750,8 @@ class TaskPanel:
|
||||
self.stockCreateCylinder = None
|
||||
self.stockEdit = None
|
||||
|
||||
self.setupGlobal = PathSetupSheetGui.GlobalEditor(
|
||||
self.obj.SetupSheet, self.form
|
||||
)
|
||||
self.setupOps = PathSetupSheetGui.OpsDefaultEditor(
|
||||
self.obj.SetupSheet, self.form
|
||||
)
|
||||
self.setupGlobal = PathSetupSheetGui.GlobalEditor(self.obj.SetupSheet, self.form)
|
||||
self.setupOps = PathSetupSheetGui.OpsDefaultEditor(self.obj.SetupSheet, self.form)
|
||||
|
||||
def populateCombobox(self, form, enumTups, comboBoxesPropertyMap):
|
||||
"""populateCombobox(form, enumTups, comboBoxesPropertyMap) ... populate comboboxes with translated enumerations
|
||||
@@ -879,25 +835,17 @@ class TaskPanel:
|
||||
if hasattr(self.obj.Proxy, "tooltipArgs") and self.obj.Proxy.tooltipArgs:
|
||||
self.form.postProcessorArguments.setToolTip(self.obj.Proxy.tooltipArgs)
|
||||
else:
|
||||
self.form.postProcessorArguments.setToolTip(
|
||||
self.postProcessorArgsDefaultTooltip
|
||||
)
|
||||
self.form.postProcessorArguments.setToolTip(self.postProcessorArgsDefaultTooltip)
|
||||
else:
|
||||
self.form.postProcessor.setToolTip(self.postProcessorDefaultTooltip)
|
||||
self.form.postProcessorArguments.setToolTip(
|
||||
self.postProcessorArgsDefaultTooltip
|
||||
)
|
||||
self.form.postProcessorArguments.setToolTip(self.postProcessorArgsDefaultTooltip)
|
||||
|
||||
def getFields(self):
|
||||
"""sets properties in the object to match the form"""
|
||||
if self.obj:
|
||||
self.obj.PostProcessor = str(self.form.postProcessor.currentText())
|
||||
self.obj.PostProcessorArgs = str(
|
||||
self.form.postProcessorArguments.displayText()
|
||||
)
|
||||
self.obj.PostProcessorOutputFile = str(
|
||||
self.form.postProcessorOutputFile.text()
|
||||
)
|
||||
self.obj.PostProcessorArgs = str(self.form.postProcessorArguments.displayText())
|
||||
self.obj.PostProcessorOutputFile = str(self.form.postProcessorOutputFile.text())
|
||||
|
||||
self.obj.Label = str(self.form.jobLabel.text())
|
||||
self.obj.Description = str(self.form.jobDescription.toPlainText())
|
||||
@@ -911,10 +859,7 @@ class TaskPanel:
|
||||
|
||||
flist = []
|
||||
for i in range(self.form.wcslist.count()):
|
||||
if (
|
||||
self.form.wcslist.item(i).checkState()
|
||||
== QtCore.Qt.CheckState.Checked
|
||||
):
|
||||
if self.form.wcslist.item(i).checkState() == QtCore.Qt.CheckState.Checked:
|
||||
flist.append(self.form.wcslist.item(i).text())
|
||||
self.obj.Fixtures = flist
|
||||
except Exception as e:
|
||||
@@ -1078,9 +1023,7 @@ class TaskPanel:
|
||||
self.form.operationMove.setEnabled(True)
|
||||
row = self.form.operationsList.currentRow()
|
||||
self.form.operationUp.setEnabled(row > 0)
|
||||
self.form.operationDown.setEnabled(
|
||||
row < self.form.operationsList.count() - 1
|
||||
)
|
||||
self.form.operationDown.setEnabled(row < self.form.operationsList.count() - 1)
|
||||
else:
|
||||
self.form.operationModify.setEnabled(False)
|
||||
self.form.operationMove.setEnabled(False)
|
||||
@@ -1128,9 +1071,7 @@ class TaskPanel:
|
||||
# can only delete what is selected
|
||||
delete = edit
|
||||
# ... but we want to make sure there's at least one TC left
|
||||
if len(self.obj.Tools.Group) == len(
|
||||
self.form.toolControllerList.selectedItems()
|
||||
):
|
||||
if len(self.obj.Tools.Group) == len(self.form.toolControllerList.selectedItems()):
|
||||
delete = False
|
||||
# ... also don't want to delete any TCs that are already used
|
||||
if delete:
|
||||
@@ -1170,9 +1111,7 @@ class TaskPanel:
|
||||
if toolBit["path"] == tool.File:
|
||||
toolNum = toolBit["nr"]
|
||||
|
||||
tc = PathToolControllerGui.Create(
|
||||
name=tool.Label, tool=tool, toolNumber=toolNum
|
||||
)
|
||||
tc = PathToolControllerGui.Create(name=tool.Label, tool=tool, toolNumber=toolNum)
|
||||
self.obj.Proxy.addToolController(tc)
|
||||
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
@@ -1204,13 +1143,9 @@ class TaskPanel:
|
||||
tc.SpindleSpeed = speed
|
||||
except Exception:
|
||||
pass
|
||||
item.setText(
|
||||
"%s%g" % ("+" if tc.SpindleDir == "Forward" else "-", tc.SpindleSpeed)
|
||||
)
|
||||
item.setText("%s%g" % ("+" if tc.SpindleDir == "Forward" else "-", tc.SpindleSpeed))
|
||||
elif "HorizFeed" == prop or "VertFeed" == prop:
|
||||
vUnit = FreeCAD.Units.Quantity(
|
||||
1, FreeCAD.Units.Velocity
|
||||
).getUserPreferred()[2]
|
||||
vUnit = FreeCAD.Units.Quantity(1, FreeCAD.Units.Velocity).getUserPreferred()[2]
|
||||
try:
|
||||
val = FreeCAD.Units.Quantity(item.text())
|
||||
if FreeCAD.Units.Velocity == val.Unit:
|
||||
@@ -1235,9 +1170,7 @@ class TaskPanel:
|
||||
Path.Log.track(axis)
|
||||
|
||||
def alignSel(sel, normal, flip=False):
|
||||
Path.Log.track(
|
||||
"Vector(%.2f, %.2f, %.2f)" % (normal.x, normal.y, normal.z), flip
|
||||
)
|
||||
Path.Log.track("Vector(%.2f, %.2f, %.2f)" % (normal.x, normal.y, normal.z), flip)
|
||||
v = axis
|
||||
if flip:
|
||||
v = axis.negative()
|
||||
@@ -1291,12 +1224,10 @@ class TaskPanel:
|
||||
alignSel(sel, normal)
|
||||
|
||||
elif "Edge" == sub.ShapeType:
|
||||
normal = (
|
||||
sub.Vertexes[1].Point - sub.Vertexes[0].Point
|
||||
).normalize()
|
||||
if Path.Geom.pointsCoincide(
|
||||
axis, normal
|
||||
) or Path.Geom.pointsCoincide(axis, FreeCAD.Vector() - normal):
|
||||
normal = (sub.Vertexes[1].Point - sub.Vertexes[0].Point).normalize()
|
||||
if Path.Geom.pointsCoincide(axis, normal) or Path.Geom.pointsCoincide(
|
||||
axis, FreeCAD.Vector() - normal
|
||||
):
|
||||
# Don't really know the orientation of an edge, so let's just flip the object
|
||||
# and if the user doesn't like it they can flip again
|
||||
alignSel(sel, normal, True)
|
||||
@@ -1325,9 +1256,7 @@ class TaskPanel:
|
||||
Path.Log.track(selObject.Label, name)
|
||||
feature = selObject.Shape.getElement(name)
|
||||
bb = feature.BoundBox
|
||||
offset = FreeCAD.Vector(
|
||||
axis.x * bb.XMax, axis.y * bb.YMax, axis.z * bb.ZMax
|
||||
)
|
||||
offset = FreeCAD.Vector(axis.x * bb.XMax, axis.y * bb.YMax, axis.z * bb.ZMax)
|
||||
Path.Log.track(feature.BoundBox.ZMax, offset)
|
||||
p = selObject.Placement
|
||||
p.move(offset)
|
||||
@@ -1359,9 +1288,7 @@ class TaskPanel:
|
||||
Draft.rotate(sel.Object, angle, bb.Center, axis)
|
||||
else:
|
||||
for sel in selection:
|
||||
Draft.rotate(
|
||||
sel.Object, angle, sel.Object.Shape.BoundBox.Center, axis
|
||||
)
|
||||
Draft.rotate(sel.Object, angle, sel.Object.Shape.BoundBox.Center, axis)
|
||||
|
||||
def alignSetOrigin(self):
|
||||
(obj, by) = self.alignMoveToOrigin()
|
||||
@@ -1405,9 +1332,7 @@ class TaskPanel:
|
||||
def setupFromBaseEdit():
|
||||
Path.Log.track(index, force)
|
||||
if force or not self.stockFromBase:
|
||||
self.stockFromBase = StockFromBaseBoundBoxEdit(
|
||||
self.obj, self.form, force
|
||||
)
|
||||
self.stockFromBase = StockFromBaseBoundBoxEdit(self.obj, self.form, force)
|
||||
self.stockEdit = self.stockFromBase
|
||||
|
||||
def setupCreateBoxEdit():
|
||||
@@ -1419,17 +1344,13 @@ class TaskPanel:
|
||||
def setupCreateCylinderEdit():
|
||||
Path.Log.track(index, force)
|
||||
if force or not self.stockCreateCylinder:
|
||||
self.stockCreateCylinder = StockCreateCylinderEdit(
|
||||
self.obj, self.form, force
|
||||
)
|
||||
self.stockCreateCylinder = StockCreateCylinderEdit(self.obj, self.form, force)
|
||||
self.stockEdit = self.stockCreateCylinder
|
||||
|
||||
def setupFromExisting():
|
||||
Path.Log.track(index, force)
|
||||
if force or not self.stockFromExisting:
|
||||
self.stockFromExisting = StockFromExistingEdit(
|
||||
self.obj, self.form, force
|
||||
)
|
||||
self.stockFromExisting = StockFromExistingEdit(self.obj, self.form, force)
|
||||
if self.stockFromExisting.candidates(self.obj):
|
||||
self.stockEdit = self.stockFromExisting
|
||||
return True
|
||||
@@ -1446,8 +1367,7 @@ class TaskPanel:
|
||||
setupFromExisting()
|
||||
else:
|
||||
Path.Log.error(
|
||||
translate("CAM_Job", "Unsupported stock object %s")
|
||||
% self.obj.Stock.Label
|
||||
translate("CAM_Job", "Unsupported stock object %s") % self.obj.Stock.Label
|
||||
)
|
||||
else:
|
||||
if index == StockFromBaseBoundBoxEdit.Index:
|
||||
@@ -1572,11 +1492,7 @@ class TaskPanel:
|
||||
for model, count in obsolete.items():
|
||||
for i in range(count):
|
||||
# it seems natural to remove the last of all the base objects for a given model
|
||||
base = [
|
||||
b
|
||||
for b in obj.Model.Group
|
||||
if proxy.baseObject(obj, b) == model
|
||||
][-1]
|
||||
base = [b for b in obj.Model.Group if proxy.baseObject(obj, b) == model][-1]
|
||||
self.vproxy.forgetBaseVisibility(obj, base)
|
||||
self.obj.Proxy.removeBase(obj, base, True)
|
||||
# do not access any of the retired objects after this point, they don't exist anymore
|
||||
@@ -1620,9 +1536,7 @@ class TaskPanel:
|
||||
self.form.postProcessor.currentIndexChanged.connect(self.getFields)
|
||||
self.form.postProcessorArguments.editingFinished.connect(self.getFields)
|
||||
self.form.postProcessorOutputFile.editingFinished.connect(self.getFields)
|
||||
self.form.postProcessorSetOutputFile.clicked.connect(
|
||||
self.setPostProcessorOutputFile
|
||||
)
|
||||
self.form.postProcessorSetOutputFile.clicked.connect(self.setPostProcessorOutputFile)
|
||||
|
||||
# Workplan
|
||||
self.form.operationsList.itemSelectionChanged.connect(self.operationSelect)
|
||||
@@ -1635,9 +1549,7 @@ class TaskPanel:
|
||||
self.form.activeToolGroup.hide() # not supported yet
|
||||
|
||||
# Tool controller
|
||||
self.form.toolControllerList.itemSelectionChanged.connect(
|
||||
self.toolControllerSelect
|
||||
)
|
||||
self.form.toolControllerList.itemSelectionChanged.connect(self.toolControllerSelect)
|
||||
self.form.toolControllerList.itemChanged.connect(self.toolControllerChanged)
|
||||
self.form.toolControllerEdit.clicked.connect(self.toolControllerEdit)
|
||||
self.form.toolControllerDelete.clicked.connect(self.toolControllerDelete)
|
||||
@@ -1654,58 +1566,32 @@ class TaskPanel:
|
||||
self.form.stock.currentIndexChanged.connect(self.updateStockEditor)
|
||||
self.form.refreshStock.clicked.connect(self.refreshStock)
|
||||
|
||||
self.form.modelSetXAxis.clicked.connect(
|
||||
lambda: self.modelSetAxis(FreeCAD.Vector(1, 0, 0))
|
||||
)
|
||||
self.form.modelSetYAxis.clicked.connect(
|
||||
lambda: self.modelSetAxis(FreeCAD.Vector(0, 1, 0))
|
||||
)
|
||||
self.form.modelSetZAxis.clicked.connect(
|
||||
lambda: self.modelSetAxis(FreeCAD.Vector(0, 0, 1))
|
||||
)
|
||||
self.form.modelSetX0.clicked.connect(
|
||||
lambda: self.modelSet0(FreeCAD.Vector(-1, 0, 0))
|
||||
)
|
||||
self.form.modelSetY0.clicked.connect(
|
||||
lambda: self.modelSet0(FreeCAD.Vector(0, -1, 0))
|
||||
)
|
||||
self.form.modelSetZ0.clicked.connect(
|
||||
lambda: self.modelSet0(FreeCAD.Vector(0, 0, -1))
|
||||
)
|
||||
self.form.modelSetXAxis.clicked.connect(lambda: self.modelSetAxis(FreeCAD.Vector(1, 0, 0)))
|
||||
self.form.modelSetYAxis.clicked.connect(lambda: self.modelSetAxis(FreeCAD.Vector(0, 1, 0)))
|
||||
self.form.modelSetZAxis.clicked.connect(lambda: self.modelSetAxis(FreeCAD.Vector(0, 0, 1)))
|
||||
self.form.modelSetX0.clicked.connect(lambda: self.modelSet0(FreeCAD.Vector(-1, 0, 0)))
|
||||
self.form.modelSetY0.clicked.connect(lambda: self.modelSet0(FreeCAD.Vector(0, -1, 0)))
|
||||
self.form.modelSetZ0.clicked.connect(lambda: self.modelSet0(FreeCAD.Vector(0, 0, -1)))
|
||||
|
||||
self.form.setOrigin.clicked.connect(self.alignSetOrigin)
|
||||
self.form.moveToOrigin.clicked.connect(self.alignMoveToOrigin)
|
||||
|
||||
self.form.modelMoveLeftUp.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(-1, 1, 0))
|
||||
)
|
||||
self.form.modelMoveLeft.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(-1, 0, 0))
|
||||
)
|
||||
self.form.modelMoveLeftUp.clicked.connect(lambda: self.modelMove(FreeCAD.Vector(-1, 1, 0)))
|
||||
self.form.modelMoveLeft.clicked.connect(lambda: self.modelMove(FreeCAD.Vector(-1, 0, 0)))
|
||||
self.form.modelMoveLeftDown.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(-1, -1, 0))
|
||||
)
|
||||
|
||||
self.form.modelMoveUp.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(0, 1, 0))
|
||||
)
|
||||
self.form.modelMoveDown.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(0, -1, 0))
|
||||
)
|
||||
self.form.modelMoveUp.clicked.connect(lambda: self.modelMove(FreeCAD.Vector(0, 1, 0)))
|
||||
self.form.modelMoveDown.clicked.connect(lambda: self.modelMove(FreeCAD.Vector(0, -1, 0)))
|
||||
|
||||
self.form.modelMoveRightUp.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(1, 1, 0))
|
||||
)
|
||||
self.form.modelMoveRight.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(1, 0, 0))
|
||||
)
|
||||
self.form.modelMoveRightUp.clicked.connect(lambda: self.modelMove(FreeCAD.Vector(1, 1, 0)))
|
||||
self.form.modelMoveRight.clicked.connect(lambda: self.modelMove(FreeCAD.Vector(1, 0, 0)))
|
||||
self.form.modelMoveRightDown.clicked.connect(
|
||||
lambda: self.modelMove(FreeCAD.Vector(1, -1, 0))
|
||||
)
|
||||
|
||||
self.form.modelRotateLeft.clicked.connect(
|
||||
lambda: self.modelRotate(FreeCAD.Vector(0, 0, 1))
|
||||
)
|
||||
self.form.modelRotateLeft.clicked.connect(lambda: self.modelRotate(FreeCAD.Vector(0, 0, 1)))
|
||||
self.form.modelRotateRight.clicked.connect(
|
||||
lambda: self.modelRotate(FreeCAD.Vector(0, 0, -1))
|
||||
)
|
||||
|
||||
@@ -68,13 +68,9 @@ class JobCreate:
|
||||
"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 = QtGui.QMessageBox(QtGui.QMessageBox.Warning, header, msg)
|
||||
|
||||
msgbox.addButton(
|
||||
translate("CAM_Job", "Ok"), QtGui.QMessageBox.AcceptRole
|
||||
)
|
||||
msgbox.addButton(translate("CAM_Job", "Ok"), QtGui.QMessageBox.AcceptRole)
|
||||
msgbox.addButton(
|
||||
translate("CAM_Job", "Don't Show This Anymore"),
|
||||
QtGui.QMessageBox.ActionRole,
|
||||
@@ -110,14 +106,10 @@ class JobCreate:
|
||||
)
|
||||
jobResources = job.Model.Group + [job.Stock]
|
||||
else:
|
||||
preSelected = Counter(
|
||||
[obj.Label for obj in FreeCADGui.Selection.getSelection()]
|
||||
)
|
||||
preSelected = Counter([obj.Label for obj in FreeCADGui.Selection.getSelection()])
|
||||
jobResources = []
|
||||
|
||||
self.candidates = sorted(
|
||||
PathJob.ObjectJob.baseCandidates(), key=lambda o: o.Label
|
||||
)
|
||||
self.candidates = sorted(PathJob.ObjectJob.baseCandidates(), key=lambda o: o.Label)
|
||||
|
||||
# If there is only one possibility we might as well make sure it's selected
|
||||
if not preSelected and 1 == len(self.candidates):
|
||||
@@ -187,7 +179,9 @@ class JobCreate:
|
||||
|
||||
self.delegate = _ItemDelegate(self, self.dialog.modelTree)
|
||||
self.model = QtGui.QStandardItemModel(self.dialog)
|
||||
self.model.setHorizontalHeaderLabels([translate("CAM_Job","Model"), translate("CAM_Job", "Count")])
|
||||
self.model.setHorizontalHeaderLabels(
|
||||
[translate("CAM_Job", "Model"), translate("CAM_Job", "Count")]
|
||||
)
|
||||
|
||||
if self.itemsSolid.hasChildren():
|
||||
self.model.appendRow(self.itemsSolid)
|
||||
@@ -299,9 +293,7 @@ class JobCreate:
|
||||
# Note that we do want to use the models (resource clones) of the
|
||||
# source job as base objects for the new job in order to get the
|
||||
# identical placement, and anything else that's been customized.
|
||||
models.extend(
|
||||
self.itemsJob.child(i, 0).data(self.DataObject).Model.Group
|
||||
)
|
||||
models.extend(self.itemsJob.child(i, 0).data(self.DataObject).Model.Group)
|
||||
|
||||
return models
|
||||
|
||||
@@ -353,9 +345,7 @@ class JobTemplateExport:
|
||||
if job.Stock and not PathJob.isResourceClone(job, "Stock", "Stock"):
|
||||
stockType = PathStock.StockType.FromStock(job.Stock)
|
||||
if stockType == PathStock.StockType.FromBase:
|
||||
seHint = translate(
|
||||
"CAM_Job", "Base -/+ %.2f/%.2f %.2f/%.2f %.2f/%.2f"
|
||||
) % (
|
||||
seHint = translate("CAM_Job", "Base -/+ %.2f/%.2f %.2f/%.2f %.2f/%.2f") % (
|
||||
job.Stock.ExtXneg,
|
||||
job.Stock.ExtXpos,
|
||||
job.Stock.ExtYneg,
|
||||
|
||||
@@ -41,9 +41,7 @@ class JobPreferencesPage:
|
||||
self.form.toolBox.setCurrentIndex(0) # Take that qt designer!
|
||||
|
||||
self.postProcessorDefaultTooltip = self.form.defaultPostProcessor.toolTip()
|
||||
self.postProcessorArgsDefaultTooltip = (
|
||||
self.form.defaultPostProcessorArgs.toolTip()
|
||||
)
|
||||
self.postProcessorArgsDefaultTooltip = self.form.defaultPostProcessorArgs.toolTip()
|
||||
self.processor = {}
|
||||
|
||||
def saveSettings(self):
|
||||
@@ -51,9 +49,7 @@ class JobPreferencesPage:
|
||||
jobTemplate = self.form.leDefaultJobTemplate.text()
|
||||
geometryTolerance = Units.Quantity(self.form.geometryTolerance.text())
|
||||
curveAccuracy = Units.Quantity(self.form.curveAccuracy.text())
|
||||
Path.Preferences.setJobDefaults(
|
||||
filePath, jobTemplate, geometryTolerance, curveAccuracy
|
||||
)
|
||||
Path.Preferences.setJobDefaults(filePath, jobTemplate, geometryTolerance, curveAccuracy)
|
||||
|
||||
if curveAccuracy:
|
||||
Path.Area.setDefaultParams(Accuracy=curveAccuracy)
|
||||
@@ -84,15 +80,9 @@ class JobPreferencesPage:
|
||||
][self.form.stock.currentIndex()]
|
||||
attrs["create"] = typ
|
||||
if typ == PathStock.StockType.CreateBox:
|
||||
attrs["length"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockBoxLength.text()
|
||||
).UserString
|
||||
attrs["width"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockBoxWidth.text()
|
||||
).UserString
|
||||
attrs["height"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockBoxHeight.text()
|
||||
).UserString
|
||||
attrs["length"] = FreeCAD.Units.Quantity(self.form.stockBoxLength.text()).UserString
|
||||
attrs["width"] = FreeCAD.Units.Quantity(self.form.stockBoxWidth.text()).UserString
|
||||
attrs["height"] = FreeCAD.Units.Quantity(self.form.stockBoxHeight.text()).UserString
|
||||
if typ == PathStock.StockType.CreateCylinder:
|
||||
attrs["radius"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockCylinderRadius.text()
|
||||
@@ -101,24 +91,12 @@ class JobPreferencesPage:
|
||||
self.form.stockCylinderHeight.text()
|
||||
).UserString
|
||||
if typ == PathStock.StockType.FromBase:
|
||||
attrs["xneg"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockExtXneg.text()
|
||||
).UserString
|
||||
attrs["xpos"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockExtXpos.text()
|
||||
).UserString
|
||||
attrs["yneg"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockExtYneg.text()
|
||||
).UserString
|
||||
attrs["ypos"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockExtYpos.text()
|
||||
).UserString
|
||||
attrs["zneg"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockExtZneg.text()
|
||||
).UserString
|
||||
attrs["zpos"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockExtZpos.text()
|
||||
).UserString
|
||||
attrs["xneg"] = FreeCAD.Units.Quantity(self.form.stockExtXneg.text()).UserString
|
||||
attrs["xpos"] = FreeCAD.Units.Quantity(self.form.stockExtXpos.text()).UserString
|
||||
attrs["yneg"] = FreeCAD.Units.Quantity(self.form.stockExtYneg.text()).UserString
|
||||
attrs["ypos"] = FreeCAD.Units.Quantity(self.form.stockExtYpos.text()).UserString
|
||||
attrs["zneg"] = FreeCAD.Units.Quantity(self.form.stockExtZneg.text()).UserString
|
||||
attrs["zpos"] = FreeCAD.Units.Quantity(self.form.stockExtZpos.text()).UserString
|
||||
if self.form.stockPlacementGroup.isChecked():
|
||||
angle = FreeCAD.Units.Quantity(self.form.stockAngle.text()).Value
|
||||
axis = FreeCAD.Vector(
|
||||
@@ -131,15 +109,9 @@ class JobPreferencesPage:
|
||||
attrs["rotY"] = rot.Q[1]
|
||||
attrs["rotZ"] = rot.Q[2]
|
||||
attrs["rotW"] = rot.Q[3]
|
||||
attrs["posX"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockPositionX.text()
|
||||
).Value
|
||||
attrs["posY"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockPositionY.text()
|
||||
).Value
|
||||
attrs["posZ"] = FreeCAD.Units.Quantity(
|
||||
self.form.stockPositionZ.text()
|
||||
).Value
|
||||
attrs["posX"] = FreeCAD.Units.Quantity(self.form.stockPositionX.text()).Value
|
||||
attrs["posY"] = FreeCAD.Units.Quantity(self.form.stockPositionY.text()).Value
|
||||
attrs["posZ"] = FreeCAD.Units.Quantity(self.form.stockPositionZ.text()).Value
|
||||
Path.Preferences.setDefaultStockTemplate(json.dumps(attrs))
|
||||
else:
|
||||
Path.Preferences.setDefaultStockTemplate("")
|
||||
@@ -194,35 +166,23 @@ class JobPreferencesPage:
|
||||
| QtCore.Qt.ItemFlag.ItemIsUserCheckable
|
||||
)
|
||||
self.form.postProcessorList.addItem(item)
|
||||
self.verifyAndUpdateDefaultPostProcessorWith(
|
||||
Path.Preferences.defaultPostProcessor()
|
||||
)
|
||||
self.verifyAndUpdateDefaultPostProcessorWith(Path.Preferences.defaultPostProcessor())
|
||||
|
||||
self.form.defaultPostProcessorArgs.setText(
|
||||
Path.Preferences.defaultPostProcessorArgs()
|
||||
)
|
||||
self.form.defaultPostProcessorArgs.setText(Path.Preferences.defaultPostProcessorArgs())
|
||||
|
||||
geomTol = Units.Quantity(
|
||||
Path.Preferences.defaultGeometryTolerance(), Units.Length
|
||||
)
|
||||
geomTol = Units.Quantity(Path.Preferences.defaultGeometryTolerance(), Units.Length)
|
||||
self.form.geometryTolerance.setText(geomTol.UserString)
|
||||
self.form.curveAccuracy.setText(
|
||||
Units.Quantity(
|
||||
Path.Preferences.defaultLibAreaCurveAccuracy(), Units.Length
|
||||
).UserString
|
||||
Units.Quantity(Path.Preferences.defaultLibAreaCurveAccuracy(), Units.Length).UserString
|
||||
)
|
||||
|
||||
self.form.leOutputFile.setText(Path.Preferences.defaultOutputFile())
|
||||
self.selectComboEntry(
|
||||
self.form.cboOutputPolicy, Path.Preferences.defaultOutputPolicy()
|
||||
)
|
||||
self.selectComboEntry(self.form.cboOutputPolicy, Path.Preferences.defaultOutputPolicy())
|
||||
|
||||
self.form.tbDefaultFilePath.clicked.connect(self.browseDefaultFilePath)
|
||||
self.form.tbDefaultJobTemplate.clicked.connect(self.browseDefaultJobTemplate)
|
||||
self.form.postProcessorList.itemEntered.connect(self.setProcessorListTooltip)
|
||||
self.form.postProcessorList.itemChanged.connect(
|
||||
self.verifyAndUpdateDefaultPostProcessor
|
||||
)
|
||||
self.form.postProcessorList.itemChanged.connect(self.verifyAndUpdateDefaultPostProcessor)
|
||||
self.form.defaultPostProcessor.currentIndexChanged.connect(
|
||||
self.updateDefaultPostProcessorToolTip
|
||||
)
|
||||
@@ -324,9 +284,7 @@ class JobPreferencesPage:
|
||||
self.form.stockCreateCylinder.hide()
|
||||
|
||||
def loadToolSettings(self):
|
||||
self.form.toolsAbsolutePaths.setChecked(
|
||||
Path.Preferences.toolsStoreAbsolutePaths()
|
||||
)
|
||||
self.form.toolsAbsolutePaths.setChecked(Path.Preferences.toolsStoreAbsolutePaths())
|
||||
|
||||
def getPostProcessor(self, name):
|
||||
if not name in self.processor:
|
||||
@@ -355,14 +313,10 @@ class JobPreferencesPage:
|
||||
if processor.tooltipArgs:
|
||||
self.form.defaultPostProcessorArgs.setToolTip(processor.tooltipArgs)
|
||||
else:
|
||||
self.form.defaultPostProcessorArgs.setToolTip(
|
||||
self.postProcessorArgsDefaultTooltip
|
||||
)
|
||||
self.form.defaultPostProcessorArgs.setToolTip(self.postProcessorArgsDefaultTooltip)
|
||||
else:
|
||||
self.form.defaultPostProcessor.setToolTip(self.postProcessorDefaultTooltip)
|
||||
self.form.defaultPostProcessorArgs.setToolTip(
|
||||
self.postProcessorArgsDefaultTooltip
|
||||
)
|
||||
self.form.defaultPostProcessorArgs.setToolTip(self.postProcessorArgsDefaultTooltip)
|
||||
|
||||
def bestGuessForFilePath(self):
|
||||
path = self.form.leDefaultFilePath.text()
|
||||
|
||||
@@ -50,13 +50,9 @@ class CommandCAMSanity:
|
||||
def GetResources(self):
|
||||
return {
|
||||
"Pixmap": "CAM_Sanity",
|
||||
"MenuText": QT_TRANSLATE_NOOP(
|
||||
"CAM_Sanity", "Check the CAM job for common errors"
|
||||
),
|
||||
"MenuText": QT_TRANSLATE_NOOP("CAM_Sanity", "Check the CAM job for common errors"),
|
||||
"Accel": "P, S",
|
||||
"ToolTip": QT_TRANSLATE_NOOP(
|
||||
"CAM_Sanity", "Check the CAM job for common errors"
|
||||
),
|
||||
"ToolTip": QT_TRANSLATE_NOOP("CAM_Sanity", "Check the CAM job for common errors"),
|
||||
}
|
||||
|
||||
def IsActive(self):
|
||||
@@ -67,7 +63,6 @@ class CommandCAMSanity:
|
||||
FreeCADGui.addIconPath(":/icons")
|
||||
obj = FreeCADGui.Selection.getSelectionEx()[0].Object
|
||||
|
||||
|
||||
# Ask the user for a filename to save the report to
|
||||
|
||||
file_location = QFileDialog.getSaveFileName(
|
||||
@@ -85,11 +80,9 @@ class CommandCAMSanity:
|
||||
return
|
||||
|
||||
with open(file_location, "w") as fp:
|
||||
fp.write(html)
|
||||
fp.write(html)
|
||||
|
||||
FreeCAD.Console.PrintMessage(
|
||||
"Sanity check report written to: {}\n".format(file_location)
|
||||
)
|
||||
FreeCAD.Console.PrintMessage("Sanity check report written to: {}\n".format(file_location))
|
||||
|
||||
webbrowser.open_new_tab(file_location)
|
||||
|
||||
|
||||
@@ -83,9 +83,7 @@ class PathSimulation:
|
||||
|
||||
def UpdateProgress(self):
|
||||
if self.numCommands > 0:
|
||||
self.taskForm.form.progressBar.setValue(
|
||||
self.iprogress * 100 / self.numCommands
|
||||
)
|
||||
self.taskForm.form.progressBar.setValue(self.iprogress * 100 / self.numCommands)
|
||||
|
||||
def Activate(self):
|
||||
self.initdone = False
|
||||
@@ -124,9 +122,7 @@ class PathSimulation:
|
||||
guiSelection = FreeCADGui.Selection.getSelectionEx()
|
||||
if guiSelection: # Identify job selected by user
|
||||
sel = guiSelection[0]
|
||||
if hasattr(sel.Object, "Proxy") and isinstance(
|
||||
sel.Object.Proxy, PathJob.ObjectJob
|
||||
):
|
||||
if hasattr(sel.Object, "Proxy") and isinstance(sel.Object.Proxy, PathJob.ObjectJob):
|
||||
jobName = sel.Object.Name
|
||||
FreeCADGui.Selection.clearSelection()
|
||||
|
||||
@@ -193,9 +189,7 @@ class PathSimulation:
|
||||
if not self.cutTool.Shape.isValid() or self.cutTool.Shape.isNull():
|
||||
self.EndSimulation()
|
||||
raise RuntimeError(
|
||||
"Path Simulation: Error in tool geometry - {}".format(
|
||||
self.tool.Name
|
||||
)
|
||||
"Path Simulation: Error in tool geometry - {}".format(self.tool.Name)
|
||||
)
|
||||
|
||||
self.cutTool.ViewObject.show()
|
||||
@@ -212,9 +206,7 @@ class PathSimulation:
|
||||
self.skipStep = False
|
||||
self.initialPos = Vector(0, 0, self.job.Stock.Shape.BoundBox.ZMax)
|
||||
# Add cut tool
|
||||
self.cutTool = FreeCAD.ActiveDocument.addObject(
|
||||
"Part::FeaturePython", "CutTool"
|
||||
)
|
||||
self.cutTool = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "CutTool")
|
||||
self.cutTool.ViewObject.Proxy = 0
|
||||
self.cutTool.ViewObject.hide()
|
||||
|
||||
@@ -240,9 +232,7 @@ class PathSimulation:
|
||||
|
||||
# Add cut path solid for debug
|
||||
if self.debug:
|
||||
self.cutSolid = FreeCAD.ActiveDocument.addObject(
|
||||
"Part::FeaturePython", "CutDebug"
|
||||
)
|
||||
self.cutSolid = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "CutDebug")
|
||||
self.cutSolid.ViewObject.Proxy = 0
|
||||
self.cutSolid.ViewObject.hide()
|
||||
|
||||
@@ -270,9 +260,7 @@ class PathSimulation:
|
||||
if self.skipStep:
|
||||
self.curpos = self.RapidMove(cmd, self.curpos)
|
||||
else:
|
||||
(pathSolid, self.curpos) = self.GetPathSolid(
|
||||
self.tool, cmd, self.curpos
|
||||
)
|
||||
(pathSolid, self.curpos) = self.GetPathSolid(self.tool, cmd, self.curpos)
|
||||
|
||||
if cmd.Name in ["G80"]:
|
||||
self.firstDrill = True
|
||||
@@ -363,15 +351,9 @@ class PathSimulation:
|
||||
if self.firstDrill:
|
||||
extendcommands.append(Path.Command("G0", {"Z": cmd.r}))
|
||||
self.firstDrill = False
|
||||
extendcommands.append(
|
||||
Path.Command("G0", {"X": cmd.x, "Y": cmd.y, "Z": cmd.r})
|
||||
)
|
||||
extendcommands.append(
|
||||
Path.Command("G1", {"X": cmd.x, "Y": cmd.y, "Z": cmd.z})
|
||||
)
|
||||
extendcommands.append(
|
||||
Path.Command("G1", {"X": cmd.x, "Y": cmd.y, "Z": cmd.r})
|
||||
)
|
||||
extendcommands.append(Path.Command("G0", {"X": cmd.x, "Y": cmd.y, "Z": cmd.r}))
|
||||
extendcommands.append(Path.Command("G1", {"X": cmd.x, "Y": cmd.y, "Z": cmd.z}))
|
||||
extendcommands.append(Path.Command("G1", {"X": cmd.x, "Y": cmd.y, "Z": cmd.r}))
|
||||
for ecmd in extendcommands:
|
||||
self.curpos = self.voxSim.ApplyCommand(self.curpos, ecmd)
|
||||
if not self.disableAnim:
|
||||
@@ -630,9 +612,7 @@ class CommandPathSimulate:
|
||||
"Pixmap": "CAM_Simulator",
|
||||
"MenuText": QtCore.QT_TRANSLATE_NOOP("CAM_Simulator", "CAM Simulator"),
|
||||
"Accel": "P, M",
|
||||
"ToolTip": QtCore.QT_TRANSLATE_NOOP(
|
||||
"CAM_Simulator", "Simulate G-code on stock"
|
||||
),
|
||||
"ToolTip": QtCore.QT_TRANSLATE_NOOP("CAM_Simulator", "Simulate G-code on stock"),
|
||||
}
|
||||
|
||||
def IsActive(self):
|
||||
|
||||
@@ -30,7 +30,7 @@ import FreeCAD
|
||||
import Path.Base.Util as PathUtil
|
||||
import Path.Dressup.Utils as PathDressup
|
||||
import Path.Main.Job as PathJob
|
||||
from PathScripts import PathUtils
|
||||
from PathScripts import PathUtils
|
||||
import CAMSimulator
|
||||
|
||||
from FreeCAD import Vector, Placement, Rotation
|
||||
@@ -49,48 +49,45 @@ if FreeCAD.GuiUp:
|
||||
|
||||
_filePath = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def IsSame(x, y):
|
||||
""" Check if two floats are the same within an epsilon
|
||||
"""
|
||||
"""Check if two floats are the same within an epsilon"""
|
||||
return abs(x - y) < 0.0001
|
||||
|
||||
|
||||
def RadiusAt(edge, p):
|
||||
""" Find the tool radius within a point on its circumference
|
||||
"""
|
||||
"""Find the tool radius within a point on its circumference"""
|
||||
x = edge.valueAt(p).x
|
||||
y = edge.valueAt(p).y
|
||||
return math.sqrt(x * x + y * y)
|
||||
|
||||
|
||||
class CAMSimTaskUi:
|
||||
""" Handles the simulator task panel
|
||||
"""
|
||||
"""Handles the simulator task panel"""
|
||||
|
||||
def __init__(self, parent):
|
||||
# this will create a Qt widget from our ui file
|
||||
self.form = FreeCADGui.PySideUic.loadUi(":/panels/TaskCAMSimulator.ui")
|
||||
self.parent = parent
|
||||
|
||||
def getStandardButtons(self, *_args):
|
||||
""" Task panel needs only Close button
|
||||
"""
|
||||
"""Task panel needs only Close button"""
|
||||
return QDialogButtonBox.Close
|
||||
|
||||
def reject(self):
|
||||
""" User Pressed the Close button
|
||||
"""
|
||||
"""User Pressed the Close button"""
|
||||
self.parent.cancel()
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
|
||||
def TSError(msg):
|
||||
""" Display error message
|
||||
"""
|
||||
"""Display error message"""
|
||||
QtGui.QMessageBox.information(None, "Path Simulation", msg)
|
||||
|
||||
|
||||
class CAMSimulation:
|
||||
""" Handles and prepares CAM jobs for simulation
|
||||
"""
|
||||
"""Handles and prepares CAM jobs for simulation"""
|
||||
|
||||
def __init__(self):
|
||||
self.debug = False
|
||||
self.stdrot = FreeCAD.Rotation(Vector(0, 0, 1), 0)
|
||||
@@ -114,12 +111,11 @@ class CAMSimulation:
|
||||
self.baseShape = None
|
||||
|
||||
def Connect(self, but, sig):
|
||||
""" Connect task panel buttons """
|
||||
"""Connect task panel buttons"""
|
||||
QtCore.QObject.connect(but, QtCore.SIGNAL("clicked()"), sig)
|
||||
|
||||
def FindClosestEdge(self, edges, px, pz):
|
||||
""" Convert tool shape to tool profile needed by GL simulator
|
||||
"""
|
||||
"""Convert tool shape to tool profile needed by GL simulator"""
|
||||
for edge in edges:
|
||||
p1 = edge.FirstParameter
|
||||
p2 = edge.LastParameter
|
||||
@@ -140,8 +136,7 @@ class CAMSimulation:
|
||||
return None, 0.0, 0.0
|
||||
|
||||
def FindTopMostEdge(self, edges):
|
||||
""" Examine tool solid edges and find the top most one
|
||||
"""
|
||||
"""Examine tool solid edges and find the top most one"""
|
||||
maxz = -99999999.0
|
||||
topedge = None
|
||||
top_p1 = 0.0
|
||||
@@ -164,11 +159,11 @@ class CAMSimulation:
|
||||
return topedge, top_p1, top_p2
|
||||
|
||||
def GetToolProfile(self, tool, resolution):
|
||||
""" Get the edge profile of a tool solid. Basically locating the
|
||||
side edge that OCC creates on any revolved object
|
||||
"""Get the edge profile of a tool solid. Basically locating the
|
||||
side edge that OCC creates on any revolved object
|
||||
"""
|
||||
originalPlacement = tool.Placement
|
||||
tool.Placement = Placement(Vector(0,0,0), Rotation(Vector(0,0,1),0), Vector(0,0,0))
|
||||
tool.Placement = Placement(Vector(0, 0, 0), Rotation(Vector(0, 0, 1), 0), Vector(0, 0, 0))
|
||||
shape = tool.Shape
|
||||
tool.Placement = originalPlacement
|
||||
sideEdgeList = []
|
||||
@@ -217,8 +212,7 @@ class CAMSimulation:
|
||||
return profile
|
||||
|
||||
def Activate(self):
|
||||
""" Invoke the simulator task panel
|
||||
"""
|
||||
"""Invoke the simulator task panel"""
|
||||
self.initdone = False
|
||||
self.taskForm = CAMSimTaskUi(self)
|
||||
form = self.taskForm.form
|
||||
@@ -238,8 +232,7 @@ class CAMSimulation:
|
||||
# self.SetupSimulation()
|
||||
|
||||
def _populateJobSelection(self, form):
|
||||
""" Make Job selection combobox
|
||||
"""
|
||||
"""Make Job selection combobox"""
|
||||
setJobIdx = 0
|
||||
jobName = ""
|
||||
jIdx = 0
|
||||
@@ -251,9 +244,7 @@ class CAMSimulation:
|
||||
guiSelection = FreeCADGui.Selection.getSelectionEx()
|
||||
if guiSelection: # Identify job selected by user
|
||||
sel = guiSelection[0]
|
||||
if hasattr(sel.Object, "Proxy") and isinstance(
|
||||
sel.Object.Proxy, PathJob.ObjectJob
|
||||
):
|
||||
if hasattr(sel.Object, "Proxy") and isinstance(sel.Object.Proxy, PathJob.ObjectJob):
|
||||
jobName = sel.Object.Name
|
||||
FreeCADGui.Selection.clearSelection()
|
||||
|
||||
@@ -275,8 +266,7 @@ class CAMSimulation:
|
||||
form.comboJobs.setCurrentIndex(0)
|
||||
|
||||
def SetupSimulation(self):
|
||||
""" Prepare all selected job operations for simulation
|
||||
"""
|
||||
"""Prepare all selected job operations for simulation"""
|
||||
form = self.taskForm.form
|
||||
self.activeOps = []
|
||||
self.numCommands = 0
|
||||
@@ -291,8 +281,7 @@ class CAMSimulation:
|
||||
self.busy = False
|
||||
|
||||
def onJobChange(self):
|
||||
""" When a new job is selected from the drop-down, update job operation list
|
||||
"""
|
||||
"""When a new job is selected from the drop-down, update job operation list"""
|
||||
form = self.taskForm.form
|
||||
j = self.jobs[form.comboJobs.currentIndex()]
|
||||
self.job = j
|
||||
@@ -311,8 +300,7 @@ class CAMSimulation:
|
||||
self.baseShape = None
|
||||
|
||||
def onAccuracyBarChange(self):
|
||||
""" Update simulation quality
|
||||
"""
|
||||
"""Update simulation quality"""
|
||||
form = self.taskForm.form
|
||||
self.quality = form.sliderAccuracy.value()
|
||||
qualText = QtCore.QT_TRANSLATE_NOOP("CAM_Simulator", "High")
|
||||
@@ -323,8 +311,7 @@ class CAMSimulation:
|
||||
form.labelAccuracy.setText(qualText)
|
||||
|
||||
def onOperationItemChange(self, _item):
|
||||
""" Check if at least one operation is selected to enable the Play button
|
||||
"""
|
||||
"""Check if at least one operation is selected to enable the Play button"""
|
||||
playvalid = False
|
||||
form = self.taskForm.form
|
||||
for i in range(form.listOperations.count()):
|
||||
@@ -334,8 +321,7 @@ class CAMSimulation:
|
||||
form.toolButtonPlay.setEnabled(playvalid)
|
||||
|
||||
def SimPlay(self):
|
||||
""" Activate the simulation
|
||||
"""
|
||||
"""Activate the simulation"""
|
||||
self.SetupSimulation()
|
||||
self.millSim.ResetSimulation()
|
||||
for op in self.activeOps:
|
||||
@@ -351,28 +337,23 @@ class CAMSimulation:
|
||||
self.millSim.SetBaseShape(self.baseShape, 1)
|
||||
|
||||
def cancel(self):
|
||||
""" Cancel the simulation
|
||||
"""
|
||||
"""Cancel the simulation"""
|
||||
|
||||
|
||||
class CommandCAMSimulate:
|
||||
""" FreeCAD invoke simulation task panel command
|
||||
"""
|
||||
"""FreeCAD invoke simulation task panel command"""
|
||||
|
||||
def GetResources(self):
|
||||
""" Command info
|
||||
"""
|
||||
"""Command info"""
|
||||
return {
|
||||
"Pixmap": "CAM_SimulatorGL",
|
||||
"MenuText": QtCore.QT_TRANSLATE_NOOP("CAM_Simulator", "New CAM Simulator"),
|
||||
"Accel": "P, N",
|
||||
"ToolTip": QtCore.QT_TRANSLATE_NOOP(
|
||||
"CAM_Simulator", "Simulate G-code on stock"
|
||||
),
|
||||
"ToolTip": QtCore.QT_TRANSLATE_NOOP("CAM_Simulator", "Simulate G-code on stock"),
|
||||
}
|
||||
|
||||
def IsActive(self):
|
||||
""" Command is active if at least one CAM job exists
|
||||
"""
|
||||
"""Command is active if at least one CAM job exists"""
|
||||
if FreeCAD.ActiveDocument is not None:
|
||||
for o in FreeCAD.ActiveDocument.Objects:
|
||||
if o.Name[:3] == "Job":
|
||||
@@ -380,8 +361,7 @@ class CommandCAMSimulate:
|
||||
return False
|
||||
|
||||
def Activated(self):
|
||||
""" Activate the simulation
|
||||
"""
|
||||
"""Activate the simulation"""
|
||||
CamSimulation = CAMSimulation()
|
||||
CamSimulation.Activate()
|
||||
|
||||
|
||||
@@ -112,9 +112,7 @@ class ObjectJob:
|
||||
"App::PropertyFile",
|
||||
"PostProcessorOutputFile",
|
||||
"Output",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "The G-code output file for this project"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "The G-code output file for this project"),
|
||||
)
|
||||
obj.addProperty(
|
||||
"App::PropertyEnumeration",
|
||||
@@ -197,25 +195,19 @@ class ObjectJob:
|
||||
"App::PropertyBool",
|
||||
"SplitOutput",
|
||||
"Output",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "Split output into multiple G-code files"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "Split output into multiple G-code files"),
|
||||
)
|
||||
obj.addProperty(
|
||||
"App::PropertyEnumeration",
|
||||
"OrderOutputBy",
|
||||
"WCS",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "If multiple WCS, order the output this way"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "If multiple WCS, order the output this way"),
|
||||
)
|
||||
obj.addProperty(
|
||||
"App::PropertyStringList",
|
||||
"Fixtures",
|
||||
"WCS",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "The Work Coordinate Systems for the Job"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "The Work Coordinate Systems for the Job"),
|
||||
)
|
||||
|
||||
obj.Fixtures = ["G54"]
|
||||
@@ -309,9 +301,7 @@ class ObjectJob:
|
||||
if obj.SetupSheet.ViewObject:
|
||||
import Path.Base.Gui.IconViewProvider
|
||||
|
||||
Path.Base.Gui.IconViewProvider.Attach(
|
||||
obj.SetupSheet.ViewObject, "SetupSheet"
|
||||
)
|
||||
Path.Base.Gui.IconViewProvider.Attach(obj.SetupSheet.ViewObject, "SetupSheet")
|
||||
obj.SetupSheet.Label = "SetupSheet"
|
||||
self.setupSheet = obj.SetupSheet.Proxy
|
||||
|
||||
@@ -324,31 +314,23 @@ class ObjectJob:
|
||||
"App::PropertyLink",
|
||||
"Model",
|
||||
"Base",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "The base objects for all operations"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "The base objects for all operations"),
|
||||
)
|
||||
addModels = True
|
||||
elif obj.Model is None:
|
||||
addModels = True
|
||||
|
||||
if addModels:
|
||||
model = FreeCAD.ActiveDocument.addObject(
|
||||
"App::DocumentObjectGroup", "Model"
|
||||
)
|
||||
model = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroup", "Model")
|
||||
if model.ViewObject:
|
||||
model.ViewObject.Visibility = False
|
||||
if models:
|
||||
model.addObjects(
|
||||
[createModelResourceClone(obj, base) for base in models]
|
||||
)
|
||||
model.addObjects([createModelResourceClone(obj, base) for base in models])
|
||||
obj.Model = model
|
||||
obj.Model.Label = "Model"
|
||||
|
||||
if hasattr(obj, "Base"):
|
||||
Path.Log.info(
|
||||
"Converting Job.Base to new Job.Model for {}".format(obj.Label)
|
||||
)
|
||||
Path.Log.info("Converting Job.Base to new Job.Model for {}".format(obj.Label))
|
||||
obj.Model.addObject(obj.Base)
|
||||
obj.Base = None
|
||||
obj.removeProperty("Base")
|
||||
@@ -369,9 +351,7 @@ class ObjectJob:
|
||||
addTable = True
|
||||
|
||||
if addTable:
|
||||
toolTable = FreeCAD.ActiveDocument.addObject(
|
||||
"App::DocumentObjectGroup", "Tools"
|
||||
)
|
||||
toolTable = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroup", "Tools")
|
||||
toolTable.Label = "Tools"
|
||||
if toolTable.ViewObject:
|
||||
toolTable.ViewObject.Visibility = False
|
||||
@@ -408,9 +388,7 @@ class ObjectJob:
|
||||
|
||||
if getattr(obj, "Operations", None):
|
||||
# the first to tear down are the ops, they depend on other resources
|
||||
Path.Log.debug(
|
||||
"taking down ops: %s" % [o.Name for o in self.allOperations()]
|
||||
)
|
||||
Path.Log.debug("taking down ops: %s" % [o.Name for o in self.allOperations()])
|
||||
while obj.Operations.Group:
|
||||
op = obj.Operations.Group[0]
|
||||
if (
|
||||
@@ -469,9 +447,7 @@ class ObjectJob:
|
||||
except Exception:
|
||||
name = obj.Operations.Name
|
||||
label = obj.Operations.Label
|
||||
ops = FreeCAD.ActiveDocument.addObject(
|
||||
"Path::FeatureCompoundPython", "Operations"
|
||||
)
|
||||
ops = FreeCAD.ActiveDocument.addObject("Path::FeatureCompoundPython", "Operations")
|
||||
ops.ViewObject.Proxy = 0
|
||||
ops.Group = obj.Operations.Group
|
||||
obj.Operations.Group = []
|
||||
@@ -509,9 +485,7 @@ class ObjectJob:
|
||||
"App::PropertyStringList",
|
||||
"Fixtures",
|
||||
"WCS",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "The Work Coordinate Systems for the Job"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "The Work Coordinate Systems for the Job"),
|
||||
)
|
||||
obj.Fixtures = ["G54"]
|
||||
|
||||
@@ -520,9 +494,7 @@ class ObjectJob:
|
||||
"App::PropertyEnumeration",
|
||||
"OrderOutputBy",
|
||||
"WCS",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "If multiple WCS, order the output this way"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "If multiple WCS, order the output this way"),
|
||||
)
|
||||
obj.OrderOutputBy = ["Fixture", "Tool", "Operation"]
|
||||
|
||||
@@ -531,9 +503,7 @@ class ObjectJob:
|
||||
"App::PropertyBool",
|
||||
"SplitOutput",
|
||||
"Output",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "Split output into multiple G-code files"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "Split output into multiple G-code files"),
|
||||
)
|
||||
obj.SplitOutput = False
|
||||
|
||||
@@ -588,9 +558,7 @@ class ObjectJob:
|
||||
self.setupSheet.setFromTemplate(attrs[JobTemplate.SetupSheet])
|
||||
|
||||
if attrs.get(JobTemplate.GeometryTolerance):
|
||||
obj.GeometryTolerance = float(
|
||||
attrs.get(JobTemplate.GeometryTolerance)
|
||||
)
|
||||
obj.GeometryTolerance = float(attrs.get(JobTemplate.GeometryTolerance))
|
||||
if attrs.get(JobTemplate.PostProcessor):
|
||||
obj.PostProcessor = attrs.get(JobTemplate.PostProcessor)
|
||||
if attrs.get(JobTemplate.PostProcessorArgs):
|
||||
@@ -598,9 +566,7 @@ class ObjectJob:
|
||||
else:
|
||||
obj.PostProcessorArgs = ""
|
||||
if attrs.get(JobTemplate.PostProcessorOutputFile):
|
||||
obj.PostProcessorOutputFile = attrs.get(
|
||||
JobTemplate.PostProcessorOutputFile
|
||||
)
|
||||
obj.PostProcessorOutputFile = attrs.get(JobTemplate.PostProcessorOutputFile)
|
||||
if attrs.get(JobTemplate.Description):
|
||||
obj.Description = attrs.get(JobTemplate.Description)
|
||||
|
||||
@@ -612,14 +578,10 @@ class ObjectJob:
|
||||
else:
|
||||
Path.Log.debug(f"skipping TC {tc['name']}")
|
||||
if attrs.get(JobTemplate.Stock):
|
||||
obj.Stock = PathStock.CreateFromTemplate(
|
||||
obj, attrs.get(JobTemplate.Stock)
|
||||
)
|
||||
obj.Stock = PathStock.CreateFromTemplate(obj, attrs.get(JobTemplate.Stock))
|
||||
|
||||
if attrs.get(JobTemplate.Fixtures):
|
||||
obj.Fixtures = [
|
||||
x for y in attrs.get(JobTemplate.Fixtures) for x in y
|
||||
]
|
||||
obj.Fixtures = [x for y in attrs.get(JobTemplate.Fixtures) for x in y]
|
||||
|
||||
if attrs.get(JobTemplate.OrderOutputBy):
|
||||
obj.OrderOutputBy = attrs.get(JobTemplate.OrderOutputBy)
|
||||
@@ -632,9 +594,7 @@ class ObjectJob:
|
||||
obj.Tools.Group = tcs
|
||||
else:
|
||||
Path.Log.error(
|
||||
"Unsupported PathJob template version {}".format(
|
||||
attrs.get(JobTemplate.Version)
|
||||
)
|
||||
"Unsupported PathJob template version {}".format(attrs.get(JobTemplate.Version))
|
||||
)
|
||||
|
||||
if not tcs:
|
||||
@@ -694,9 +654,7 @@ class ObjectJob:
|
||||
# Convert the formatted time from HH:MM:SS to just seconds
|
||||
opCycleTime = sum(
|
||||
x * int(t)
|
||||
for x, t in zip(
|
||||
[1, 60, 3600], reversed(formattedCycleTime.split(":"))
|
||||
)
|
||||
for x, t in zip([1, 60, 3600], reversed(formattedCycleTime.split(":")))
|
||||
)
|
||||
except Exception:
|
||||
continue
|
||||
@@ -733,9 +691,7 @@ class ObjectJob:
|
||||
|
||||
def addToolController(self, tc):
|
||||
group = self.obj.Tools.Group
|
||||
Path.Log.debug(
|
||||
"addToolController(%s): %s" % (tc.Label, [t.Label for t in group])
|
||||
)
|
||||
Path.Log.debug("addToolController(%s): %s" % (tc.Label, [t.Label for t in group]))
|
||||
if tc.Name not in [str(t.Name) for t in group]:
|
||||
tc.setExpression(
|
||||
"VertRapid",
|
||||
@@ -770,9 +726,7 @@ class ObjectJob:
|
||||
for sub in op.Group:
|
||||
collectBaseOps(sub)
|
||||
|
||||
if getattr(self.obj, "Operations", None) and getattr(
|
||||
self.obj.Operations, "Group", None
|
||||
):
|
||||
if getattr(self.obj, "Operations", None) and getattr(self.obj.Operations, "Group", None):
|
||||
for op in self.obj.Operations.Group:
|
||||
collectBaseOps(op)
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# * *
|
||||
# ***************************************************************************
|
||||
from string import Template
|
||||
|
||||
"""
|
||||
This module contains the HTML template for the CAM Sanity report.
|
||||
"""
|
||||
|
||||
@@ -64,15 +64,11 @@ class CAMSanity:
|
||||
raise ValueError(
|
||||
translate(
|
||||
"CAM_Sanity",
|
||||
"output location {} doesn't exist".format(
|
||||
os.path.dirname(output_file)
|
||||
),
|
||||
"output location {} doesn't exist".format(os.path.dirname(output_file)),
|
||||
)
|
||||
)
|
||||
|
||||
self.image_builder = ImageBuilder.ImageBuilderFactory.get_image_builder(
|
||||
self.filelocation
|
||||
)
|
||||
self.image_builder = ImageBuilder.ImageBuilderFactory.get_image_builder(self.filelocation)
|
||||
self.data = self.summarize()
|
||||
|
||||
def summarize(self):
|
||||
@@ -93,11 +89,7 @@ class CAMSanity:
|
||||
return data
|
||||
|
||||
def squawk(self, operator, note, date=datetime.now(), squawkType="NOTE"):
|
||||
squawkType = (
|
||||
squawkType
|
||||
if squawkType in ("NOTE", "WARNING", "CAUTION", "TIP")
|
||||
else "NOTE"
|
||||
)
|
||||
squawkType = squawkType if squawkType in ("NOTE", "WARNING", "CAUTION", "TIP") else "NOTE"
|
||||
|
||||
if squawkType == "TIP":
|
||||
squawk_icon = "Sanity_Bulb"
|
||||
@@ -225,12 +217,8 @@ class CAMSanity:
|
||||
)
|
||||
else:
|
||||
if os.path.isfile(obj.LastPostProcessOutput):
|
||||
data["filesize"] = str(
|
||||
os.path.getsize(obj.LastPostProcessOutput) / 1000
|
||||
)
|
||||
data["linecount"] = str(
|
||||
sum(1 for line in open(obj.LastPostProcessOutput))
|
||||
)
|
||||
data["filesize"] = str(os.path.getsize(obj.LastPostProcessOutput) / 1000)
|
||||
data["linecount"] = str(sum(1 for line in open(obj.LastPostProcessOutput)))
|
||||
else:
|
||||
data["filesize"] = str(0.0)
|
||||
data["linecount"] = str(0)
|
||||
@@ -321,15 +309,9 @@ class CAMSanity:
|
||||
}
|
||||
|
||||
bb = obj.Stock.Shape.BoundBox
|
||||
data["xLen"] = FreeCAD.Units.Quantity(
|
||||
bb.XLength, FreeCAD.Units.Length
|
||||
).UserString
|
||||
data["yLen"] = FreeCAD.Units.Quantity(
|
||||
bb.YLength, FreeCAD.Units.Length
|
||||
).UserString
|
||||
data["zLen"] = FreeCAD.Units.Quantity(
|
||||
bb.ZLength, FreeCAD.Units.Length
|
||||
).UserString
|
||||
data["xLen"] = FreeCAD.Units.Quantity(bb.XLength, FreeCAD.Units.Length).UserString
|
||||
data["yLen"] = FreeCAD.Units.Quantity(bb.YLength, FreeCAD.Units.Length).UserString
|
||||
data["zLen"] = FreeCAD.Units.Quantity(bb.ZLength, FreeCAD.Units.Length).UserString
|
||||
|
||||
data["material"] = "Not Specified"
|
||||
if hasattr(obj.Stock, "ShapeMaterial"):
|
||||
@@ -391,9 +373,9 @@ class CAMSanity:
|
||||
data["squawkData"].append(
|
||||
self.squawk(
|
||||
"CAMSanity",
|
||||
translate(
|
||||
"CAM_Sanity", "Tool number {} used by multiple tools"
|
||||
).format(TC.ToolNumber),
|
||||
translate("CAM_Sanity", "Tool number {} used by multiple tools").format(
|
||||
TC.ToolNumber
|
||||
),
|
||||
squawkType="CAUTION",
|
||||
)
|
||||
)
|
||||
@@ -414,9 +396,9 @@ class CAMSanity:
|
||||
data["squawkData"].append(
|
||||
self.squawk(
|
||||
"CAMSanity",
|
||||
translate(
|
||||
"CAM_Sanity", "Toolbit Shape for TC: {} not found"
|
||||
).format(TC.ToolNumber),
|
||||
translate("CAM_Sanity", "Toolbit Shape for TC: {} not found").format(
|
||||
TC.ToolNumber
|
||||
),
|
||||
squawkType="WARNING",
|
||||
)
|
||||
)
|
||||
@@ -434,9 +416,9 @@ class CAMSanity:
|
||||
data["squawkData"].append(
|
||||
self.squawk(
|
||||
"CAMSanity",
|
||||
translate(
|
||||
"CAM_Sanity", "Tool Controller '{}' has no feedrate"
|
||||
).format(TC.Label),
|
||||
translate("CAM_Sanity", "Tool Controller '{}' has no feedrate").format(
|
||||
TC.Label
|
||||
),
|
||||
squawkType="WARNING",
|
||||
)
|
||||
)
|
||||
@@ -446,9 +428,9 @@ class CAMSanity:
|
||||
data["squawkData"].append(
|
||||
self.squawk(
|
||||
"CAMSanity",
|
||||
translate(
|
||||
"CAM_Sanity", "Tool Controller '{}' has no spindlespeed"
|
||||
).format(TC.Label),
|
||||
translate("CAM_Sanity", "Tool Controller '{}' has no spindlespeed").format(
|
||||
TC.Label
|
||||
),
|
||||
squawkType="WARNING",
|
||||
)
|
||||
)
|
||||
@@ -472,9 +454,9 @@ class CAMSanity:
|
||||
data["squawkData"].append(
|
||||
self.squawk(
|
||||
"CAMSanity",
|
||||
translate(
|
||||
"CAM_Sanity", "Tool Controller '{}' is not used"
|
||||
).format(TC.Label),
|
||||
translate("CAM_Sanity", "Tool Controller '{}' is not used").format(
|
||||
TC.Label
|
||||
),
|
||||
squawkType="WARNING",
|
||||
)
|
||||
)
|
||||
@@ -487,9 +469,7 @@ class CAMSanity:
|
||||
# Convert an exception to its string representation
|
||||
return str(obj)
|
||||
# You might need to handle more types depending on your needs
|
||||
return str(
|
||||
obj
|
||||
) # Fallback to convert any other non-serializable types to string
|
||||
return str(obj) # Fallback to convert any other non-serializable types to string
|
||||
|
||||
def get_output_report(self):
|
||||
Path.Log.debug("get_output_url")
|
||||
|
||||
@@ -86,9 +86,7 @@ def shapeBoundBox(obj):
|
||||
bb = bb.united(b)
|
||||
return bb
|
||||
if obj:
|
||||
Path.Log.error(
|
||||
translate("PathStock", "Invalid base object %s - no shape found") % obj.Name
|
||||
)
|
||||
Path.Log.error(translate("PathStock", "Invalid base object %s - no shape found") % obj.Name)
|
||||
return None
|
||||
|
||||
|
||||
@@ -114,9 +112,7 @@ class StockFromBase(Stock):
|
||||
"App::PropertyLink",
|
||||
"Base",
|
||||
"Base",
|
||||
QT_TRANSLATE_NOOP(
|
||||
"App::Property", "The base object this stock is derived from"
|
||||
),
|
||||
QT_TRANSLATE_NOOP("App::Property", "The base object this stock is derived from"),
|
||||
)
|
||||
obj.addProperty(
|
||||
"App::PropertyDistance",
|
||||
@@ -204,19 +200,13 @@ class StockFromBase(Stock):
|
||||
return None
|
||||
|
||||
def execute(self, obj):
|
||||
bb = (
|
||||
shapeBoundBox(obj.Base.Group)
|
||||
if obj.Base and hasattr(obj.Base, "Group")
|
||||
else None
|
||||
)
|
||||
bb = shapeBoundBox(obj.Base.Group) if obj.Base and hasattr(obj.Base, "Group") else None
|
||||
Path.Log.track(obj.Label, bb)
|
||||
|
||||
# Sometimes, when the Base changes it's temporarily not assigned when
|
||||
# Stock.execute is triggered - it'll be set correctly the next time around.
|
||||
if bb:
|
||||
self.origin = FreeCAD.Vector(
|
||||
-obj.ExtXneg.Value, -obj.ExtYneg.Value, -obj.ExtZneg.Value
|
||||
)
|
||||
self.origin = FreeCAD.Vector(-obj.ExtXneg.Value, -obj.ExtYneg.Value, -obj.ExtZneg.Value)
|
||||
|
||||
self.length = bb.XLength + obj.ExtXneg.Value + obj.ExtXpos.Value
|
||||
self.width = bb.YLength + obj.ExtYneg.Value + obj.ExtYpos.Value
|
||||
@@ -433,16 +423,14 @@ def CreateCylinder(job, radius=None, height=None, placement=None):
|
||||
obj.Height = height
|
||||
elif base:
|
||||
bb = shapeBoundBox(base.Group)
|
||||
obj.Radius = math.sqrt(bb.XLength ** 2 + bb.YLength ** 2) / 2.0
|
||||
obj.Radius = math.sqrt(bb.XLength**2 + bb.YLength**2) / 2.0
|
||||
obj.Height = max(bb.ZLength, 1)
|
||||
|
||||
if placement:
|
||||
obj.Placement = placement
|
||||
elif base:
|
||||
bb = shapeBoundBox(base.Group)
|
||||
origin = FreeCAD.Vector(
|
||||
(bb.XMin + bb.XMax) / 2, (bb.YMin + bb.YMax) / 2, bb.ZMin
|
||||
)
|
||||
origin = FreeCAD.Vector((bb.XMin + bb.XMax) / 2, (bb.YMin + bb.YMax) / 2, bb.ZMin)
|
||||
obj.Placement = FreeCAD.Placement(origin, FreeCAD.Vector(), 0)
|
||||
|
||||
SetupStockObject(obj, StockType.CreateCylinder)
|
||||
@@ -508,9 +496,7 @@ def CreateFromTemplate(job, template):
|
||||
and rotW is not None
|
||||
):
|
||||
pos = FreeCAD.Vector(float(posX), float(posY), float(posZ))
|
||||
rot = FreeCAD.Rotation(
|
||||
float(rotX), float(rotY), float(rotZ), float(rotW)
|
||||
)
|
||||
rot = FreeCAD.Rotation(float(rotX), float(rotY), float(rotZ), float(rotW))
|
||||
placement = FreeCAD.Placement(pos, rot)
|
||||
elif (
|
||||
posX is not None
|
||||
@@ -584,8 +570,7 @@ def CreateFromTemplate(job, template):
|
||||
)
|
||||
else:
|
||||
Path.Log.track(
|
||||
" take placement (%s) and extent (%s) from model"
|
||||
% (placement, extent)
|
||||
" take placement (%s) and extent (%s) from model" % (placement, extent)
|
||||
)
|
||||
return CreateBox(job, extent, placement)
|
||||
|
||||
@@ -603,15 +588,13 @@ def CreateFromTemplate(job, template):
|
||||
return CreateCylinder(job, radius, height, placement)
|
||||
|
||||
Path.Log.error(
|
||||
translate("PathStock", "Unsupported stock type named {}").format(
|
||||
stockType
|
||||
)
|
||||
translate("PathStock", "Unsupported stock type named {}").format(stockType)
|
||||
)
|
||||
else:
|
||||
Path.Log.error(
|
||||
translate(
|
||||
"PathStock", "Unsupported PathStock template version {}"
|
||||
).format(template.get("version"))
|
||||
translate("PathStock", "Unsupported PathStock template version {}").format(
|
||||
template.get("version")
|
||||
)
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
Reference in New Issue
Block a user