From e8143ab0cff14e81c94e321099aca18ca18e84d5 Mon Sep 17 00:00:00 2001 From: vdwalts Date: Mon, 1 Aug 2016 21:58:04 +0100 Subject: [PATCH] FEM: task panel show results: add principat stress temperature and user calculation input field --- src/Mod/Fem/TaskPanelShowResult.ui | 82 +++++++++++++++++++++--- src/Mod/Fem/_TaskPanelShowResult.py | 98 ++++++++++++++++++++++++++++- 2 files changed, 170 insertions(+), 10 deletions(-) diff --git a/src/Mod/Fem/TaskPanelShowResult.ui b/src/Mod/Fem/TaskPanelShowResult.ui index 436bc54db2..af2b547d06 100644 --- a/src/Mod/Fem/TaskPanelShowResult.ui +++ b/src/Mod/Fem/TaskPanelShowResult.ui @@ -6,8 +6,8 @@ 0 0 - 331 - 431 + 446 + 603 @@ -24,6 +24,13 @@ + + + + Max shear stress(Tresca) + + + @@ -45,7 +52,21 @@ + + + + Von Mises stress + + + + + + Max Principal stress + + + + None @@ -55,13 +76,6 @@ - - - - Von Mises stress - - - @@ -69,6 +83,20 @@ + + + + Min Principal stress + + + + + + + Temperature + + + @@ -231,6 +259,42 @@ + + + + + + <html><head/><body><p>User Defined equation </p></body></html> + + + + + + + Available: Disp(x,y,z) Principal stresses (P1,P2,P3) + + + + + + + <!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> + + + + + + + Calculate and plot + + + + + diff --git a/src/Mod/Fem/_TaskPanelShowResult.py b/src/Mod/Fem/_TaskPanelShowResult.py index 8d541b35fd..31cfa467d3 100644 --- a/src/Mod/Fem/_TaskPanelShowResult.py +++ b/src/Mod/Fem/_TaskPanelShowResult.py @@ -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: