diff --git a/src/Mod/Fem/ObjectsFem.py b/src/Mod/Fem/ObjectsFem.py index 2cd6e1d449..32c8b787cd 100644 --- a/src/Mod/Fem/ObjectsFem.py +++ b/src/Mod/Fem/ObjectsFem.py @@ -362,6 +362,53 @@ def makeResultMechanical(doc, name="MechanicalResult"): return obj +def makePostVtkFilterClipRegion(doc, base_vtk_result, name="FEMVtkFilterClipRegion"): + '''makePostVtkFilterClipRegion(document, base_vtk_result, [name]): creates an FEM post processing region clip filter object (vtk based)''' + obj = doc.addObject("Fem::FemPostClipFilter", name) + tmp_filter_list = base_vtk_result.Filter + tmp_filter_list.append(obj) + base_vtk_result.Filter = tmp_filter_list + del tmp_filter_list + return obj + + +def makePostVtkFilterClipScalar(doc, base_vtk_result, name="FEMVtkFilterClipScalar"): + '''makePostVtkFilterClipScalar(document, base_vtk_result, [name]): creates an FEM post processing scalar clip filter object (vtk based)''' + obj = doc.addObject("Fem::FemPostScalarClipFilter", name) + tmp_filter_list = base_vtk_result.Filter + tmp_filter_list.append(obj) + base_vtk_result.Filter = tmp_filter_list + del tmp_filter_list + return obj + + +def makePostVtkFilterCutFunction(doc, base_vtk_result, name="FEMVtkFilterCutFunction"): + '''makePostVtkFilterCutFunction(document, base_vtk_result, [name]): creates an FEM post processing cut function filter object (vtk based)''' + obj = doc.addObject("Fem::FemPostClipFilter", name) + tmp_filter_list = base_vtk_result.Filter + tmp_filter_list.append(obj) + base_vtk_result.Filter = tmp_filter_list + del tmp_filter_list + return obj + + +def makePostVtkFilterWarp(doc, base_vtk_result, name="FEMVtkFilterWarp"): + '''makePostVtkFilterWarp(document, base_vtk_result, [name]): creates an FEM post processing warp filter object (vtk based)''' + obj = doc.addObject("Fem::FemPostWarpVectorFilter", name) + tmp_filter_list = base_vtk_result.Filter + tmp_filter_list.append(obj) + base_vtk_result.Filter = tmp_filter_list + del tmp_filter_list + return obj + + +def makePostVtkResult(doc, base_result, name="FEMVtkResult"): + '''makePostVtkResult(document, base_result [name]): creates an FEM post processing result object (vtk based) to hold FEM results''' + obj = doc.addObject("Fem::FemPostPipeline", name) + obj.load(base_result) + return obj + + # ********* solver objects ********* def makeEquationElasticity(doc, base_solver): '''makeEquationElasticity(document, base_solver): creates a FEM elasticity equation for a solver''' diff --git a/src/Mod/Fem/femtest/testobject.py b/src/Mod/Fem/femtest/testobject.py index 2deea4ccf8..d4cdc17aa1 100644 --- a/src/Mod/Fem/femtest/testobject.py +++ b/src/Mod/Fem/femtest/testobject.py @@ -83,7 +83,13 @@ class TestObjectCreate(unittest.TestCase): analysis.addObject(ObjectsFem.makeMeshNetgen(doc)) analysis.addObject(ObjectsFem.makeMeshResult(doc)) - analysis.addObject(ObjectsFem.makeResultMechanical(doc)) + res = analysis.addObject(ObjectsFem.makeResultMechanical(doc))[0] + if "BUILD_FEM_VTK" in FreeCAD.__cmake__: + vres = analysis.addObject(ObjectsFem.makePostVtkResult(doc, res))[0] + analysis.addObject(ObjectsFem.makePostVtkFilterClipRegion(doc, vres)) + analysis.addObject(ObjectsFem.makePostVtkFilterClipScalar(doc, vres)) + analysis.addObject(ObjectsFem.makePostVtkFilterCutFunction(doc, vres)) + analysis.addObject(ObjectsFem.makePostVtkFilterWarp(doc, vres)) analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc)) analysis.addObject(ObjectsFem.makeSolverCalculix(doc)) @@ -95,13 +101,19 @@ class TestObjectCreate(unittest.TestCase): analysis.addObject(ObjectsFem.makeEquationFlow(doc, sol)) analysis.addObject(ObjectsFem.makeEquationFluxsolver(doc, sol)) analysis.addObject(ObjectsFem.makeEquationHeat(doc, sol)) - # is = 43 (just copy in empty file to test, or run unit test case, it is printed) + # is = 48 (just copy in empty file to test, or run unit test case, it is printed) # TODO if the equations and gmsh mesh childs are added to the analysis, # they show up twice on Tree (on solver resp. gemsh mesh obj and on analysis) # https://forum.freecadweb.org/viewtopic.php?t=25283 doc.recompute() - self.assertEqual(len(analysis.Group), testtools.get_defmake_count() - 1) # because of the analysis itself count -1 + + # if FEM VTK post processing is disabled, we are not able to create VTK post objects + if "BUILD_FEM_VTK" in FreeCAD.__cmake__: + fem_vtk_post = True + else: + fem_vtk_post = False + self.assertEqual(len(analysis.Group), testtools.get_defmake_count(fem_vtk_post) - 1) # because of the analysis itself count -1 def tearDown(self): FreeCAD.closeDocument(self.doc_name) diff --git a/src/Mod/Fem/femtest/utilstest.py b/src/Mod/Fem/femtest/utilstest.py index 9a7443eea6..eb64c2f354 100644 --- a/src/Mod/Fem/femtest/utilstest.py +++ b/src/Mod/Fem/femtest/utilstest.py @@ -54,7 +54,7 @@ def fcc_print(message): FreeCAD.Console.PrintMessage('{} \n'.format(message)) -def get_defmake_count(): +def get_defmake_count(fem_vtk_post=True): ''' count the def make in module ObjectsFem could also be done in bash with @@ -65,6 +65,12 @@ def get_defmake_count(): lines_modefile = modfile.readlines() modfile.close() lines_defmake = [l for l in lines_modefile if l.startswith('def make')] + if not fem_vtk_post: # FEM VTK post processing is disabled, we are not able to create VTK post objects + new_lines = [] + for l in lines_defmake: + if not "PostVtk" in l: + new_lines.append(l) + lines_defmake = new_lines return len(lines_defmake)