Skip to content

Commit

Permalink
FEM: analysis member, get rid of duplicate code in getting the analys…
Browse files Browse the repository at this point in the history
…is mesh
  • Loading branch information
berndhahnebach authored and wwmayer committed Mar 4, 2019
1 parent e606062 commit 56cc7e7
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 29 deletions.
21 changes: 13 additions & 8 deletions src/Mod/Fem/femsolver/calculix/tasks.py
Expand Up @@ -32,6 +32,8 @@
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
Expand Down Expand Up @@ -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')
Expand All @@ -170,13 +182,6 @@ def __init__(self, analysis):
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)

Expand Down
21 changes: 13 additions & 8 deletions src/Mod/Fem/femsolver/z88/tasks.py
Expand Up @@ -31,6 +31,8 @@
import os.path

import FreeCAD
if FreeCAD.GuiUp:
from PySide import QtGui
import femtools.femutils as femutils
import feminout.importZ88O2Results as importZ88O2Results

Expand Down Expand Up @@ -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')
Expand All @@ -158,13 +170,6 @@ def __init__(self, analysis):
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)

Expand Down
24 changes: 11 additions & 13 deletions src/Mod/Fem/femtools/ccxtools.py
Expand Up @@ -146,6 +146,17 @@ def find_solver(self):
# 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}, {}, ...]
Expand All @@ -160,9 +171,6 @@ def update_objects(self):
# [{'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')
Expand Down Expand Up @@ -215,16 +223,6 @@ def update_objects(self):
# 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 = ""
Expand Down
15 changes: 15 additions & 0 deletions src/Mod/Fem/femtools/femutils.py
Expand Up @@ -32,6 +32,7 @@
import FreeCAD as App


# analysis and its members
def createObject(doc, name, proxy, viewProxy):
obj = doc.addObject(proxy.BaseType, name)
proxy(obj)
Expand Down Expand Up @@ -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)'''
Expand Down

0 comments on commit 56cc7e7

Please sign in to comment.