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
25 from .geomsmesh import geompy, smesh
26 from .geomsmesh import geomPublish
27 from .geomsmesh import geomPublishInFather
31 from .fissureGenerique import fissureGenerique
33 from .initEtude import initEtude
34 from .triedreBase import triedreBase
35 from .genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
36 from .creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
37 from .construitFissureGenerale import construitFissureGenerale
38 from .putName import putName
40 O, OX, OY, OZ = triedreBase()
42 class casStandard(fissureGenerique):
43 """problème de fissure standard, défini par :
45 - un maillage sain (hexaèdres),
46 - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
47 - les noms des groupes d'arêtes ou leurs numéros d'arêtes (edges au sens de GEOM) correspondant au fond de fissure
48 - les paramètres de maillage de la fissure
50 referencesMaillageFissure = None
52 # ---------------------------------------------------------------------------
53 def __init__ (self, dicoParams, references = None, numeroCas = 0):
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]
62 self.nomCas = 'casStandard'
63 if 'reptrav' in self.dicoParams:
64 self.reptrav = self.dicoParams['reptrav']
66 self.reptrav = os.curdir
67 self.numeroCas = numeroCas
68 if self.numeroCas != 0:
69 self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
71 self.nomProbleme = self.nomCas
72 if 'lenSegPipe' in self.dicoParams:
73 self.lenSegPipe = self.dicoParams['lenSegPipe']
75 self.lenSegPipe =self.dicoParams['rayonPipe']
76 if 'step' in self.dicoParams:
77 step = self.dicoParams['step']
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)
85 # ---------------------------------------------------------------------------
86 def genereMaillageSain(self, geometriesSaines, meshParams):
87 logging.info("genereMaillageSain %s", self.nomCas)
89 ([objetSain], _) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
90 putName(objetSain.GetMesh(), 'objetSain', i_pref=self.numeroCas)
92 return [objetSain, True] # True : maillage hexa
94 # ---------------------------------------------------------------------------
95 def setParamShapeFissure(self):
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)
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])
112 self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
113 rayonPipe = self.dicoParams['rayonPipe'],
114 lenSegPipe = self.lenSegPipe)
116 # ---------------------------------------------------------------------------
117 def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams, \
118 mailleur="MeshGems"):
120 lgInfluence = shapeFissureParams['lgInfluence']
122 # Contrôle de 'brepFaceFissure' pour les anciennes versions
123 if ( 'brepFaceFissure' in self.dicoParams ):
124 self.dicoParams['CAOFaceFissure'] = self.dicoParams['brepFaceFissure']
125 cao_file = self.dicoParams['CAOFaceFissure']
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 # Contrôle de 'edgeFissIds' pour les anciennes versions
133 if ( 'edgeFissIds' in self.dicoParams ):
134 self.dicoParams['edgeFiss'] = self.dicoParams['edgeFissIds']
135 if isinstance(self.dicoParams['edgeFiss'][0],int):
136 geompy.UnionIDs(fondFiss, self.dicoParams['edgeFiss'] )
138 l_groups = geompy.GetGroups(shellFiss)
140 for group in l_groups:
141 if ( group.GetName() in self.dicoParams['edgeFiss'] ):
143 geompy.UnionList(fondFiss, l_aux )
144 geomPublish(initLog.debug, shellFiss, 'shellFiss' )
145 geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
148 coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1], \
149 mailleur, self.numeroCas)
152 return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
154 # ---------------------------------------------------------------------------
155 def setParamMaillageFissure(self):
156 self.maillageFissureParams = dict(nomRep = self.reptrav,
157 nomFicSain = self.nomCas +'_sain',
158 nomFicFissure = self.nomCas,
159 nbsegRad = self.dicoParams['nbSegRad'],
160 nbsegCercle = self.dicoParams['nbSegCercle'],
161 areteFaceFissure = self.dicoParams['areteFaceFissure'],
162 aretesVives = self.dicoParams['aretesVives'])
164 # ---------------------------------------------------------------------------
165 def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
166 elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams, \
168 return elementsDefaut
170 # ---------------------------------------------------------------------------
171 def genereMaillageFissure(self, geometriesSaines, maillagesSains, \
172 shapesFissure, shapeFissureParams, \
173 maillageFissureParams, elementsDefaut, step, \
174 mailleur="MeshGems"):
175 maillageFissure = construitFissureGenerale(shapesFissure, shapeFissureParams, \
176 maillageFissureParams, elementsDefaut, \
177 mailleur, self.numeroCas)
178 return maillageFissure
180 # ---------------------------------------------------------------------------
181 def setReferencesMaillageFissure(self):
182 if self.references is not None:
183 self.referencesMaillageFissure = self.references
185 self.referencesMaillageFissure = dict( \
186 Entity_Quad_Quadrangle = 0, \
187 Entity_Quad_Hexa = 0, \
189 Entity_Quad_Edge = 0, \
190 Entity_Quad_Triangle = 0, \
191 Entity_Quad_Tetra = 0, \
192 Entity_Quad_Pyramid = 0, \
193 Entity_Quad_Penta = 0 \