Salome HOME
Amélioration du ptyhon
[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
43 O, OX, OY, OZ = triedreBase()
44
45 class casStandard(fissureGenerique):
46   """problème de fissure standard, défini par :
47
48   - un maillage sain (hexaèdres),
49   - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
50   - les numéros d'arêtes (edges géométriques) correspondant au fond de fissure
51   - les paramètres de maillage de la fissure
52   """
53   referencesMaillageFissure = None
54
55   # ---------------------------------------------------------------------------
56   def __init__ (self, dicoParams, references = None, numeroCas = 0):
57     initEtude()
58     self.references = references
59     self.dicoParams = dicoParams
60     if 'nomCas' in self.dicoParams:
61       self.nomCas = self.dicoParams['nomCas']
62     elif 'nomres' in self.dicoParams:
63       self.nomCas = os.path.splitext(os.path.split(self.dicoParams['nomres'])[1])[0]
64     else:
65       self.nomCas = 'casStandard'
66     if 'reptrav' in self.dicoParams:
67       self.reptrav = self.dicoParams['reptrav']
68     else:
69       self.reptrav = os.curdir
70     self.numeroCas = numeroCas
71     if self.numeroCas != 0:
72       self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
73     else:
74       self.nomProbleme = self.nomCas
75     if 'lenSegPipe' in self.dicoParams:
76       self.lenSegPipe = self.dicoParams['lenSegPipe']
77     else:
78       self.lenSegPipe =self.dicoParams['rayonPipe']
79     if 'step' in self.dicoParams:
80       step = self.dicoParams['step']
81     else:
82       step = -1 # exécuter toutes les étapes
83     if 'aretesVives' not in self.dicoParams:
84       self.dicoParams['aretesVives'] = 0
85     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
86       self.executeProbleme(step)
87
88   # ---------------------------------------------------------------------------
89   def genereMaillageSain(self, geometriesSaines, meshParams):
90     logging.info("genereMaillageSain %s", self.nomCas)
91
92     ([objetSain], _) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
93     smesh.SetName(objetSain.GetMesh(), 'objetSain')
94
95     return [objetSain, True] # True : maillage hexa
96
97   # ---------------------------------------------------------------------------
98   def setParamShapeFissure(self):
99     """
100     paramètres de la fissure pour méthode insereFissureGenerale
101     lgInfluence : distance autour de la shape de fissure a remailler (A ajuster selon le maillage)
102     rayonPipe   : le rayon du pile maillé en hexa autour du fond de fissure
103     convexe     : True : la face est convexe (vue de l'exterieur) sert si on ne donne pas de point interne
104     pointIn_x   : optionnel : coordonnée x d'un point dans le solide sain (pour orienter la face - idem avec y,z)
105     """
106     logging.info("setParamShapeFissure %s", self.nomCas)
107     if 'pointInterieur' in self.dicoParams:
108       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
109                                      rayonPipe   = self.dicoParams['rayonPipe'],
110                                      lenSegPipe  = self.lenSegPipe,
111                                      pointIn_x   = self.dicoParams['pointInterieur'][0],
112                                      pointIn_y   = self.dicoParams['pointInterieur'][1],
113                                      pointIn_z   = self.dicoParams['pointInterieur'][2])
114     else:
115       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
116                                      rayonPipe   = self.dicoParams['rayonPipe'],
117                                      lenSegPipe  = self.lenSegPipe)
118
119   # ---------------------------------------------------------------------------
120   def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams, \
121                                 mailleur="MeshGems"):
122
123     lgInfluence = shapeFissureParams['lgInfluence']
124
125 #   Contrôle de 'brepFaceFissure' pour les anciennes versions
126     if ( 'brepFaceFissure' in self.dicoParams ):
127       self.dicoParams['CAOFaceFissure'] = self.dicoParams['brepFaceFissure']
128     cao_file = self.dicoParams['CAOFaceFissure']
129     suffix = os.path.basename(cao_file).split(".")[-1]
130     if ( suffix.upper() == "BREP" ):
131       shellFiss = geompy.ImportBREP(cao_file)
132     elif ( suffix.upper() == "XAO" ):
133       (_, shellFiss, _, l_groups, _) = geompy.ImportXAO(cao_file)
134     fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
135 #   Contrôle de 'edgeFissIds' pour les anciennes versions
136     if ( 'edgeFissIds' in self.dicoParams ):
137       self.dicoParams['edgeFiss'] = self.dicoParams['edgeFissIds']
138     if isinstance(self.dicoParams['edgeFiss'][0],int):
139       geompy.UnionIDs(fondFiss, self.dicoParams['edgeFiss'] )
140     else:
141       l_groups = geompy.GetGroups(shellFiss)
142       l_aux = list()
143       for group in l_groups:
144         if ( group.GetName() in self.dicoParams['edgeFiss'] ):
145           l_aux.append(group)
146       geompy.UnionList(fondFiss, l_aux )
147     geomPublish(initLog.debug, shellFiss, 'shellFiss' )
148     geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
149
150
151     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1], \
152                                                      mailleur)
153
154     centre = None
155     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
156
157   # ---------------------------------------------------------------------------
158   def setParamMaillageFissure(self):
159     self.maillageFissureParams = dict(nomRep           = self.reptrav,
160                                       nomFicSain       = self.nomCas +'_sain',
161                                       nomFicFissure    = self.nomCas,
162                                       nbsegRad         = self.dicoParams['nbSegRad'],
163                                       nbsegCercle      = self.dicoParams['nbSegCercle'],
164                                       areteFaceFissure = self.dicoParams['areteFaceFissure'],
165                                       aretesVives      = self.dicoParams['aretesVives'])
166
167   # ---------------------------------------------------------------------------
168   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
169     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
170     return elementsDefaut
171
172   # ---------------------------------------------------------------------------
173   def genereMaillageFissure(self, geometriesSaines, maillagesSains, \
174                                   shapesFissure, shapeFissureParams, \
175                                   maillageFissureParams, elementsDefaut, step, \
176                                   mailleur="MeshGems"):
177     maillageFissure = construitFissureGenerale(shapesFissure, shapeFissureParams, \
178                                                maillageFissureParams, elementsDefaut, \
179                                                step, mailleur, self.numeroCas)
180     return maillageFissure
181
182   # ---------------------------------------------------------------------------
183   def setReferencesMaillageFissure(self):
184     if self.references is not None:
185       self.referencesMaillageFissure = self.references
186     else:
187       self.referencesMaillageFissure = dict( \
188                                             Entity_Quad_Quadrangle = 0, \
189                                             Entity_Quad_Hexa = 0, \
190                                             Entity_Node = 0, \
191                                             Entity_Quad_Edge = 0, \
192                                             Entity_Quad_Triangle = 0, \
193                                             Entity_Quad_Tetra = 0, \
194                                             Entity_Quad_Pyramid = 0, \
195                                             Entity_Quad_Penta = 0 \
196                                            )