Salome HOME
Bos #23995 [CEA 24030] ParaView 5.9: fix volumes selection
[modules/smesh.git] / src / Tools / blocFissure / gmu / casStandard.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """Cas standard"""
21
22 import os
23 import logging
24
25 import GEOM
26 import SALOMEDS
27 import SMESH
28
29 from .geomsmesh import geompy, smesh
30 from .geomsmesh import geomPublish
31 from .geomsmesh import geomPublishInFather
32
33 from . import initLog
34
35 from .fissureGenerique import fissureGenerique
36
37 from .initEtude import initEtude
38 from .triedreBase import triedreBase
39 from .genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
40 from .creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
41 from .construitFissureGenerale import construitFissureGenerale
42 from .putName import putName
43
44 O, OX, OY, OZ = triedreBase()
45
46 class casStandard(fissureGenerique):
47   """problème de fissure standard, défini par :
48
49   - un maillage sain (hexaèdres),
50   - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
51   - les noms des groupes d'arêtes ou leurs numéros d'arêtes (edges au sens de GEOM) correspondant au fond de fissure
52   - les paramètres de maillage de la fissure
53   """
54   referencesMaillageFissure = None
55
56   # ---------------------------------------------------------------------------
57   def __init__ (self, dicoParams, references = None, numeroCas = 0):
58     initEtude()
59     self.references = references
60     self.dicoParams = dicoParams
61     if 'nomCas' in self.dicoParams:
62       self.nomCas = self.dicoParams['nomCas']
63     elif 'nomres' in self.dicoParams:
64       self.nomCas = os.path.splitext(os.path.split(self.dicoParams['nomres'])[1])[0]
65     else:
66       self.nomCas = 'casStandard'
67     if 'reptrav' in self.dicoParams:
68       self.reptrav = self.dicoParams['reptrav']
69     else:
70       self.reptrav = os.curdir
71     self.numeroCas = numeroCas
72     if self.numeroCas != 0:
73       self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
74     else:
75       self.nomProbleme = self.nomCas
76     if 'lenSegPipe' in self.dicoParams:
77       self.lenSegPipe = self.dicoParams['lenSegPipe']
78     else:
79       self.lenSegPipe =self.dicoParams['rayonPipe']
80     if 'step' in self.dicoParams:
81       step = self.dicoParams['step']
82     else:
83       step = -1 # exécuter toutes les étapes
84     if 'aretesVives' not in self.dicoParams:
85       self.dicoParams['aretesVives'] = 0
86     if self.numeroCas == 0: # valeur par défaut : exécution immédiate, sinon execution différée dans le cas d'une liste de problèmes
87       self.executeProbleme(step)
88
89   # ---------------------------------------------------------------------------
90   def genereMaillageSain(self, geometriesSaines, meshParams):
91     logging.info("genereMaillageSain %s", self.nomCas)
92
93     ([objetSain], _) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
94     putName(objetSain.GetMesh(), 'objetSain', i_pref=self.numeroCas)
95
96     return [objetSain, True] # True : maillage hexa
97
98   # ---------------------------------------------------------------------------
99   def setParamShapeFissure(self):
100     """
101     paramètres de la fissure pour méthode insereFissureGenerale
102     lgInfluence : distance autour de la shape de fissure a remailler (A ajuster selon le maillage)
103     rayonPipe   : le rayon du pile maillé en hexa autour du fond de fissure
104     convexe     : True : la face est convexe (vue de l'exterieur) sert si on ne donne pas de point interne
105     pointIn_x   : optionnel : coordonnée x d'un point dans le solide sain (pour orienter la face - idem avec y,z)
106     """
107     logging.info("setParamShapeFissure %s", self.nomCas)
108     if 'pointInterieur' in self.dicoParams:
109       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
110                                      rayonPipe   = self.dicoParams['rayonPipe'],
111                                      lenSegPipe  = self.lenSegPipe,
112                                      pointIn_x   = self.dicoParams['pointInterieur'][0],
113                                      pointIn_y   = self.dicoParams['pointInterieur'][1],
114                                      pointIn_z   = self.dicoParams['pointInterieur'][2])
115     else:
116       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
117                                      rayonPipe   = self.dicoParams['rayonPipe'],
118                                      lenSegPipe  = self.lenSegPipe)
119
120   # ---------------------------------------------------------------------------
121   def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams, \
122                                 mailleur="MeshGems"):
123
124     lgInfluence = shapeFissureParams['lgInfluence']
125
126 #   Contrôle de 'brepFaceFissure' pour les anciennes versions
127     if ( 'brepFaceFissure' in self.dicoParams ):
128       self.dicoParams['CAOFaceFissure'] = self.dicoParams['brepFaceFissure']
129     cao_file = self.dicoParams['CAOFaceFissure']
130     suffix = os.path.basename(cao_file).split(".")[-1]
131     if ( suffix.upper() == "BREP" ):
132       shellFiss = geompy.ImportBREP(cao_file)
133     elif ( suffix.upper() == "XAO" ):
134       (_, shellFiss, _, l_groups, _) = geompy.ImportXAO(cao_file)
135     fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
136 #   Contrôle de 'edgeFissIds' pour les anciennes versions
137     if ( 'edgeFissIds' in self.dicoParams ):
138       self.dicoParams['edgeFiss'] = self.dicoParams['edgeFissIds']
139     if isinstance(self.dicoParams['edgeFiss'][0],int):
140       geompy.UnionIDs(fondFiss, self.dicoParams['edgeFiss'] )
141     else:
142       l_groups = geompy.GetGroups(shellFiss)
143       l_aux = list()
144       for group in l_groups:
145         if ( group.GetName() in self.dicoParams['edgeFiss'] ):
146           l_aux.append(group)
147       geompy.UnionList(fondFiss, l_aux )
148     geomPublish(initLog.debug, shellFiss, 'shellFiss' )
149     geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
150
151
152     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1], \
153                                                      mailleur, self.numeroCas)
154
155     centre = None
156     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
157
158   # ---------------------------------------------------------------------------
159   def setParamMaillageFissure(self):
160     self.maillageFissureParams = dict(nomRep           = self.reptrav,
161                                       nomFicSain       = self.nomCas +'_sain',
162                                       nomFicFissure    = self.nomCas,
163                                       nbsegRad         = self.dicoParams['nbSegRad'],
164                                       nbsegCercle      = self.dicoParams['nbSegCercle'],
165                                       areteFaceFissure = self.dicoParams['areteFaceFissure'],
166                                       aretesVives      = self.dicoParams['aretesVives'])
167
168   # ---------------------------------------------------------------------------
169   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
170     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams, \
171                           self.numeroCas)
172     return elementsDefaut
173
174   # ---------------------------------------------------------------------------
175   def genereMaillageFissure(self, geometriesSaines, maillagesSains, \
176                                   shapesFissure, shapeFissureParams, \
177                                   maillageFissureParams, elementsDefaut, step, \
178                                   mailleur="MeshGems"):
179     maillageFissure = construitFissureGenerale(shapesFissure, shapeFissureParams, \
180                                                maillageFissureParams, elementsDefaut, \
181                                                step, mailleur, self.numeroCas)
182     return maillageFissure
183
184   # ---------------------------------------------------------------------------
185   def setReferencesMaillageFissure(self):
186     if self.references is not None:
187       self.referencesMaillageFissure = self.references
188     else:
189       self.referencesMaillageFissure = dict( \
190                                             Entity_Quad_Quadrangle = 0, \
191                                             Entity_Quad_Hexa = 0, \
192                                             Entity_Node = 0, \
193                                             Entity_Quad_Edge = 0, \
194                                             Entity_Quad_Triangle = 0, \
195                                             Entity_Quad_Tetra = 0, \
196                                             Entity_Quad_Pyramid = 0, \
197                                             Entity_Quad_Penta = 0 \
198                                            )