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