diff --git a/src/Mod/Fem/Gui/CMakeLists.txt b/src/Mod/Fem/Gui/CMakeLists.txt index ec05485b75..73939d9c06 100755 --- a/src/Mod/Fem/Gui/CMakeLists.txt +++ b/src/Mod/Fem/Gui/CMakeLists.txt @@ -400,6 +400,7 @@ SET(FemGuiPythonUI_SRCS Resources/ui/ConstraintTie.ui Resources/ui/ConstraintSectionPrint.ui Resources/ui/CurrentDensity.ui + Resources/ui/DlgSettingsNetgen.ui Resources/ui/ElectrostaticPotential.ui Resources/ui/ElementFluid1D.ui Resources/ui/ElementGeometry1D.ui diff --git a/src/Mod/Fem/Gui/Resources/Fem.qrc b/src/Mod/Fem/Gui/Resources/Fem.qrc index 49a7df6e26..db84762ef8 100755 --- a/src/Mod/Fem/Gui/Resources/Fem.qrc +++ b/src/Mod/Fem/Gui/Resources/Fem.qrc @@ -123,6 +123,7 @@ ui/ConstraintSectionPrint.ui ui/ConstraintTie.ui ui/CurrentDensity.ui + ui/DlgSettingsNetgen.ui ui/ElectrostaticPotential.ui ui/ElementFluid1D.ui ui/ElementGeometry1D.ui diff --git a/src/Mod/Fem/Gui/Resources/ui/DlgSettingsNetgen.ui b/src/Mod/Fem/Gui/Resources/ui/DlgSettingsNetgen.ui new file mode 100644 index 0000000000..d803a33c5d --- /dev/null +++ b/src/Mod/Fem/Gui/Resources/ui/DlgSettingsNetgen.ui @@ -0,0 +1,66 @@ + + + Gui::Dialog::DlgSettingsNetgen + + + + 0 + 0 + 500 + 560 + + + + Netgen + + + + + + Netgen + + + + + + Use legacy Netgen object implementation + + + Qt::LeftToRight + + + true + + + Legacy Netgen + + + UseLegacyNetgen + + + Mod/Fem/Netgen + + + + + + + + + + Qt::Vertical + + + + + + + + Gui::PrefCheckBox + QCheckBox +
Gui/PrefWidgets.h
+
+
+ + +
diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index f32ec68677..0ec9b478bf 100644 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -72,6 +72,8 @@ class FemWorkbench(Workbench): import FemGui import femcommands.commands + FreeCADGui.addPreferencePage(":/ui/DlgSettingsNetgen.ui", "FEM") + # dummy usage to get flake8 and lgtm quiet False if Fem.__name__ else True False if FemGui.__name__ else True diff --git a/src/Mod/Fem/ObjectsFem.py b/src/Mod/Fem/ObjectsFem.py index 5148f2b891..bd0eb7d301 100644 --- a/src/Mod/Fem/ObjectsFem.py +++ b/src/Mod/Fem/ObjectsFem.py @@ -537,6 +537,13 @@ def makeMeshNetgen(doc, name="MeshNetgen"): return obj +def makeMeshNetgenLegacy(doc, name="MeshNetgen"): + """makeMeshNetgenLegacy(document, [name]): + makes a old implementation Netgen FEM mesh object""" + obj = doc.addObject("Fem::FemMeshShapeNetgenObject", name) + return obj + + def makeMeshRegion(doc, base_mesh, element_length=0.0, name="MeshRegion"): """makeMeshRegion(document, base_mesh, [element_length], [name]): creates a FEM mesh refinement object to define properties for a refinement of a FEM mesh diff --git a/src/Mod/Fem/femcommands/commands.py b/src/Mod/Fem/femcommands/commands.py index bc41a058a4..78085ce8b4 100644 --- a/src/Mod/Fem/femcommands/commands.py +++ b/src/Mod/Fem/femcommands/commands.py @@ -817,14 +817,20 @@ class _MeshNetgenFromShape(CommandManager): def Activated(self): # a mesh could be made with and without an analysis, # we're going to check not for an analysis in command manager module + netgen_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/Netgen") FreeCAD.ActiveDocument.openTransaction("Create FEM mesh Netgen") mesh_obj_name = "FEMMeshNetgen" # if requested by some people add Preference for this # mesh_obj_name = sel[0].Name + "_Mesh" FreeCADGui.addModule("ObjectsFem") - FreeCADGui.doCommand( - "ObjectsFem.makeMeshNetgen(FreeCAD.ActiveDocument, '" + mesh_obj_name + "')" - ) + if netgen_prefs.GetBool("UseLegacyNetgen", 1): + FreeCADGui.doCommand( + "ObjectsFem.makeMeshNetgenLegacy(FreeCAD.ActiveDocument, '" + mesh_obj_name + "')" + ) + else: + FreeCADGui.doCommand( + "ObjectsFem.makeMeshNetgen(FreeCAD.ActiveDocument, '" + mesh_obj_name + "')" + ) FreeCADGui.doCommand( "FreeCAD.ActiveDocument.ActiveObject.Shape = FreeCAD.ActiveDocument.{}".format( self.selobj.Name diff --git a/src/Mod/Fem/femtest/app/test_object.py b/src/Mod/Fem/femtest/app/test_object.py index 57471886cb..ce4b47e9b0 100644 --- a/src/Mod/Fem/femtest/app/test_object.py +++ b/src/Mod/Fem/femtest/app/test_object.py @@ -241,6 +241,9 @@ class TestObjectType(unittest.TestCase): self.assertEqual("Fem::MeshGroup", type_of_obj(ObjectsFem.makeMeshGroup(doc, mesh))) self.assertEqual("Fem::MeshRegion", type_of_obj(ObjectsFem.makeMeshRegion(doc, mesh))) self.assertEqual("Fem::FemMeshNetgen", type_of_obj(ObjectsFem.makeMeshNetgen(doc))) + self.assertEqual( + "Fem::FemMeshShapeNetgenObject", type_of_obj(ObjectsFem.makeMeshNetgenLegacy(doc)) + ) self.assertEqual("Fem::MeshResult", type_of_obj(ObjectsFem.makeMeshResult(doc))) self.assertEqual("Fem::ResultMechanical", type_of_obj(ObjectsFem.makeResultMechanical(doc))) solverelmer = ObjectsFem.makeSolverElmer(doc) @@ -408,6 +411,9 @@ class TestObjectType(unittest.TestCase): self.assertTrue(is_of_type(ObjectsFem.makeMeshGroup(doc, mesh), "Fem::MeshGroup")) self.assertTrue(is_of_type(ObjectsFem.makeMeshRegion(doc, mesh), "Fem::MeshRegion")) self.assertTrue(is_of_type(ObjectsFem.makeMeshNetgen(doc), "Fem::FemMeshNetgen")) + self.assertTrue( + is_of_type(ObjectsFem.makeMeshNetgenLegacy(doc), "Fem::FemMeshShapeNetgenObject") + ) self.assertTrue(is_of_type(ObjectsFem.makeMeshResult(doc), "Fem::MeshResult")) self.assertTrue(is_of_type(ObjectsFem.makeResultMechanical(doc), "Fem::ResultMechanical")) solverelmer = ObjectsFem.makeSolverElmer(doc) @@ -744,6 +750,9 @@ class TestObjectType(unittest.TestCase): mesh_netgen = ObjectsFem.makeMeshNetgen(doc) self.assertTrue(is_derived_from(mesh_netgen, "App::DocumentObject")) self.assertTrue(is_derived_from(mesh_netgen, "Fem::FemMeshShapeBaseObjectPython")) + mesh_netgen = ObjectsFem.makeMeshNetgenLegacy(doc) + self.assertTrue(is_derived_from(mesh_netgen, "App::DocumentObject")) + self.assertTrue(is_derived_from(mesh_netgen, "Fem::FemMeshShapeNetgenObject")) # MeshResult mesh_result = ObjectsFem.makeMeshResult(doc) @@ -972,6 +981,9 @@ class TestObjectType(unittest.TestCase): self.assertTrue( ObjectsFem.makeMeshNetgen(doc).isDerivedFrom("Fem::FemMeshShapeBaseObjectPython") ) + self.assertTrue( + ObjectsFem.makeMeshNetgenLegacy(doc).isDerivedFrom("Fem::FemMeshShapeNetgenObject") + ) self.assertTrue(ObjectsFem.makeMeshResult(doc).isDerivedFrom("Fem::FemMeshObjectPython")) self.assertTrue( ObjectsFem.makeResultMechanical(doc).isDerivedFrom("Fem::FemResultObjectPython") @@ -1081,6 +1093,7 @@ def create_all_fem_objects_doc(doc): ObjectsFem.makeMeshGroup(doc, msh) ObjectsFem.makeMeshRegion(doc, msh) analysis.addObject(ObjectsFem.makeMeshNetgen(doc)) + analysis.addObject(ObjectsFem.makeMeshNetgenLegacy(doc)) rm = ObjectsFem.makeMeshResult(doc) res = analysis.addObject(ObjectsFem.makeResultMechanical(doc))[0]