From 0c13ef45ed60457bc5e021ddeeda866f78fdf9ad Mon Sep 17 00:00:00 2001 From: kreso-t Date: Tue, 28 Aug 2018 22:30:02 +0200 Subject: [PATCH] Path: Adaptive - added stock to leave option --- src/Mod/Path/PathScripts/PathAdaptive.py | 15 +++++++++------ src/Mod/Path/PathScripts/PathAdaptiveGui.py | 16 +++++++++++++++- src/Mod/Path/libarea/Adaptive.cpp | 5 +++++ src/Mod/Path/libarea/Adaptive.hpp | 1 + src/Mod/Path/libarea/PythonStuff.cpp | 1 + src/Mod/Path/libarea/pyarea.cpp | 1 + 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathAdaptive.py b/src/Mod/Path/PathScripts/PathAdaptive.py index 496e657dd6..0712608ee4 100644 --- a/src/Mod/Path/PathScripts/PathAdaptive.py +++ b/src/Mod/Path/PathScripts/PathAdaptive.py @@ -280,15 +280,15 @@ def Execute(op,obj): path2d = convertTo2d(pathArray) # put here all properties that influence calculation of adaptive base paths, inputStateObject = { - "tool": op.tool.Diameter, - "tolerance": obj.Tolerance, + "tool": float(op.tool.Diameter), + "tolerance": float(obj.Tolerance), "geometry" : path2d, - "stepover" :obj.StepOver, - "effectiveHelixDiameter": helixDiameter, + "stepover" : float(obj.StepOver), + "effectiveHelixDiameter": float(helixDiameter), "operationType": obj.OperationType, "side": obj.Side, - "processHoles": obj.ProcessHoles - + "processHoles": obj.ProcessHoles, + "stockToLeave": float(obj.StockToLeave) } inputStateChanged=False @@ -315,6 +315,7 @@ def Execute(op,obj): a2d.stepOverFactor = 0.01*obj.StepOver a2d.toolDiameter = op.tool.Diameter a2d.helixRampDiameter = helixDiameter + a2d.stockToLeave = obj.StockToLeave a2d.tolerance = obj.Tolerance a2d.opType = opType a2d.polyTreeNestingLimit = nestingLimit @@ -366,6 +367,7 @@ class PathAdaptive(PathOp.ObjectOp): obj.addProperty("App::PropertyFloat", "Tolerance", "Adaptive", "Influences accuracy and performance") obj.addProperty("App::PropertyPercent", "StepOver", "Adaptive", "Percent of cutter diameter to step over on each pass") obj.addProperty("App::PropertyDistance", "LiftDistance", "Adaptive", "Lift distance for rapid moves") + obj.addProperty("App::PropertyDistance", "StockToLeave", "Adaptive", "How much stock to leave (i.e. for finishing operation)") obj.addProperty("App::PropertyBool", "ProcessHoles", "Adaptive","Process holes as well as the face outline") obj.addProperty("App::PropertyBool", "Stopped", "Adaptive", "Stop processing") @@ -398,6 +400,7 @@ class PathAdaptive(PathOp.ObjectOp): obj.HelixDiameterLimit = 0.0 obj.AdaptiveInputState ="" obj.AdaptiveOutputState = "" + obj.StockToLeave= 0 def opExecute(self, obj): '''opExecute(obj) ... called whenever the receiver needs to be recalculated. diff --git a/src/Mod/Path/PathScripts/PathAdaptiveGui.py b/src/Mod/Path/PathScripts/PathAdaptiveGui.py index c770db291c..6c89768213 100644 --- a/src/Mod/Path/PathScripts/PathAdaptiveGui.py +++ b/src/Mod/Path/PathScripts/PathAdaptiveGui.py @@ -71,7 +71,7 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): form.HelixDiameterLimit.setMaximum(90) form.HelixDiameterLimit.setSingleStep(0.1) form.HelixDiameterLimit.setValue(0) - form.HelixDiameterLimit.setToolTip("If non zero it limits the size helix diameter, otherwise the tool radius is taken as the helix diameter") + form.HelixDiameterLimit.setToolTip("If non zero it limits the size helix diameter, otherwise the tool diameter is taken") formLayout.addRow(QtGui.QLabel("Helix Max Diameter"),form.HelixDiameterLimit) #lift distance @@ -83,6 +83,15 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): form.LiftDistance.setToolTip("How much to lift the tool up during the rapid repositioning moves (used when no obstacles)") formLayout.addRow(QtGui.QLabel("Lift Distance"),form.LiftDistance) + #stock to leave + form.StockToLeave = QtGui.QDoubleSpinBox() + form.StockToLeave.setMinimum(0.0) + form.StockToLeave.setMaximum(1000) + form.StockToLeave.setSingleStep(0.1) + form.StockToLeave.setValue(0) + form.StockToLeave.setToolTip("How much material to leave (i.e. for finishing operation)") + formLayout.addRow(QtGui.QLabel("Stock to Leave"),form.StockToLeave) + #process holes form.ProcessHoles = QtGui.QCheckBox() form.ProcessHoles.setChecked(True) @@ -110,6 +119,7 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): signals.append(self.form.HelixAngle.valueChanged) signals.append(self.form.HelixDiameterLimit.valueChanged) signals.append(self.form.LiftDistance.valueChanged) + signals.append(self.form.StockToLeave.valueChanged) signals.append(self.form.ProcessHoles.stateChanged) signals.append(self.form.StopButton.toggled) @@ -123,6 +133,8 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): self.form.HelixAngle.setValue(obj.HelixAngle) self.form.HelixDiameterLimit.setValue(obj.HelixDiameterLimit) self.form.LiftDistance.setValue(obj.LiftDistance) + if hasattr(obj, 'StockToLeave'): + self.form.StockToLeave.setValue(obj.StockToLeave) self.form.ProcessHoles.setChecked(obj.ProcessHoles) self.setupToolController(obj, self.form.ToolController) @@ -144,6 +156,8 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): obj.HelixAngle = self.form.HelixAngle.value() obj.HelixDiameterLimit = self.form.HelixDiameterLimit.value() obj.LiftDistance = self.form.LiftDistance.value() + if hasattr(obj, 'StockToLeave'): + obj.StockToLeave = self.form.StockToLeave.value() obj.ProcessHoles = self.form.ProcessHoles.isChecked() obj.Stopped = self.form.StopButton.isChecked() diff --git a/src/Mod/Path/libarea/Adaptive.cpp b/src/Mod/Path/libarea/Adaptive.cpp index 48864a9abd..427ef98f88 100644 --- a/src/Mod/Path/libarea/Adaptive.cpp +++ b/src/Mod/Path/libarea/Adaptive.cpp @@ -854,7 +854,12 @@ namespace AdaptivePath { inputPaths.push_back(cpth); } SimplifyPolygons(inputPaths); + if(fabs(stockToLeave)>NTOL) { + clipof.Clear(); + clipof.AddPaths(inputPaths,JoinType::jtRound,EndType::etClosedPolygon); + clipof.Execute(inputPaths,-stockToLeave*scaleFactor); + } // ******************************* // Resolve hierarchy and run processing // ******************************** diff --git a/src/Mod/Path/libarea/Adaptive.hpp b/src/Mod/Path/libarea/Adaptive.hpp index 266edb07ac..7b37ee6b07 100644 --- a/src/Mod/Path/libarea/Adaptive.hpp +++ b/src/Mod/Path/libarea/Adaptive.hpp @@ -60,6 +60,7 @@ namespace AdaptivePath { double stepOverFactor = 0.2; int polyTreeNestingLimit=0; double tolerance=0.1; + double stockToLeave=0; OperationType opType = OperationType::otClearing; std::list Execute(const DPaths &paths, std::function progressCallbackFn); diff --git a/src/Mod/Path/libarea/PythonStuff.cpp b/src/Mod/Path/libarea/PythonStuff.cpp index d98efe9b99..ae2ea6fe4d 100644 --- a/src/Mod/Path/libarea/PythonStuff.cpp +++ b/src/Mod/Path/libarea/PythonStuff.cpp @@ -511,6 +511,7 @@ BOOST_PYTHON_MODULE(area) { .def("Execute",&AdaptiveExecute) .def_readwrite("stepOverFactor", &Adaptive2d::stepOverFactor) .def_readwrite("toolDiameter", &Adaptive2d::toolDiameter) + .def_readwrite("stockToLeave", &Adaptive2d::stockToLeave) .def_readwrite("helixRampDiameter", &Adaptive2d::helixRampDiameter) .def_readwrite("polyTreeNestingLimit", &Adaptive2d::polyTreeNestingLimit) .def_readwrite("tolerance", &Adaptive2d::tolerance) diff --git a/src/Mod/Path/libarea/pyarea.cpp b/src/Mod/Path/libarea/pyarea.cpp index 95770b46e3..45bb30b0e4 100644 --- a/src/Mod/Path/libarea/pyarea.cpp +++ b/src/Mod/Path/libarea/pyarea.cpp @@ -385,6 +385,7 @@ void init_pyarea(py::module &m){ .def("Execute",&Adaptive2d::Execute) .def_readwrite("stepOverFactor", &Adaptive2d::stepOverFactor) .def_readwrite("toolDiameter", &Adaptive2d::toolDiameter) + .def_readwrite("stockToLeave", &Adaptive2d::stockToLeave) .def_readwrite("helixRampDiameter", &Adaptive2d::helixRampDiameter) .def_readwrite("polyTreeNestingLimit", &Adaptive2d::polyTreeNestingLimit) .def_readwrite("tolerance", &Adaptive2d::tolerance)