From e0956f67f3c95a0f67a8eb52c7ddaeb201ec3d17 Mon Sep 17 00:00:00 2001 From: Przemo Firszt Date: Sun, 7 Jun 2015 12:37:21 +0100 Subject: [PATCH] FEM: Add basic FemTools module That module will handle in the future all non-gui related features that are currently in MechanicalAnalysis.py. It will allow easier python scripting and greater flexibility when creating new FEM wb features. Signed-off-by: Przemo Firszt --- src/Mod/Fem/App/CMakeLists.txt | 1 + src/Mod/Fem/CMakeLists.txt | 1 + src/Mod/Fem/FemTools.py | 52 +++++++++++++++++++++++++++++++ src/Mod/Fem/MechanicalAnalysis.py | 50 ++++++++--------------------- 4 files changed, 67 insertions(+), 37 deletions(-) create mode 100644 src/Mod/Fem/FemTools.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 685e8ed29..cd587beaa 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -71,6 +71,7 @@ SET(FemScripts_SRCS convert2TetGen.py ccxFrdReader.py ccxInpWriter.py + FemTools.py MechanicalAnalysis.ui MechanicalAnalysis.py MechanicalMaterial.ui diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 253811ed9..241616cd8 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -12,6 +12,7 @@ INSTALL( convert2TetGen.py ccxFrdReader.py ccxInpWriter.py + FemTools.py FemExample.py MechanicalAnalysis.py MechanicalMaterial.py diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py new file mode 100644 index 000000000..e08c0e32b --- /dev/null +++ b/src/Mod/Fem/FemTools.py @@ -0,0 +1,52 @@ +#*************************************************************************** +#* * +#* Copyright (c) 2015 - Przemo Firszt * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU Lesser General Public License (LGPL) * +#* as published by the Free Software Foundation; either version 2 of * +#* the License, or (at your option) any later version. * +#* for detail see the LICENCE text file. * +#* * +#* This program is distributed in the hope that it will be useful, * +#* but WITHOUT ANY WARRANTY; without even the implied warranty of * +#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +#* GNU Library General Public License for more details. * +#* * +#* You should have received a copy of the GNU Library General Public * +#* License along with this program; if not, write to the Free Software * +#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +#* USA * +#* * +#*************************************************************************** + + +import FreeCAD +import FemGui + + +class FemTools: + def __init__(self, analysis_object=None): + if analysis_object: + self.fem_analysis = analysis_object + else: + self.fem_analysis = FemGui.getActiveAnalysis() + self.mesh = None + for m in self.fem_analysis.Member: + if m.isDerivedFrom("Fem::FemMeshObject"): + self.mesh = m + + def purge_results(self): + for m in self.fem_analysis.Member: + if (m.isDerivedFrom('Fem::FemResultObject')): + FreeCAD.ActiveDocument.removeObject(m.Name) + + def reset_mesh_deformation(self): + if self.mesh: + self.mesh.ViewObject.applyDisplacement(0.0) + + def reset_mesh_color(self): + if self.mesh: + self.mesh.ViewObject.NodeColor = {} + self.mesh.ViewObject.ElementColor = {} + self.mesh.ViewObject.setNodeColorByScalars() diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index b569d9ee3..b69cb525c 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -22,6 +22,7 @@ import ccxFrdReader import FreeCAD +from FemTools import FemTools import FemGui import os import sys @@ -135,9 +136,10 @@ class _CommandPurgeFemResults: 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_PurgeResults", "Purge results from an analysis")} def Activated(self): - purge_fem_results() - reset_mesh_color() - reset_mesh_deformation() + fea = FemTools() + fea.purge_results() + fea.reset_mesh_color() + fea.reset_mesh_deformation() def IsActive(self): return FreeCADGui.ActiveDocument is not None and results_present() @@ -335,9 +337,10 @@ class _JobControlTaskPanel: print "Loading results...." self.femConsoleMessage("Loading result sets...") self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start)) - purge_fem_results() - reset_mesh_color() - reset_mesh_deformation() + fea = FemTools() + fea.purge_results() + fea.reset_mesh_color() + fea.reset_mesh_deformation() if os.path.isfile(self.base_name + '.frd'): QApplication.setOverrideCursor(Qt.WaitCursor) ccxFrdReader.importFrd(self.base_name + '.frd', FemGui.getActiveAnalysis()) @@ -408,8 +411,8 @@ class _JobControlTaskPanel: self.PressureObjects = [] (self.MeshObject, self.MaterialObjects, self.FixedObjects, self.ForceObjects, self.PressureObjects) = prepare_analysis_objects() - message = check_prerequisites(active_analysis, self.MeshObject, self.MaterialObjects, - self.FixedObjects, self.ForceObjects, self.PressureObjects) + message = check_prerequisites(active_analysis, self.MeshObject, self.MaterialObjects, + self.FixedObjects, self.ForceObjects, self.PressureObjects) if message != "": QtGui.QMessageBox.critical(None, "Missing prerequisit(s)", message) return False @@ -532,7 +535,8 @@ class _ResultControlTaskPanel: def none_selected(self, state): FreeCAD.FEM_dialog["results_type"] = "None" self.set_result_stats("mm", 0.0, 0.0, 0.0) - reset_mesh_color() + fea = FemTools() + fea.reset_mesh_color() def abs_displacement_selected(self, state): FreeCAD.FEM_dialog["results_type"] = "Uabs" @@ -627,34 +631,6 @@ def results_present(): return results -def purge_fem_results(Analysis=None): - if Analysis is None: - analysis_members = FemGui.getActiveAnalysis().Member - else: - analysis_members = FemGui.Analysis().Member - for o in analysis_members: - if o.isDerivedFrom("Fem::FemResultObject"): - FreeCAD.ActiveDocument.removeObject(o.Name) - - -def reset_mesh_color(mesh=None): - if mesh is None: - for i in FemGui.getActiveAnalysis().Member: - if i.isDerivedFrom("Fem::FemMeshObject"): - mesh = i - mesh.ViewObject.NodeColor = {} - mesh.ViewObject.ElementColor = {} - mesh.ViewObject.setNodeColorByScalars() - - -def reset_mesh_deformation(mesh=None): - if mesh is None: - for i in FemGui.getActiveAnalysis().Member: - if i.isDerivedFrom("Fem::FemMeshObject"): - mesh = i - mesh.ViewObject.applyDisplacement(0.0) - - def prepare_analysis_objects(): MeshObject = None MaterialObjects = []