FEM: analysis member, get rid of duplicate code in getting the analysis mesh

This commit is contained in:
Bernd Hahnebach
2019-03-04 08:30:30 +01:00
committed by wmayer
parent e606062f4c
commit 56cc7e7913
4 changed files with 52 additions and 29 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 = ""

View File

@@ -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)'''