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)