Further implementation of Post-Processing

This commit is contained in:
jriegel 2014-01-03 17:30:38 +01:00
parent 88f1c2c180
commit cb63cba061
7 changed files with 167 additions and 54 deletions

View File

@ -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):

View File

@ -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)

View File

@ -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>

View 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;

View File

@ -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")

View File

@ -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())

View File

@ -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>