From 36868f3fe575014af2ed1130dcafc011a0395ec0 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 20 Dec 2016 18:11:10 +0100 Subject: [PATCH] FEM: mesh region, add object --- src/Mod/Fem/App/CMakeLists.txt | 3 + src/Mod/Fem/CMakeLists.txt | 4 ++ src/Mod/Fem/FemMeshRegion.py | 49 +++++++++++++ src/Mod/Fem/_FemMeshGmsh.py | 3 + src/Mod/Fem/_FemMeshRegion.py | 40 +++++++++++ src/Mod/Fem/_ViewProviderFemMeshRegion.py | 84 +++++++++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 src/Mod/Fem/FemMeshRegion.py create mode 100644 src/Mod/Fem/_FemMeshRegion.py create mode 100644 src/Mod/Fem/_ViewProviderFemMeshRegion.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 29572819bc..14633a173b 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -80,6 +80,7 @@ SET(FemScripts_SRCS _FemConstraintSelfWeight.py _FemMaterialMechanicalNonlinear.py _FemMeshGmsh.py + _FemMeshRegion.py _FemShellThickness.py _FemSolverCalculix.py _FemSolverZ88.py @@ -94,6 +95,7 @@ SET(FemScripts_SRCS _ViewProviderFemConstraintSelfWeight.py _ViewProviderFemMaterialMechanicalNonlinear.py _ViewProviderFemMeshGmsh.py + _ViewProviderFemMeshRegion.py _ViewProviderFemShellThickness.py _ViewProviderFemSolverCalculix.py _ViewProviderFemSolverZ88.py @@ -116,6 +118,7 @@ SET(FemScripts_SRCS FemMaterialMechanicalNonlinear.py FemMesh2Mesh.py FemMeshGmsh.py + FemMeshRegion.py FemMeshTools.py FemShellThickness.py FemSolverCalculix.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 794b56e5e2..d541817503 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -48,6 +48,10 @@ INSTALL( FemMesh2Mesh.py _CommandFEMMesh2Mesh.py + FemMeshRegion.py + _FemMeshRegion.py + _ViewProviderFemMeshRegion.py + FemBeamSection.py _FemBeamSection.py _ViewProviderFemBeamSection.py diff --git a/src/Mod/Fem/FemMeshRegion.py b/src/Mod/Fem/FemMeshRegion.py new file mode 100644 index 0000000000..94fb8a2aa2 --- /dev/null +++ b/src/Mod/Fem/FemMeshRegion.py @@ -0,0 +1,49 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "FemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## \addtogroup FEM +# @{ + +import FreeCAD +import _FemMeshRegion + + +def makeFemMeshRegion(base_mesh, element_length=2.0, name="FEMMeshRegion"): + '''makeFemMeshRegion([length], [name]): creates a FEM mesh region object to define properties for a regon of a FEM mesh''' + obj = FreeCAD.ActiveDocument.addObject("Fem::FeaturePython", name) + _FemMeshRegion._FemMeshRegion(obj) + obj.CharacteristicLength = element_length + # obj.BaseMesh = base_mesh + # App::PropertyLinkList does not support append, we will use a temporary list to append the mesh region obj. to the list + tmplist = base_mesh.MeshRegionList + tmplist.append(obj) + base_mesh.MeshRegionList = tmplist + if FreeCAD.GuiUp: + import _ViewProviderFemMeshRegion + _ViewProviderFemMeshRegion._ViewProviderFemMeshRegion(obj.ViewObject) + return obj + +# @} diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index ef9db0b6a7..1eee8c8538 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -43,6 +43,9 @@ class _FemMeshGmsh(): self.Object = obj # keep a ref to the DocObj for nonGui usage obj.Proxy = self # link between App::DocumentObject to this object + obj.addProperty("App::PropertyLinkList", "MeshRegionList", "Base", "Mesh regions of the mesh") + obj.MeshRegionList = [] + obj.addProperty("App::PropertyLink", "Part", "FEM Mesh", "Part object to mesh") obj.Part = None diff --git a/src/Mod/Fem/_FemMeshRegion.py b/src/Mod/Fem/_FemMeshRegion.py new file mode 100644 index 0000000000..49f7e1dde1 --- /dev/null +++ b/src/Mod/Fem/_FemMeshRegion.py @@ -0,0 +1,40 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_FemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package FemMeshRegion +# \ingroup FEM + + +class _FemMeshRegion: + "The FemMeshRegion object" + def __init__(self, obj): + obj.addProperty("App::PropertyLength", "CharacteristicLength", "MeshRegionProperties", "set characteristic length of FEM elements for this region") + obj.addProperty("App::PropertyLinkSubList", "References", "MeshRegionShapes", "List of FEM mesh region shapes") + obj.Proxy = self + self.Type = "FemMeshRegion" + + def execute(self, obj): + return diff --git a/src/Mod/Fem/_ViewProviderFemMeshRegion.py b/src/Mod/Fem/_ViewProviderFemMeshRegion.py new file mode 100644 index 0000000000..a5a4f3caaa --- /dev/null +++ b/src/Mod/Fem/_ViewProviderFemMeshRegion.py @@ -0,0 +1,84 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_ViewProviderFemMeshRegion" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package ViewProviderFemMeshRegion +# \ingroup FEM + +import FreeCAD +import FreeCADGui +from pivy import coin + + +class _ViewProviderFemMeshRegion: + "A View Provider for the FemMeshRegion object" + def __init__(self, vobj): + vobj.Proxy = self + + def getIcon(self): + return ":/icons/fem-femmesh-from-shape.svg" + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + self.standard = coin.SoGroup() + vobj.addDisplayMode(self.standard, "Standard") + + def getDisplayModes(self, obj): + return ["Standard"] + + def getDefaultDisplayMode(self): + return "Standard" + + def updateData(self, obj, prop): + return + + def onChanged(self, vobj, prop): + return + + def setEdit(self, vobj, mode=0): + import _TaskPanelFemMeshRegion + taskd = _TaskPanelFemMeshRegion._TaskPanelFemMeshRegion(self.Object) + taskd.obj = vobj.Object + FreeCADGui.Control.showDialog(taskd) + return True + + def unsetEdit(self, vobj, mode=0): + FreeCADGui.Control.closeDialog() + return + + def doubleClicked(self, vobj): + doc = FreeCADGui.getDocument(vobj.Object.Document) + if not doc.getInEdit(): + doc.setEdit(vobj.Object.Name) + else: + FreeCAD.Console.PrintError('Active Task Dialog found! Please close this one first!\n') + return True + + def __getstate__(self): + return None + + def __setstate__(self, state): + return None