1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
29 from .geomsmesh import geompy, smesh
30 from .geomsmesh import geomPublish
31 from .geomsmesh import geomPublishInFather
35 from .fissureGenerique import fissureGenerique
37 from .initEtude import initEtude
38 from .triedreBase import triedreBase
39 from .genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
40 from .creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
41 from .construitFissureGenerale import construitFissureGenerale
43 O, OX, OY, OZ = triedreBase()
45 class casStandard(fissureGenerique):
46 """problème de fissure standard, défini par :
48 - un maillage sain (hexaèdres),
49 - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
50 - les numéros d'arêtes (edges géométriques) correspondant au fond de fissure
51 - les paramètres de maillage de la fissure
53 referencesMaillageFissure = None
55 # ---------------------------------------------------------------------------
56 def __init__ (self, dicoParams, references = None, numeroCas = 0):
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]
65 self.nomCas = 'casStandard'
66 if 'reptrav' in self.dicoParams:
67 self.reptrav = self.dicoParams['reptrav']
69 self.reptrav = os.curdir
70 self.numeroCas = numeroCas
71 if self.numeroCas != 0:
72 self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
74 self.nomProbleme = self.nomCas
75 if 'lenSegPipe' in self.dicoParams:
76 self.lenSegPipe = self.dicoParams['lenSegPipe']
78 self.lenSegPipe =self.dicoParams['rayonPipe']
79 if 'step' in self.dicoParams:
80 step = self.dicoParams['step']
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)
88 # ---------------------------------------------------------------------------
89 def genereMaillageSain(self, geometriesSaines, meshParams):
90 logging.info("genereMaillageSain %s", self.nomCas)
92 ([objetSain], _) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
93 smesh.SetName(objetSain.GetMesh(), 'objetSain')
95 return [objetSain, True] # True : maillage hexa
97 # ---------------------------------------------------------------------------
98 def setParamShapeFissure(self):
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)
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])
115 self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
116 rayonPipe = self.dicoParams['rayonPipe'],
117 lenSegPipe = self.lenSegPipe)
119 # ---------------------------------------------------------------------------
120 def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams, \
121 mailleur="MeshGems"):
123 lgInfluence = shapeFissureParams['lgInfluence']
125 # Contrôle de 'brepFaceFissure' pour les anciennes versions
126 if ( 'brepFaceFissure' in self.dicoParams ):
127 self.dicoParams['CAOFaceFissure'] = self.dicoParams['brepFaceFissure']
128 cao_file = self.dicoParams['CAOFaceFissure']
129 suffix = os.path.basename(cao_file).split(".")[-1]
130 if ( suffix.upper() == "BREP" ):
131 shellFiss = geompy.ImportBREP(cao_file)
132 elif ( suffix.upper() == "XAO" ):
133 (_, shellFiss, _, l_groups, _) = geompy.ImportXAO(cao_file)
134 fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
135 # Contrôle de 'edgeFissIds' pour les anciennes versions
136 if ( 'edgeFissIds' in self.dicoParams ):
137 self.dicoParams['edgeFiss'] = self.dicoParams['edgeFissIds']
138 if isinstance(self.dicoParams['edgeFiss'][0],int):
139 geompy.UnionIDs(fondFiss, self.dicoParams['edgeFiss'] )
141 l_groups = geompy.GetGroups(shellFiss)
143 for group in l_groups:
144 if ( group.GetName() in self.dicoParams['edgeFiss'] ):
146 geompy.UnionList(fondFiss, l_aux )
147 geomPublish(initLog.debug, shellFiss, 'shellFiss' )
148 geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
151 coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1], \
155 return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
157 # ---------------------------------------------------------------------------
158 def setParamMaillageFissure(self):
159 self.maillageFissureParams = dict(nomRep = self.reptrav,
160 nomFicSain = self.nomCas +'_sain',
161 nomFicFissure = self.nomCas,
162 nbsegRad = self.dicoParams['nbSegRad'],
163 nbsegCercle = self.dicoParams['nbSegCercle'],
164 areteFaceFissure = self.dicoParams['areteFaceFissure'],
165 aretesVives = self.dicoParams['aretesVives'])
167 # ---------------------------------------------------------------------------
168 def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
169 elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
170 return elementsDefaut
172 # ---------------------------------------------------------------------------
173 def genereMaillageFissure(self, geometriesSaines, maillagesSains, \
174 shapesFissure, shapeFissureParams, \
175 maillageFissureParams, elementsDefaut, step, \
176 mailleur="MeshGems"):
177 maillageFissure = construitFissureGenerale(shapesFissure, shapeFissureParams, \
178 maillageFissureParams, elementsDefaut, \
179 step, mailleur, self.numeroCas)
180 return maillageFissure
182 # ---------------------------------------------------------------------------
183 def setReferencesMaillageFissure(self):
184 if self.references is not None:
185 self.referencesMaillageFissure = self.references
187 self.referencesMaillageFissure = dict( \
188 Entity_Quad_Quadrangle = 0, \
189 Entity_Quad_Hexa = 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 \