smesh/src/Tools/blocFissure/gmu/peauInterne.py

108 lines
4.6 KiB
Python
Raw Normal View History

2014-01-09 14:20:44 +00:00
# -*- coding: utf-8 -*-
2021-03-23 17:44:27 +03:00
# Copyright (C) 2014-2021 EDF R&D
2019-02-14 14:55:47 +03:00
#
# This library 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.
#
# This library 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 this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
2014-01-09 14:20:44 +00:00
import logging
2017-03-20 13:27:30 +01:00
from .geomsmesh import smesh
2014-01-09 14:20:44 +00:00
import SMESH
import traceback
2017-03-20 13:27:30 +01:00
from .fissError import fissError
2014-01-09 14:20:44 +00:00
2017-03-20 13:27:30 +01:00
from .listOfExtraFunctions import lookForCorner
from .fusionMaillageAttributionDefaut import fusionMaillageDefaut
2014-01-09 14:20:44 +00:00
# -----------------------------------------------------------------------------
# --- peau interne du defaut dans le maillage sain
def peauInterne(fichierMaillage, shapeDefaut, nomZones):
2021-03-03 16:39:15 +01:00
"""Retrouve les groupes de défaut dans le maillage sain modifié par CreateHoleSkin (CreeZoneDefautMaillage)
2014-01-09 14:20:44 +00:00
On récupère le volume et la peau de la zone de défaut, les éventuelles faces et arêtes internes de cette zone.
Remarque : intérêt du passage par fichierMaillage plutôt que par maillageSain ?
2014-01-09 14:20:44 +00:00
"""
logging.info("start")
([maillageSain], status) = smesh.CreateMeshesFromMED(fichierMaillage)
groups = maillageSain.GetGroups()
2021-03-03 16:39:15 +01:00
#print ("groupes :")
#for grp in groups:
#print ("\t{}".format(grp.GetName()))
2014-01-09 14:20:44 +00:00
zoneDefaut = None
for grp in groups:
logging.debug("groupe %s",grp.GetName())
2014-01-09 14:20:44 +00:00
if grp.GetName() == nomZones + "_vol":
zoneDefaut = grp
break
2021-03-03 16:39:15 +01:00
#print ("zoneDefaut = {}".format(zoneDefaut))
2014-01-09 14:20:44 +00:00
zoneDefaut_skin = None
for grp in groups:
if grp.GetName() == nomZones + "_skin":
zoneDefaut_skin = grp
break
2021-03-03 16:39:15 +01:00
#print ("zoneDefaut_skin = {}".format(zoneDefaut_skin))
2014-01-09 14:20:44 +00:00
zoneDefaut_internalFaces = None
for grp in groups:
if grp.GetName() == nomZones + "_internalFaces":
zoneDefaut_internalFaces = grp
break
2021-03-03 16:39:15 +01:00
#print ("zoneDefaut_internalFaces = {}".format(zoneDefaut_internalFaces))
2014-01-09 14:20:44 +00:00
zoneDefaut_internalEdges = None
for grp in groups:
if grp.GetName() == nomZones + "_internalEdges":
zoneDefaut_internalEdges = grp
break
2021-03-03 16:39:15 +01:00
#print ("zoneDefaut_internalEdges = {}".format(zoneDefaut_internalEdges))
# --- Le groupe ZoneDefaut ne doit contenir que des Hexaèdres"
2021-03-03 16:39:15 +01:00
info = maillageSain.GetMeshInfo(zoneDefaut)
#print ("info = {}".format(info))
nbelem = 0
nbhexa = 0
for entity_type in info:
#print (". {} : {})".format(entity_type, info[entity_type]))
nbelem += info[entity_type]
if ("Entity_Hexa" == str(entity_type)):
nbhexa += info[entity_type]
nbhexa += info[entity_type]
#print ("==> nbelem = {}, nbhexa = {}".format(nbelem,nbhexa))
if ( (nbelem == 0) or (nbhexa < nbelem) ):
print ("==> nbelem = {}, nbhexa = {}".format(nbelem,nbhexa))
texte = "La zone a remailler est incorrecte.<br>"
texte += "Causes possibles :<ul>"
texte += "<li>Les mailles à enlever dans le maillage sain n'ont pas été détectées.</li>"
texte += "<li>Certaines faces du maillage sain sont à l'envers : les normales aux faces en paroi de volume doivent être sortantes.</li>"
2021-03-03 16:39:15 +01:00
texte += "<li>Il n'y a pas que des hexaèdres réglés linéaires dans la zone à remailler (notamment mailles quadratiques, tetraèdres non traités)</li></ul>"
raise fissError(traceback.extract_stack(),texte)
2014-01-09 14:20:44 +00:00
nbAdded, maillageSain, DefautBoundary = maillageSain.MakeBoundaryElements( SMESH.BND_2DFROM3D, 'DefBound', '', 0, [ zoneDefaut ])
internal = maillageSain.GetMesh().CutListOfGroups( [ DefautBoundary ], [ zoneDefaut_skin ], 'internal' )
internalBoundary = smesh.CopyMesh( internal, 'internalBoundary', 0, 0)
2021-03-03 16:39:15 +01:00
maillageDefautCible = smesh.CopyMesh(zoneDefaut_skin, 'maillageCible', 0, 0)
listOfCorner = lookForCorner(maillageDefautCible)
logging.debug("listOfCorner = {}".format(listOfCorner))
if listOfCorner:
logging.info("présence de coins à la surface externe de la zone à reconstruire")
zoneDefaut_skin, internalBoundary = fusionMaillageDefaut(maillageSain, maillageDefautCible, internalBoundary, zoneDefaut_skin, shapeDefaut, listOfCorner)
2014-01-09 14:20:44 +00:00
return maillageSain, internalBoundary, zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges