FEM: task panel show results: add principat stress temperature and user calculation input field

This commit is contained in:
vdwalts 2016-08-01 21:58:04 +01:00 committed by wmayer
parent 1d61226313
commit e8143ab0cf
2 changed files with 170 additions and 10 deletions

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>331</width>
<height>431</height>
<width>446</width>
<height>603</height>
</rect>
</property>
<property name="windowTitle">
@ -24,6 +24,13 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="0">
<widget class="QRadioButton" name="rb_max_shear_stress">
<property name="text">
<string>Max shear stress(Tresca)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rb_y_displacement">
<property name="text">
@ -45,7 +52,21 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="rb_vm_stress">
<property name="text">
<string>Von Mises stress</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QRadioButton" name="rb_maxprin">
<property name="text">
<string>Max Principal stress</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="rb_none">
<property name="text">
<string>None</string>
@ -55,13 +76,6 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="rb_vm_stress">
<property name="text">
<string>Von Mises stress</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="rb_abs_displacement">
<property name="text">
@ -69,6 +83,20 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QRadioButton" name="rb_minprin">
<property name="text">
<string>Min Principal stress</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QRadioButton" name="rb_temperature">
<property name="text">
<string>Temperature</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -231,6 +259,42 @@
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="user_def_head">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User Defined equation &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="user_def_text">
<property name="text">
<string>Available: Disp(x,y,z) Principal stresses (P1,P2,P3)</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="user_def_eq">
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;P1-P3 # Stress intensity stress equation. Available values are numpy array format. Calculation np.funtion can be used on available values. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="calculate">
<property name="text">
<string>Calculate and plot</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>

View File

@ -27,6 +27,7 @@ __url__ = "http://www.freecadweb.org"
import FreeCAD
import FemTools
import numpy as np
if FreeCAD.GuiUp:
import FreeCADGui
@ -51,6 +52,13 @@ class _TaskPanelShowResult:
QtCore.QObject.connect(self.form.rb_abs_displacement, QtCore.SIGNAL("toggled(bool)"), self.abs_displacement_selected)
QtCore.QObject.connect(self.form.rb_vm_stress, QtCore.SIGNAL("toggled(bool)"), self.vm_stress_selected)
QtCore.QObject.connect(self.form.rb_max_shear_stress, QtCore.SIGNAL("toggled(bool)"), self.max_shear_selected)
QtCore.QObject.connect(self.form.rb_maxprin, QtCore.SIGNAL("toggled(bool)"), self.max_prin_selected)
QtCore.QObject.connect(self.form.rb_minprin, QtCore.SIGNAL("toggled(bool)"), self.min_prin_selected)
QtCore.QObject.connect(self.form.rb_temperature, QtCore.SIGNAL("toggled(bool)"), self.temperature_selected)
QtCore.QObject.connect(self.form.user_def_eq, QtCore.SIGNAL("textchanged()"), self.user_defined_text)
QtCore.QObject.connect(self.form.calculate, QtCore.SIGNAL("clicked()"), self.calculate)
QtCore.QObject.connect(self.form.cb_show_displacement, QtCore.SIGNAL("clicked(bool)"), self.show_displacement)
QtCore.QObject.connect(self.form.hsb_displacement_factor, QtCore.SIGNAL("valueChanged(int)"), self.hsb_disp_factor_changed)
QtCore.QObject.connect(self.form.sb_displacement_factor, QtCore.SIGNAL("valueChanged(int)"), self.sb_disp_factor_changed)
@ -83,6 +91,18 @@ class _TaskPanelShowResult:
elif rt == "Sabs":
self.form.rb_vm_stress.setChecked(True)
self.vm_stress_selected(True)
elif rt == "MaxShear":
self.form.rb_max_shear.setChecked(True)
self.rb_max_shear(True)
elif rt == "MaxPrin":
self.form.rb_maxprin.setChecked(True)
self.rb_maxprin(True)
elif rt == "Temp":
self.form.rb_temperature.setChecked(True)
self.rb_temperature(True)
elif rt == "MinPrin":
self.form.rb_minprin.setChecked(True)
self.rb_minprin(True)
sd = FreeCAD.FEM_dialog["show_disp"]
self.form.cb_show_displacement.setChecked(sd)
@ -115,6 +135,10 @@ class _TaskPanelShowResult:
"U3": (Stats[6], Stats[7], Stats[8]),
"Uabs": (Stats[9], Stats[10], Stats[11]),
"Sabs": (Stats[12], Stats[13], Stats[14]),
"MaxPrin": (Stats[15], Stats[16], Stats[17]),
"MidPrin": (Stats[18], Stats[19], Stats[20]),
"MinPrin": (Stats[21], Stats[22], Stats[23]),
"MaxShear": (Stats[24], Stats[25], Stats[26]),
"None": (0.0, 0.0, 0.0)}
return match_table[type_name]
return (0.0, 0.0, 0.0)
@ -150,6 +174,75 @@ class _TaskPanelShowResult:
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.qApp.restoreOverrideCursor()
def max_shear_selected(self, state):
FreeCAD.FEM_dialog["results_type"] = "MaxShear"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.NodeNumbers, self.result_object.MaxShear)
(minm, avg, maxm) = self.get_result_stats("MaxShear")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.qApp.restoreOverrideCursor()
def max_prin_selected(self, state):
FreeCAD.FEM_dialog["results_type"] = "MaxPrin"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.NodeNumbers, self.result_object.PrincipalMax)
(minm, avg, maxm) = self.get_result_stats("MaxPrin")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.qApp.restoreOverrideCursor()
def temperature_selected(self, state):
FreeCAD.FEM_dialog["results_type"] = "Temp"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.NodeNumbers, self.result_object.Temperature)
minm = min(self.result_object.Temperature)
avg = sum(self.result_object.Temperature) / len(self.result_object.Temperature)
maxm = max(self.result_object.Temperature)
self.set_result_stats("K", minm, avg, maxm)
QtGui.qApp.restoreOverrideCursor()
def min_prin_selected(self, state):
FreeCAD.FEM_dialog["results_type"] = "MinPrin"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.NodeNumbers, self.result_object.PrincipalMin)
(minm, avg, maxm) = self.get_result_stats("MinPrin")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.qApp.restoreOverrideCursor()
def user_defined_text(self, equation):
FreeCAD.FEM_dialog["results_type"] = "user"
eq = self.form.user_def_eq.toPlainText()
def calculate(self):
FreeCAD.FEM_dialog["results_type"] = "None"
self.update()
self.restore_result_dialog()
# Convert existing values to numpy array
P1 = np.array(self.result_object.PrincipalMax)
P2 = np.array(self.result_object.PrincipalMed)
P3 = np.array(self.result_object.PrincipalMin)
Von = np.array(self.result_object.StressValues)
T = np.array(self.result_object.Temperature)
dispvectors = np.array(self.result_object.DisplacementVectors)
x = np.array(dispvectors[:, 0])
y = np.array(dispvectors[:, 1])
z = np.array(dispvectors[:, 2])
userdefined_eq = self.form.user_def_eq.toPlainText() # Get equation to be used
UserDefinedFormula = eval(userdefined_eq).tolist()
minm = min(UserDefinedFormula)
avg = sum(UserDefinedFormula) / len(UserDefinedFormula)
maxm = max(UserDefinedFormula)
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.NodeNumbers, UserDefinedFormula)
self.set_result_stats("", minm, avg, maxm)
QtGui.qApp.restoreOverrideCursor()
def select_displacement_type(self, disp_type):
QApplication.setOverrideCursor(Qt.WaitCursor)
if disp_type == "Uabs":
@ -208,6 +301,9 @@ class _TaskPanelShowResult:
def update(self):
self.MeshObject = None
self.result_object = get_results_object(FreeCADGui.Selection.getSelection())
# Disable temperature radio button if it does ot exist in results
if len(self.result_object.Temperature) == 1:
self.form.rb_temperature.setEnabled(0)
for i in FemGui.getActiveAnalysis().Member:
if i.isDerivedFrom("Fem::FemMeshObject"):
@ -216,7 +312,7 @@ class _TaskPanelShowResult:
self.suitable_results = False
if self.result_object:
if self.MeshObject.FemMesh.NodeCount == len(self.result_object.NodeNumbers):
if (self.MeshObject.FemMesh.NodeCount == len(self.result_object.NodeNumbers)):
self.suitable_results = True
else:
if not self.MeshObject.FemMesh.VolumeCount: