From a8ded939ff4463c41c7cc71c1d9c46982233e953 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 28 Feb 2017 11:50:40 +0100 Subject: [PATCH] FEM: result task panel, add peeq strain results and add peeq to result stats, by sodelo --- src/Mod/Fem/PyGui/TaskPanelShowResult.ui | 755 +++++++++++----------- src/Mod/Fem/PyGui/_TaskPanelShowResult.py | 24 +- src/Mod/Fem/importCcxFrdResults.py | 43 +- src/Mod/Fem/importZ88O2Results.py | 20 +- 4 files changed, 427 insertions(+), 415 deletions(-) diff --git a/src/Mod/Fem/PyGui/TaskPanelShowResult.ui b/src/Mod/Fem/PyGui/TaskPanelShowResult.ui index 8940a5e5fd03..6c3bb69560ea 100644 --- a/src/Mod/Fem/PyGui/TaskPanelShowResult.ui +++ b/src/Mod/Fem/PyGui/TaskPanelShowResult.ui @@ -7,405 +7,408 @@ 0 0 446 - 898 + 696 Show result - + - - - Result type - - - - - - - - None - - - true - - - - - - - Temperature - - - - - - - Abs displacement - - - - - - - Von Mises stress - - - - - - - X displacement - - - - - - - Max Principal stress - - - - - - - Y displacement - - - - - - - Min Principal stress - - - - - - - Z displacement - - - - - - - Max shear stress(Tresca) - - - - - - - Mass Flow Rate - - - - - - - Network Pressure - - - - - - - - - - - Min: - - - - - - - true - - - mm - - - - - - - + + + + + Result type + + - - - Avg: - - + + + + + Abs displacement + + + + + + + None + + + true + + + + + + + Y displacement + + + + + + + X displacement + + + + + + + Peeq + + + + + + + Z displacement + + + + + + + Temperature + + + + + + + Von Mises stress + + + + + + + Max Principal stress + + + + + + + Min Principal stress + + + + + + + Max shear stress(Tresca) + + + + + + + Mass Flow Rate + + + + + + + Network Pressure + + + + - - - true - - - mm - - + + + + + Avg: + + + + + + + true + + + mm + + + + + + + Max: + + + + + + + true + + + mm + + + + + + + true + + + mm + + + + + + + Min: + + + + - - - + + + + + + Displacement + + - - - Max: - - + + + + + Show + + + false + + + + + + + false + + + + 0 + 0 + + + + Qt::Horizontal + + + + - - - true - - - mm - - - - - - - - - - - - Displacement - - - - - - - - Show - - - false - - + + + + + false + + + Factor: + + + + + + + false + + + false + + + 99999 + + + 10 + + + 1 + + + + - - - false - - - - 0 - 0 - - - - Qt::Horizontal - - + + + + + false + + + Slider max: + + + + + + + false + + + false + + + 99999 + + + 10 + + + 100 + + + + - - - + + + + + + User defined equation + + - - - false - - - Factor: - - - - - - - false - - - false - - - 99999 - - - 10 - - - 1 - - - - - - - - - - - false - - - Slider max: - - - - - - - false - - - false - - - 99999 - - - 10 - - - 100 - - - - - - - - - - - - User defined equation - - - - - - - - Calculate and plot - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + + + + + Calculate and plot + + + + + + + <!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> - - - - - - - <html><head/><body><p><span style=" text-decoration: underline;">Available result types:</span></p></body></html> - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - 1 - - - <html><head/><body><p>displacement (x,y,z) and strain (ex,ey,ez)</p></body></html> - - - false - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - -1 - - - Qt::NoTextInteraction - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - 1 - - - <html><head/><body><p>stresses (sx,sy,sz) and principal stresses (P1,P2,P3)</p></body></html> - - - false - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - -1 - - - Qt::NoTextInteraction - - +</style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; 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;"><span style=" font-family:'Ubuntu'; font-size:11pt;">P1-P3 # Stress intensity stress equation. Available values are numpy array format. Calculation np.funtion can be used on available values. </span></p></body></html> + + + + + + + <html><head/><body><p><span style=" text-decoration: underline;">Available result types:</span></p></body></html> + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + 1 + + + <html><head/><body><p>displacement (x,y,z) and strain (ex,ey,ez)</p></body></html> + + + false + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + -1 + + + Qt::NoTextInteraction + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + 1 + + + <html><head/><body><p>stresses (sx,sy,sz) and principal stresses (P1,P2,P3)</p></body></html> + + + false + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + -1 + + + Qt::NoTextInteraction + + + + - - - - - - - - Qt::Vertical - - - - 20 - 92 - - - + + + + + + Qt::Vertical + + + + 20 + 240 + + + + + diff --git a/src/Mod/Fem/PyGui/_TaskPanelShowResult.py b/src/Mod/Fem/PyGui/_TaskPanelShowResult.py index 617bb666b0e1..6c5d835d1708 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelShowResult.py +++ b/src/Mod/Fem/PyGui/_TaskPanelShowResult.py @@ -63,8 +63,7 @@ def __init__(self, obj): QtCore.QObject.connect(self.form.rb_max_shear_stress, QtCore.SIGNAL("toggled(bool)"), self.max_shear_selected) QtCore.QObject.connect(self.form.rb_massflowrate, QtCore.SIGNAL("toggled(bool)"), self.massflowrate_selected) QtCore.QObject.connect(self.form.rb_networkpressure, QtCore.SIGNAL("toggled(bool)"), self.networkpressure_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.rb_peeq, QtCore.SIGNAL("toggled(bool)"), self.peeq_selected) # displacement QtCore.QObject.connect(self.form.cb_show_displacement, QtCore.SIGNAL("clicked(bool)"), self.show_displacement) @@ -121,6 +120,9 @@ def restore_result_dialog(self): elif rt == "NPress": self.form.rb_networkpressure.setChecked(True) self.networkpressure_selected(True) + elif rt == "Peeq": + self.form.rb_peeq.setChecked(True) + self.peeq_selected(True) sd = FreeCAD.FEM_dialog["show_disp"] self.form.cb_show_displacement.setChecked(sd) @@ -156,6 +158,7 @@ def get_result_stats(self, type_name, analysis=None): "MidPrin": (Stats[18], Stats[19], Stats[20]), "MinPrin": (Stats[21], Stats[22], Stats[23]), "MaxShear": (Stats[24], Stats[25], Stats[26]), + "Peeq": (Stats[27], Stats[28], Stats[29]), "None": (0.0, 0.0, 0.0)} return match_table[type_name] return (0.0, 0.0, 0.0) @@ -250,6 +253,15 @@ def min_prin_selected(self, state): self.set_result_stats("MPa", minm, avg, maxm) QtGui.qApp.restoreOverrideCursor() + def peeq_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "Peeq" + QApplication.setOverrideCursor(Qt.WaitCursor) + if self.suitable_results: + self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.Peeq) + (minm, avg, maxm) = self.get_result_stats("Peeq") + self.set_result_stats("", minm, avg, maxm) + QtGui.qApp.restoreOverrideCursor() + def user_defined_text(self, equation): FreeCAD.FEM_dialog["results_type"] = "user" self.form.user_def_eq.toPlainText() @@ -263,6 +275,7 @@ def calculate(self): P2 = np.array(self.result_obj.PrincipalMed) P3 = np.array(self.result_obj.PrincipalMin) Von = np.array(self.result_obj.StressValues) + Peeq = np.array(self.result_obj.Peeq) T = np.array(self.result_obj.Temperature) MF = np.array(self.result_obj.MassFlowRate) NP = np.array(self.result_obj.NetworkPressure) @@ -290,7 +303,7 @@ def calculate(self): self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, UserDefinedFormula) self.set_result_stats("", minm, avg, maxm) QtGui.qApp.restoreOverrideCursor() - del x, y, z, T, Von, P1, P2, P3, sx, sy, sz, ex, ey, ez, MF, NP # Dummy use to get around flake8, varibles not being used + del x, y, z, T, Von, Peeq, P1, P2, P3, sx, sy, sz, ex, ey, ez, MF, NP # Dummy use to get around flake8, varibles not being used def select_displacement_type(self, disp_type): QApplication.setOverrideCursor(Qt.WaitCursor) @@ -358,7 +371,8 @@ def disable_empty_result_buttons(self): PrincipalMin --> rb_minprin MaxShear --> rb_max_shear_stress MassFlowRate --> rb_massflowrate - NetworkPressure --> rb_networkpressure''' + NetworkPressure --> rb_networkpressure + Peeq --> rb_peeq''' if len(self.result_obj.DisplacementLengths) == 0: self.form.rb_abs_displacement.setEnabled(0) if len(self.result_obj.DisplacementVectors) == 0: @@ -379,6 +393,8 @@ def disable_empty_result_buttons(self): self.form.rb_massflowrate.setEnabled(0) if len(self.result_obj.NetworkPressure) == 0: self.form.rb_networkpressure.setEnabled(0) + if len(self.result_obj.Peeq) == 0: + self.form.rb_peeq.setEnabled(0) def update(self): self.suitable_results = False diff --git a/src/Mod/Fem/importCcxFrdResults.py b/src/Mod/Fem/importCcxFrdResults.py index 7c09ba1514d9..216c8f246ef0 100644 --- a/src/Mod/Fem/importCcxFrdResults.py +++ b/src/Mod/Fem/importCcxFrdResults.py @@ -174,6 +174,21 @@ def importFrd(filename, analysis=None, result_name_prefix=None): .format(results.NodeNumbers, len(results.StressValues))) results.NodeNumbers = stress.keys() + # Read Equivalent Plastic strain if they exist + if 'peeq' in result_set: + Peeq = result_set['peeq'] + if len(Peeq) > 0: + if len(Peeq.values()) != len(disp.values()): + Pe = [] + Pe_extra_nodes = Peeq.values() + nodes = len(disp.values()) + for i in range(nodes): + Pe_value = Pe_extra_nodes[i] + Pe.append(Pe_value) + results.Peeq = Pe + else: + results.Peeq = Peeq.values() + x_min, y_min, z_min = map(min, zip(*displacement)) sum_list = map(sum, zip(*displacement)) x_avg, y_avg, z_avg = [i / no_of_values for i in sum_list] @@ -193,6 +208,14 @@ def importFrd(filename, analysis=None, result_name_prefix=None): ms_min = min(results.MaxShear) ms_avg = sum(results.MaxShear) / no_of_values ms_max = max(results.MaxShear) + if results.Peeq: + peeq_max = max(results.Peeq) + peeq_min = min(results.Peeq) + peeq_avg = sum(results.Peeq) / no_of_values + else: + peeq_max = 0 + peeq_min = 0 + peeq_avg = 0 disp_abs = [] for d in displacement: @@ -211,24 +234,8 @@ def importFrd(filename, analysis=None, result_name_prefix=None): p1_min, p1_avg, p1_max, p2_min, p2_avg, p2_max, p3_min, p3_avg, p3_max, - ms_min, ms_avg, ms_max] - except: - pass - - # Read Equivalent Plastic strain if they exist - try: - Peeq = result_set['peeq'] - if len(Peeq) > 0: - if len(Peeq.values()) != len(disp.values()): - Pe = [] - Pe_extra_nodes = Peeq.values() - nodes = len(disp.values()) - for i in range(nodes): - Pe_value = Pe_extra_nodes[i] - Pe.append(Pe_value) - results.Peeq = Pe - else: - results.Peeq = Peeq.values() + ms_min, ms_avg, ms_max, + peeq_min, peeq_avg, peeq_max] except: pass diff --git a/src/Mod/Fem/importZ88O2Results.py b/src/Mod/Fem/importZ88O2Results.py index 70f4acf939df..5b660aa952e1 100644 --- a/src/Mod/Fem/importZ88O2Results.py +++ b/src/Mod/Fem/importZ88O2Results.py @@ -105,22 +105,7 @@ def import_z88_disp(filename, analysis=None, result_name_prefix=None): # set stats of not imported values to 0 s_max = s_min = s_avg = 0 p1_min = p1_avg = p1_max = p2_min = p2_avg = p2_max = p3_min = p3_avg = p3_max = 0 - ms_min = ms_avg = ms_max = 0 - # s_max = max(results.StressValues) - # s_min = min(results.StressValues) - # s_avg = sum(results.StressValues) / no_of_values - # p1_min = min(results.PrincipalMax) - # p1_avg = sum(results.PrincipalMax) / no_of_values - # p1_max = max(results.PrincipalMax) - # p2_min = min(results.PrincipalMed) - # p2_avg = sum(results.PrincipalMed) / no_of_values - # p2_max = max(results.PrincipalMed) - # p3_min = min(results.PrincipalMin) - # p3_avg = sum(results.PrincipalMin) / no_of_values - # p3_max = max(results.PrincipalMin) - # ms_min = min(results.MaxShear) - # ms_avg = sum(results.MaxShear) / no_of_values - # ms_max = max(results.MaxShear) + ms_min = ms_avg = ms_max = peeq_min = peeq_avg = peeq_max = 0 disp_abs = [] for d in displacement: @@ -139,7 +124,8 @@ def import_z88_disp(filename, analysis=None, result_name_prefix=None): p1_min, p1_avg, p1_max, p2_min, p2_avg, p2_max, p3_min, p3_avg, p3_max, - ms_min, ms_avg, ms_max] + ms_min, ms_avg, ms_max, + peeq_min, peeq_avg, peeq_max] analysis_object.Member = analysis_object.Member + [results] if(FreeCAD.GuiUp):