Further implementation of Post-Processing
This commit is contained in:
parent
88f1c2c180
commit
cb63cba061
|
@ -140,6 +140,7 @@ def importFrd(filename):
|
|||
disp = m['Displacement']
|
||||
o = FreeCAD.ActiveDocument.addObject('Fem::FemResultVector','Displacement')
|
||||
o.Values = disp.values()
|
||||
o.DataType = 'Displacement'
|
||||
o.ElementNumbers = disp.keys()
|
||||
if(MeshObject):
|
||||
o.Mesh = MeshObject
|
||||
|
@ -153,12 +154,15 @@ def importFrd(filename):
|
|||
mstress.append( sqrt( pow( i[0] - i[1] ,2) + pow( i[1] - i[2] ,2) + pow( i[2] - i[0] ,2) + 6 * (pow(i[3],2)+pow(i[4],2)+pow(i[5],2) ) ) )
|
||||
|
||||
o.Values = mstress
|
||||
o.DataType = 'VanMisesStress'
|
||||
o.ElementNumbers = stress.keys()
|
||||
if(MeshObject):
|
||||
o.Mesh = MeshObject
|
||||
AnalysisObject.Member = AnalysisObject.Member + [o]
|
||||
if(FreeCAD.GuiUp):
|
||||
import FemGui
|
||||
import FemGui, FreeCADGui
|
||||
if FreeCADGui.activeWorkbench().name() != 'FemWorkbench':
|
||||
FreeCADGui.activateWorkbench("FemWorkbench")
|
||||
FemGui.setActiveAnalysis(AnalysisObject)
|
||||
|
||||
def insert(filename,docname):
|
||||
|
|
|
@ -20,8 +20,17 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
def DebugLoad():
|
||||
import MechanicalAnalysis,MechanicalMaterial
|
||||
reload(MechanicalAnalysis)
|
||||
reload(MechanicalMaterial)
|
||||
__title__="Mechanical Analysis managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://www.freecadweb.org"
|
||||
|
||||
|
||||
def colorValue(value,min,max):
|
||||
'creates a homogenouse color ramp between [min,max] green to red'
|
||||
if value < min: return (0.0,1.0,0.0)
|
||||
if value > max: return (1.0,0.0,0.0)
|
||||
if value < (min + (max-min)/2.0):
|
||||
return ((value-min) / ((max-min)/2.0),1.0,0.0)
|
||||
else:
|
||||
return (1.0,1-((value-min-((max-min)/2.0)) / ((max-min)/2.0)),0.0)
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
<file>icons/Fem_ResultStress.svg</file>
|
||||
<file>translations/Fem_af.qm</file>
|
||||
<file>translations/Fem_de.qm</file>
|
||||
<file>translations/Fem_fi.qm</file>
|
||||
<file>translations/Fem_fi.qm</file>
|
||||
<file>translations/Fem_fr.qm</file>
|
||||
<file>translations/Fem_hr.qm</file>
|
||||
<file>translations/Fem_it.qm</file>
|
||||
|
|
|
@ -69,8 +69,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const
|
|||
<< "Fem_ConstraintGear"
|
||||
<< "Fem_ConstraintPulley"
|
||||
<< "Separator"
|
||||
<< "Fem_ShowStressResult"
|
||||
<< "Fem_ShowDisplacementResult";
|
||||
<< "Fem_ShowResult";
|
||||
return root;
|
||||
}
|
||||
|
||||
|
@ -95,8 +94,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const
|
|||
<< "Fem_ConstraintGear"
|
||||
<< "Fem_ConstraintPulley"
|
||||
<< "Separator"
|
||||
<< "Fem_ShowStressResult"
|
||||
<< "Fem_ShowDisplacementResult"
|
||||
<< "Fem_ShowResult"
|
||||
;
|
||||
|
||||
return root;
|
||||
|
|
|
@ -46,3 +46,4 @@ ParGrp = App.ParamGet("System parameter:Modules").GetGroup("Fem")
|
|||
FreeCAD.addExportType("TetGen file (*.poly)","convert2TetGen")
|
||||
FreeCAD.addImportType("FEM formats (*.unv *.med *.dat *.bdf)","Fem")
|
||||
FreeCAD.addExportType("FEM formats (*.unv *.med *.dat *.inp)","Fem")
|
||||
FreeCAD.addImportType("CalculiX result (*.frd)","CalculixLib")
|
||||
|
|
|
@ -20,7 +20,8 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem, os,sys,string,math,shutil,glob,subprocess,tempfile
|
||||
import FreeCAD, Fem, FemLib
|
||||
import os,sys,string,math,shutil,glob,subprocess,tempfile
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui,FemGui
|
||||
|
@ -29,7 +30,7 @@ if FreeCAD.GuiUp:
|
|||
from pivy import coin
|
||||
import PyQt4.uic as uic
|
||||
|
||||
__title__="Machine-Distortion Analysis managment"
|
||||
__title__="Mechanical Analysis managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://www.freecadweb.org"
|
||||
|
||||
|
@ -100,47 +101,33 @@ class _CommandMechanicalJobControl:
|
|||
return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() != None
|
||||
|
||||
|
||||
class _CommandMechanicalShowStress:
|
||||
|
||||
class _CommandMechanicalShowResult:
|
||||
"the Fem JobControl command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Fem_ResultStress',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_ResultStress","Show stress result"),
|
||||
return {'Pixmap' : 'Fem_Result',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_ResultDisplacement","Show result"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_ResultStress","Show stress result")}
|
||||
|
||||
def Activated(self):
|
||||
import FemGui
|
||||
|
||||
taskd = _JobControlTaskPanel(FemGui.getActiveAnalysis())
|
||||
#taskd.obj = vobj.Object
|
||||
taskd.update()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
|
||||
|
||||
def IsActive(self):
|
||||
import FemGui
|
||||
return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() != None
|
||||
|
||||
|
||||
class _CommandMechanicalShowDisplacement:
|
||||
"the Fem JobControl command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Fem_ResultDisplacement',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_ResultDisplacement","Show displacement result"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_ResultDisplacement","Show displacement result")}
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_ResultDisplacement","Show result imformatation of an analysis")}
|
||||
|
||||
def Activated(self):
|
||||
import FemGui
|
||||
DisplacementObject = None
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemResultVector"):
|
||||
DisplacementObject = i
|
||||
if not DisplacementObject:
|
||||
QtGui.QMessageBox.critical(None, "Missing prerequisit","No displacement result in active Analysis")
|
||||
if i.DataType == 'Displacement':
|
||||
DisplacementObject = i
|
||||
StressObject = None
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemResultValue"):
|
||||
if i.DataType == 'VanMisesStress':
|
||||
StressObject = i
|
||||
|
||||
if not DisplacementObject and not StressObject:
|
||||
QtGui.QMessageBox.critical(None, "Missing prerequisit","No result found in active Analysis")
|
||||
return
|
||||
|
||||
taskd = _DisplacementControlTaskPanel(FemGui.getActiveAnalysis())
|
||||
taskd = _ResultControlTaskPanel(FemGui.getActiveAnalysis())
|
||||
#taskd.obj = vobj.Object
|
||||
taskd.update()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
|
@ -314,7 +301,7 @@ class _JobControlTaskPanel:
|
|||
#poisson_ratio = float(matmap['FEM_poissonratio'])
|
||||
|
||||
|
||||
class _DisplacementControlTaskPanel:
|
||||
class _ResultControlTaskPanel:
|
||||
'''The control for the displacement post-processing'''
|
||||
def __init__(self,object):
|
||||
# the panel has a tree widget that contains categories
|
||||
|
@ -328,8 +315,18 @@ class _DisplacementControlTaskPanel:
|
|||
self.formUi.setupUi(self.form)
|
||||
|
||||
#Connect Signals and Slots
|
||||
#QtCore.QObject.connect(self.formUi.toolButton_chooseOutputDir, QtCore.SIGNAL("clicked()"), self.chooseOutputDir)
|
||||
#QtCore.QObject.connect(self.formUi.pushButton_generate, QtCore.SIGNAL("clicked()"), self.run)
|
||||
QtCore.QObject.connect(self.formUi.radioButton_Displacement, QtCore.SIGNAL("clicked(bool)"), self.displacementClicked)
|
||||
QtCore.QObject.connect(self.formUi.radioButton_Stress, QtCore.SIGNAL("clicked(bool)"), self.stressClicked)
|
||||
QtCore.QObject.connect(self.formUi.radioButton_NoColor, QtCore.SIGNAL("clicked(bool)"), self.noColorClicked)
|
||||
QtCore.QObject.connect(self.formUi.checkBox_ShowDisplacement, QtCore.SIGNAL("clicked(bool)"), self.showDisplacementClicked)
|
||||
|
||||
QtCore.QObject.connect(self.formUi.verticalScrollBar_Factor, QtCore.SIGNAL("valueChanged(int)"), self.sliderValue)
|
||||
|
||||
QtCore.QObject.connect(self.formUi.spinBox_SliderFactor, QtCore.SIGNAL("valueChanged(double)"), self.sliderMaxValue)
|
||||
QtCore.QObject.connect(self.formUi.spinBox_DisplacementFactor, QtCore.SIGNAL("valueChanged(double)"), self.displacementFactorValue)
|
||||
|
||||
self.DisplacementObject = None
|
||||
self.StressObject = None
|
||||
|
||||
self.update()
|
||||
|
||||
|
@ -337,11 +334,88 @@ class _DisplacementControlTaskPanel:
|
|||
|
||||
def getStandardButtons(self):
|
||||
return int(QtGui.QDialogButtonBox.Close)
|
||||
|
||||
def displacementClicked(self,bool):
|
||||
QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor)
|
||||
self.setColorDisplacement()
|
||||
QtGui.qApp.restoreOverrideCursor()
|
||||
|
||||
def stressClicked(self,bool):
|
||||
print 'stressClicked()'
|
||||
QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor)
|
||||
self.setColorStress()
|
||||
QtGui.qApp.restoreOverrideCursor()
|
||||
|
||||
def noColorClicked(self,bool):
|
||||
self.MeshObject.ViewObject.NodeColor = {}
|
||||
self.MeshObject.ViewObject.ElementColor = {}
|
||||
|
||||
def showDisplacementClicked(self,bool):
|
||||
QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor)
|
||||
self.setDisplacement()
|
||||
QtGui.qApp.restoreOverrideCursor()
|
||||
|
||||
def sliderValue(self,value):
|
||||
if(self.formUi.checkBox_ShowDisplacement.isChecked()):
|
||||
self.MeshObject.ViewObject.animate(value)
|
||||
|
||||
self.formUi.spinBox_DisplacementFactor.setValue(value)
|
||||
|
||||
def sliderMaxValue(self,value):
|
||||
print 'sliderMaxValue()'
|
||||
self.formUi.verticalScrollBar_Factor.setMaximum(value)
|
||||
|
||||
def displacementFactorValue(self,value):
|
||||
print 'displacementFactorValue()'
|
||||
self.formUi.verticalScrollBar_Factor.setValue(value)
|
||||
|
||||
def setColorDisplacement(self):
|
||||
if self.DisplacementObject:
|
||||
values = self.DisplacementObject.Values
|
||||
maxL = 0.0
|
||||
for i in values:
|
||||
if i.Length > maxL:
|
||||
maxL = i.Length
|
||||
|
||||
self.formUi.lineEdit_Max.setText(str(maxL))
|
||||
self.formUi.doubleSpinBox_MinValueColor.setValue(maxL)
|
||||
|
||||
colors = []
|
||||
for i in values:
|
||||
colors.append( FemLib.colorValue(i.Length,0.0,maxL) )
|
||||
self.MeshObject.ViewObject.NodeColor = dict(zip( self.DisplacementObject.ElementNumbers,colors))
|
||||
def setDisplacement(self):
|
||||
if self.DisplacementObject:
|
||||
values = self.DisplacementObject.Values
|
||||
self.MeshObject.ViewObject.NodeDisplacement = dict(zip( self.DisplacementObject.ElementNumbers,values))
|
||||
|
||||
def setColorStress(self):
|
||||
if self.StressObject:
|
||||
values = self.StressObject.Values
|
||||
maxVal = max(values)
|
||||
self.formUi.doubleSpinBox_MinValueColor.setValue(maxVal)
|
||||
colors = []
|
||||
for i in values:
|
||||
colors.append( FemLib.colorValue(i,0.0,maxVal) )
|
||||
self.MeshObject.ViewObject.ElementColor = dict(zip(self.StressObject.ElementNumbers,colors))
|
||||
|
||||
def update(self):
|
||||
'fills the widgets'
|
||||
#self.formUi.lineEdit_outputDir.setText(self.params.GetString("JobDir",'/'))
|
||||
return
|
||||
|
||||
self.MeshObject = None
|
||||
if FemGui.getActiveAnalysis():
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemMeshObject"):
|
||||
self.MeshObject = i
|
||||
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemResultVector"):
|
||||
if i.DataType == 'Displacement':
|
||||
self.DisplacementObject = i
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemResultValue"):
|
||||
if i.DataType == 'VanMisesStress':
|
||||
self.StressObject = i
|
||||
|
||||
def accept(self):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
@ -357,5 +431,4 @@ class _DisplacementControlTaskPanel:
|
|||
|
||||
FreeCADGui.addCommand('Fem_NewMechanicalAnalysis',_CommandNewMechanicalAnalysis())
|
||||
FreeCADGui.addCommand('Fem_MechanicalJobControl',_CommandMechanicalJobControl())
|
||||
FreeCADGui.addCommand('Fem_ShowStressResult',_CommandMechanicalShowStress())
|
||||
FreeCADGui.addCommand('Fem_ShowDisplacementResult',_CommandMechanicalShowDisplacement())
|
||||
FreeCADGui.addCommand('Fem_ShowResult',_CommandMechanicalShowResult())
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
<string>Stress</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -37,6 +37,9 @@
|
|||
<property name="text">
|
||||
<string>Displacement</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
@ -44,6 +47,9 @@
|
|||
<property name="text">
|
||||
<string>No color</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
@ -56,7 +62,11 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_MinValueColor"/>
|
||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_MinValueColor">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
|
@ -67,6 +77,9 @@
|
|||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_MaxValueColor">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99999990.000000000000000</double>
|
||||
</property>
|
||||
|
@ -143,7 +156,7 @@
|
|||
<string>Show</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -158,6 +171,15 @@
|
|||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBox_DisplacementFactor">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>99999</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
|
@ -176,11 +198,17 @@
|
|||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBox_SliderFactor">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>99999</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>20</number>
|
||||
<number>100</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -207,7 +235,7 @@
|
|||
<item>
|
||||
<widget class="QScrollBar" name="verticalScrollBar_Factor">
|
||||
<property name="maximum">
|
||||
<number>20</number>
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="pageStep">
|
||||
<number>1</number>
|
||||
|
|
Loading…
Reference in New Issue
Block a user