Skip to content

Commit

Permalink
added attribute to Toolbit for spindlepower
Browse files Browse the repository at this point in the history
setting this to false will suppress M3 commands.
User can configure a toolbit to never have the spindle turn on
this is to prevent accidental powering of the spindle with
unpowered tools like dragknife and probe
  • Loading branch information
sliptonic committed Nov 16, 2020
1 parent 88a2447 commit 234b88c
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 27 deletions.
10 changes: 6 additions & 4 deletions src/Mod/Path/PathScripts/PathToolBit.py
Expand Up @@ -42,8 +42,8 @@
__url__ = "https://www.freecadweb.org"
__doc__ = "Class to deal with and represent a tool bit."

# PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
# PathLog.trackModule()
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
PathLog.trackModule()


def translate(context, text, disambig=None):
Expand Down Expand Up @@ -363,6 +363,7 @@ def templateAttrs(self, obj):


def Declaration(path):
print(path)
with open(path, 'r') as fp:
return json.load(fp)

Expand All @@ -388,12 +389,13 @@ def __init__(self):
self.addProperty('App::PropertyMap', 'UserAttributes',
PropertyGroupAttribute, translate('PathToolBit',
'User Defined Values'))

self.addProperty('App::PropertyBool', 'SpindlePower',
PropertyGroupAttribute, translate('PathToolBit',
'Whether Spindle Power should be allowed'))

class ToolBitFactory(object):

def CreateFromAttrs(self, attrs, name='ToolBit'):
# pylint: disable=protected-access
obj = Factory.Create(name, attrs['shape'])
obj.Label = attrs['name']
params = attrs['parameter']
Expand Down
16 changes: 9 additions & 7 deletions src/Mod/Path/PathScripts/PathToolBitEdit.py
Expand Up @@ -169,14 +169,16 @@ def accept(self):

# get the attributes
for i, name in enumerate(self.props):
print('in accept: {}'.format(name))
prop = self.proto.getProperty(name)
enabled = self.model.item(i, 0).checkState() == QtCore.Qt.Checked
if enabled and not prop.getValue() is None:
prop.setupProperty(self.tool, name,
PathToolBit.PropertyGroupAttribute,
prop.getValue())
elif hasattr(self.tool, name):
self.tool.removeProperty(name)
if self.model.item(i, 0) is not None:
enabled = self.model.item(i, 0).checkState() == QtCore.Qt.Checked
if enabled and not prop.getValue() is None:
prop.setupProperty(self.tool, name,
PathToolBit.PropertyGroupAttribute,
prop.getValue())
elif hasattr(self.tool, name):
self.tool.removeProperty(name)

def reject(self):
PathLog.track()
Expand Down
66 changes: 50 additions & 16 deletions src/Mod/Path/PathScripts/PathToolController.py
Expand Up @@ -30,16 +30,17 @@

from PySide import QtCore

#PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
#PathLog.trackModule(PathLog.thisModule())
# PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
# PathLog.trackModule(PathLog.thisModule())


# Qt translation handling
def translate(context, text, disambig=None):
return QtCore.QCoreApplication.translate(context, text, disambig)


class ToolControllerTemplate:
'''Attribute and sub element strings for template export/import.'''
# pylint: disable=no-init

Expressions = 'xengine'
ExprExpr = 'expr'
Expand All @@ -56,21 +57,36 @@ class ToolControllerTemplate:
VertFeed = 'vfeed'
VertRapid = 'vrapid'


class ToolController:

def __init__(self, obj, cTool=False):
PathLog.track('tool: {}'.format(cTool))

obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", QtCore.QT_TRANSLATE_NOOP("PathToolController", "The active tool"))
obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber",
"Tool", QtCore.QT_TRANSLATE_NOOP("PathToolController",
"The active tool"))
obj.ToolNumber = (0, 0, 10000, 1)
self.ensureUseLegacyTool(obj, cTool)
obj.addProperty("App::PropertyFloat", "SpindleSpeed", "Tool", QtCore.QT_TRANSLATE_NOOP("PathToolController", "The speed of the cutting spindle in RPM"))
obj.addProperty("App::PropertyEnumeration", "SpindleDir", "Tool", QtCore.QT_TRANSLATE_NOOP("PathToolController", "Direction of spindle rotation"))
obj.addProperty("App::PropertyFloat", "SpindleSpeed", "Tool",
QtCore.QT_TRANSLATE_NOOP("PathToolController",
"The speed of the cutting spindle in RPM"))
obj.addProperty("App::PropertyEnumeration", "SpindleDir", "Tool",
QtCore.QT_TRANSLATE_NOOP("PathToolController",
"Direction of spindle rotation"))
obj.SpindleDir = ['Forward', 'Reverse']
obj.addProperty("App::PropertySpeed", "VertFeed", "Feed", QtCore.QT_TRANSLATE_NOOP("PathToolController", "Feed rate for vertical moves in Z"))
obj.addProperty("App::PropertySpeed", "HorizFeed", "Feed", QtCore.QT_TRANSLATE_NOOP("PathToolController", "Feed rate for horizontal moves"))
obj.addProperty("App::PropertySpeed", "VertRapid", "Rapid", QtCore.QT_TRANSLATE_NOOP("PathToolController", "Rapid rate for vertical moves in Z"))
obj.addProperty("App::PropertySpeed", "HorizRapid", "Rapid", QtCore.QT_TRANSLATE_NOOP("PathToolController", "Rapid rate for horizontal moves"))
obj.addProperty("App::PropertySpeed", "VertFeed", "Feed",
QtCore.QT_TRANSLATE_NOOP("PathToolController",
"Feed rate for vertical moves in Z"))
obj.addProperty("App::PropertySpeed", "HorizFeed", "Feed",
QtCore.QT_TRANSLATE_NOOP("PathToolController",
"Feed rate for horizontal moves"))
obj.addProperty("App::PropertySpeed", "VertRapid", "Rapid",
QtCore.QT_TRANSLATE_NOOP("PathToolController",
"Rapid rate for vertical moves in Z"))
obj.addProperty("App::PropertySpeed", "HorizRapid", "Rapid",
QtCore.QT_TRANSLATE_NOOP("PathToolController",
"Rapid rate for horizontal moves"))
obj.setEditorMode('Placement', 2)

def onDocumentRestored(self, obj):
Expand All @@ -85,7 +101,10 @@ def onDelete(self, obj, arg2=None):
obj.Document.removeObject(obj.Tool.Name)

def setFromTemplate(self, obj, template):
'''setFromTemplate(obj, xmlItem) ... extract properties from xmlItem and assign to receiver.'''
'''
setFromTemplate(obj, xmlItem) ... extract properties from xmlItem
and assign to receiver.
'''
PathLog.track(obj.Name, template)
version = 0
if template.get(ToolControllerTemplate.Version):
Expand Down Expand Up @@ -158,10 +177,22 @@ def execute(self, obj):
commands += "(" + obj.Label + ")"+'\n'
commands += 'M6 T'+str(obj.ToolNumber)+'\n'

if obj.SpindleDir == 'Forward':
commands += 'M3 S' + str(obj.SpindleSpeed) + '\n'
else:
commands += 'M4 S' + str(obj.SpindleSpeed) + '\n'

# If a toolbit is used, check to see if spindlepower is allowed.
# This is to prevent accidentally spinning the spindle with an
# unpowered tool like probe or dragknife

allowSpindlePower = True
if (not isinstance(obj.Tool, Path.Tool) and
hasattr(obj.Tool, "SpindlePower")):
allowSpindlePower = obj.Tool.SpindlePower

if allowSpindlePower:
PathLog.debug('selected tool preventing spindle power')
if obj.SpindleDir == 'Forward':
commands += 'M3 S' + str(obj.SpindleSpeed) + '\n'
else:
commands += 'M4 S' + str(obj.SpindleSpeed) + '\n'

if commands == "":
commands += "(No commands processed)"
Expand Down Expand Up @@ -195,7 +226,8 @@ def ensureUseLegacyTool(self, obj, legacy):
else:
obj.addProperty("App::PropertyLink", "Tool", "Base", QtCore.QT_TRANSLATE_NOOP("PathToolController", "The tool used by this controller"))

def Create(name = 'Default Tool', tool=None, toolNumber=1, assignViewProvider=True):

def Create(name='Default Tool', tool=None, toolNumber=1, assignViewProvider=True):
legacyTool = PathPreferences.toolsReallyUseLegacyTools() if tool is None else isinstance(tool, Path.Tool)

PathLog.track(tool, toolNumber, legacyTool)
Expand Down Expand Up @@ -224,6 +256,7 @@ def Create(name = 'Default Tool', tool=None, toolNumber=1, assignViewProvider=Tr
obj.ToolNumber = toolNumber
return obj


def FromTemplate(template, assignViewProvider=True):
# pylint: disable=unused-argument
PathLog.track()
Expand All @@ -234,6 +267,7 @@ def FromTemplate(template, assignViewProvider=True):

return obj


if FreeCAD.GuiUp:
# need ViewProvider class in this file to support loading of old files
from PathScripts.PathToolControllerGui import ViewProvider
Expand Down

0 comments on commit 234b88c

Please sign in to comment.