# -*- coding: utf-8 -*- # *************************************************************************** # * * # * Copyright (c) 2014 Yorik van Havre * # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU Lesser General Public License (LGPL) * # * as published by the Free Software Foundation; either version 2 of * # * the License, or (at your option) any later version. * # * for detail see the LICENCE text file. * # * * # * This program is distributed in the hope that it will be useful, * # * but WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * # * GNU Library General Public License for more details. * # * * # * You should have received a copy of the GNU Library General Public * # * License along with this program; if not, write to the Free Software * # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * # * USA * # * * # *************************************************************************** import FreeCAD import Path import xml.sax import os from PySide import QtCore, QtGui import DraftGui # convenience functions try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) # Tooltable XML readers class FreeCADTooltableHandler(xml.sax.ContentHandler): # http://www.tutorialspoint.com/python/python_xml_processing.htm def __init__(self): self.tooltable = None self.tool = None self.number = None # Call when an element is found def startElement(self, tag, attributes): if tag == "Tooltable": self.tooltable = Path.Tooltable() elif tag == "Toolslot": self.number = int(attributes["number"]) elif tag == "Tool": self.tool = Path.Tool() self.tool.Name = str(attributes["name"]) self.tool.ToolType = str(attributes["type"]) self.tool.Material = str(attributes["mat"]) # for some reason without the following line I get an error print attributes["diameter"] self.tool.Diameter = float(attributes["diameter"]) self.tool.LengthOffset = float(attributes["length"]) self.tool.FlatRadius = float(attributes["flat"]) self.tool.CornerRadius = float(attributes["corner"]) self.tool.CuttingEdgeAngle = float(attributes["angle"]) self.tool.CuttingEdgeHeight = float(attributes["height"]) # Call when an elements ends def endElement(self, tag): if tag == "Toolslot": if self.tooltable and self.tool and self.number: self.tooltable.setTool(self.number, self.tool) self.number = None self.tool = None class HeeksTooltableHandler(xml.sax.ContentHandler): def __init__(self): self.tooltable = Path.Tooltable() self.tool = None self.number = None # Call when an element is found def startElement(self, tag, attributes): if tag == "Tool": self.tool = Path.Tool() self.number = int(attributes["tool_number"]) self.tool.Name = str(attributes["title"]) elif tag == "params": t = str(attributes["type"]) if t == "drill": self.tool.ToolType = "Drill" elif t == "center_drill_bit": self.tool.ToolType = "CenterDrill" elif t == "end_mill": self.tool.ToolType = "EndMill" elif t == "slot_cutter": self.tool.ToolType = "SlotCutter" elif t == "ball_end_mill": self.tool.ToolType = "BallEndMill" elif t == "chamfer": self.tool.ToolType = "Chamfer" elif t == "engraving_bit": self.tool.ToolType = "Engraver" m = str(attributes["material"]) if m == "0": self.tool.Material = "HighSpeedSteel" elif m == "1": self.tool.Material = "Carbide" # for some reason without the following line I get an error print attributes["diameter"] self.tool.Diameter = float(attributes["diameter"]) self.tool.LengthOffset = float(attributes["tool_length_offset"]) self.tool.FlatRadius = float(attributes["flat_radius"]) self.tool.CornerRadius = float(attributes["corner_radius"]) self.tool.CuttingEdgeAngle = float( attributes["cutting_edge_angle"]) self.tool.CuttingEdgeHeight = float( attributes["cutting_edge_height"]) # Call when an elements ends def endElement(self, tag): if tag == "Tool": if self.tooltable and self.tool and self.number: self.tooltable.setTool(self.number, self.tool) self.number = None self.tool = None # Tooltable Editor class Editor(QtGui.QDialog): def __init__(self, obj): QtGui.QDialog.__init__(self) self.setObjectName(_fromUtf8("TooltableEditor")) self.resize(468, 476) self.verticalLayout = QtGui.QVBoxLayout(self) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.DECIMALS = FreeCAD.ParamGet( "User parameter:BaseApp/Preferences/Units").GetInt("Decimals", 2) self.FORMAT = DraftGui.makeFormatSpec(self.DECIMALS, 'Length') # left groupbox self.groupBox = QtGui.QGroupBox(self) sizePolicy = QtGui.QSizePolicy( QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.horizontalLayout_9 = QtGui.QHBoxLayout() self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) # import button self.ButtonImport = QtGui.QPushButton(self.groupBox) icon = QtGui.QIcon.fromTheme(_fromUtf8("document-import")) self.ButtonImport.setIcon(icon) self.ButtonImport.setObjectName(_fromUtf8("ButtonImport")) self.horizontalLayout_9.addWidget(self.ButtonImport) # export button self.ButtonExport = QtGui.QPushButton(self.groupBox) icon = QtGui.QIcon.fromTheme(_fromUtf8("document-export")) self.ButtonExport.setIcon(icon) self.ButtonExport.setObjectName(_fromUtf8("ButtonExport")) self.horizontalLayout_9.addWidget(self.ButtonExport) # tools list self.verticalLayout_2.addLayout(self.horizontalLayout_9) self.ToolsList = QtGui.QTreeWidget(self.groupBox) self.ToolsList.setObjectName(_fromUtf8("ToolsList")) self.ToolsList.header().setDefaultSectionSize(40) self.verticalLayout_2.addWidget(self.ToolsList) # add button self.horizontalLayout_8 = QtGui.QHBoxLayout() self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) self.ButtonAdd = QtGui.QPushButton(self.groupBox) icon = QtGui.QIcon.fromTheme(_fromUtf8("edit-add")) self.ButtonAdd.setIcon(icon) self.ButtonAdd.setObjectName(_fromUtf8("ButtonAdd")) self.horizontalLayout_8.addWidget(self.ButtonAdd) # delete button self.ButtonDelete = QtGui.QPushButton(self.groupBox) icon = QtGui.QIcon.fromTheme(_fromUtf8("edit-delete")) self.ButtonDelete.setIcon(icon) self.ButtonDelete.setObjectName(_fromUtf8("ButtonDelete")) self.horizontalLayout_8.addWidget(self.ButtonDelete) # up button self.ButtonUp = QtGui.QPushButton(self.groupBox) icon = QtGui.QIcon.fromTheme(_fromUtf8("go-up")) self.ButtonUp.setIcon(icon) self.ButtonDelete.setObjectName(_fromUtf8("ButtonUp")) self.horizontalLayout_8.addWidget(self.ButtonUp) # down button self.ButtonDown = QtGui.QPushButton(self.groupBox) icon = QtGui.QIcon.fromTheme(_fromUtf8("go-down")) self.ButtonDown.setIcon(icon) self.ButtonDown.setObjectName(_fromUtf8("ButtonDown")) self.horizontalLayout_8.addWidget(self.ButtonDown) # right groupbox self.verticalLayout_2.addLayout(self.horizontalLayout_8) self.horizontalLayout.addWidget(self.groupBox) self.groupBox_2 = QtGui.QGroupBox(self) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.groupBox_2) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) # name self.label = QtGui.QLabel(self.groupBox_2) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout_3.addWidget(self.label) self.NameField = QtGui.QLineEdit(self.groupBox_2) self.NameField.setObjectName(_fromUtf8("NameField")) self.verticalLayout_3.addWidget(self.NameField) # type self.label_2 = QtGui.QLabel(self.groupBox_2) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout_3.addWidget(self.label_2) self.TypeField = QtGui.QComboBox(self.groupBox_2) self.TypeField.setObjectName(_fromUtf8("TypeField")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.TypeField.addItem(_fromUtf8("")) self.verticalLayout_3.addWidget(self.TypeField) # material self.label_3 = QtGui.QLabel(self.groupBox_2) self.label_3.setObjectName(_fromUtf8("label_3")) self.verticalLayout_3.addWidget(self.label_3) self.MaterialField = QtGui.QComboBox(self.groupBox_2) self.MaterialField.setObjectName(_fromUtf8("MaterialField")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.MaterialField.addItem(_fromUtf8("")) self.verticalLayout_3.addWidget(self.MaterialField) self.label_4 = QtGui.QLabel(self.groupBox_2) self.label_4.setObjectName(_fromUtf8("label_4")) self.verticalLayout_3.addWidget(self.label_4) # diameter self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_5 = QtGui.QLabel(self.groupBox_2) self.label_5.setObjectName(_fromUtf8("label_5")) self.horizontalLayout_2.addWidget(self.label_5) self.DiameterField = QtGui.QDoubleSpinBox(self.groupBox_2) self.DiameterField.setMaximum(9999) self.DiameterField.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.DiameterField.setObjectName(_fromUtf8("DiameterField")) self.horizontalLayout_2.addWidget(self.DiameterField) self.verticalLayout_3.addLayout(self.horizontalLayout_2) # length offset self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.label_6 = QtGui.QLabel(self.groupBox_2) self.label_6.setObjectName(_fromUtf8("label_6")) self.horizontalLayout_3.addWidget(self.label_6) self.LengthOffsetField = QtGui.QDoubleSpinBox(self.groupBox_2) self.LengthOffsetField.setMaximum(9999) self.LengthOffsetField.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.LengthOffsetField.setObjectName(_fromUtf8("LengthOffsetField")) self.horizontalLayout_3.addWidget(self.LengthOffsetField) self.verticalLayout_3.addLayout(self.horizontalLayout_3) # flat radius self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.label_7 = QtGui.QLabel(self.groupBox_2) self.label_7.setObjectName(_fromUtf8("label_7")) self.horizontalLayout_4.addWidget(self.label_7) self.FlatRadiusField = QtGui.QDoubleSpinBox(self.groupBox_2) self.FlatRadiusField.setMaximum(9999) self.FlatRadiusField.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.FlatRadiusField.setObjectName(_fromUtf8("FlatRadiusField")) self.horizontalLayout_4.addWidget(self.FlatRadiusField) self.verticalLayout_3.addLayout(self.horizontalLayout_4) # corner radius self.horizontalLayout_5 = QtGui.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) self.label_8 = QtGui.QLabel(self.groupBox_2) self.label_8.setObjectName(_fromUtf8("label_8")) self.horizontalLayout_5.addWidget(self.label_8) self.CornerRadiusField = QtGui.QDoubleSpinBox(self.groupBox_2) self.CornerRadiusField.setMaximum(9999) self.CornerRadiusField.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.CornerRadiusField.setObjectName(_fromUtf8("CornerRadiusField")) self.horizontalLayout_5.addWidget(self.CornerRadiusField) self.verticalLayout_3.addLayout(self.horizontalLayout_5) # cutting edge angle self.horizontalLayout_6 = QtGui.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) self.label_9 = QtGui.QLabel(self.groupBox_2) self.label_9.setObjectName(_fromUtf8("label_9")) self.horizontalLayout_6.addWidget(self.label_9) self.CuttingEdgeAngleField = QtGui.QDoubleSpinBox(self.groupBox_2) self.CuttingEdgeAngleField.setMaximum(360) self.CuttingEdgeAngleField.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.CuttingEdgeAngleField.setObjectName( _fromUtf8("CuttingEdgeAngleField")) self.horizontalLayout_6.addWidget(self.CuttingEdgeAngleField) self.verticalLayout_3.addLayout(self.horizontalLayout_6) # cutting edge height self.horizontalLayout_7 = QtGui.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) self.label_10 = QtGui.QLabel(self.groupBox_2) self.label_10.setObjectName(_fromUtf8("label_10")) self.horizontalLayout_7.addWidget(self.label_10) self.CuttingEdgeHeightField = QtGui.QDoubleSpinBox(self.groupBox_2) self.CuttingEdgeHeightField.setMaximum(9999) self.CuttingEdgeHeightField.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.CuttingEdgeHeightField.setObjectName( _fromUtf8("CuttingEdgeHeightField")) self.horizontalLayout_7.addWidget(self.CuttingEdgeHeightField) self.verticalLayout_3.addLayout(self.horizontalLayout_7) self.horizontalLayout.addWidget(self.groupBox_2) self.verticalLayout.addLayout(self.horizontalLayout) # ok / cancel box self.buttonBox = QtGui.QDialogButtonBox(self) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons( QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi() # connect buttons QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL( _fromUtf8("accepted()")), self.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL( _fromUtf8("rejected()")), self.reject) QtCore.QObject.connect(self.ButtonImport, QtCore.SIGNAL( _fromUtf8("clicked()")), self.read) QtCore.QObject.connect(self.ButtonExport, QtCore.SIGNAL( _fromUtf8("clicked()")), self.write) QtCore.QObject.connect(self.ButtonAdd, QtCore.SIGNAL( _fromUtf8("clicked()")), self.addnew) QtCore.QObject.connect(self.ButtonDelete, QtCore.SIGNAL( _fromUtf8("clicked()")), self.delete) QtCore.QObject.connect(self.ButtonUp, QtCore.SIGNAL( _fromUtf8("clicked()")), self.moveup) QtCore.QObject.connect(self.ButtonDown, QtCore.SIGNAL( _fromUtf8("clicked()")), self.movedown) QtCore.QObject.connect(self.ToolsList, QtCore.SIGNAL(_fromUtf8( "currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)")), self.selectTool) QtCore.QObject.connect(self.NameField, QtCore.SIGNAL( _fromUtf8("textEdited(QString)")), self.changeName) QtCore.QObject.connect(self.TypeField, QtCore.SIGNAL( _fromUtf8("currentIndexChanged(int)")), self.changeType) QtCore.QObject.connect(self.MaterialField, QtCore.SIGNAL( _fromUtf8("currentIndexChanged(int)")), self.changeMaterial) QtCore.QObject.connect(self.DiameterField, QtCore.SIGNAL( _fromUtf8("valueChanged(double)")), self.changeDiameter) QtCore.QObject.connect(self.LengthOffsetField, QtCore.SIGNAL( _fromUtf8("valueChanged(double)")), self.changeLengthOffset) QtCore.QObject.connect(self.FlatRadiusField, QtCore.SIGNAL( _fromUtf8("valueChanged(double)")), self.changeFlatRadius) QtCore.QObject.connect(self.CornerRadiusField, QtCore.SIGNAL( _fromUtf8("valueChanged(double)")), self.changeCornerRadius) QtCore.QObject.connect(self.CuttingEdgeAngleField, QtCore.SIGNAL( _fromUtf8("valueChanged(double)")), self.changeCuttingEdgeAngle) QtCore.QObject.connect(self.CuttingEdgeHeightField, QtCore.SIGNAL( _fromUtf8("valueChanged(double)")), self.changeCuttingEdgeHeight) QtCore.QMetaObject.connectSlotsByName(self) self.tooltable = obj.Tooltable.copy() self.tool = None self.number = None self.reset() def retranslateUi(self): self.setWindowTitle(_translate( "TooltableEditor", "Tooltable editor", None)) self.groupBox.setTitle(_translate( "TooltableEditor", "Tools list", None)) self.ButtonImport.setText(_translate( "TooltableEditor", "Import...", None)) self.ButtonExport.setText(_translate( "TooltableEditor", "Export...", None)) self.ToolsList.headerItem().setText( 0, _translate("TooltableEditor", "Slot", None)) self.ToolsList.headerItem().setText( 1, _translate("TooltableEditor", "Tool", None)) self.ButtonAdd.setText(_translate("TooltableEditor", "Add new", None)) self.ButtonDelete.setText(_translate( "TooltableEditor", "Delete", None)) self.ButtonUp.setText(_translate("TooltableEditor", "Move up", None)) self.ButtonDown.setText(_translate( "TooltableEditor", "Move down", None)) self.groupBox_2.setTitle(_translate( "TooltableEditor", "Tool properties", None)) self.label.setText(_translate("TooltableEditor", "Name", None)) self.label_2.setText(_translate("TooltableEditor", "Type", None)) self.TypeField.setItemText(0, _translate( "TooltableEditor", "Undefined", None)) self.TypeField.setItemText(1, _translate( "TooltableEditor", "Drill", None)) self.TypeField.setItemText(2, _translate( "TooltableEditor", "Center Drill", None)) self.TypeField.setItemText(3, _translate( "TooltableEditor", "Counter Sink", None)) self.TypeField.setItemText(4, _translate( "TooltableEditor", "Counter Bore", None)) self.TypeField.setItemText(5, _translate( "TooltableEditor", "Reamer", None)) self.TypeField.setItemText( 6, _translate("TooltableEditor", "Tap", None)) self.TypeField.setItemText(7, _translate( "TooltableEditor", "End Mill", None)) self.TypeField.setItemText(8, _translate( "TooltableEditor", "Slot Cutter", None)) self.TypeField.setItemText(9, _translate( "TooltableEditor", "Ball End Mill", None)) self.TypeField.setItemText(10, _translate( "TooltableEditor", "Chamfer Mill", None)) self.TypeField.setItemText(11, _translate( "TooltableEditor", "Corner Round", None)) self.TypeField.setItemText(12, _translate( "TooltableEditor", "Engraver", None)) self.label_3.setText(_translate("TooltableEditor", "Material", None)) self.MaterialField.setItemText(0, _translate( "TooltableEditor", "Undefined", None)) self.MaterialField.setItemText(1, _translate( "TooltableEditor", "High Speed Steel", None)) self.MaterialField.setItemText(2, _translate( "TooltableEditor", "High Carbon Tool Steel", None)) self.MaterialField.setItemText(3, _translate( "TooltableEditor", "Cast Alloy", None)) self.MaterialField.setItemText( 4, _translate("TooltableEditor", "Carbide", None)) self.MaterialField.setItemText( 5, _translate("TooltableEditor", "Ceramics", None)) self.MaterialField.setItemText( 6, _translate("TooltableEditor", "Diamond", None)) self.MaterialField.setItemText( 7, _translate("TooltableEditor", "Sialon", None)) self.label_4.setText(_translate("TooltableEditor", "Properties", None)) self.label_5.setText(_translate("TooltableEditor", "Diameter", None)) # self.DiameterField.setSuffix(_translate("TooltableEditor", "mm", None)) self.label_6.setText(_translate( "TooltableEditor", "Length offset", None)) self.LengthOffsetField.setSuffix( _translate("TooltableEditor", "mm", None)) self.label_7.setText(_translate( "TooltableEditor", "Flat radius", None)) self.FlatRadiusField.setSuffix( _translate("TooltableEditor", "mm", None)) self.label_8.setText(_translate( "TooltableEditor", "Corner radius", None)) self.CornerRadiusField.setSuffix( _translate("TooltableEditor", "mm", None)) self.label_9.setText(_translate( "TooltableEditor", "Cutting edge angle", None)) self.CuttingEdgeAngleField.setSuffix( _translate("TooltableEditor", "°", None)) self.label_10.setText(_translate( "TooltableEditor", "Cutting edge height", None)) self.CuttingEdgeHeightField.setSuffix( _translate("TooltableEditor", "mm", None)) def reset(self): "resets the editor with the contents of the current internal tooltable" self.tool = None self.number = None self.ToolsList.clear() for number, tool in self.tooltable.Tools.iteritems(): item = QtGui.QTreeWidgetItem(self.ToolsList) item.setText(0, str(number)) item.setText(1, tool.Name) self.NameField.setText("") self.TypeField.setCurrentIndex(-1) self.MaterialField.setCurrentIndex(-1) self.DiameterField.setValue(0) self.LengthOffsetField.setValue(0) self.FlatRadiusField.setValue(0) self.CornerRadiusField.setValue(0) self.CuttingEdgeAngleField.setValue(0) self.CuttingEdgeHeightField.setValue(0) def selectTool(self, current, previous): "fills the data of the currently selected tool" if current: number = int(current.text(0)) tool = self.tooltable.getTool(number) if tool: self.number = number self.tool = tool self.NameField.setText(tool.Name) self.TypeField.setCurrentIndex(self.getType(tool.ToolType)) self.MaterialField.setCurrentIndex( self.getMaterial(tool.Material)) self.DiameterField.setValue(tool.Diameter) self.LengthOffsetField.setValue(tool.LengthOffset) self.FlatRadiusField.setValue(tool.FlatRadius) self.CornerRadiusField.setValue(tool.CornerRadius) self.CuttingEdgeAngleField.setValue(tool.CuttingEdgeAngle) self.CuttingEdgeHeightField.setValue(tool.CuttingEdgeHeight) def getType(self, tooltype): "gets a combobox index number for a given type or viceversa" toolslist = ["Drill", "CenterDrill", "CounterSink", "CounterBore", "Reamer", "Tap", "EndMill", "SlotCutter", "BallEndMill", "ChamferMill", "CornerRound", "Engraver"] if isinstance(tooltype, str): if tooltype in toolslist: return toolslist.index(tooltype) + 1 else: return 0 else: if tooltype == 0: return "Undefined" else: return toolslist[tooltype - 1] def getMaterial(self, material): "gets a combobox index number for a given material or viceversa" matslist = ["HighSpeedSteel", "HighCarbonToolSteel", "CastAlloy", "Carbide", "Ceramics", "Diamond", "Sialon"] if isinstance(material, str): if material in matslist: return matslist.index(material) + 1 else: return 0 else: if material == 0: return "Undefined" else: return matslist[material - 1] def changeName(self, text): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.Name = str(text) self.changeTool() if self.number: l = self.ToolsList.findItems( str(self.number), QtCore.Qt.MatchExactly, 0) if len(l) == 1: l[0].setText(1, text) def changeType(self, num): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.ToolType = self.getType(num) self.changeTool() def changeMaterial(self, num): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.Material = self.getMaterial(num) self.changeTool() def changeDiameter(self, value): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.Diameter = value self.changeTool() def changeLengthOffset(self, value): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.LengthOffset = value self.changeTool() def changeFlatRadius(self, value): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.FlatRadius = value self.changeTool() def changeCornerRadius(self, value): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.CornerRadius = value self.changeTool() def changeCuttingEdgeAngle(self, value): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.CuttingEdgeAngle = value self.changeTool() def changeCuttingEdgeHeight(self, value): "called when the corresponding field has changed (needed for nasty pyside bug)" if self.tool: self.tool.CuttingEdgeHeight = value self.changeTool() def changeTool(self): "changes a given tool" if self.number and self.tool: self.tooltable.setTool(self.number, self.tool) def delete(self): "deletes the current tool" if self.number: self.tooltable.deleteTool(self.number) self.reset() def addnew(self): "adds a new tool at the end of the table" tool = Path.Tool() print self.NameField if self.NameField.text(): tool.Name = str(self.NameField.text()) tool.ToolType = self.getType(self.TypeField.currentIndex()) tool.Material = self.getMaterial(self.MaterialField.currentIndex()) tool.Diameter = self.DiameterField.value() tool.LengthOffset = self.LengthOffsetField.value() tool.FlatRadius = self.FlatRadiusField.value() tool.CornerRadius = self.CornerRadiusField.value() tool.CuttingEdgeAngle = self.CuttingEdgeAngleField.value() tool.CuttingEdgeHeight = self.CuttingEdgeHeightField.value() self.tooltable.addTools(tool) self.reset() def read(self): "imports a tooltable from a file" filename = QtGui.QFileDialog.getOpenFileName(self, _translate("TooltableEditor", "Open tooltable", None), None, _translate( "TooltableEditor", "Tooltable XML (*.xml);;HeeksCAD tooltable (*.tooltable)", None)) if filename: parser = xml.sax.make_parser() parser.setFeature(xml.sax.handler.feature_namespaces, 0) if os.path.splitext(filename[0])[1].lower() == ".tooltable": Handler = HeeksTooltableHandler() else: Handler = FreeCADTooltableHandler() parser.setContentHandler(Handler) parser.parse(str(filename[0])) if Handler.tooltable: self.tooltable = Handler.tooltable self.reset() def write(self): "exports the tooltable to a file" if self.tooltable: filename = QtGui.QFileDialog.getSaveFileName(self, _translate( "TooltableEditor", "Save tooltable", None), None, _translate("TooltableEditor", "Tooltable XML (*.xml)", None)) if filename: fil = open(str(filename[0]), "wb") fil.write('\n') fil.write(self.tooltable.Content) fil.close() print "Written ", filename[0] def moveup(self): "moves a tool to a lower number, if possible" if self.number: if self.number < 2: return target = self.number - 1 t1 = self.tooltable.getTool(self.number).copy() self.tooltable.deleteTool(self.number) if target in self.tooltable.Tools.keys(): t2 = self.tooltable.getTool(target).copy() self.tooltable.deleteTool(target) self.tooltable.setTool(self.number, t2) self.tooltable.setTool(target, t1) self.reset() def movedown(self): "moves a tool to a higher number, if possible" if self.number: target = self.number + 1 t1 = self.tooltable.getTool(self.number).copy() self.tooltable.deleteTool(self.number) if target in self.tooltable.Tools.keys(): t2 = self.tooltable.getTool(target).copy() self.tooltable.deleteTool(target) self.tooltable.setTool(self.number, t2) self.tooltable.setTool(target, t1) self.reset() def edit(objectname): """edit(objectname): this is the main function of this module. opens an editor dialog to edit the Tooltable of the given object""" obj = FreeCAD.ActiveDocument.getObject(objectname) if not obj: raise Exception(_translate( "TooltableEditor", "Object not found", None)) if not hasattr(obj, "Tooltable"): raise Exception(_translate("TooltableEditor", "Object doesn't have a tooltable property", None)) dialog = Editor(obj) r = dialog.exec_() if r: tooltable = dialog.tooltable FreeCAD.ActiveDocument.openTransaction("Edit Tooltable") obj.Tooltable = tooltable FreeCAD.ActiveDocument.commitTransaction() obj.ViewObject.finishEditing()