2014-01-09 20:20:44 +06:00
# -*- coding: utf-8 -*-
import logging
2017-03-20 17:27:30 +05:00
from . geomsmesh import smesh
2014-01-09 20:20:44 +06:00
import SMESH
2016-03-04 19:09:50 +05:00
import traceback
2017-03-20 17:27:30 +05:00
from . fissError import fissError
2014-01-09 20:20:44 +06:00
2017-03-20 17:27:30 +05:00
from . listOfExtraFunctions import lookForCorner
from . fusionMaillageAttributionDefaut import fusionMaillageDefaut
2014-08-25 21:26:29 +06:00
2014-01-09 20:20:44 +06:00
# -----------------------------------------------------------------------------
# --- peau interne du defaut dans le maillage sain
2014-08-25 21:26:29 +06:00
def peauInterne ( fichierMaillage , shapeDefaut , nomZones ) :
2014-01-09 20:20:44 +06:00
"""
Retrouve les groupes de défaut dans le maillage sain modifié par CreateHoleSkin ( CreeZoneDefautMaillage )
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 .
"""
logging . info ( " start " )
( [ maillageSain ] , status ) = smesh . CreateMeshesFromMED ( fichierMaillage )
groups = maillageSain . GetGroups ( )
zoneDefaut = None
for grp in groups :
2014-08-29 19:11:49 +06:00
logging . debug ( " groupe %s " , grp . GetName ( ) )
2014-01-09 20:20:44 +06:00
if grp . GetName ( ) == nomZones + " _vol " :
zoneDefaut = grp
break
zoneDefaut_skin = None
for grp in groups :
if grp . GetName ( ) == nomZones + " _skin " :
zoneDefaut_skin = grp
break
zoneDefaut_internalFaces = None
for grp in groups :
if grp . GetName ( ) == nomZones + " _internalFaces " :
zoneDefaut_internalFaces = grp
break
zoneDefaut_internalEdges = None
for grp in groups :
if grp . GetName ( ) == nomZones + " _internalEdges " :
zoneDefaut_internalEdges = grp
break
2016-03-04 19:09:50 +05:00
# --- Le groupe ZoneDefaut ne doit contenir que des Hexaèdres"
info = maillageSain . GetMeshInfo ( zoneDefaut )
2017-03-20 17:27:30 +05:00
keys = list ( info . keys ( ) ) ; keys . sort ( )
2016-03-04 19:09:50 +05:00
nbelem = 0
nbhexa = 0
for i in keys :
#print " %s : %d" % ( i, info[i] )
nbelem + = info [ i ]
2016-03-08 15:41:15 +05:00
if " Entity_Hexa " in str ( i ) :
2016-03-04 19:09:50 +05:00
nbhexa + = info [ i ]
if ( nbelem == 0 ) or ( nbhexa < nbelem ) :
2016-03-04 20:29:26 +05:00
texte = " La zone a remailler est incorrecte.<br> "
2016-03-04 19:09:50 +05: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 20:29:26 +05:00
texte + = " <li>Certaines faces du maillage sain sont à l ' envers : les normales aux faces en paroi de volume doivent être sortantes.</li> "
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 19:09:50 +05:00
raise fissError ( traceback . extract_stack ( ) , texte )
2014-01-09 20:20:44 +06: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 )
2014-08-25 21:26:29 +06:00
maillageDefautCible = smesh . CopyMesh ( zoneDefaut_skin , ' maillageCible ' , 0 , 0 )
listOfCorner = lookForCorner ( maillageDefautCible )
2014-08-29 19:11:49 +06:00
logging . debug ( " listOfCorner = %s " , listOfCorner )
2014-08-25 21:26:29 +06:00
if len ( listOfCorner ) > 0 :
2014-08-29 19:11:49 +06:00
logging . info ( " présence de coins à la surface externe de la zone à reconstruire " )
2014-08-25 21:26:29 +06:00
zoneDefaut_skin , internalBoundary = fusionMaillageDefaut ( maillageSain , maillageDefautCible , internalBoundary , zoneDefaut_skin , shapeDefaut , listOfCorner )
2014-01-09 20:20:44 +06:00
return maillageSain , internalBoundary , zoneDefaut , zoneDefaut_skin , zoneDefaut_internalFaces , zoneDefaut_internalEdges