Files
create/src/Mod/Fem/femviewprovider/view_mesh_netgen.py
2024-11-07 23:05:27 -03:00

163 lines
7.9 KiB
Python

# SPDX-License-Identifier: LGPL-2.1-or-later
# ***************************************************************************
# * Copyright (c) 2024 Mario Passaglia <mpassaglia[at]cbc.uba.ar> *
# * *
# * This file is part of FreeCAD. *
# * *
# * FreeCAD is free software: you can redistribute it and/or modify it *
# * under the terms of the GNU Lesser General Public License as *
# * published by the Free Software Foundation, either version 2.1 of the *
# * License, or (at your option) any later version. *
# * *
# * FreeCAD 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 *
# * Lesser General Public License for more details. *
# * *
# * You should have received a copy of the GNU Lesser General Public *
# * License along with FreeCAD. If not, see *
# * <https://www.gnu.org/licenses/>. *
# * *
# ***************************************************************************
__title__ = "FreeCAD FEM mesh netgen ViewProvider for the document object"
__author__ = "Mario Passaglia"
__url__ = "https://www.freecad.org"
## @package view_mesh_netgen
# \ingroup FEM
# \brief view provider for mesh netgen object
import FreeCAD
import FreeCADGui
import FemGui
from PySide import QtGui
from femtaskpanels import task_mesh_netgen
from femtools.femutils import is_of_type
from femviewprovider import view_base_femobject
class VPMeshNetgen(view_base_femobject.VPBaseFemObject):
"""
A View Provider for the MeshNetgen object
"""
def __init__(self, vobj):
vobj.Proxy = self
def getIcon(self):
return ":/icons/FEM_MeshNetgenFromShape.svg"
def setEdit(self, vobj, mode):
# hide all FEM meshes and VTK FemPost* objects
for obj in vobj.Object.Document.Objects:
if obj.isDerivedFrom("Fem::FemMeshObject") or obj.isDerivedFrom("Fem::FemPostObject"):
obj.ViewObject.hide()
# show the mesh we like to edit
self.ViewObject.show()
# show task panel
taskd = task_mesh_netgen._TaskPanel(self.Object)
FreeCADGui.Control.showDialog(taskd)
return True
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 analysis the object belongs too!!!
# first check if there is an analysis in the active document
found_an_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom("Fem::FemAnalysisPython"):
found_an_analysis = True
break
if found_an_analysis:
if FemGui.getActiveAnalysis() is not None:
if FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument:
if self.Object in FemGui.getActiveAnalysis().Group:
if not gui_doc.getInEdit():
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError(
"Activate the analysis this Netgen FEM "
"mesh object belongs too!\n"
)
else:
FreeCAD.Console.PrintMessage(
"Netgen FEM mesh object does not belong to the active analysis.\n"
)
found_mesh_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom("Fem::FemAnalysisPython"):
for m in o.Group:
if m == self.Object:
found_mesh_analysis = True
FemGui.setActiveAnalysis(o)
FreeCAD.Console.PrintMessage(
"The analysis the Netgen FEM mesh object "
"belongs to was found and activated: {}\n".format(
o.Name
)
)
gui_doc.setEdit(vobj.Object.Name)
break
if not found_mesh_analysis:
FreeCAD.Console.PrintLog(
"Netgen FEM mesh object does not belong to an analysis. "
"Analysis group meshing can not be used.\n"
)
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError("Active analysis is not in active document.\n")
else:
FreeCAD.Console.PrintLog(
"No active analysis in active document, "
"we are going to have a look if the Netgen FEM mesh object "
"belongs to a non active analysis.\n"
)
found_mesh_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom("Fem::FemAnalysisPython"):
for m in o.Group:
if m == self.Object:
found_mesh_analysis = True
FemGui.setActiveAnalysis(o)
FreeCAD.Console.PrintMessage(
"The analysis the Netgen FEM mesh object "
"belongs to was found and activated: {}\n".format(o.Name)
)
gui_doc.setEdit(vobj.Object.Name)
break
if not found_mesh_analysis:
FreeCAD.Console.PrintLog(
"Netgen FEM mesh object does not belong to an analysis. "
"Analysis group meshing can not be used.\n"
)
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintLog("No analysis in the active document.\n")
gui_doc.setEdit(vobj.Object.Name)
else:
from PySide.QtGui import QMessageBox
message = "Active Task Dialog found! Please close this one before opening a new one!"
QMessageBox.critical(None, "Error in tree view", message)
FreeCAD.Console.PrintError(message + "\n")
return True
def claimChildren(self):
reg_childs = self.Object.MeshRegionList
return reg_childs
def dumps(self):
return None
def loads(self, state):
return None