Salome HOME
Préparation pour MG-CADSurf
[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                                 mailleur="MeshGems"):
121
122     lgInfluence = shapeFissureParams['lgInfluence']
123
124 #   Contrôle de 'brepFaceFissure' pour les anciennes versions
125     if ( 'brepFaceFissure' in self.dicoParams ):
126       self.dicoParams['CAOFaceFissure'] = self.dicoParams['brepFaceFissure']
127     cao_file = self.dicoParams['CAOFaceFissure']
128     suffix = os.path.basename(cao_file).split(".")[-1]
129     if ( suffix.upper() == "BREP" ):
130       shellFiss = geompy.ImportBREP(cao_file)
131     elif ( suffix.upper() == "XAO" ):
132       (_, shellFiss, _, l_groups, _) = geompy.ImportXAO(cao_file)
133     fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
134 #   Contrôle de 'edgeFissIds' pour les anciennes versions
135     if ( 'edgeFissIds' in self.dicoParams ):
136       self.dicoParams['edgeFiss'] = self.dicoParams['edgeFissIds']
137     if isinstance(self.dicoParams['edgeFiss'][0],int):
138       geompy.UnionIDs(fondFiss, self.dicoParams['edgeFiss'] )
139     else:
140       l_groups = geompy.GetGroups(shellFiss)
141       l_aux = list()
142       for group in l_groups:
143         if ( group.GetName() in self.dicoParams['edgeFiss'] ):
144           l_aux.append(group)
145       geompy.UnionList(fondFiss, l_aux )
146     geomPublish(initLog.debug, shellFiss, 'shellFiss' )
147     geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
148
149
150     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1], \
151                                                      mailleur)
152
153     centre = None
154     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
155
156   # ---------------------------------------------------------------------------
157   def setParamMaillageFissure(self):
158     self.maillageFissureParams = dict(nomRep           = self.reptrav,
159                                       nomFicSain       = self.nomCas +'_sain',
160                                       nomFicFissure    = self.nomCas,
161                                       nbsegRad         = self.dicoParams['nbSegRad'],
162                                       nbsegCercle      = self.dicoParams['nbSegCercle'],
163                                       areteFaceFissure = self.dicoParams['areteFaceFissure'],
164                                       aretesVives      = self.dicoParams['aretesVives'])
165
166   # ---------------------------------------------------------------------------
167   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
168     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
169     return elementsDefaut
170
171   # ---------------------------------------------------------------------------
172   def genereMaillageFissure(self, geometriesSaines, maillagesSains, \
173                                   shapesFissure, shapeFissureParams, \
174                                   maillageFissureParams, elementsDefaut, step, \
175                                   mailleur="MeshGems"):
176     maillageFissure = construitFissureGenerale(maillagesSains, \
177                                                shapesFissure, shapeFissureParams, \
178                                                maillageFissureParams, elementsDefaut, \
179                                                step, mailleur)
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                                            )