1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020 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
22 from .geomsmesh import geompy, smesh
23 from .geomsmesh import geomPublish
24 from .geomsmesh import geomPublishInFather
33 from .fissureGenerique import fissureGenerique
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
41 O, OX, OY, OZ = triedreBase()
43 class casStandard(fissureGenerique):
44 """problème de fissure standard, défini par :
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
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], status) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
90 smesh.SetName(objetSain.GetMesh(), 'objetSain')
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 logging.info("genereShapeFissure %s", self.nomCas)
120 lgInfluence = shapeFissureParams['lgInfluence']
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'] )
132 l_groups = geompy.GetGroups(shellFiss)
134 for group in l_groups:
135 if ( group.GetName() in self.dicoParams['edgeFissIds'] ):
137 geompy.UnionList(fondFiss, l_aux )
138 geomPublish(initLog.debug, shellFiss, 'shellFiss' )
139 geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
142 coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1])
145 return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
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'])
157 # ---------------------------------------------------------------------------
158 def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
159 elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
160 return elementsDefaut
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
171 # ---------------------------------------------------------------------------
172 def setReferencesMaillageFissure(self):
173 if self.references is not None:
174 self.referencesMaillageFissure = self.references
176 self.referencesMaillageFissure = dict( \
177 Entity_Quad_Quadrangle = 0, \
178 Entity_Quad_Hexa = 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 \