CAM: apply precommit

This commit is contained in:
Adrian Insaurralde Avalos
2024-09-03 14:54:36 -04:00
parent 261ef09348
commit a17a3cf6d7
337 changed files with 26842 additions and 25585 deletions

View File

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

View File

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

View File

@@ -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 + ")"
)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -20,6 +20,7 @@
# * *
# ***************************************************************************
from string import Template
"""
This module contains the HTML template for the CAM Sanity report.
"""

View File

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

View File

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