Salome HOME
Utilisation d'une CAO sous xao avec des groupes
[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 StdMeshers
32 #import GHS3DPlugin
33 #import NETGENPlugin
34 import logging
35
36 from .fissureGenerique import fissureGenerique
37
38 from .initEtude import initEtude
39 from .triedreBase import triedreBase
40 from .genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
41 from .creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
42 from .construitFissureGenerale import construitFissureGenerale
43
44 O, OX, OY, OZ = triedreBase()
45
46 class casStandard(fissureGenerique):
47   """
48   problème de fissure standard, défini par :
49   - un maillage sain (hexaèdres),
50   - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
51   - les numéros d'arêtes (edges géométriques) correspondant au fond de fissure
52   - les paramètres de maillage de la fissure
53   """
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 = '.'
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], status) = 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     logging.info("genereShapeFissure %s", self.nomCas)
122
123     lgInfluence = shapeFissureParams['lgInfluence']
124
125     cao_file = self.dicoParams['brepFaceFissure']
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     if isinstance(self.dicoParams['edgeFissIds'][0],int):
133       geompy.UnionIDs(fondFiss, self.dicoParams['edgeFissIds'] )
134     else:
135       l_groups = geompy.GetGroups(shellFiss)
136       l_aux = list()
137       for group in l_groups:
138         if ( group.GetName() in self.dicoParams['edgeFissIds'] ):
139           l_aux.append(group)
140       geompy.UnionList(fondFiss, l_aux )
141     geomPublish(initLog.debug, shellFiss, 'shellFiss' )
142     geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
143
144
145     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1])
146
147     centre = None
148     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
149
150   # ---------------------------------------------------------------------------
151   def setParamMaillageFissure(self):
152     self.maillageFissureParams = dict(nomRep           = self.reptrav,
153                                       nomFicSain       = self.nomCas +'_sain',
154                                       nomFicFissure    = self.nomCas,
155                                       nbsegRad         = self.dicoParams['nbSegRad'],
156                                       nbsegCercle      = self.dicoParams['nbSegCercle'],
157                                       areteFaceFissure = self.dicoParams['areteFaceFissure'],
158                                       aretesVives      = self.dicoParams['aretesVives'])
159
160   # ---------------------------------------------------------------------------
161   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
162     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
163     return elementsDefaut
164
165   # ---------------------------------------------------------------------------
166   def genereMaillageFissure(self, geometriesSaines, maillagesSains,
167                             shapesFissure, shapeFissureParams,
168                             maillageFissureParams, elementsDefaut, step):
169     maillageFissure = construitFissureGenerale(maillagesSains, \
170                                               shapesFissure, shapeFissureParams, \
171                                               maillageFissureParams, elementsDefaut, step)
172     return maillageFissure
173
174   # ---------------------------------------------------------------------------
175   def setReferencesMaillageFissure(self):
176     if self.references is not None:
177       self.referencesMaillageFissure = self.references
178     else:
179       self.referencesMaillageFissure = dict(Entity_Quad_Pyramid    = 0,
180                                             Entity_Quad_Triangle   = 0,
181                                             Entity_Quad_Edge       = 0,
182                                             Entity_Quad_Penta      = 0,
183                                             Entity_Quad_Hexa       = 0,
184                                             Entity_Node            = 0,
185                                             Entity_Quad_Tetra      = 0,
186                                             Entity_Quad_Quadrangle = 0)