From c3df2e298d5637a1230a92e7294f0cee643baa63 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 22 Nov 2016 19:47:54 +0100 Subject: [PATCH] FEM: GMSH mesh tool, new python mesh object --- src/Mod/Fem/App/CMakeLists.txt | 3 + src/Mod/Fem/CMakeLists.txt | 4 + src/Mod/Fem/FemMeshGmsh.py | 43 +++++++++ src/Mod/Fem/_FemMeshGmsh.py | 69 ++++++++++++++ src/Mod/Fem/_ViewProviderFemMeshGmsh.py | 114 ++++++++++++++++++++++++ 5 files changed, 233 insertions(+) create mode 100644 src/Mod/Fem/FemMeshGmsh.py create mode 100644 src/Mod/Fem/_FemMeshGmsh.py create mode 100644 src/Mod/Fem/_ViewProviderFemMeshGmsh.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 448b304ce..bf1cb25dc 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -80,6 +80,7 @@ SET(FemScripts_SRCS _FemBeamSection.py _FemConstraintSelfWeight.py _FemMaterialMechanicalNonlinear.py + _FemMeshGmsh.py _FemShellThickness.py _FemSolverCalculix.py _FemSolverZ88.py @@ -92,6 +93,7 @@ SET(FemScripts_SRCS _ViewProviderFemBeamSection.py _ViewProviderFemConstraintSelfWeight.py _ViewProviderFemMaterialMechanicalNonlinear.py + _ViewProviderFemMeshGmsh.py _ViewProviderFemShellThickness.py _ViewProviderFemSolverCalculix.py _ViewProviderFemSolverZ88.py @@ -111,6 +113,7 @@ SET(FemScripts_SRCS FemInputWriterCcx.py FemInputWriterZ88.py FemMaterialMechanicalNonlinear.py + FemMeshGmsh.py FemMeshTools.py FemShellThickness.py FemSolverCalculix.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 213166b67..3a8f33ce4 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -36,6 +36,10 @@ INSTALL( FemAnalysis.py _CommandAnalysis.py + FemMeshGmsh.py + _FemMeshGmsh.py + _ViewProviderFemMeshGmsh.py + FemBeamSection.py _FemBeamSection.py _ViewProviderFemBeamSection.py diff --git a/src/Mod/Fem/FemMeshGmsh.py b/src/Mod/Fem/FemMeshGmsh.py new file mode 100644 index 000000000..fbc98684a --- /dev/null +++ b/src/Mod/Fem/FemMeshGmsh.py @@ -0,0 +1,43 @@ +# *************************************************************************** +# * * +# * 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__ = "FemMeshGmsh" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## \addtogroup FEM +# @{ + +import FreeCAD +import _FemMeshGmsh + + +def makeFemMeshGmsh(name="FEMMeshGMSH"): + '''makeFemMeshGmsh(name): makes a GMSH FEM mesh object''' + obj = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObjectPython", name) + _FemMeshGmsh._FemMeshGmsh(obj) + if FreeCAD.GuiUp: + import _ViewProviderFemMeshGmsh + _ViewProviderFemMeshGmsh._ViewProviderFemMeshGmsh(obj.ViewObject) + return obj + +# @} diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py new file mode 100644 index 000000000..2dc0833e4 --- /dev/null +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -0,0 +1,69 @@ +# *************************************************************************** +# * * +# * 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__ = "_FemMeshGmsh" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package FemMeshGmsh +# \ingroup FEM + + +class _FemMeshGmsh(): + """The Fem::FemMeshObject's Proxy python type, add GMSH specific properties + """ + + # they will be used from the task panel too, thus they need to be outside of the __init__ + known_element_dimensions = ['Auto', '1D', '2D', '3D'] + known_element_orders = ['Auto', '1st', '2nd'] + + def __init__(self, obj): + self.Type = "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::PropertyLink", "Part", "FEM Mesh", "Part object to mesh") + obj.Part = None + + obj.addProperty("App::PropertyFloat", "ElementSizeMax", "FEM Mesh Params", "Max mesh element size (0.0 = infinity)") + obj.ElementSizeMax = 0.0 # will be 1e+22 + + obj.addProperty("App::PropertyFloat", "ElementSizeMin", "FEM Mesh Params", "Min mesh element size") + obj.ElementSizeMin = 0.0 + + obj.addProperty("App::PropertyEnumeration", "ElementDimension", "FEM Mesh Params", "Dimension of mesh elements (Auto = according ShapeType of part to mesh)") + obj.ElementDimension = _FemMeshGmsh.known_element_dimensions + obj.ElementDimension = 'Auto' # according ShapeType of Part to mesh + + obj.addProperty("App::PropertyEnumeration", "ElementOrder", "FEM Mesh Params", "Order of mesh elements (Auto will be 2nd)") + obj.ElementOrder = _FemMeshGmsh.known_element_orders + obj.ElementOrder = 'Auto' # = 2nd + + def execute(self, obj): + return + + def __getstate__(self): + return self.Type + + def __setstate__(self, state): + if state: + self.Type = state diff --git a/src/Mod/Fem/_ViewProviderFemMeshGmsh.py b/src/Mod/Fem/_ViewProviderFemMeshGmsh.py new file mode 100644 index 000000000..bcae49398 --- /dev/null +++ b/src/Mod/Fem/_ViewProviderFemMeshGmsh.py @@ -0,0 +1,114 @@ +# *************************************************************************** +# * * +# * 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__ = "_ViewProviderFemMeshGmsh" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package ViewProviderFemMeshGmsh +# \ingroup FEM + +import FreeCAD +import FreeCADGui +import FemGui + + +class _ViewProviderFemMeshGmsh: + "A View Provider for the FemMeshGmsh object" + def __init__(self, vobj): + vobj.Proxy = self + + def getIcon(self): + return ":/icons/fem-fem-mesh-from-shape.svg" + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + + def updateData(self, obj, prop): + return + + def onChanged(self, vobj, prop): + return + + def setEdit(self, vobj, mode): + self.ViewObject.show() # show the mesh on edit if it is hided + import _TaskPanelFemMeshGmsh + taskd = _TaskPanelFemMeshGmsh._TaskPanelFemMeshGmsh(self.Object) + taskd.obj = vobj.Object + FreeCADGui.Control.showDialog(taskd) + return True + + def unsetEdit(self, vobj, mode): + FreeCADGui.Control.closeDialog() + return + + def doubleClicked(self, vobj): + # Group meshing is only active on active analysis, we should make sure the analysis the mesh belongs too is active + gui_doc = FreeCADGui.getDocument(vobj.Object.Document) + if not gui_doc.getInEdit(): + # may be go the other way around and just activate the analysis the user has doubleClicked on ?! + # not a fast one, we need to iterate over all member of all analysis to know to which analyis the object belongs too!!! + if FemGui.getActiveAnalysis() is not None: + if FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument: + if self.Object in FemGui.getActiveAnalysis().Member: + if not gui_doc.getInEdit(): + FreeCAD.Console.PrintError('TaskPanel test not yet implemented\n') + # gui_doc.setEdit(vobj.Object.Name) + else: + FreeCAD.Console.PrintError('Activate the analysis this mesh belongs to!\n') + else: + print('Mesh does not belong to the active analysis.') + for o in gui_doc.Document.Objects: + if o.isDerivedFrom('Fem::FemAnalysisPython'): + for m in o.Member: + if m == self.Object: + FemGui.setActiveAnalysis(o) + print('Analysis the Mesh belongs too was activated.') + FreeCAD.Console.PrintError('TaskPanel test not yet implemented\n') + # gui_doc.setEdit(vobj.Object.Name) + break + else: + FreeCAD.Console.PrintError('Active Analysis is not in active Document!\n') + else: + # no active analysis, we gone have a look if the obj belongs to a non active analysis, + for o in gui_doc.Document.Objects: + if o.isDerivedFrom('Fem::FemAnalysisPython'): + for m in o.Member: + if m == self.Object: + FemGui.setActiveAnalysis(o) + print('Analysis the Mesh belongs too was activated.') + FreeCAD.Console.PrintError('TaskPanel test not yet implemented\n') + # gui_doc.setEdit(vobj.Object.Name) + break + else: + print('Mesh GMSH object does not belong to an analysis. Group meshing will is deactivated.') + gui_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