Old toollibrary black
This commit is contained in:
@@ -35,11 +35,13 @@ import xml.sax
|
||||
from PySide import QtCore, QtGui
|
||||
|
||||
PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule())
|
||||
#PathLog.trackModule(PathLog.thisModule())
|
||||
# PathLog.trackModule(PathLog.thisModule())
|
||||
|
||||
|
||||
def translate(context, text, disambig=None):
|
||||
return QtCore.QCoreApplication.translate(context, text, disambig)
|
||||
|
||||
|
||||
# Tooltable XML readers
|
||||
class FreeCADTooltableHandler(xml.sax.ContentHandler):
|
||||
# http://www.tutorialspoint.com/python/python_xml_processing.htm
|
||||
@@ -62,7 +64,7 @@ class FreeCADTooltableHandler(xml.sax.ContentHandler):
|
||||
self.tool.ToolType = str(attrs["type"])
|
||||
self.tool.Material = str(attrs["mat"])
|
||||
# for some reason without the following line I get an error
|
||||
#print attrs["diameter"]
|
||||
# print attrs["diameter"]
|
||||
self.tool.Diameter = float(attrs["diameter"])
|
||||
self.tool.LengthOffset = float(attrs["length"])
|
||||
self.tool.FlatRadius = float(attrs["flat"])
|
||||
@@ -80,7 +82,6 @@ class FreeCADTooltableHandler(xml.sax.ContentHandler):
|
||||
|
||||
|
||||
class HeeksTooltableHandler(xml.sax.ContentHandler):
|
||||
|
||||
def __init__(self):
|
||||
xml.sax.ContentHandler.__init__(self)
|
||||
self.tooltable = Path.Tooltable()
|
||||
@@ -115,15 +116,13 @@ class HeeksTooltableHandler(xml.sax.ContentHandler):
|
||||
elif m == "1":
|
||||
self.tool.Material = "Carbide"
|
||||
# for some reason without the following line I get an error
|
||||
#print attrs["diameter"]
|
||||
# print attrs["diameter"]
|
||||
self.tool.Diameter = float(attrs["diameter"])
|
||||
self.tool.LengthOffset = float(attrs["tool_length_offset"])
|
||||
self.tool.FlatRadius = float(attrs["flat_radius"])
|
||||
self.tool.CornerRadius = float(attrs["corner_radius"])
|
||||
self.tool.CuttingEdgeAngle = float(
|
||||
attrs["cutting_edge_angle"])
|
||||
self.tool.CuttingEdgeHeight = float(
|
||||
attrs["cutting_edge_height"])
|
||||
self.tool.CuttingEdgeAngle = float(attrs["cutting_edge_angle"])
|
||||
self.tool.CuttingEdgeHeight = float(attrs["cutting_edge_height"])
|
||||
|
||||
# Call when an elements ends
|
||||
def endElement(self, name):
|
||||
@@ -134,17 +133,21 @@ class HeeksTooltableHandler(xml.sax.ContentHandler):
|
||||
self.tool = None
|
||||
|
||||
|
||||
class ToolLibraryManager():
|
||||
'''
|
||||
class ToolLibraryManager:
|
||||
"""
|
||||
The Tool Library is a list of individual tool tables. Each
|
||||
Tool Table can contain n tools. The tool library will be persisted to user
|
||||
preferences and all or part of the library can be exported to other formats
|
||||
'''
|
||||
"""
|
||||
|
||||
TooltableTypeJSON = translate("PathToolLibraryManager", "Tooltable JSON (*.json)")
|
||||
TooltableTypeXML = translate("PathToolLibraryManager", "Tooltable XML (*.xml)")
|
||||
TooltableTypeHeekscad = translate("PathToolLibraryManager", "HeeksCAD tooltable (*.tooltable)")
|
||||
TooltableTypeLinuxCNC = translate("PathToolLibraryManager", "LinuxCNC tooltable (*.tbl)")
|
||||
TooltableTypeJSON = translate("PathToolLibraryManager", "Tooltable JSON (*.json)")
|
||||
TooltableTypeXML = translate("PathToolLibraryManager", "Tooltable XML (*.xml)")
|
||||
TooltableTypeHeekscad = translate(
|
||||
"PathToolLibraryManager", "HeeksCAD tooltable (*.tooltable)"
|
||||
)
|
||||
TooltableTypeLinuxCNC = translate(
|
||||
"PathToolLibraryManager", "LinuxCNC tooltable (*.tbl)"
|
||||
)
|
||||
|
||||
PreferenceMainLibraryXML = "ToolLibrary"
|
||||
PreferenceMainLibraryJSON = "ToolLibrary-Main"
|
||||
@@ -156,38 +159,40 @@ class ToolLibraryManager():
|
||||
self.loadToolTables()
|
||||
|
||||
def getToolTables(self):
|
||||
''' Return tool table list '''
|
||||
"""Return tool table list"""
|
||||
return self.toolTables
|
||||
|
||||
def getCurrentTableName(self):
|
||||
''' return the name of the currently loaded tool table '''
|
||||
"""return the name of the currently loaded tool table"""
|
||||
return self.currentTableName
|
||||
|
||||
def getCurrentTable(self):
|
||||
''' returns an object of the current tool table '''
|
||||
"""returns an object of the current tool table"""
|
||||
return self.getTableFromName(self.currentTableName)
|
||||
|
||||
def getTableFromName(self, name):
|
||||
''' get the tool table object from the name '''
|
||||
"""get the tool table object from the name"""
|
||||
for table in self.toolTables:
|
||||
if table.Name == name:
|
||||
return table
|
||||
|
||||
def getNextToolTableName(self, tableName='Tool Table'):
|
||||
''' get a unique name for a new tool table '''
|
||||
def getNextToolTableName(self, tableName="Tool Table"):
|
||||
"""get a unique name for a new tool table"""
|
||||
iter = 1
|
||||
tempName = tableName[-2:]
|
||||
|
||||
if tempName[0] == '-' and tempName[-1].isdigit():
|
||||
if tempName[0] == "-" and tempName[-1].isdigit():
|
||||
tableName = tableName[:-2]
|
||||
|
||||
while any(table.Name == tableName + '-' + str(iter) for table in self.toolTables):
|
||||
while any(
|
||||
table.Name == tableName + "-" + str(iter) for table in self.toolTables
|
||||
):
|
||||
iter += 1
|
||||
|
||||
return tableName + '-' + str(iter)
|
||||
return tableName + "-" + str(iter)
|
||||
|
||||
def addNewToolTable(self):
|
||||
''' creates a new tool table '''
|
||||
"""creates a new tool table"""
|
||||
tt = Path.Tooltable()
|
||||
tt.Version = 1
|
||||
name = self.getNextToolTableName()
|
||||
@@ -197,20 +202,27 @@ class ToolLibraryManager():
|
||||
return name
|
||||
|
||||
def deleteToolTable(self):
|
||||
''' deletes the selected tool table '''
|
||||
"""deletes the selected tool table"""
|
||||
if len(self.toolTables):
|
||||
index = next((index for (index, d) in enumerate(self.toolTables) if d.Name == self.currentTableName), None)
|
||||
index = next(
|
||||
(
|
||||
index
|
||||
for (index, d) in enumerate(self.toolTables)
|
||||
if d.Name == self.currentTableName
|
||||
),
|
||||
None,
|
||||
)
|
||||
self.toolTables.pop(index)
|
||||
self.saveMainLibrary()
|
||||
|
||||
def renameToolTable(self, newName, index):
|
||||
''' renames a tool table with the new name'''
|
||||
"""renames a tool table with the new name"""
|
||||
currentTableName = self.toolTables[index].Name
|
||||
if newName == currentTableName:
|
||||
PathLog.error(translate('PathToolLibraryManager', "Tool Table Same Name"))
|
||||
PathLog.error(translate("PathToolLibraryManager", "Tool Table Same Name"))
|
||||
return False
|
||||
if newName in self.toolTables:
|
||||
PathLog.error(translate('PathToolLibraryManager', "Tool Table Name Exists"))
|
||||
PathLog.error(translate("PathToolLibraryManager", "Tool Table Name Exists"))
|
||||
return False
|
||||
tt = self.getTableFromName(currentTableName)
|
||||
if tt:
|
||||
@@ -218,67 +230,74 @@ class ToolLibraryManager():
|
||||
self.saveMainLibrary()
|
||||
return True
|
||||
|
||||
|
||||
def templateAttrs(self):
|
||||
''' gets the tool table arributes '''
|
||||
"""gets the tool table arributes"""
|
||||
toolTables = []
|
||||
for tt in self.toolTables:
|
||||
tableData = {}
|
||||
tableData['Version'] = 1
|
||||
tableData['TableName'] = tt.Name
|
||||
tableData["Version"] = 1
|
||||
tableData["TableName"] = tt.Name
|
||||
|
||||
toolData = {}
|
||||
for tool in tt.Tools:
|
||||
toolData[tool] = tt.Tools[tool].templateAttrs()
|
||||
|
||||
tableData['Tools'] = toolData
|
||||
tableData["Tools"] = toolData
|
||||
toolTables.append(tableData)
|
||||
|
||||
return toolTables
|
||||
|
||||
def tooltableFromAttrs(self, stringattrs):
|
||||
if stringattrs.get('Version') and 1 == int(stringattrs['Version']):
|
||||
if stringattrs.get("Version") and 1 == int(stringattrs["Version"]):
|
||||
|
||||
tt = Path.Tooltable()
|
||||
tt.Version = 1
|
||||
tt.Name = self.getNextToolTableName()
|
||||
|
||||
if stringattrs.get('Version'):
|
||||
tt.Version = stringattrs.get('Version')
|
||||
if stringattrs.get("Version"):
|
||||
tt.Version = stringattrs.get("Version")
|
||||
|
||||
if stringattrs.get('TableName'):
|
||||
tt.Name = stringattrs.get('TableName')
|
||||
if stringattrs.get("TableName"):
|
||||
tt.Name = stringattrs.get("TableName")
|
||||
if any(table.Name == tt.Name for table in self.toolTables):
|
||||
tt.Name = self.getNextToolTableName(tt.Name)
|
||||
|
||||
for key, attrs in PathUtil.keyValueIter(stringattrs['Tools']):
|
||||
tool = Path.Tool()
|
||||
tool.Name = str(attrs["name"])
|
||||
tool.ToolType = str(attrs["tooltype"])
|
||||
tool.Material = str(attrs["material"])
|
||||
tool.Diameter = float(attrs["diameter"])
|
||||
tool.LengthOffset = float(attrs["lengthOffset"])
|
||||
tool.FlatRadius = float(attrs["flatRadius"])
|
||||
tool.CornerRadius = float(attrs["cornerRadius"])
|
||||
tool.CuttingEdgeAngle = float(attrs["cuttingEdgeAngle"])
|
||||
tool.CuttingEdgeHeight = float(attrs["cuttingEdgeHeight"])
|
||||
tt.setTool(int(key), tool)
|
||||
for key, attrs in PathUtil.keyValueIter(stringattrs["Tools"]):
|
||||
tool = Path.Tool()
|
||||
tool.Name = str(attrs["name"])
|
||||
tool.ToolType = str(attrs["tooltype"])
|
||||
tool.Material = str(attrs["material"])
|
||||
tool.Diameter = float(attrs["diameter"])
|
||||
tool.LengthOffset = float(attrs["lengthOffset"])
|
||||
tool.FlatRadius = float(attrs["flatRadius"])
|
||||
tool.CornerRadius = float(attrs["cornerRadius"])
|
||||
tool.CuttingEdgeAngle = float(attrs["cuttingEdgeAngle"])
|
||||
tool.CuttingEdgeHeight = float(attrs["cuttingEdgeHeight"])
|
||||
tt.setTool(int(key), tool)
|
||||
|
||||
return tt
|
||||
else:
|
||||
PathLog.error(translate('PathToolLibraryManager', "Unsupported Path tooltable template version %s") % stringattrs.get('Version'))
|
||||
PathLog.error(
|
||||
translate(
|
||||
"PathToolLibraryManager",
|
||||
"Unsupported Path tooltable template version %s",
|
||||
)
|
||||
% stringattrs.get("Version")
|
||||
)
|
||||
return None
|
||||
|
||||
def loadToolTables(self):
|
||||
''' loads the tool tables from the stored data '''
|
||||
"""loads the tool tables from the stored data"""
|
||||
self.toolTables = []
|
||||
self.currentTableName = ''
|
||||
self.currentTableName = ""
|
||||
|
||||
def addTable(tt):
|
||||
if tt:
|
||||
self.toolTables.append(tt)
|
||||
else:
|
||||
PathLog.error(translate('PathToolLibraryManager', "Unsupported Path tooltable"))
|
||||
PathLog.error(
|
||||
translate("PathToolLibraryManager", "Unsupported Path tooltable")
|
||||
)
|
||||
|
||||
prefString = self.prefs.GetString(self.PreferenceMainLibraryJSON, "")
|
||||
|
||||
@@ -300,14 +319,14 @@ class ToolLibraryManager():
|
||||
self.currentTableName = self.toolTables[0].Name
|
||||
|
||||
def saveMainLibrary(self):
|
||||
'''Persists the permanent library to FreeCAD user preferences'''
|
||||
"""Persists the permanent library to FreeCAD user preferences"""
|
||||
tmpstring = json.dumps(self.templateAttrs())
|
||||
self.prefs.SetString(self.PreferenceMainLibraryJSON, tmpstring)
|
||||
self.loadToolTables()
|
||||
return True
|
||||
|
||||
def getJobList(self):
|
||||
'''Builds the list of all Tool Table lists'''
|
||||
"""Builds the list of all Tool Table lists"""
|
||||
tablelist = []
|
||||
|
||||
for o in FreeCAD.ActiveDocument.Objects:
|
||||
@@ -318,27 +337,29 @@ class ToolLibraryManager():
|
||||
return tablelist
|
||||
|
||||
def getTool(self, listname, toolnum):
|
||||
''' gets the tool object '''
|
||||
"""gets the tool object"""
|
||||
tt = self.getTableFromName(listname)
|
||||
return tt.getTool(toolnum)
|
||||
|
||||
def getTools(self, tablename):
|
||||
'''returns the tool data for a given table'''
|
||||
"""returns the tool data for a given table"""
|
||||
tooldata = []
|
||||
tableExists = any(table.Name == tablename for table in self.toolTables)
|
||||
tableExists = any(table.Name == tablename for table in self.toolTables)
|
||||
if tableExists:
|
||||
self.currentTableName = tablename
|
||||
else:
|
||||
return None
|
||||
|
||||
tt = self.getTableFromName(tablename)
|
||||
headers = ["","Tool Num.","Name","Tool Type","Diameter"]
|
||||
headers = ["", "Tool Num.", "Name", "Tool Type", "Diameter"]
|
||||
model = QtGui.QStandardItemModel()
|
||||
model.setHorizontalHeaderLabels(headers)
|
||||
|
||||
def unitconv(ivalue):
|
||||
val = FreeCAD.Units.Quantity(ivalue, FreeCAD.Units.Length)
|
||||
displayed_val = val.UserString #just the displayed value-not the internal one
|
||||
displayed_val = (
|
||||
val.UserString
|
||||
) # just the displayed value-not the internal one
|
||||
return displayed_val
|
||||
|
||||
if tt:
|
||||
@@ -348,10 +369,10 @@ class ToolLibraryManager():
|
||||
|
||||
itemcheck = QtGui.QStandardItem()
|
||||
itemcheck.setCheckable(True)
|
||||
itemNumber = QtGui.QStandardItem(str(number))
|
||||
itemName = QtGui.QStandardItem(t.Name)
|
||||
itemToolType = QtGui.QStandardItem(t.ToolType)
|
||||
itemDiameter = QtGui.QStandardItem(unitconv(t.Diameter))
|
||||
itemNumber = QtGui.QStandardItem(str(number))
|
||||
itemName = QtGui.QStandardItem(t.Name)
|
||||
itemToolType = QtGui.QStandardItem(t.ToolType)
|
||||
itemDiameter = QtGui.QStandardItem(unitconv(t.Diameter))
|
||||
|
||||
row = [itemcheck, itemNumber, itemName, itemToolType, itemDiameter]
|
||||
model.appendRow(row)
|
||||
@@ -367,9 +388,9 @@ class ToolLibraryManager():
|
||||
try:
|
||||
fileExtension = os.path.splitext(filename[0])[1].lower()
|
||||
xmlHandler = None
|
||||
if fileExtension == '.tooltable':
|
||||
if fileExtension == ".tooltable":
|
||||
xmlHandler = HeeksTooltableHandler()
|
||||
if fileExtension == '.xml':
|
||||
if fileExtension == ".xml":
|
||||
xmlHandler = FreeCADTooltableHandler()
|
||||
|
||||
if xmlHandler:
|
||||
@@ -405,41 +426,58 @@ class ToolLibraryManager():
|
||||
else:
|
||||
return False
|
||||
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
print("could not parse file", e)
|
||||
|
||||
|
||||
def write(self, filename, listname):
|
||||
"exports the tooltable to a file"
|
||||
tt = self.getTableFromName(listname)
|
||||
if tt:
|
||||
try:
|
||||
|
||||
def openFileWithExtension(name, ext):
|
||||
fext = os.path.splitext(name)[1].lower()
|
||||
if fext != ext:
|
||||
name = "{}{}".format(name, ext)
|
||||
return (open(PathUtil.toUnicode(name), 'w'), name)
|
||||
return (open(PathUtil.toUnicode(name), "w"), name)
|
||||
|
||||
if filename[1] == self.TooltableTypeXML:
|
||||
fp,fname = openFileWithExtension(filename[0], '.xml')
|
||||
fp, fname = openFileWithExtension(filename[0], ".xml")
|
||||
fp.write('<?xml version="1.0" encoding="UTF-8"?>\n')
|
||||
fp.write(tt.Content)
|
||||
elif filename[1] == self.TooltableTypeLinuxCNC:
|
||||
fp,fname = openFileWithExtension(filename[0], '.tbl')
|
||||
fp, fname = openFileWithExtension(filename[0], ".tbl")
|
||||
for key in tt.Tools:
|
||||
t = tt.Tools[key]
|
||||
fp.write("T{0} P{0} Y{1} Z{2} A{3} B{4} C{5} U{6} V{7} W{8} D{9} I{10} J{11} Q{12} ;{13}\n".format(key,0,t.LengthOffset,0,0,0,0,0,0,t.Diameter,0,0,0,t.Name))
|
||||
fp.write(
|
||||
"T{0} P{0} Y{1} Z{2} A{3} B{4} C{5} U{6} V{7} W{8} D{9} I{10} J{11} Q{12} ;{13}\n".format(
|
||||
key,
|
||||
0,
|
||||
t.LengthOffset,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
t.Diameter,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
t.Name,
|
||||
)
|
||||
)
|
||||
else:
|
||||
fp,fname = openFileWithExtension(filename[0], '.json')
|
||||
fp, fname = openFileWithExtension(filename[0], ".json")
|
||||
json.dump(self.templateAttrs(), fp, sort_keys=True, indent=2)
|
||||
|
||||
fp.close()
|
||||
print("Written ", PathUtil.toUnicode(fname))
|
||||
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
print("Could not write file:", e)
|
||||
|
||||
def addnew(self, listname, tool, position = None):
|
||||
def addnew(self, listname, tool, position=None):
|
||||
"adds a new tool at the end of the table"
|
||||
tt = self.getTableFromName(listname)
|
||||
if not tt:
|
||||
@@ -456,7 +494,7 @@ class ToolLibraryManager():
|
||||
return newID
|
||||
|
||||
def updateTool(self, listname, toolnum, tool):
|
||||
'''updates tool data'''
|
||||
"""updates tool data"""
|
||||
tt = self.getTableFromName(listname)
|
||||
tt.deleteTool(toolnum)
|
||||
tt.setTool(toolnum, tool)
|
||||
@@ -498,7 +536,7 @@ class ToolLibraryManager():
|
||||
return True, target
|
||||
|
||||
def duplicate(self, number, listname):
|
||||
''' duplicates the selected tool in the selected tool table '''
|
||||
"""duplicates the selected tool in the selected tool table"""
|
||||
tt = self.getTableFromName(listname)
|
||||
tool = tt.getTool(number).copy()
|
||||
tt.addTools(tool)
|
||||
@@ -510,7 +548,7 @@ class ToolLibraryManager():
|
||||
return True, newID
|
||||
|
||||
def moveToTable(self, number, listname):
|
||||
''' Moves the tool to selected tool table '''
|
||||
"""Moves the tool to selected tool table"""
|
||||
fromTable = self.getTableFromName(self.getCurrentTableName())
|
||||
toTable = self.getTableFromName(listname)
|
||||
tool = fromTable.getTool(number).copy()
|
||||
@@ -518,9 +556,9 @@ class ToolLibraryManager():
|
||||
fromTable.deleteTool(number)
|
||||
|
||||
def delete(self, number, listname):
|
||||
'''deletes a tool from the current list'''
|
||||
"""deletes a tool from the current list"""
|
||||
tt = self.getTableFromName(listname)
|
||||
tt.deleteTool(number)
|
||||
if listname == self.getCurrentTableName():
|
||||
self.saveMainLibrary()
|
||||
return True
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user