From 4d345e18536399bfbe03ae14d1b164a9ce423c5b Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Thu, 6 Dec 2018 10:16:32 +0100 Subject: [PATCH] FEM: utils, get rid of duplicate defs --- src/Mod/Fem/femsolver/calculix/tasks.py | 2 +- src/Mod/Fem/femsolver/elmer/tasks.py | 2 +- src/Mod/Fem/femsolver/elmer/writer.py | 10 +-- src/Mod/Fem/femsolver/run.py | 4 +- src/Mod/Fem/femsolver/z88/tasks.py | 2 +- src/Mod/Fem/femtest/testobject.py | 88 ++++++++++++------------- src/Mod/Fem/femtools/femutils.py | 31 +++++---- 7 files changed, 69 insertions(+), 70 deletions(-) diff --git a/src/Mod/Fem/femsolver/calculix/tasks.py b/src/Mod/Fem/femsolver/calculix/tasks.py index d63c20b7f7..e0b7f6393b 100644 --- a/src/Mod/Fem/femsolver/calculix/tasks.py +++ b/src/Mod/Fem/femsolver/calculix/tasks.py @@ -121,7 +121,7 @@ class Results(run.Results): def purge_results(self): for m in FemUtils.getMember(self.analysis, "Fem::FemResultObject"): - if FemUtils.isOfType(m.Mesh, "Fem::FemMeshResult"): + if FemUtils.is_of_type(m.Mesh, "Fem::FemMeshResult"): self.analysis.Document.removeObject(m.Mesh.Name) self.analysis.Document.removeObject(m.Name) App.ActiveDocument.recompute() diff --git a/src/Mod/Fem/femsolver/elmer/tasks.py b/src/Mod/Fem/femsolver/elmer/tasks.py index b65799072e..410b132557 100644 --- a/src/Mod/Fem/femsolver/elmer/tasks.py +++ b/src/Mod/Fem/femsolver/elmer/tasks.py @@ -46,7 +46,7 @@ class Check(run.Check): def checkMeshType(self): mesh = FemUtils.getSingleMember(self.analysis, "Fem::FemMeshObject") - if not FemUtils.isOfType(mesh, "Fem::FemMeshGmsh"): + if not FemUtils.is_of_type(mesh, "Fem::FemMeshGmsh"): self.report.error( "Unsupported type of mesh. " "Mesh must be created with gmsh.") diff --git a/src/Mod/Fem/femsolver/elmer/writer.py b/src/Mod/Fem/femsolver/elmer/writer.py index 336ddc3a92..db924d37f4 100644 --- a/src/Mod/Fem/femsolver/elmer/writer.py +++ b/src/Mod/Fem/femsolver/elmer/writer.py @@ -197,7 +197,7 @@ class Writer(object): def _handleHeat(self): activeIn = [] for equation in self.solver.Group: - if FemUtils.isOfType(equation, "Fem::FemEquationElmerHeat"): + if FemUtils.is_of_type(equation, "Fem::FemEquationElmerHeat"): if equation.References: activeIn = equation.References[0][1] else: @@ -297,7 +297,7 @@ class Writer(object): def _handleElectrostatic(self): activeIn = [] for equation in self.solver.Group: - if FemUtils.isOfType(equation, "Fem::FemEquationElmerElectrostatic"): + if FemUtils.is_of_type(equation, "Fem::FemEquationElmerElectrostatic"): if equation.References: activeIn = equation.References[0][1] else: @@ -361,7 +361,7 @@ class Writer(object): def _handleFluxsolver(self): activeIn = [] for equation in self.solver.Group: - if FemUtils.isOfType(equation, "Fem::FemEquationElmerFluxsolver"): + if FemUtils.is_of_type(equation, "Fem::FemEquationElmerFluxsolver"): if equation.References: activeIn = equation.References[0][1] else: @@ -382,7 +382,7 @@ class Writer(object): def _handleElasticity(self): activeIn = [] for equation in self.solver.Group: - if FemUtils.isOfType(equation, "Fem::FemEquationElmerElasticity"): + if FemUtils.is_of_type(equation, "Fem::FemEquationElmerElasticity"): if equation.References: activeIn = equation.References[0][1] else: @@ -540,7 +540,7 @@ class Writer(object): def _handleFlow(self): activeIn = [] for equation in self.solver.Group: - if FemUtils.isOfType(equation, "Fem::FemEquationElmerFlow"): + if FemUtils.is_of_type(equation, "Fem::FemEquationElmerFlow"): if equation.References: activeIn = equation.References[0][1] else: diff --git a/src/Mod/Fem/femsolver/run.py b/src/Mod/Fem/femsolver/run.py index 07755ef122..405505ecb4 100644 --- a/src/Mod/Fem/femsolver/run.py +++ b/src/Mod/Fem/femsolver/run.py @@ -284,10 +284,10 @@ class Check(BaseTask): def checkSupported(self, allSupported): for m in self.analysis.Group: - if FemUtils.isOfType(m, "Fem::Constraint"): + if FemUtils.is_of_type(m, "Fem::Constraint"): supported = False for sc in allSupported: - if FemUtils.isOfType(m, *sc): + if FemUtils.is_of_type(m, *sc): supported = True if not supported: self.report.warning( diff --git a/src/Mod/Fem/femsolver/z88/tasks.py b/src/Mod/Fem/femsolver/z88/tasks.py index f147857b76..91859ac473 100644 --- a/src/Mod/Fem/femsolver/z88/tasks.py +++ b/src/Mod/Fem/femsolver/z88/tasks.py @@ -135,7 +135,7 @@ class Results(run.Results): def purge_results(self): for m in FemUtils.getMember(self.analysis, "Fem::FemResultObject"): - if FemUtils.isOfType(m.Mesh, "Fem::FemMeshResult"): + if FemUtils.is_of_type(m.Mesh, "Fem::FemMeshResult"): self.analysis.Document.removeObject(m.Mesh.Name) self.analysis.Document.removeObject(m.Name) App.ActiveDocument.recompute() diff --git a/src/Mod/Fem/femtest/testobject.py b/src/Mod/Fem/femtest/testobject.py index 5e44df5af2..eaab17f897 100644 --- a/src/Mod/Fem/femtest/testobject.py +++ b/src/Mod/Fem/femtest/testobject.py @@ -211,53 +211,53 @@ class FemObject(unittest.TestCase): def test_femobjects_derivedfromfem(self): doc = self.active_doc - from femtools.femutils import isDerivedFrom as isDerivedFromFem - self.assertTrue(isDerivedFromFem(ObjectsFem.makeAnalysis(doc), 'Fem::FemAnalysis')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintBearing(doc), 'Fem::ConstraintBearing')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintBodyHeatSource(doc), 'Fem::ConstraintBodyHeatSource')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintContact(doc), 'Fem::ConstraintContact')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintDisplacement(doc), 'Fem::ConstraintDisplacement')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'Fem::ConstraintElectrostaticPotential')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintFixed(doc), 'Fem::ConstraintFixed')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintFlowVelocity(doc), 'Fem::ConstraintFlowVelocity')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintFluidBoundary(doc), 'Fem::ConstraintFluidBoundary')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintForce(doc), 'Fem::ConstraintForce')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintGear(doc), 'Fem::ConstraintGear')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintHeatflux(doc), 'Fem::ConstraintHeatflux')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'Fem::ConstraintInitialFlowVelocity')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintInitialTemperature(doc), 'Fem::ConstraintInitialTemperature')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintPlaneRotation(doc), 'Fem::ConstraintPlaneRotation')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintPressure(doc), 'Fem::ConstraintPressure')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintPulley(doc), 'Fem::ConstraintPulley')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintSelfWeight(doc), 'Fem::ConstraintSelfWeight')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintTemperature(doc), 'Fem::ConstraintTemperature')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeConstraintTransform(doc), 'Fem::ConstraintTransform')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeElementFluid1D(doc), 'Fem::FemElementFluid1D')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeElementGeometry1D(doc), 'Fem::FemElementGeometry1D')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeElementGeometry2D(doc), 'Fem::FemElementGeometry2D')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeElementRotation1D(doc), 'Fem::FemElementRotation1D')) + from femtools.femutils import is_derived_from + self.assertTrue(is_derived_from(ObjectsFem.makeAnalysis(doc), 'Fem::FemAnalysis')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBearing(doc), 'Fem::ConstraintBearing')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintBodyHeatSource(doc), 'Fem::ConstraintBodyHeatSource')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintContact(doc), 'Fem::ConstraintContact')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintDisplacement(doc), 'Fem::ConstraintDisplacement')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintElectrostaticPotential(doc), 'Fem::ConstraintElectrostaticPotential')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFixed(doc), 'Fem::ConstraintFixed')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFlowVelocity(doc), 'Fem::ConstraintFlowVelocity')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintFluidBoundary(doc), 'Fem::ConstraintFluidBoundary')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintForce(doc), 'Fem::ConstraintForce')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintGear(doc), 'Fem::ConstraintGear')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintHeatflux(doc), 'Fem::ConstraintHeatflux')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialFlowVelocity(doc), 'Fem::ConstraintInitialFlowVelocity')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintInitialTemperature(doc), 'Fem::ConstraintInitialTemperature')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPlaneRotation(doc), 'Fem::ConstraintPlaneRotation')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPressure(doc), 'Fem::ConstraintPressure')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintPulley(doc), 'Fem::ConstraintPulley')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintSelfWeight(doc), 'Fem::ConstraintSelfWeight')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTemperature(doc), 'Fem::ConstraintTemperature')) + self.assertTrue(is_derived_from(ObjectsFem.makeConstraintTransform(doc), 'Fem::ConstraintTransform')) + self.assertTrue(is_derived_from(ObjectsFem.makeElementFluid1D(doc), 'Fem::FemElementFluid1D')) + self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry1D(doc), 'Fem::FemElementGeometry1D')) + self.assertTrue(is_derived_from(ObjectsFem.makeElementGeometry2D(doc), 'Fem::FemElementGeometry2D')) + self.assertTrue(is_derived_from(ObjectsFem.makeElementRotation1D(doc), 'Fem::FemElementRotation1D')) materialsolid = ObjectsFem.makeMaterialSolid(doc) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMaterialFluid(doc), 'Fem::Material')) - self.assertTrue(isDerivedFromFem(materialsolid, 'Fem::Material')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'Fem::MaterialMechanicalNonlinear')) + self.assertTrue(is_derived_from(ObjectsFem.makeMaterialFluid(doc), 'Fem::Material')) + self.assertTrue(is_derived_from(materialsolid, 'Fem::Material')) + self.assertTrue(is_derived_from(ObjectsFem.makeMaterialMechanicalNonlinear(doc, materialsolid), 'Fem::MaterialMechanicalNonlinear')) mesh = ObjectsFem.makeMeshGmsh(doc) - self.assertTrue(isDerivedFromFem(mesh, 'Fem::FemMeshGmsh')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'Fem::FemMeshBoundaryLayer')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMeshGroup(doc, mesh), 'Fem::FemMeshGroup')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMeshRegion(doc, mesh), 'Fem::FemMeshRegion')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMeshNetgen(doc), 'Fem::FemMeshShapeNetgenObject')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeMeshResult(doc), 'Fem::FemMeshResult')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeResultMechanical(doc), 'Fem::FemResultMechanical')) + self.assertTrue(is_derived_from(mesh, 'Fem::FemMeshGmsh')) + self.assertTrue(is_derived_from(ObjectsFem.makeMeshBoundaryLayer(doc, mesh), 'Fem::FemMeshBoundaryLayer')) + self.assertTrue(is_derived_from(ObjectsFem.makeMeshGroup(doc, mesh), 'Fem::FemMeshGroup')) + self.assertTrue(is_derived_from(ObjectsFem.makeMeshRegion(doc, mesh), 'Fem::FemMeshRegion')) + self.assertTrue(is_derived_from(ObjectsFem.makeMeshNetgen(doc), 'Fem::FemMeshShapeNetgenObject')) + self.assertTrue(is_derived_from(ObjectsFem.makeMeshResult(doc), 'Fem::FemMeshResult')) + self.assertTrue(is_derived_from(ObjectsFem.makeResultMechanical(doc), 'Fem::FemResultMechanical')) solverelmer = ObjectsFem.makeSolverElmer(doc) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverCalculixCcxTools')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObjectCalculix')) - self.assertTrue(isDerivedFromFem(solverelmer, 'Fem::FemSolverObjectElmer')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObjectZ88')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'Fem::FemEquationElmerElasticity')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'Fem::FemEquationElmerElectrostatic')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeEquationFlow(doc, solverelmer), 'Fem::FemEquationElmerFlow')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'Fem::FemEquationElmerFluxsolver')) - self.assertTrue(isDerivedFromFem(ObjectsFem.makeEquationHeat(doc, solverelmer), 'Fem::FemEquationElmerHeat')) + self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculixCcxTools(doc), 'Fem::FemSolverCalculixCcxTools')) + self.assertTrue(is_derived_from(ObjectsFem.makeSolverCalculix(doc), 'Fem::FemSolverObjectCalculix')) + self.assertTrue(is_derived_from(solverelmer, 'Fem::FemSolverObjectElmer')) + self.assertTrue(is_derived_from(ObjectsFem.makeSolverZ88(doc), 'Fem::FemSolverObjectZ88')) + self.assertTrue(is_derived_from(ObjectsFem.makeEquationElasticity(doc, solverelmer), 'Fem::FemEquationElmerElasticity')) + self.assertTrue(is_derived_from(ObjectsFem.makeEquationElectrostatic(doc, solverelmer), 'Fem::FemEquationElmerElectrostatic')) + self.assertTrue(is_derived_from(ObjectsFem.makeEquationFlow(doc, solverelmer), 'Fem::FemEquationElmerFlow')) + self.assertTrue(is_derived_from(ObjectsFem.makeEquationFluxsolver(doc, solverelmer), 'Fem::FemEquationElmerFluxsolver')) + self.assertTrue(is_derived_from(ObjectsFem.makeEquationHeat(doc, solverelmer), 'Fem::FemEquationElmerHeat')) # is = 43 (just copy in empty file to test) def test_femobjects_derivedfromstd(self): diff --git a/src/Mod/Fem/femtools/femutils.py b/src/Mod/Fem/femtools/femutils.py index 1d3070d234..ee40de134e 100644 --- a/src/Mod/Fem/femtools/femutils.py +++ b/src/Mod/Fem/femtools/femutils.py @@ -60,13 +60,13 @@ def _searchGroups(member, objs): return False -# typeID and object type defs used in Elmer +# collect analyis members used in Elmer def getMember(analysis, t): if analysis is None: raise ValueError("Analysis must not be None") matching = [] for m in analysis.Group: - if isDerivedFrom(m, t): + if is_derived_from(m, t): matching.append(m) return matching @@ -76,20 +76,7 @@ def getSingleMember(analysis, t): return objs[0] if objs else None -def isOfType(obj, t): - if hasattr(obj, "Proxy") and hasattr(obj.Proxy, "Type"): - return obj.Proxy.Type == t - return obj.TypeId == t - - -def isDerivedFrom(obj, t): - if (hasattr(obj, "Proxy") and hasattr(obj.Proxy, "Type") and - obj.Proxy.Type == t): - return True - return obj.isDerivedFrom(t) - - -# typeID and object type defs ATM not used in FEM solver writer modules +# typeID and object type defs def type_of_obj(obj): '''returns objects TypeId (C++ objects) or Proxy.Type (Python objects)''' if hasattr(obj, "Proxy") and hasattr(obj.Proxy, "Type"): @@ -99,9 +86,21 @@ def type_of_obj(obj): def is_of_type(obj, ty): '''returns True if an object is of a given TypeId (C++ objects) or Proxy.Type (Python Features)''' + # only returns true if the exact TypeId is given. + # For FeaturPythons the Proxy.Type has to be given. Keep in mind the TypeId for them is the TypeId from the C++ father class return type_of_obj(obj) == ty +def is_derived_from(obj, t): + '''returns True if an object or its inheritance chain is of a given TypeId (C++ objects) or Proxy.Type (Python objects)''' + # returns true for all FEM objects if given t == 'App::DocumentObject' since this is a father of the given object + # see https://forum.freecadweb.org/viewtopic.php?f=10&t=32625 + if (hasattr(obj, "Proxy") and hasattr(obj.Proxy, "Type") and + obj.Proxy.Type == t): + return True + return obj.isDerivedFrom(t) + + def getBoundBoxOfAllDocumentShapes(doc): overalboundbox = None for o in doc.Objects: