diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 1eaf536310..2e83aaea85 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -615,26 +615,36 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): # - U1, U2, U3 - deformation # - Uabs - absolute deformation # - Sabs - Von Mises stress - # Prin1 Principal stress 1 - # Prin2 Principal stress 2 - # Prin3 Principal stress 3 - # MaxSear maximum shear stress + # - Prin1 - Principal stress 1 + # - Prin2 - Principal stress 2 + # - Prin3 - Principal stress 3 + # - MaxSear - maximum shear stress + # - Peeq - peeq strain + # - Temp - Temperature + # - MFlow - MassFlowRate + # - NPress - NetworkPressure # - None - always return (0.0, 0.0, 0.0) def get_stats(self, result_type): stats = (0.0, 0.0, 0.0) for m in self.analysis.Member: if m.isDerivedFrom("Fem::FemResultObject"): - match = {"U1": (m.Stats[0], m.Stats[1], m.Stats[2]), - "U2": (m.Stats[3], m.Stats[4], m.Stats[5]), - "U3": (m.Stats[6], m.Stats[7], m.Stats[8]), - "Uabs": (m.Stats[9], m.Stats[10], m.Stats[11]), - "Sabs": (m.Stats[12], m.Stats[13], m.Stats[14]), - "MaxPrin": (m.Stats[15], m.Stats[16], m.Stats[17]), - "MidPrin": (m.Stats[18], m.Stats[19], m.Stats[20]), - "MinPrin": (m.Stats[21], m.Stats[22], m.Stats[23]), - "MaxShear": (m.Stats[24], m.Stats[25], m.Stats[26]), - "None": (0.0, 0.0, 0.0)} - stats = match[result_type] + match_table = { + "U1": (m.Stats[0], m.Stats[1], m.Stats[2]), + "U2": (m.Stats[3], m.Stats[4], m.Stats[5]), + "U3": (m.Stats[6], m.Stats[7], m.Stats[8]), + "Uabs": (m.Stats[9], m.Stats[10], m.Stats[11]), + "Sabs": (m.Stats[12], m.Stats[13], m.Stats[14]), + "MaxPrin": (m.Stats[15], m.Stats[16], m.Stats[17]), + "MidPrin": (m.Stats[18], m.Stats[19], m.Stats[20]), + "MinPrin": (m.Stats[21], m.Stats[22], m.Stats[23]), + "MaxShear": (m.Stats[24], m.Stats[25], m.Stats[26]), + "Peeq": (m.Stats[27], m.Stats[28], m.Stats[29]), + "Temp": (m.Stats[30], m.Stats[31], m.Stats[32]), + "MFlow": (m.Stats[33], m.Stats[34], m.Stats[35]), + "NPress": (m.Stats[36], m.Stats[37], m.Stats[38]), + "None": (0.0, 0.0, 0.0) + } + stats = match_table[result_type] return stats diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemResultShow.py b/src/Mod/Fem/PyGui/_TaskPanelFemResultShow.py index 9d16c32d51..08f16874bb 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemResultShow.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemResultShow.py @@ -149,17 +149,22 @@ class _TaskPanelFemResultShow: def get_result_stats(self, type_name, analysis=None): if "Stats" in self.result_obj.PropertiesList: Stats = self.result_obj.Stats - match_table = {"U1": (Stats[0], Stats[1], Stats[2]), - "U2": (Stats[3], Stats[4], Stats[5]), - "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]), - "Peeq": (Stats[27], Stats[28], Stats[29]), - "None": (0.0, 0.0, 0.0)} + match_table = { + "U1": (Stats[0], Stats[1], Stats[2]), + "U2": (Stats[3], Stats[4], Stats[5]), + "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]), + "Peeq": (Stats[27], Stats[28], Stats[29]), + "Temp": (Stats[30], Stats[31], Stats[32]), + "MFlow": (Stats[33], Stats[34], Stats[35]), + "NPress": (Stats[36], Stats[37], Stats[38]), + "None": (0.0, 0.0, 0.0) + } return match_table[type_name] return (0.0, 0.0, 0.0) @@ -216,9 +221,7 @@ class _TaskPanelFemResultShow: QApplication.setOverrideCursor(Qt.WaitCursor) if self.suitable_results: self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.Temperature) - minm = min(self.result_obj.Temperature) - avg = sum(self.result_obj.Temperature) / len(self.result_obj.Temperature) - maxm = max(self.result_obj.Temperature) + (minm, avg, maxm) = self.get_result_stats("Temp") self.set_result_stats("K", minm, avg, maxm) QtGui.qApp.restoreOverrideCursor() @@ -227,9 +230,7 @@ class _TaskPanelFemResultShow: QApplication.setOverrideCursor(Qt.WaitCursor) if self.suitable_results: self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.MassFlowRate) - minm = min(self.result_obj.MassFlowRate) - avg = sum(self.result_obj.MassFlowRate) / len(self.result_obj.MassFlowRate) - maxm = max(self.result_obj.MassFlowRate) + (minm, avg, maxm) = self.get_result_stats("MFlow") self.set_result_stats("kg/s", minm, avg, maxm) QtGui.qApp.restoreOverrideCursor() @@ -238,9 +239,7 @@ class _TaskPanelFemResultShow: QApplication.setOverrideCursor(Qt.WaitCursor) if self.suitable_results: self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.NetworkPressure) - minm = min(self.result_obj.NetworkPressure) - avg = sum(self.result_obj.NetworkPressure) / len(self.result_obj.NetworkPressure) - maxm = max(self.result_obj.NetworkPressure) + (minm, avg, maxm) = self.get_result_stats("NPress") self.set_result_stats("MPa", minm, avg, maxm) QtGui.qApp.restoreOverrideCursor() diff --git a/src/Mod/Fem/importToolsFem.py b/src/Mod/Fem/importToolsFem.py index b762950036..35bc61ed15 100644 --- a/src/Mod/Fem/importToolsFem.py +++ b/src/Mod/Fem/importToolsFem.py @@ -190,6 +190,7 @@ def make_femmesh(mesh_data): def fill_femresult_mechanical(results, result_set, span): ''' fills an FreeCAD FEM mechanical result object with result data ''' + no_of_values = None if 'number' in result_set: eigenmode_number = result_set['number'] @@ -295,6 +296,8 @@ def fill_femresult_mechanical(results, result_set, span): if 'mflow' in result_set: MassFlow = result_set['mflow'] + if not no_of_values: + no_of_values = len(MassFlow) if len(MassFlow) > 0: results.MassFlowRate = list(map((lambda x: x), MassFlow.values())) results.Time = step_time @@ -310,19 +313,20 @@ def fill_femresult_mechanical(results, result_set, span): a_max = a_min = a_avg = 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 = peeq_min = peeq_avg = peeq_max = 0 + temp_min = temp_avg = temp_max = mflow_min = mflow_avg = mflow_max = npress_min = npress_avg = npress_max = 0 if results.DisplacementVectors: x_max, y_max, z_max = map(max, zip(*displacement)) 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] - a_max = max(results.DisplacementLengths) a_min = min(results.DisplacementLengths) a_avg = sum(results.DisplacementLengths) / no_of_values + a_max = max(results.DisplacementLengths) if results.StressValues: - s_max = max(results.StressValues) s_min = min(results.StressValues) s_avg = sum(results.StressValues) / no_of_values + s_max = max(results.StressValues) if results.PrincipalMax: p1_min = min(results.PrincipalMax) p1_avg = sum(results.PrincipalMax) / no_of_values @@ -340,9 +344,21 @@ def fill_femresult_mechanical(results, result_set, span): 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 + peeq_max = max(results.Peeq) + if results.Temperature: + temp_min = min(results.Temperature) + temp_avg = sum(results.Temperature) / no_of_values + temp_max = max(results.Temperature) + if results.MassFlowRate: + mflow_min = min(results.MassFlowRate) + mflow_avg = sum(results.MassFlowRate) / no_of_values + mflow_max = max(results.MassFlowRate) + if results.NetworkPressure: + npress_min = min(results.NetworkPressure) + npress_avg = sum(results.NetworkPressure) / no_of_values + npress_max = max(results.NetworkPressure) results.Stats = [x_min, x_avg, x_max, y_min, y_avg, y_max, @@ -353,7 +369,13 @@ def fill_femresult_mechanical(results, result_set, span): p2_min, p2_avg, p2_max, p3_min, p3_avg, p3_max, ms_min, ms_avg, ms_max, - peeq_min, peeq_avg, peeq_max] + peeq_min, peeq_avg, peeq_max, + temp_min, temp_avg, temp_max, + mflow_min, mflow_avg, mflow_max, + npress_min, npress_avg, npress_max] + # do not forget to adapt the def get_stats in FemTools and _TaskPanelFemResultShow module as well as the TestFem module + # stat_types = ["U1", "U2", "U3", "Uabs", "Sabs", "MaxPrin", "MidPrin", "MinPrin", "MaxShear", "Peeq", "Temp", "MFlow", "NPress"] + # TODO a dictionary would be far robust than a list, but needs adapten in VTK too because of VTK result import return results