# -*- coding: utf-8 -*- ################################################################################### # # ScrewCalc.py # A calculator utility to calculate needed hole sizes for selected fasteners # # Copyright 2015 Shai Seger <shaise at gmail dot com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # ################################################################################### ################################################################################### # replace below with generated code from pyuic4 ################################################################################### from PySide import QtCore, QtGui 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) class Ui_DockWidget(object): def setupUi(self, DockWidget): DockWidget.setObjectName(_fromUtf8("DockWidget")) DockWidget.resize(267, 136) DockWidget.setFloating(True) self.dockWidgetContents = QtGui.QWidget() self.dockWidgetContents.setObjectName(_fromUtf8("dockWidgetContents")) self.gridLayout = QtGui.QGridLayout(self.dockWidgetContents) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label = QtGui.QLabel(self.dockWidgetContents) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.comboFastenerType = QtGui.QComboBox(self.dockWidgetContents) self.comboFastenerType.setObjectName(_fromUtf8("comboFastenerType")) self.horizontalLayout.addWidget(self.comboFastenerType) self.verticalLayout.addLayout(self.horizontalLayout) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_2 = QtGui.QLabel(self.dockWidgetContents) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_2.addWidget(self.label_2) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) self.comboDiameter = QtGui.QComboBox(self.dockWidgetContents) self.comboDiameter.setObjectName(_fromUtf8("comboDiameter")) self.horizontalLayout_2.addWidget(self.comboDiameter) self.verticalLayout.addLayout(self.horizontalLayout_2) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.labelHoleSize = QtGui.QLabel(self.dockWidgetContents) self.labelHoleSize.setObjectName(_fromUtf8("labelHoleSize")) self.horizontalLayout_3.addWidget(self.labelHoleSize) spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem2) self.textHole = QtGui.QLineEdit(self.dockWidgetContents) self.textHole.setReadOnly(True) self.textHole.setObjectName(_fromUtf8("textHole")) self.horizontalLayout_3.addWidget(self.textHole) self.verticalLayout.addLayout(self.horizontalLayout_3) spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem3) self.gridLayout.addLayout(self.verticalLayout, 1, 0, 1, 1) DockWidget.setWidget(self.dockWidgetContents) self.retranslateUi(DockWidget) QtCore.QMetaObject.connectSlotsByName(DockWidget) def retranslateUi(self, DockWidget): DockWidget.setWindowTitle(_translate("DockWidget", "Screw hole calculator", None)) self.label.setText(_translate("DockWidget", "Fastener type:", None)) self.label_2.setText(_translate("DockWidget", "Screw Diameter:", None)) self.labelHoleSize.setText(_translate("DockWidget", "Suggested Hole diameter (mm):", None)) ################################################################################### # End position for generated code from pyuic4 ################################################################################### def fillScrewTypes(self): self.comboFastenerType.currentIndexChanged.connect(self.onTypeChange) self.comboDiameter.currentIndexChanged.connect(self.onDiameterChange) self.comboFastenerType.clear() for type in FSCScrewTypes: icon, name, table = type self.comboFastenerType.addItem(QtGui.QIcon(os.path.join(iconPath , icon)), name) def fillDiameters(self): self.comboDiameter.clear() idx = self.comboFastenerType.currentIndex() table = FSCScrewTypes[idx][2] for diam in table: self.comboDiameter.addItem(diam[0]) def onDiameterChange(self, diamindex): idx = self.comboFastenerType.currentIndex() table = FSCScrewTypes[idx][2] self.textHole.setText(str(table[diamindex][1])) def onTypeChange(self, typeindex): self.fillDiameters() from FreeCAD import Gui from FreeCAD import Base import FreeCAD, FreeCADGui, Part, os, math __dir__ = os.path.dirname(__file__) iconPath = os.path.join( __dir__, 'Icons' ) import FastenerBase from FastenerBase import FSBaseObject import ScrewMaker screwMaker = ScrewMaker.Instance() FSCPEMPressNutHoleChart = ( ("M2", 4.22), ("M2.5", 4.22), ("M3", 4.22), ("M3.5", 4.75), ("M4", 5.41), ("M5", 6.35), ("M6", 8.75), ("M8", 10.5), ("M10", 14), ("M12", 17) ) # hole size +0.08 FSCPEMStandOffHoleChart = ( ("M3", 4.22), ("3.5M3", 5.41), ("M3.5", 5.41), ("M4", 7.14), ("M5", 7.14) ) FSCPEMStudHoleChart = ( ("M2.5", 2.5), ("M3", 3), ("M3.5", 3.5), ("M4", 4), ("M5", 5), ("M6", 6), ("M8", 8) ) FSCScrewTypes = ( ("ISO7045.svg", "Metric Screw", ScrewMaker.FSCScrewHoleChart), ("PEMPressNut.svg", "PEM Press-nut", FSCPEMPressNutHoleChart), ("PEMBLStandoff.svg", "PEM Stand-off", FSCPEMStudHoleChart), ("PEMStud.svg", "PEM Stud", FSCPEMStudHoleChart) ) FSScrewCalcDlg = QtGui.QDockWidget() FSScrewCalcDlg.ui = Ui_DockWidget() FSScrewCalcDlg.ui.setupUi(FSScrewCalcDlg) FSScrewCalcDlg.ui.fillScrewTypes() Gui.getMainWindow().addDockWidget(QtCore.Qt.RightDockWidgetArea, FSScrewCalcDlg) FSScrewCalcDlg.setFloating(True) FSScrewCalcDlg.hide() class FSScrewCalcCommand: """Display a calculator for needed screw holes""" def GetResources(self): FreeCAD.Console.PrintLog("Getting resources\n") icon = os.path.join( iconPath , 'IconScrewCalc.svg') return {'Pixmap' : icon , # the name of a svg file available in the resources 'MenuText': "Screw calculator" , 'ToolTip' : "Show a screw hole calculator"} def Activated(self): if FSScrewCalcDlg.isHidden(): FSScrewCalcDlg.show() else: FSScrewCalcDlg.hide() return def IsActive(self): return True Gui.addCommand("FSScrewCalc", FSScrewCalcCommand()) FastenerBase.FSCommands.append("FSScrewCalc", "command")