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