diff --git a/src/Mod/Path/Gui/Resources/panels/PathEdit.ui b/src/Mod/Path/Gui/Resources/panels/PathEdit.ui
index ccc8ef4458..9b3350643a 100644
--- a/src/Mod/Path/Gui/Resources/panels/PathEdit.ui
+++ b/src/Mod/Path/Gui/Resources/panels/PathEdit.ui
@@ -7,14 +7,14 @@
0
0
432
- 673
+ 1160
Job Edit
- 2
+ 0
@@ -32,63 +32,79 @@
0
0
412
- 549
+ 1036
Job
-
- -
-
-
+
+
-
+
+
Label
+
+
-
+
+
+
- -
-
-
- -
-
-
+
-
+
+
Model
+
+
-
+
+
+ QAbstractItemView::MultiSelection
+
+
+
+ -
+
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 334
+ 20
+
+
+
+
+ -
+
+
+ Edit
+
+
+
+
+
+
+
- -
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
+
-
+
+
Description
+
+
-
+
+
+
- -
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
@@ -190,7 +206,7 @@
0
0
418
- 762
+ 1117
@@ -392,55 +408,11 @@
-
-
-
- Orientation
-
-
-
-
-
-
- X-Axis
-
-
-
- -
-
-
- Y-Axis
-
-
-
- -
-
-
- Z-Axis
-
-
-
-
-
-
- -
-
+
Alignment
-
-
-
-
- Set Origin
-
-
-
- -
-
-
- Move to Origin
-
-
-
-
@@ -455,6 +427,285 @@
+ -
+
+
+ Set Origin
+
+
+
+ -
+
+
+ Move to Origin
+
+
+
+
+
+
+ -
+
+
+ Set
+
+
+
-
+
+
+ X-Axis
+
+
+
+ -
+
+
+ Y-Axis
+
+
+
+ -
+
+
+ Z-Axis
+
+
+
+ -
+
+
+ Y=0
+
+
+
+ -
+
+
+ Z=0
+
+
+
+ -
+
+
+ X=0
+
+
+
+
+
+
+ -
+
+
+ Move - XY
+
+
+
-
+
+
+
+
+
+
+ :/icons/arrow-up.svg:/icons/arrow-up.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-right-up.svg:/icons/arrow-right-up.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-left-up.svg:/icons/arrow-left-up.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-right.svg:/icons/arrow-right.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+ -1000.000000000000000
+
+
+ 1000.000000000000000
+
+
+ 1.000000000000000
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-left.svg:/icons/arrow-left.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-left-down.svg:/icons/arrow-left-down.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-down.svg:/icons/arrow-down.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-right-down.svg:/icons/arrow-right-down.svg
+
+
+
+ 32
+ 32
+
+
+
+
+
+
+
+ -
+
+
+ Rotate - XY
+
+
+
-
+
+
+
+
+
+
+ :/icons/arrow-ccw.svg:/icons/arrow-ccw.svg
+
+
+
+ 32
+ 32
+
+
+
+
+ -
+
+
+ -180.000000000000000
+
+
+ 360.000000000000000
+
+
+ 90.000000000000000
+
+
+
+ -
+
+
+
+
+
+
+ :/icons/arrow-cw.svg:/icons/arrow-cw.svg
+
+
+
+ 32
+ 32
+
+
+
+
@@ -642,8 +893,8 @@
0
0
- 412
- 549
+ 312
+ 169
@@ -976,9 +1227,6 @@
- jobLabel
- jobModel
- jobDescription
postProcessorOutputFile
postProcessorSetOutputFile
postProcessor
@@ -996,13 +1244,6 @@
stockBoxLength
stockBoxWidth
stockBoxHeight
- orientXAxis
- orientYAxis
- orientZAxis
- setOrigin
- moveToOrigin
- centerInStock
- centerInStockXY
toolControllerEdit
toolControllerAdd
toolControllerDelete
@@ -1015,6 +1256,7 @@
+
diff --git a/src/Mod/Path/PathScripts/PathCircularHoleBaseGui.py b/src/Mod/Path/PathScripts/PathCircularHoleBaseGui.py
index dbee10bed2..7a137e9010 100644
--- a/src/Mod/Path/PathScripts/PathCircularHoleBaseGui.py
+++ b/src/Mod/Path/PathScripts/PathCircularHoleBaseGui.py
@@ -118,7 +118,6 @@ class TaskPanelHoleGeometryPage(PathOpGui.TaskPanelBaseGeometryPage):
selected = [self.form.baseList.row(item) for item in self.form.baseList.selectedItems()]
self.form.baseList.blockSignals(True)
for row in sorted(list(set(selected)), key=lambda row: -row):
- print("row = %d" % row)
self.form.baseList.removeRow(row)
self.updateBase()
self.form.baseList.resizeColumnToContents(0)
diff --git a/src/Mod/Path/PathScripts/PathEngrave.py b/src/Mod/Path/PathScripts/PathEngrave.py
index edf0e69377..5723989bfc 100644
--- a/src/Mod/Path/PathScripts/PathEngrave.py
+++ b/src/Mod/Path/PathScripts/PathEngrave.py
@@ -36,7 +36,7 @@ from PySide import QtCore
__doc__ = "Class and implementation of Path Engrave operation"
-if True:
+if False:
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
PathLog.trackModule(PathLog.thisModule())
else:
diff --git a/src/Mod/Path/PathScripts/PathEngraveBase.py b/src/Mod/Path/PathScripts/PathEngraveBase.py
index 9c6c1184f5..e38fd7ec94 100644
--- a/src/Mod/Path/PathScripts/PathEngraveBase.py
+++ b/src/Mod/Path/PathScripts/PathEngraveBase.py
@@ -123,10 +123,9 @@ class ObjectOp(PathOp.ObjectOp):
params.update({'Z': z, 'F': self.horizFeed})
self.commandlist.append(Path.Command(cmd.Name, params))
- def opSetDefaultValues(self, obj):
+ def opSetDefaultValues(self, obj, job):
'''opSetDefaultValues(obj) ... set depths for engraving'''
if PathOp.FeatureDepths & self.opFeatures(obj):
- job = PathUtils.findParentJob(obj)
if job and len(job.Model.Group) > 0:
bb = job.Proxy.modelBoundBox(job)
obj.OpStartDepth = bb.ZMax
diff --git a/src/Mod/Path/PathScripts/PathJobCmd.py b/src/Mod/Path/PathScripts/PathJobCmd.py
index 655a4bf130..7158671f8d 100644
--- a/src/Mod/Path/PathScripts/PathJobCmd.py
+++ b/src/Mod/Path/PathScripts/PathJobCmd.py
@@ -80,115 +80,6 @@ class CommandJobCreate:
FreeCADGui.doCommand('PathScripts.PathJobGui.Create(%s, %s)' % ([o.Name for o in base], template))
-class DlgJobTemplateExport:
- DataObject = QtCore.Qt.ItemDataRole.UserRole
-
- def __init__(self, job, parent=None):
- self.job = job
- self.dialog = FreeCADGui.PySideUic.loadUi(":/panels/DlgJobTemplateExport.ui")
- if parent:
- self.dialog.setParent(parent)
- parent.layout().addWidget(self.dialog)
- self.dialog.dialogButtonBox.hide()
- else:
- self.dialog.exportButtonBox.hide()
- self.updateUI()
- self.dialog.toolsGroup.clicked.connect(self.checkUncheckTools)
-
- def exportButton(self):
- return self.dialog.exportButton
-
- def updateUI(self):
- job = self.job
- if job.PostProcessor:
- ppHint = "%s %s %s" % (job.PostProcessor, job.PostProcessorArgs, job.PostProcessorOutputFile)
- self.dialog.postProcessingHint.setText(ppHint)
- else:
- self.dialog.postProcessingGroup.setEnabled(False)
- self.dialog.postProcessingGroup.setChecked(False)
-
- if job.Stock and not PathJob.isResourceClone(job, 'Stock', 'Stock'):
- stockType = PathStock.StockType.FromStock(job.Stock)
- if stockType == PathStock.StockType.FromBase:
- seHint = translate('PathJob', "Base -/+ %.2f/%.2f %.2f/%.2f %.2f/%.2f") % (job.Stock.ExtXneg, job.Stock.ExtXpos, job.Stock.ExtYneg, job.Stock.ExtYpos, job.Stock.ExtZneg, job.Stock.ExtZpos)
- self.dialog.stockPlacement.setChecked(False)
- elif stockType == PathStock.StockType.CreateBox:
- seHint = translate('PathJob', "Box: %.2f x %.2f x %.2f") % (job.Stock.Length, job.Stock.Width, job.Stock.Height)
- elif stockType == PathStock.StockType.CreateCylinder:
- seHint = translate('PathJob', "Cylinder: %.2f x %.2f") % (job.Stock.Radius, job.Stock.Height)
- else:
- seHint = '-'
- PathLog.error(translate('PathJob', 'Unsupported stock type'))
- self.dialog.stockExtentHint.setText(seHint)
- spHint = "%s" % job.Stock.Placement
- self.dialog.stockPlacementHint.setText(spHint)
-
- rapidChanged = not job.SetupSheet.Proxy.hasDefaultToolRapids()
- depthsChanged = not job.SetupSheet.Proxy.hasDefaultOperationDepths()
- heightsChanged = not job.SetupSheet.Proxy.hasDefaultOperationHeights()
- opsWithSettings = job.SetupSheet.Proxy.operationsWithSettings()
- settingsChanged = rapidChanged or depthsChanged or heightsChanged or 0 != len(opsWithSettings)
- self.dialog.settingsGroup.setChecked(settingsChanged)
- self.dialog.settingToolRapid.setChecked(rapidChanged)
- self.dialog.settingOperationDepths.setChecked(depthsChanged)
- self.dialog.settingOperationHeights.setChecked(heightsChanged)
-
- self.dialog.settingsOpsList.clear()
- for op in opsWithSettings:
- item = QtGui.QListWidgetItem(op)
- item.setCheckState(QtCore.Qt.CheckState.Checked)
- self.dialog.settingsOpsList.addItem(item)
-
- self.dialog.toolsList.clear()
- for tc in sorted(job.ToolController, key=lambda o: o.Label):
- item = QtGui.QListWidgetItem(tc.Label)
- item.setData(self.DataObject, tc)
- item.setCheckState(QtCore.Qt.CheckState.Checked)
- self.dialog.toolsList.addItem(item)
-
- def checkUncheckTools(self):
- state = QtCore.Qt.CheckState.Checked if self.dialog.toolsGroup.isChecked() else QtCore.Qt.CheckState.Unchecked
- for i in range(self.dialog.toolsList.count()):
- self.dialog.toolsList.item(i).setCheckState(state)
-
- def includePostProcessing(self):
- return self.dialog.postProcessingGroup.isChecked()
-
- def includeToolControllers(self):
- tcs = []
- for i in range(self.dialog.toolsList.count()):
- item = self.dialog.toolsList.item(i)
- if item.checkState() == QtCore.Qt.CheckState.Checked:
- tcs.append(item.data(self.DataObject))
- return tcs
-
- def includeStock(self):
- return self.dialog.stockGroup.isChecked()
- def includeStockExtent(self):
- return self.dialog.stockExtent.isChecked()
- def includeStockPlacement(self):
- return self.dialog.stockPlacement.isChecked()
-
- def includeSettings(self):
- return self.dialog.settingsGroup.isChecked()
- def includeSettingToolRapid(self):
- return self.dialog.settingToolRapid.isChecked()
- def includeSettingOperationHeights(self):
- return self.dialog.settingOperationHeights.isChecked()
- def includeSettingOperationDepths(self):
- return self.dialog.settingOperationDepths.isChecked()
-
- def includeSettingOpsSettings(self):
- ops = []
- for i in range(self.dialog.settingsOpsList.count()):
- item = self.dialog.settingsOpsList.item(i)
- if item.checkState() == QtCore.Qt.CheckState.Checked:
- ops.append(item.text())
- return ops
-
- def exec_(self):
- return self.dialog.exec_()
-
class CommandJobTemplateExport:
'''
Command to export a template of a given job.
diff --git a/src/Mod/Path/PathScripts/PathJobDlg.py b/src/Mod/Path/PathScripts/PathJobDlg.py
index e8d578619d..d78bb5aa16 100644
--- a/src/Mod/Path/PathScripts/PathJobDlg.py
+++ b/src/Mod/Path/PathScripts/PathJobDlg.py
@@ -183,7 +183,20 @@ class JobTemplateExport:
def __init__(self, job, parent=None):
self.job = job
self.dialog = FreeCADGui.PySideUic.loadUi(":/panels/DlgJobTemplateExport.ui")
+ if parent:
+ self.dialog.setParent(parent)
+ parent.layout().addWidget(self.dialog)
+ self.dialog.dialogButtonBox.hide()
+ else:
+ self.dialog.exportButtonBox.hide()
+ self.updateUI()
+ self.dialog.toolsGroup.clicked.connect(self.checkUncheckTools)
+ def exportButton(self):
+ return self.dialog.exportButton
+
+ def updateUI(self):
+ job = self.job
if job.PostProcessor:
ppHint = "%s %s %s" % (job.PostProcessor, job.PostProcessorArgs, job.PostProcessorOutputFile)
self.dialog.postProcessingHint.setText(ppHint)
@@ -210,20 +223,26 @@ class JobTemplateExport:
rapidChanged = not job.SetupSheet.Proxy.hasDefaultToolRapids()
depthsChanged = not job.SetupSheet.Proxy.hasDefaultOperationDepths()
heightsChanged = not job.SetupSheet.Proxy.hasDefaultOperationHeights()
- settingsChanged = rapidChanged or depthsChanged or heightsChanged
+ opsWithSettings = job.SetupSheet.Proxy.operationsWithSettings()
+ settingsChanged = rapidChanged or depthsChanged or heightsChanged or 0 != len(opsWithSettings)
self.dialog.settingsGroup.setChecked(settingsChanged)
self.dialog.settingToolRapid.setChecked(rapidChanged)
self.dialog.settingOperationDepths.setChecked(depthsChanged)
self.dialog.settingOperationHeights.setChecked(heightsChanged)
+ self.dialog.settingsOpsList.clear()
+ for op in opsWithSettings:
+ item = QtGui.QListWidgetItem(op)
+ item.setCheckState(QtCore.Qt.CheckState.Checked)
+ self.dialog.settingsOpsList.addItem(item)
+
+ self.dialog.toolsList.clear()
for tc in sorted(job.ToolController, key=lambda o: o.Label):
item = QtGui.QListWidgetItem(tc.Label)
item.setData(self.DataObject, tc)
item.setCheckState(QtCore.Qt.CheckState.Checked)
self.dialog.toolsList.addItem(item)
- self.dialog.toolsGroup.clicked.connect(self.checkUncheckTools)
-
def checkUncheckTools(self):
state = QtCore.Qt.CheckState.Checked if self.dialog.toolsGroup.isChecked() else QtCore.Qt.CheckState.Unchecked
for i in range(self.dialog.toolsList.count()):
@@ -256,6 +275,14 @@ class JobTemplateExport:
def includeSettingOperationDepths(self):
return self.dialog.settingOperationDepths.isChecked()
+ def includeSettingOpsSettings(self):
+ ops = []
+ for i in range(self.dialog.settingsOpsList.count()):
+ item = self.dialog.settingsOpsList.item(i)
+ if item.checkState() == QtCore.Qt.CheckState.Checked:
+ ops.append(item.text())
+ return ops
+
def exec_(self):
return self.dialog.exec_()
diff --git a/src/Mod/Path/PathScripts/PathJobGui.py b/src/Mod/Path/PathScripts/PathJobGui.py
index a2ca352c1e..c7df0d6265 100644
--- a/src/Mod/Path/PathScripts/PathJobGui.py
+++ b/src/Mod/Path/PathScripts/PathJobGui.py
@@ -27,6 +27,7 @@ import DraftVecUtils
import FreeCAD
import FreeCADGui
import PathScripts.PathJob as PathJob
+import PathScripts.PathJobCmd as PathJobCmd
import PathScripts.PathJobDlg as PathJobDlg
import PathScripts.PathGeom as PathGeom
import PathScripts.PathGui as PathGui
@@ -474,7 +475,7 @@ class TaskPanel:
self.obj = vobj.Object
self.deleteOnReject = deleteOnReject
self.form = FreeCADGui.PySideUic.loadUi(":/panels/PathEdit.ui")
- self.template = PathJobCmd.DlgJobTemplateExport(self.obj, self.form.jobBox.widget(1))
+ self.template = PathJobDlg.JobTemplateExport(self.obj, self.form.jobBox.widget(1))
vUnit = FreeCAD.Units.Quantity(1, FreeCAD.Units.Velocity).getUserPreferred()[2]
self.form.toolControllerList.horizontalHeaderItem(1).setText('#')
@@ -911,8 +912,6 @@ class TaskPanel:
PathLog.track(index, force)
if force or not self.stockFromBase:
self.stockFromBase = StockFromBaseBoundBoxEdit(self.obj, self.form, force)
- else:
- PathLog.error('wtf')
self.stockEdit = self.stockFromBase
def setupCreateBoxEdit():
PathLog.track(index, force)
@@ -963,7 +962,7 @@ class TaskPanel:
self.template.updateUI()
def refreshStock(self):
- self.updateStockEditor(self.form.stock.currentIndex())
+ self.updateStockEditor(self.form.stock.currentIndex(), True)
def alignCenterInStock(self):
bbs = self.obj.Stock.Shape.BoundBox
@@ -1065,6 +1064,8 @@ class TaskPanel:
self.template.updateUI()
def setupUi(self, activate):
+ self.setupGlobal.setupUi()
+ self.setupOps.setupUi()
self.updateStockEditor(-1, True)
self.setFields()
diff --git a/src/Mod/Path/PathScripts/PathStock.py b/src/Mod/Path/PathScripts/PathStock.py
index 9f1756c5b5..575132e91f 100644
--- a/src/Mod/Path/PathScripts/PathStock.py
+++ b/src/Mod/Path/PathScripts/PathStock.py
@@ -112,7 +112,7 @@ class StockFromBase(Stock):
obj.ExtZpos= 1.0
# placement is only tracked on creation
- bb = shapeBoundBox(base.Group)
+ bb = shapeBoundBox(base.Group) if base else None
if bb:
obj.Placement = FreeCAD.Placement(FreeCAD.Vector(bb.XMin, bb.YMin, bb.ZMin), FreeCAD.Rotation())
else:
@@ -225,9 +225,7 @@ def SetupStockObject(obj, stockType):
def CreateFromBase(job, neg=None, pos=None, placement=None):
PathLog.track(job.Label, neg, pos, placement)
- base = job.Model if job and hasattr(job, 'Model') else None
- if base:
- base.Shape.tessellate(0.1)
+ base = job.Model if job else None
obj = FreeCAD.ActiveDocument.addObject('Part::FeaturePython', 'Stock')
proxy = StockFromBase(obj, base)
@@ -250,9 +248,7 @@ def CreateFromBase(job, neg=None, pos=None, placement=None):
return obj
def CreateBox(job, extent=None, placement=None):
- base = job.Model.Group if job else None
- if base:
- base.Shape.tessellate(0.1)
+ base = job.Model if job else None
obj = FreeCAD.ActiveDocument.addObject('Part::FeaturePython', 'Stock')
proxy = StockCreateBox(obj)
@@ -261,24 +257,24 @@ def CreateBox(job, extent=None, placement=None):
obj.Width = extent.y
obj.Height = extent.z
elif base:
- bb = shapeBoundBox(base)
+ bb = shapeBoundBox(base.Group)
obj.Length = max(bb.XLength, 1)
obj.Width = max(bb.YLength, 1)
obj.Height = max(bb.ZLength, 1)
+
if placement:
obj.Placement = placement
elif base:
- bb = shapeBoundBox(base)
+ bb = shapeBoundBox(base.Group)
origin = FreeCAD.Vector(bb.XMin, bb.YMin, bb.ZMin)
obj.Placement = FreeCAD.Placement(origin, FreeCAD.Vector(), 0)
+
SetupStockObject(obj, StockType.CreateBox)
return obj
def CreateCylinder(job, radius=None, height=None, placement=None):
- base = job.Model.Group if job else None
+ base = job.Model if job else None
obj = FreeCAD.ActiveDocument.addObject('Part::FeaturePython', 'Stock')
- if base:
- base.Shape.tessellate(0.1) obj = FreeCAD.ActiveDocument.addObject('Part::FeaturePython', 'Stock')
proxy = StockCreateCylinder(obj)
if radius:
@@ -287,14 +283,14 @@ def CreateCylinder(job, radius=None, height=None, placement=None):
if height:
obj.Height = height
elif base:
- bb = shapeBoundBox(base)
+ bb = shapeBoundBox(base.Group)
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)
+ bb = shapeBoundBox(base.Group)
origin = FreeCAD.Vector((bb.XMin + bb.XMax)/2, (bb.YMin + bb.YMax)/2, bb.ZMin)
obj.Placement = FreeCAD.Placement(origin, FreeCAD.Vector(), 0)