Fem: Add option to use old Netgen mesher implementation

This commit is contained in:
marioalexis
2024-10-04 11:26:19 -03:00
committed by Yorik van Havre
parent 5b3ab4759d
commit 5438cc3a7f
7 changed files with 99 additions and 3 deletions

View File

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

View File

@@ -123,6 +123,7 @@
<file>ui/ConstraintSectionPrint.ui</file>
<file>ui/ConstraintTie.ui</file>
<file>ui/CurrentDensity.ui</file>
<file>ui/DlgSettingsNetgen.ui</file>
<file>ui/ElectrostaticPotential.ui</file>
<file>ui/ElementFluid1D.ui</file>
<file>ui/ElementGeometry1D.ui</file>

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Gui::Dialog::DlgSettingsNetgen</class>
<widget class="QWidget" name="Gui::Dialog::DlgSettingsNetgen">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>560</height>
</rect>
</property>
<property name="windowTitle">
<string>Netgen</string>
</property>
<layout class="QVBoxLayout">
<item>
<widget class="QGroupBox" name="groupBox_1">
<property name="title">
<string>Netgen</string>
</property>
<layout class="QGridLayout" name="gridLayout_1">
<item row="0" column="0">
<widget class="Gui::PrefCheckBox" name="ckb_legacy">
<property name="toolTip">
<string>Use legacy Netgen object implementation</string>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Legacy Netgen</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>UseLegacyNetgen</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Fem/Netgen</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_1">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>Gui::PrefCheckBox</class>
<extends>QCheckBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

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

View File

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

View File

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

View File

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