diff --git a/src/Mod/Fem/femsolver/calculix/tasks.py b/src/Mod/Fem/femsolver/calculix/tasks.py index 8b8e9218f8..8dc26a6020 100644 --- a/src/Mod/Fem/femsolver/calculix/tasks.py +++ b/src/Mod/Fem/femsolver/calculix/tasks.py @@ -32,6 +32,8 @@ import subprocess import os.path import FreeCAD +if FreeCAD.GuiUp: + from PySide import QtGui import femtools.femutils as femutils import feminout.importCcxFrdResults as importCcxFrdResults import feminout.importCcxDatResults as importCcxDatResults @@ -151,7 +153,17 @@ class _Container(object): def __init__(self, analysis): self.analysis = analysis - self.mesh = None + + # get mesh + mesh, message = femutils.get_mesh_to_solve(self.analysis) + if mesh is not None: + self.mesh = mesh + else: + if FreeCAD.GuiUp: + QtGui.QMessageBox.critical(None, "Missing prerequisite", message) + raise Exception(message + '\n') + + # get member self.materials_linear = self.get_several_member('Fem::Material') self.materials_nonlinear = self.get_several_member('Fem::MaterialMechanicalNonlinear') self.fixed_constraints = self.get_several_member('Fem::ConstraintFixed') @@ -170,13 +182,6 @@ class _Container(object): self.contact_constraints = self.get_several_member('Fem::ConstraintContact') self.transform_constraints = self.get_several_member('Fem::ConstraintTransform') - for m in self.analysis.Group: - if m.isDerivedFrom("Fem::FemMeshObject") and not femutils.is_of_type(m, 'Fem::FemMeshResult'): - if not self.mesh: - self.mesh = m - else: - raise Exception('FEM: Multiple mesh in analysis not yet supported!') - def get_several_member(self, t): return femutils.get_several_member(self.analysis, t) diff --git a/src/Mod/Fem/femsolver/z88/tasks.py b/src/Mod/Fem/femsolver/z88/tasks.py index c16d967161..d54825d978 100644 --- a/src/Mod/Fem/femsolver/z88/tasks.py +++ b/src/Mod/Fem/femsolver/z88/tasks.py @@ -31,6 +31,8 @@ import subprocess import os.path import FreeCAD +if FreeCAD.GuiUp: + from PySide import QtGui import femtools.femutils as femutils import feminout.importZ88O2Results as importZ88O2Results @@ -137,7 +139,17 @@ class _Container(object): def __init__(self, analysis): self.analysis = analysis - self.mesh = None + + # get mesh + mesh, message = femutils.get_mesh_to_solve(self.analysis) + if mesh is not None: + self.mesh = mesh + else: + if FreeCAD.GuiUp: + QtGui.QMessageBox.critical(None, "Missing prerequisite", message) + raise Exception(message + '\n') + + # get member self.materials_linear = self.get_several_member('Fem::Material') self.fixed_constraints = self.get_several_member('Fem::ConstraintFixed') self.force_constraints = self.get_several_member('Fem::ConstraintForce') @@ -158,13 +170,6 @@ class _Container(object): self.contact_constraints = [] self.transform_constraints = [] - for m in self.analysis.Group: - if m.isDerivedFrom("Fem::FemMeshObject") and not femutils.is_of_type(m, 'Fem::FemMeshResult'): - if not self.mesh: - self.mesh = m - else: - raise Exception('FEM: Multiple mesh in analysis not yet supported!') - def get_several_member(self, t): return femutils.get_several_member(self.analysis, t) diff --git a/src/Mod/Fem/femtools/ccxtools.py b/src/Mod/Fem/femtools/ccxtools.py index 9753419310..7c4205b5a2 100644 --- a/src/Mod/Fem/femtools/ccxtools.py +++ b/src/Mod/Fem/femtools/ccxtools.py @@ -146,6 +146,17 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): # FreeCAD.Console.PrintMessage('FEM: More than one solver in the analysis and no solver given to analyze. No solver is set!\n') def update_objects(self): + ## @var mesh + # mesh of the analysis. Used to generate .inp file and to show results + self.mesh = None + mesh, message = femutils.get_mesh_to_solve(self.analysis) + if mesh is not None: + self.mesh = mesh + else: + if FreeCAD.GuiUp: + QtGui.QMessageBox.critical(None, "Missing prerequisite", message) + raise Exception(message + '\n') + # [{'Object':materials_linear}, {}, ...] # [{'Object':materials_nonlinear}, {}, ...] # [{'Object':fixed_constraints, 'NodeSupports':bool}, {}, ...] @@ -160,9 +171,6 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): # [{'Object':shell_thicknesses, 'xxxxxxxx':value}, {}, ...] # [{'Object':contact_constraints, 'xxxxxxxx':value}, {}, ...] - ## @var mesh - # mesh of the analysis. Used to generate .inp file and to show results - self.mesh = None ## @var materials_linear # list of linear materials from the analysis. Updated with update_objects self.materials_linear = self._get_several_member('Fem::Material') @@ -215,16 +223,6 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): # list of transform constraints from the analysis. Updated with update_objects self.transform_constraints = self._get_several_member('Fem::ConstraintTransform') - for m in self.analysis.Group: - if m.isDerivedFrom("Fem::FemMeshObject") and not femutils.is_of_type(m, 'Fem::FemMeshResult'): - if not self.mesh: - self.mesh = m - else: - message = 'FEM: Multiple mesh in analysis not yet supported!' - if FreeCAD.GuiUp: - QtGui.QMessageBox.critical(None, "Missing prerequisite", message) - raise Exception(message + '\n') - def check_prerequisites(self): from FreeCAD import Units message = "" diff --git a/src/Mod/Fem/femtools/femutils.py b/src/Mod/Fem/femtools/femutils.py index 4ddf4f5b09..ebeb2dca1c 100644 --- a/src/Mod/Fem/femtools/femutils.py +++ b/src/Mod/Fem/femtools/femutils.py @@ -32,6 +32,7 @@ import FreeCAD import FreeCAD as App +# analysis and its members def createObject(doc, name, proxy, viewProxy): obj = doc.addObject(proxy.BaseType, name) proxy(obj) @@ -89,6 +90,20 @@ def get_several_member(analysis, t): return members +def get_mesh_to_solve(analysis): + mesh_to_solve = None + for m in analysis.Group: + if m.isDerivedFrom("Fem::FemMeshObject") and not is_of_type(m, 'Fem::FemMeshResult'): + if not mesh_to_solve: + mesh_to_solve = m + else: + return (None, 'FEM: multiple mesh in analysis not yet supported!') + if mesh_to_solve is not None: + return (mesh_to_solve, '') + else: + return (None, 'FEM: no mesh object found in analysis.') + + # typeID and object type defs def type_of_obj(obj): '''returns objects TypeId (C++ objects) or Proxy.Type (Python objects)'''