FreeCAD/src/Mod/PartDesign/WizardShaft/WizardShaft.py

204 lines
8.6 KiB
Python

#/******************************************************************************
# * Copyright (c)2012 Jan Rheinlaender <jrheinlaender@users.sourceforge.net> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
# * This library is free software; you can redistribute it and/or *
# * modify it under the terms of the GNU Library General Public *
# * License as published by the Free Software Foundation; either *
# * version 2 of the License, or (at your option) any later version. *
# * *
# * This library 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 library; see the file COPYING.LIB. If not, *
# * write to the Free Software Foundation, Inc., 59 Temple Place, *
# * Suite 330, Boston, MA 02111-1307, USA *
# * *
# ******************************************************************************/
import FreeCAD, FreeCADGui
from PyQt4 import QtCore, QtGui
from WizardShaftTable import WizardShaftTable
from Shaft import Shaft
class TaskWizardShaft:
"Shaft Wizard"
App = FreeCAD
Gui = FreeCADGui
def __init__(self, doc):
mw = QtGui.qApp.activeWindow()
cw = mw.centralWidget() # This is a qmdiarea widget
self.doc = doc
# Get active document or create a new one
# Important because when setting the default data in WizardShaftTable() the
# updateSketch() slot will be activated and it relies on finding a valid document
if self.doc == None:
self.Gui.activateWorkbench("PartDesignWorkbench")
self.doc = self.App.newDocument()
# Grab the newly created feature window
featureWindow = cw.subWindowList()[-1]
else:
featureWindow = cw.activeSubWindow()
# Buttons for diagram display
buttonLayout = QtGui.QGridLayout()
bnames = [["All [x]", "All [y]", "All [z]" ],
["N [x]", "Q [y]", "Q [z]"],
["Mt [x]", "Mb [z]", "Mb [y]"],
["", "w [y]", "w [z]"],
["sigma [x]", "sigma [y]", "sigma [z]"],
["tau [x]", "sigmab [z]", "sigmab [y]"]]
slots = [[self.slotAllx, self.slotAlly, self.slotAllz],
[self.slotFx, self.slotQy, self.slotQz],
[self.slotMx, self.slotMz, self.slotMy],
[self.slotNone, self.slotWy, self.slotWz],
[self.slotSigmax, self.slotSigmay, self.slotSigmaz],
[self.slotTaut, self.slotSigmabz, self.slotSigmaby]]
self.buttons = [[None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None]]
for col in range(3):
for row in range(6):
button = QtGui.QPushButton(bnames[row][col])
buttonLayout.addWidget(button, row, col)
self.buttons[row][col] = button
button.clicked.connect(slots[row][col])
# Create Shaft object
self.shaft = Shaft(self)
# Create table widget
self.form = QtGui.QWidget()
self.table = WizardShaftTable(self, self.shaft)
# The top layout will contain the Shaft Wizard layout plus the elements of the FEM constraints dialog
layout = QtGui.QVBoxLayout()
layout.setObjectName("ShaftWizard") # Do not change or translate: Required to detect whether Shaft Wizard is running in FemGui::ViewProviderFemConstraintXXX
sublayout = QtGui.QVBoxLayout()
sublayout.setObjectName("ShaftWizardLayout") # Do not change or translate
sublayout.addWidget(self.table.widget)
sublayout.addLayout(buttonLayout)
layout.addLayout(sublayout)
self.form.setLayout(layout)
# Switch to feature window
mdi=QtGui.qApp.activeWindow().findChild(QtGui.QMdiArea)
cw.setActiveSubWindow(featureWindow)
def slotAllx(self):
self.shaft.showDiagram("Allx")
def slotAlly(self):
self.shaft.showDiagram("Ally")
def slotAllz(self):
self.shaft.showDiagram("Allz")
def slotFx(self):
self.shaft.showDiagram("Nx")
def slotQy(self):
self.shaft.showDiagram("Qy")
def slotQz(self):
self.shaft.showDiagram("Qz")
def slotMx(self):
self.shaft.showDiagram("Mx")
def slotMz(self):
self.shaft.showDiagram("Mz")
def slotMy(self):
self.shaft.showDiagram("My")
def slotNone(self):
pass
def slotWy(self):
self.shaft.showDiagram("wy")
def slotWz(self):
self.shaft.showDiagram("wz")
def slotSigmax(self):
self.shaft.showDiagram("sigmax")
def slotSigmay(self):
self.shaft.showDiagram("sigmay")
def slotSigmaz(self):
self.shaft.showDiagram("sigmaz")
def slotTaut(self):
self.shaft.showDiagram("taut")
def slotSigmabz(self):
self.shaft.showDiagram("sigmabz")
def slotSigmaby(self):
self.shaft.showDiagram("sigmaby")
def updateButton(self, row, col, flag):
self.buttons[row][col].setEnabled(flag)
def updateButtons(self, col, flag):
for row in range(len(self.buttons)):
self.updateButton(row, col, flag)
def getStandardButtons(self):
return int(QtGui.QDialogButtonBox.Ok)
def accept(self):
if self.table:
del self.table
if self.shaft:
del self.shaft
if self.form:
del self.form
return True
def isAllowedAlterDocument(self):
return False
# Work-around to allow a callback
# Problem: From the FemConstraint ViewProvider, we need to tell the Shaft instance that the user finished editing the constraint
# We can find the Shaft Wizard dialog object from C++, but there is not way to reach the Shaft instance
# Also it seems to be impossible to access the active dialog from Python, so Gui::Command::runCommand() is not an option either
# Note: Another way would be to create a hidden widget in the Shaft Wizard dialog and write some data to it, triggering a slot
# in the python code
WizardShaftDlg = None
class WizardShaftGui:
def Activated(self):
global WizardShaftDlg
WizardShaftDlg = TaskWizardShaft(FreeCAD.ActiveDocument)
FreeCADGui.Control.showDialog(WizardShaftDlg)
def GetResources(self):
IconPath = FreeCAD.ConfigGet("AppHomePath") + "Mod/PartDesign/WizardShaft/WizardShaft.svg"
MenuText = 'Shaft design wizard...'
ToolTip = 'Start the shaft design wizard'
return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip}
def IsActive(self):
return FreeCAD.ActiveDocument != None
def __del__(self):
global WizardShaftDlg
WizardShaftDlg = None
class WizardShaftGuiCallback:
def Activated(self):
global WizardShaftDlg
if WizardShaftDlg != None and WizardShaftDlg.table != None:
WizardShaftDlg.table.finishEditConstraint()
def isActive(self):
global WizardShaftDlg
return (WizardShaftDlg is not None)
def GetResources(self):
IconPath = FreeCAD.ConfigGet("AppHomePath") + "Mod/PartDesign/WizardShaft/WizardShaft.svg"
MenuText = 'Shaft design wizard...'
ToolTip = 'Start the shaft design wizard'
return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip}
FreeCADGui.addCommand('PartDesign_WizardShaft', WizardShaftGui())
FreeCADGui.addCommand('PartDesign_WizardShaftCallBack', WizardShaftGuiCallback())
#Note: Start wizard in Python Console with
# Gui.runCommand('PartDesign_WizardShaft')