Salome HOME
Correcion de programmation - fichiers en python
[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
21 import os
22 from .geomsmesh import geompy, smesh
23 from .geomsmesh import geomPublish
24 from .geomsmesh import geomPublishInFather
25 from . import initLog
26
27 import math
28 import GEOM
29 import SALOMEDS
30 import SMESH
31 import logging
32
33 from .fissureGenerique import fissureGenerique
34
35 from .initEtude import initEtude
36 from .triedreBase import triedreBase
37 from .genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
38 from .creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
39 from .construitFissureGenerale import construitFissureGenerale
40
41 O, OX, OY, OZ = triedreBase()
42
43 class casStandard(fissureGenerique):
44   """problème de fissure standard, défini par :
45
46   - un maillage sain (hexaèdres),
47   - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
48   - les numéros d'arêtes (edges géométriques) correspondant au fond de fissure
49   - les paramètres de maillage de la fissure
50   """
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], status) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
90     smesh.SetName(objetSain.GetMesh(), 'objetSain')
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     logging.info("genereShapeFissure %s", self.nomCas)
119
120     lgInfluence = shapeFissureParams['lgInfluence']
121
122     cao_file = self.dicoParams['brepFaceFissure']
123     suffix = os.path.basename(cao_file).split(".")[-1]
124     if ( suffix.upper() == "BREP" ):
125       shellFiss = geompy.ImportBREP(cao_file)
126     elif ( suffix.upper() == "XAO" ):
127       (_, shellFiss, _, l_groups, _) = geompy.ImportXAO(cao_file)
128     fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
129     if isinstance(self.dicoParams['edgeFissIds'][0],int):
130       geompy.UnionIDs(fondFiss, self.dicoParams['edgeFissIds'] )
131     else:
132       l_groups = geompy.GetGroups(shellFiss)
133       l_aux = list()
134       for group in l_groups:
135         if ( group.GetName() in self.dicoParams['edgeFissIds'] ):
136           l_aux.append(group)
137       geompy.UnionList(fondFiss, l_aux )
138     geomPublish(initLog.debug, shellFiss, 'shellFiss' )
139     geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
140
141
142     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1])
143
144     centre = None
145     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
146
147   # ---------------------------------------------------------------------------
148   def setParamMaillageFissure(self):
149     self.maillageFissureParams = dict(nomRep           = self.reptrav,
150                                       nomFicSain       = self.nomCas +'_sain',
151                                       nomFicFissure    = self.nomCas,
152                                       nbsegRad         = self.dicoParams['nbSegRad'],
153                                       nbsegCercle      = self.dicoParams['nbSegCercle'],
154                                       areteFaceFissure = self.dicoParams['areteFaceFissure'],
155                                       aretesVives      = self.dicoParams['aretesVives'])
156
157   # ---------------------------------------------------------------------------
158   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
159     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
160     return elementsDefaut
161
162   # ---------------------------------------------------------------------------
163   def genereMaillageFissure(self, geometriesSaines, maillagesSains,
164                             shapesFissure, shapeFissureParams,
165                             maillageFissureParams, elementsDefaut, step):
166     maillageFissure = construitFissureGenerale(maillagesSains, \
167                                               shapesFissure, shapeFissureParams, \
168                                               maillageFissureParams, elementsDefaut, step)
169     return maillageFissure
170
171   # ---------------------------------------------------------------------------
172   def setReferencesMaillageFissure(self):
173     if self.references is not None:
174       self.referencesMaillageFissure = self.references
175     else:
176       self.referencesMaillageFissure = dict( \
177                                             Entity_Quad_Quadrangle = 0, \
178                                             Entity_Quad_Hexa = 0, \
179                                             Entity_Node = 0, \
180                                             Entity_Quad_Edge = 0, \
181                                             Entity_Quad_Triangle = 0, \
182                                             Entity_Quad_Tetra = 0, \
183                                             Entity_Quad_Pyramid = 0, \
184                                             Entity_Quad_Penta = 0 \
185                                            )