From e3a7a7955eb7de120ac422fa3712887e121c013d Mon Sep 17 00:00:00 2001 From: Przemo Firszt Date: Fri, 9 Oct 2015 12:11:55 +0100 Subject: [PATCH] FEM: Move _ResultControlTaskPanel class to separate file Signed-off-by: Przemo Firszt --- src/Mod/Fem/App/CMakeLists.txt | 1 + src/Mod/Fem/CMakeLists.txt | 1 + src/Mod/Fem/MechanicalAnalysis.py | 190 +---------------------- src/Mod/Fem/_ResultControlTaskPanel.py | 206 +++++++++++++++++++++++++ 4 files changed, 212 insertions(+), 186 deletions(-) create mode 100644 src/Mod/Fem/_ResultControlTaskPanel.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 7b0e5b08e..f81e27ed8 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -82,6 +82,7 @@ SET(FemScripts_SRCS MechanicalMaterial.ui MechanicalMaterial.py ShowDisplacement.ui + _ResultControlTaskPanel.py ) #SOURCE_GROUP("Scripts" FILES ${FemScripts_SRCS}) diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index b97947cc6..d2c4ef75a 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -24,6 +24,7 @@ INSTALL( MechanicalMaterial.ui MechanicalAnalysis.ui ShowDisplacement.ui + _ResultControlTaskPanel.py DESTINATION Mod/Fem ) diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index 8305612f6..94dca5204 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -168,7 +168,8 @@ class _CommandQuickAnalysis: def show_results_on_mesh(self): #FIXME proprer mesh refreshing as per FreeCAD.FEM_dialog settings required # or confirmation that it's safe to call restore_result_dialog - tp = _ResultControlTaskPanel() + import _ResultControlTaskPanel + tp = _ResultControlTaskPanel._ResultControlTaskPanel() tp.restore_result_dialog() def IsActive(self): @@ -218,7 +219,8 @@ class _CommandMechanicalShowResult: QtGui.QMessageBox.critical(None, "Missing prerequisite", "No result found in active Analysis") return - taskd = _ResultControlTaskPanel() + import _ResultControlTaskPanel + taskd = _ResultControlTaskPanel._ResultControlTaskPanel() FreeCADGui.Control.showDialog(taskd) def IsActive(self): @@ -491,190 +493,6 @@ class _JobControlTaskPanel: QApplication.restoreOverrideCursor() -class _ResultControlTaskPanel: - '''The control for the displacement post-processing''' - def __init__(self): - self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/ShowDisplacement.ui") - - #Connect Signals and Slots - QtCore.QObject.connect(self.form.rb_none, QtCore.SIGNAL("toggled(bool)"), self.none_selected) - QtCore.QObject.connect(self.form.rb_x_displacement, QtCore.SIGNAL("toggled(bool)"), self.x_displacement_selected) - QtCore.QObject.connect(self.form.rb_y_displacement, QtCore.SIGNAL("toggled(bool)"), self.y_displacement_selected) - QtCore.QObject.connect(self.form.rb_z_displacement, QtCore.SIGNAL("toggled(bool)"), self.z_displacement_selected) - 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.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) - QtCore.QObject.connect(self.form.sb_displacement_factor_max, QtCore.SIGNAL("valueChanged(int)"), self.sb_disp_factor_max_changed) - - self.update() - self.restore_result_dialog() - - def restore_result_dialog(self): - try: - rt = FreeCAD.FEM_dialog["results_type"] - if rt == "None": - self.form.rb_none.setChecked(True) - self.none_selected(True) - elif rt == "Uabs": - self.form.rb_abs_displacement.setChecked(True) - self.abs_displacement_selected(True) - elif rt == "U1": - self.form.rb_x_displacement.setChecked(True) - self.x_displacement_selected(True) - elif rt == "U2": - self.form.rb_y_displacement.setChecked(True) - self.y_displacement_selected(True) - elif rt == "U3": - self.form.rb_z_displacement.setChecked(True) - self.z_displacement_selected(True) - elif rt == "Sabs": - self.form.rb_vm_stress.setChecked(True) - self.vm_stress_selected(True) - - sd = FreeCAD.FEM_dialog["show_disp"] - self.form.cb_show_displacement.setChecked(sd) - self.show_displacement(sd) - - df = FreeCAD.FEM_dialog["disp_factor"] - dfm = FreeCAD.FEM_dialog["disp_factor_max"] - self.form.hsb_displacement_factor.setMaximum(dfm) - self.form.hsb_displacement_factor.setValue(df) - self.form.sb_displacement_factor_max.setValue(dfm) - self.form.sb_displacement_factor.setValue(df) - except: - FreeCAD.FEM_dialog = {"results_type": "None", "show_disp": False, - "disp_factor": 0, "disp_factor_max": 100} - - def getStandardButtons(self): - return int(QtGui.QDialogButtonBox.Close) - - def get_result_stats(self, type_name, analysis=None): - if analysis is None: - analysis = FemGui.getActiveAnalysis() - for i in analysis.Member: - if (i.isDerivedFrom("Fem::FemResultObject")) and ("Stats" in i.PropertiesList): - match_table = {"U1": (i.Stats[0], i.Stats[1], i.Stats[2]), - "U2": (i.Stats[3], i.Stats[4], i.Stats[5]), - "U3": (i.Stats[6], i.Stats[7], i.Stats[8]), - "Uabs": (i.Stats[9], i.Stats[10], i.Stats[11]), - "Sabs": (i.Stats[12], i.Stats[13], i.Stats[14]), - "None": (0.0, 0.0, 0.0)} - return match_table[type_name] - return (0.0, 0.0, 0.0) - - def none_selected(self, state): - FreeCAD.FEM_dialog["results_type"] = "None" - self.set_result_stats("mm", 0.0, 0.0, 0.0) - fea = FemTools() - fea.reset_mesh_color() - - def abs_displacement_selected(self, state): - FreeCAD.FEM_dialog["results_type"] = "Uabs" - self.select_displacement_type("Uabs") - - def x_displacement_selected(self, state): - FreeCAD.FEM_dialog["results_type"] = "U1" - self.select_displacement_type("U1") - - def y_displacement_selected(self, state): - FreeCAD.FEM_dialog["results_type"] = "U2" - self.select_displacement_type("U2") - - def z_displacement_selected(self, state): - FreeCAD.FEM_dialog["results_type"] = "U3" - self.select_displacement_type("U3") - - def vm_stress_selected(self, state): - FreeCAD.FEM_dialog["results_type"] = "Sabs" - QApplication.setOverrideCursor(Qt.WaitCursor) - if self.suitable_results: - self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.ElementNumbers, self.result_object.StressValues) - (minm, avg, maxm) = self.get_result_stats("Sabs") - self.set_result_stats("MPa", minm, avg, maxm) - QtGui.qApp.restoreOverrideCursor() - - def select_displacement_type(self, disp_type): - QApplication.setOverrideCursor(Qt.WaitCursor) - if disp_type == "Uabs": - if self.suitable_results: - self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.ElementNumbers, self.result_object.DisplacementLengths) - else: - match = {"U1": 0, "U2": 1, "U3": 2} - d = zip(*self.result_object.DisplacementVectors) - displacements = list(d[match[disp_type]]) - if self.suitable_results: - self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.ElementNumbers, displacements) - (minm, avg, maxm) = self.get_result_stats(disp_type) - self.set_result_stats("mm", minm, avg, maxm) - QtGui.qApp.restoreOverrideCursor() - - def set_result_stats(self, unit, minm, avg, maxm): - self.form.le_min.setProperty("unit", unit) - self.form.le_min.setText("{:.6} {}".format(minm, unit)) - self.form.le_avg.setProperty("unit", unit) - self.form.le_avg.setText("{:.6} {}".format(avg, unit)) - self.form.le_max.setProperty("unit", unit) - self.form.le_max.setText("{:.6} {}".format(maxm, unit)) - - def update_displacement(self, factor=None): - if factor is None: - if FreeCAD.FEM_dialog["show_disp"]: - factor = self.form.hsb_displacement_factor.value() - else: - factor = 0.0 - self.MeshObject.ViewObject.applyDisplacement(factor) - - def show_displacement(self, checked): - QApplication.setOverrideCursor(Qt.WaitCursor) - FreeCAD.FEM_dialog["show_disp"] = checked - if "result_object" in FreeCAD.FEM_dialog: - if FreeCAD.FEM_dialog["result_object"] != self.result_object: - self.update_displacement() - FreeCAD.FEM_dialog["result_object"] = self.result_object - if self.suitable_results: - self.MeshObject.ViewObject.setNodeDisplacementByVectors(self.result_object.ElementNumbers, self.result_object.DisplacementVectors) - self.update_displacement() - QtGui.qApp.restoreOverrideCursor() - - def hsb_disp_factor_changed(self, value): - self.form.sb_displacement_factor.setValue(value) - self.update_displacement() - - def sb_disp_factor_max_changed(self, value): - FreeCAD.FEM_dialog["disp_factor_max"] = value - self.form.hsb_displacement_factor.setMaximum(value) - - def sb_disp_factor_changed(self, value): - FreeCAD.FEM_dialog["disp_factor"] = value - self.form.hsb_displacement_factor.setValue(value) - - def update(self): - self.MeshObject = None - self.result_object = get_results_object(FreeCADGui.Selection.getSelection()) - - for i in FemGui.getActiveAnalysis().Member: - if i.isDerivedFrom("Fem::FemMeshObject"): - self.MeshObject = i - break - - if self.MeshObject.FemMesh.NodeCount == len(self.result_object.ElementNumbers): - self.suitable_results = True - else: - self.suitable_results = False - if not self.MeshObject.FemMesh.VolumeCount: - FreeCAD.Console.PrintError('Graphical bending stress output for beam or shell FEM Meshes not yet supported!\n') - else: - FreeCAD.Console.PrintError('Result node numbers are not equal to FEM Mesh NodeCount!\n') - - def accept(self): - FreeCADGui.Control.closeDialog() - - def reject(self): - FreeCADGui.Control.closeDialog() - # Helpers diff --git a/src/Mod/Fem/_ResultControlTaskPanel.py b/src/Mod/Fem/_ResultControlTaskPanel.py new file mode 100644 index 000000000..250b6b9a8 --- /dev/null +++ b/src/Mod/Fem/_ResultControlTaskPanel.py @@ -0,0 +1,206 @@ +import FreeCAD +from FemTools import FemTools + +if FreeCAD.GuiUp: + import FreeCADGui + import FemGui + from PySide import QtCore, QtGui + from PySide.QtCore import Qt + from PySide.QtGui import QApplication + + +class _ResultControlTaskPanel: + '''The control for the displacement post-processing''' + def __init__(self): + self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/ShowDisplacement.ui") + + #Connect Signals and Slots + QtCore.QObject.connect(self.form.rb_none, QtCore.SIGNAL("toggled(bool)"), self.none_selected) + QtCore.QObject.connect(self.form.rb_x_displacement, QtCore.SIGNAL("toggled(bool)"), self.x_displacement_selected) + QtCore.QObject.connect(self.form.rb_y_displacement, QtCore.SIGNAL("toggled(bool)"), self.y_displacement_selected) + QtCore.QObject.connect(self.form.rb_z_displacement, QtCore.SIGNAL("toggled(bool)"), self.z_displacement_selected) + 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.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) + QtCore.QObject.connect(self.form.sb_displacement_factor_max, QtCore.SIGNAL("valueChanged(int)"), self.sb_disp_factor_max_changed) + + self.update() + self.restore_result_dialog() + + def restore_result_dialog(self): + try: + rt = FreeCAD.FEM_dialog["results_type"] + if rt == "None": + self.form.rb_none.setChecked(True) + self.none_selected(True) + elif rt == "Uabs": + self.form.rb_abs_displacement.setChecked(True) + self.abs_displacement_selected(True) + elif rt == "U1": + self.form.rb_x_displacement.setChecked(True) + self.x_displacement_selected(True) + elif rt == "U2": + self.form.rb_y_displacement.setChecked(True) + self.y_displacement_selected(True) + elif rt == "U3": + self.form.rb_z_displacement.setChecked(True) + self.z_displacement_selected(True) + elif rt == "Sabs": + self.form.rb_vm_stress.setChecked(True) + self.vm_stress_selected(True) + + sd = FreeCAD.FEM_dialog["show_disp"] + self.form.cb_show_displacement.setChecked(sd) + self.show_displacement(sd) + + df = FreeCAD.FEM_dialog["disp_factor"] + dfm = FreeCAD.FEM_dialog["disp_factor_max"] + self.form.hsb_displacement_factor.setMaximum(dfm) + self.form.hsb_displacement_factor.setValue(df) + self.form.sb_displacement_factor_max.setValue(dfm) + self.form.sb_displacement_factor.setValue(df) + except: + FreeCAD.FEM_dialog = {"results_type": "None", "show_disp": False, + "disp_factor": 0, "disp_factor_max": 100} + + def getStandardButtons(self): + return int(QtGui.QDialogButtonBox.Close) + + def get_result_stats(self, type_name, analysis=None): + if analysis is None: + analysis = FemGui.getActiveAnalysis() + for i in analysis.Member: + if (i.isDerivedFrom("Fem::FemResultObject")) and ("Stats" in i.PropertiesList): + match_table = {"U1": (i.Stats[0], i.Stats[1], i.Stats[2]), + "U2": (i.Stats[3], i.Stats[4], i.Stats[5]), + "U3": (i.Stats[6], i.Stats[7], i.Stats[8]), + "Uabs": (i.Stats[9], i.Stats[10], i.Stats[11]), + "Sabs": (i.Stats[12], i.Stats[13], i.Stats[14]), + "None": (0.0, 0.0, 0.0)} + return match_table[type_name] + return (0.0, 0.0, 0.0) + + def none_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "None" + self.set_result_stats("mm", 0.0, 0.0, 0.0) + fea = FemTools() + fea.reset_mesh_color() + + def abs_displacement_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "Uabs" + self.select_displacement_type("Uabs") + + def x_displacement_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "U1" + self.select_displacement_type("U1") + + def y_displacement_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "U2" + self.select_displacement_type("U2") + + def z_displacement_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "U3" + self.select_displacement_type("U3") + + def vm_stress_selected(self, state): + FreeCAD.FEM_dialog["results_type"] = "Sabs" + QApplication.setOverrideCursor(Qt.WaitCursor) + if self.suitable_results: + self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.ElementNumbers, self.result_object.StressValues) + (minm, avg, maxm) = self.get_result_stats("Sabs") + self.set_result_stats("MPa", minm, avg, maxm) + QtGui.qApp.restoreOverrideCursor() + + def select_displacement_type(self, disp_type): + QApplication.setOverrideCursor(Qt.WaitCursor) + if disp_type == "Uabs": + if self.suitable_results: + self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.ElementNumbers, self.result_object.DisplacementLengths) + else: + match = {"U1": 0, "U2": 1, "U3": 2} + d = zip(*self.result_object.DisplacementVectors) + displacements = list(d[match[disp_type]]) + if self.suitable_results: + self.MeshObject.ViewObject.setNodeColorByScalars(self.result_object.ElementNumbers, displacements) + (minm, avg, maxm) = self.get_result_stats(disp_type) + self.set_result_stats("mm", minm, avg, maxm) + QtGui.qApp.restoreOverrideCursor() + + def set_result_stats(self, unit, minm, avg, maxm): + self.form.le_min.setProperty("unit", unit) + self.form.le_min.setText("{:.6} {}".format(minm, unit)) + self.form.le_avg.setProperty("unit", unit) + self.form.le_avg.setText("{:.6} {}".format(avg, unit)) + self.form.le_max.setProperty("unit", unit) + self.form.le_max.setText("{:.6} {}".format(maxm, unit)) + + def update_displacement(self, factor=None): + if factor is None: + if FreeCAD.FEM_dialog["show_disp"]: + factor = self.form.hsb_displacement_factor.value() + else: + factor = 0.0 + self.MeshObject.ViewObject.applyDisplacement(factor) + + def show_displacement(self, checked): + QApplication.setOverrideCursor(Qt.WaitCursor) + FreeCAD.FEM_dialog["show_disp"] = checked + if "result_object" in FreeCAD.FEM_dialog: + if FreeCAD.FEM_dialog["result_object"] != self.result_object: + self.update_displacement() + FreeCAD.FEM_dialog["result_object"] = self.result_object + if self.suitable_results: + self.MeshObject.ViewObject.setNodeDisplacementByVectors(self.result_object.ElementNumbers, self.result_object.DisplacementVectors) + self.update_displacement() + QtGui.qApp.restoreOverrideCursor() + + def hsb_disp_factor_changed(self, value): + self.form.sb_displacement_factor.setValue(value) + self.update_displacement() + + def sb_disp_factor_max_changed(self, value): + FreeCAD.FEM_dialog["disp_factor_max"] = value + self.form.hsb_displacement_factor.setMaximum(value) + + def sb_disp_factor_changed(self, value): + FreeCAD.FEM_dialog["disp_factor"] = value + self.form.hsb_displacement_factor.setValue(value) + + def update(self): + self.MeshObject = None + self.result_object = get_results_object(FreeCADGui.Selection.getSelection()) + + for i in FemGui.getActiveAnalysis().Member: + if i.isDerivedFrom("Fem::FemMeshObject"): + self.MeshObject = i + break + + if self.MeshObject.FemMesh.NodeCount == len(self.result_object.ElementNumbers): + self.suitable_results = True + else: + self.suitable_results = False + if not self.MeshObject.FemMesh.VolumeCount: + FreeCAD.Console.PrintError('Graphical bending stress output for beam or shell FEM Meshes not yet supported!\n') + else: + FreeCAD.Console.PrintError('Result node numbers are not equal to FEM Mesh NodeCount!\n') + + def accept(self): + FreeCADGui.Control.closeDialog() + + def reject(self): + FreeCADGui.Control.closeDialog() + + +#It's code duplication that should be removes wher we migrate to FemTools.py +def get_results_object(sel): + if (len(sel) == 1): + if sel[0].isDerivedFrom("Fem::FemResultObject"): + return sel[0] + + for i in FemGui.getActiveAnalysis().Member: + if(i.isDerivedFrom("Fem::FemResultObject")): + return i + return None