FEM: task panel show results: add principat stress temperature and user calculation input field
This commit is contained in:
parent
1d61226313
commit
e8143ab0cf
|
@ -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><html><head/><body><p>User Defined equation </p></body></html></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><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">P1-P3 # Stress intensity stress equation. Available values are numpy array format. Calculation np.funtion can be used on available values. </p></body></html></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>
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue
Block a user