From aa2881e08e3325f27baffaa169be5248ed13f7df Mon Sep 17 00:00:00 2001 From: markus Date: Fri, 13 Nov 2020 16:27:08 -0800 Subject: [PATCH] Use new ToolBits (and only those) for thread milling. --- src/Mod/Path/CMakeLists.txt | 1 + .../panels/PageOpThreadMillingEdit.ui | 33 ++------------ src/Mod/Path/PathScripts/PathThreadMilling.py | 42 +++++++++++------- .../Path/PathScripts/PathThreadMillingGui.py | 4 +- src/Mod/Path/Tools/Shape/thread-mill.fcstd | Bin 0 -> 16361 bytes 5 files changed, 33 insertions(+), 47 deletions(-) create mode 100644 src/Mod/Path/Tools/Shape/thread-mill.fcstd diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index 6c9d692156..bcfa177d88 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -176,6 +176,7 @@ SET(Tools_Shape_SRCS Tools/Shape/endmill.fcstd Tools/Shape/probe.fcstd Tools/Shape/slittingsaw.fcstd + Tools/Shape/thread-mill.fcstd Tools/Shape/v-bit.fcstd ) diff --git a/src/Mod/Path/Gui/Resources/panels/PageOpThreadMillingEdit.ui b/src/Mod/Path/Gui/Resources/panels/PageOpThreadMillingEdit.ui index f67744b714..8de86b656a 100644 --- a/src/Mod/Path/Gui/Resources/panels/PageOpThreadMillingEdit.ui +++ b/src/Mod/Path/Gui/Resources/panels/PageOpThreadMillingEdit.ui @@ -6,7 +6,7 @@ 0 0 - 482 + 318 756 @@ -157,37 +157,10 @@ Tool Controller - - - - - Tool - - - - + + - - - - false - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - false - - - Crest - - - diff --git a/src/Mod/Path/PathScripts/PathThreadMilling.py b/src/Mod/Path/PathScripts/PathThreadMilling.py index 2804de0daf..3005e7d326 100644 --- a/src/Mod/Path/PathScripts/PathThreadMilling.py +++ b/src/Mod/Path/PathScripts/PathThreadMilling.py @@ -40,8 +40,8 @@ __author__ = "sliptonic (Brad Collette)" __url__ = "http://www.freecadweb.org" __doc__ = "Path thread milling operation." -PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) -PathLog.trackModule(PathLog.thisModule()) +PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) +#PathLog.trackModule(PathLog.thisModule()) # Qt translation handling def translate(context, text, disambig=None): @@ -196,6 +196,12 @@ class ObjectThreadMilling(PathCircularHoleBase.ObjectOp): obj.addProperty("App::PropertyLink", "ClearanceOp", "Operation", QtCore.QT_TRANSLATE_NOOP("PathThreadMilling", "Operation to clear the inside of the thread")) obj.Direction = self.Directions + # Rotation related properties + if not hasattr(obj, 'EnableRotation'): + obj.addProperty("App::PropertyEnumeration", "EnableRotation", "Rotation", QtCore.QT_TRANSLATE_NOOP("App::Property", "Enable rotation to gain access to pockets/areas not normal to Z axis.")) + obj.EnableRotation = ['Off', 'A(x)', 'B(y)', 'A & B'] + + def threadStartDepth(self, obj): if obj.ThreadOrientation == self.RightHand: if obj.Direction == self.DirectionClimb: @@ -264,7 +270,7 @@ class ObjectThreadMilling(PathCircularHoleBase.ObjectOp): self.commandlist.append(Path.Command('G0', {'Z': obj.ClearanceHeight.Value, 'F': self.vertRapid})) - for radius in threadPasses(obj.Passes, radiiInternal, obj.MajorDiameter.Value, obj.MinorDiameter.Value, self.tool.Diameter, 0): + for radius in threadPasses(obj.Passes, radiiInternal, obj.MajorDiameter.Value, obj.MinorDiameter.Value, float(self.tool.Diameter), float(self.tool.Crest)): commands = internalThreadCommands(loc, gcode, zStart, zFinal, pitch, radius, obj.LeadInOut) for cmd in commands: p = cmd.Parameters @@ -279,20 +285,22 @@ class ObjectThreadMilling(PathCircularHoleBase.ObjectOp): def circularHoleExecute(self, obj, holes): PathLog.track() + if self.isToolSupported(obj, self.tool): + self.commandlist.append(Path.Command("(Begin Thread Milling)")) - self.commandlist.append(Path.Command("(Begin Thread Milling)")) + (cmd, zStart, zFinal) = self.threadSetup(obj) + pitch = obj.Pitch.Value + if obj.TPI > 0: + pitch = 25.4 / obj.TPI + if pitch <= 0: + PathLog.error("Cannot create thread with pitch {}".format(pitch)) + return - (cmd, zStart, zFinal) = self.threadSetup(obj) - pitch = obj.Pitch.Value - if obj.TPI > 0: - pitch = 25.4 / obj.TPI - if pitch <= 0: - PathLog.error("Cannot create thread with pitch {}".format(pitch)) - return - - # rapid to clearance height - for loc in holes: - self.executeThreadMill(obj, FreeCAD.Vector(loc['x'], loc['y'], 0), cmd, zStart, zFinal, pitch) + # rapid to clearance height + for loc in holes: + self.executeThreadMill(obj, FreeCAD.Vector(loc['x'], loc['y'], 0), cmd, zStart, zFinal, pitch) + else: + PathLog.error("No suitable Tool found for thread milling operation") def opSetDefaultValues(self, obj, job): @@ -305,6 +313,10 @@ class ObjectThreadMilling(PathCircularHoleBase.ObjectOp): obj.Direction = self.DirectionClimb obj.LeadInOut = True + def isToolSupported(self, obj, tool): + '''Thread milling only supports thread milling cutters.''' + return hasattr(tool, 'Diameter') and hasattr(tool, 'Crest') + def SetupProperties(): setup = [] diff --git a/src/Mod/Path/PathScripts/PathThreadMillingGui.py b/src/Mod/Path/PathScripts/PathThreadMillingGui.py index 9a3e55930e..61eecbeec7 100644 --- a/src/Mod/Path/PathScripts/PathThreadMillingGui.py +++ b/src/Mod/Path/PathScripts/PathThreadMillingGui.py @@ -38,8 +38,8 @@ __author__ = "sliptonic (Brad Collette)" __url__ = "http://www.freecadweb.org" __doc__ = "UI and Command for Path Thread Milling Operation." -PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) -PathLog.trackModule(PathLog.thisModule()) +PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) +#PathLog.trackModule(PathLog.thisModule()) def setupCombo(combo, selections): combo.clear() diff --git a/src/Mod/Path/Tools/Shape/thread-mill.fcstd b/src/Mod/Path/Tools/Shape/thread-mill.fcstd new file mode 100644 index 0000000000000000000000000000000000000000..ba9294fe6f6d7d5b07576577344fca86e42257f9 GIT binary patch literal 16361 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 literal 0 HcmV?d00001