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
2016-03-04 15:09:50 +01:00
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-08-25 17:26:29 +02:00
2014-01-09 14:20:44 +00:00
# -----------------------------------------------------------------------------
# --- peau interne du defaut dans le maillage sain
2014-08-25 17:26:29 +02:00
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 .
2021-01-26 11:45:01 +01:00
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 :
2014-08-29 15:11:49 +02:00
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))
2016-03-04 15:09:50 +01:00
# --- 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 ) )
2016-03-04 16:29:26 +01:00
texte = " La zone a remailler est incorrecte.<br> "
2016-03-04 15:09:50 +01:00
texte + = " Causes possibles :<ul> "
texte + = " <li>Les mailles à enlever dans le maillage sain n ' ont pas été détectées.</li> "
2016-03-04 16:29:26 +01:00
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> "
2016-03-04 15:09:50 +01:00
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
2014-08-25 17:26:29 +02:00
maillageDefautCible = smesh . CopyMesh ( zoneDefaut_skin , ' maillageCible ' , 0 , 0 )
listOfCorner = lookForCorner ( maillageDefautCible )
2021-01-26 11:45:01 +01:00
logging . debug ( " listOfCorner = {} " . format ( listOfCorner ) )
if listOfCorner :
2014-08-29 15:11:49 +02:00
logging . info ( " présence de coins à la surface externe de la zone à reconstruire " )
2014-08-25 17:26:29 +02:00
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