748 lines
33 KiB
Python
748 lines
33 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# ***************************************************************************
|
|
# * *
|
|
# * Copyright (c) 2014 Yorik van Havre <yorik@uncreated.net> *
|
|
# * *
|
|
# * 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('<?xml version="1.0" encoding="UTF-8"?>\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()
|