1 # -*- coding: utf-8 -*-
4 from geomsmesh import geompy, smesh
5 from geomsmesh import geomPublish
6 from geomsmesh import geomPublishInFather
18 from fissureGenerique import fissureGenerique
20 from initEtude import initEtude
21 from triedreBase import triedreBase
22 from genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
23 from creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
24 from construitFissureGenerale import construitFissureGenerale
26 O, OX, OY, OZ = triedreBase()
28 class casStandard(fissureGenerique):
30 problème de fissure standard, défini par :
31 - un maillage sain (hexaèdres),
32 - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
33 - les numéros d'arêtes (edges géométriques) correspondant au fond de fissure
34 - les paramètres de maillage de la fissure
37 # ---------------------------------------------------------------------------
38 def __init__ (self, dicoParams, references = None, numeroCas = 0):
40 self.references = references
41 self.dicoParams = dicoParams
42 if self.dicoParams.has_key('nomCas'):
43 self.nomCas = self.dicoParams['nomCas']
44 elif self.dicoParams.has_key('nomres'):
45 self.nomCas = os.path.splitext(os.path.split(self.dicoParams['nomres'])[1])[0]
47 self.nomCas = 'casStandard'
48 if self.dicoParams.has_key('reptrav'):
49 self.reptrav = self.dicoParams['reptrav']
52 self.numeroCas = numeroCas
53 if self.numeroCas != 0:
54 self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
56 self.nomProbleme = self.nomCas
57 if self.dicoParams.has_key('lenSegPipe'):
58 self.lenSegPipe = self.dicoParams['lenSegPipe']
60 self.lenSegPipe =self.dicoParams['rayonPipe']
61 if self.dicoParams.has_key('step'):
62 step = self.dicoParams['step']
64 step = -1 # exécuter toutes les étapes
65 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
66 self.executeProbleme(step)
68 # ---------------------------------------------------------------------------
69 def genereMaillageSain(self, geometriesSaines, meshParams):
70 logging.info("genereMaillageSain %s", self.nomCas)
72 ([objetSain], status) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
73 smesh.SetName(objetSain.GetMesh(), 'objetSain')
75 return [objetSain, True] # True : maillage hexa
77 # ---------------------------------------------------------------------------
78 def setParamShapeFissure(self):
80 paramètres de la fissure pour méthode insereFissureGenerale
81 lgInfluence : distance autour de la shape de fissure a remailler (A ajuster selon le maillage)
82 rayonPipe : le rayon du pile maillé en hexa autour du fond de fissure
83 convexe : True : la face est convexe (vue de l'exterieur) sert si on ne donne pas de point interne
84 pointIn_x : optionnel : coordonnée x d'un point dans le solide sain (pour orienter la face - idem avec y,z)
86 logging.info("setParamShapeFissure %s", self.nomCas)
87 if self.dicoParams.has_key('pointInterieur'):
88 self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
89 rayonPipe = self.dicoParams['rayonPipe'],
90 lenSegPipe = self.lenSegPipe,
91 pointIn_x = self.dicoParams['pointInterieur'][0],
92 pointIn_y = self.dicoParams['pointInterieur'][1],
93 pointIn_z = self.dicoParams['pointInterieur'][2])
95 self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
96 rayonPipe = self.dicoParams['rayonPipe'],
97 lenSegPipe = self.lenSegPipe)
99 # ---------------------------------------------------------------------------
100 def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams):
101 logging.info("genereShapeFissure %s", self.nomCas)
103 lgInfluence = shapeFissureParams['lgInfluence']
105 shellFiss = geompy.ImportFile( self.dicoParams['brepFaceFissure'], "BREP")
106 fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
107 geompy.UnionIDs(fondFiss, self.dicoParams['edgeFissIds'] )
108 geomPublish(initLog.debug, shellFiss, 'shellFiss' )
109 geomPublishInFather(initLog.debug, shellFiss, fondFiss, 'fondFiss' )
112 coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1])
115 return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
117 # ---------------------------------------------------------------------------
118 def setParamMaillageFissure(self):
119 self.maillageFissureParams = dict(nomRep = self.reptrav,
120 nomFicSain = self.nomCas,
121 nomFicFissure = 'fissure_' + self.nomCas,
122 nbsegRad = self.dicoParams['nbSegRad'],
123 nbsegCercle = self.dicoParams['nbSegCercle'],
124 areteFaceFissure = self.dicoParams['areteFaceFissure'])
126 # ---------------------------------------------------------------------------
127 def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
128 elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
129 return elementsDefaut
131 # ---------------------------------------------------------------------------
132 def genereMaillageFissure(self, geometriesSaines, maillagesSains,
133 shapesFissure, shapeFissureParams,
134 maillageFissureParams, elementsDefaut, step):
135 maillageFissure = construitFissureGenerale(maillagesSains,
136 shapesFissure, shapeFissureParams,
137 maillageFissureParams, elementsDefaut, step)
138 return maillageFissure
140 # ---------------------------------------------------------------------------
141 def setReferencesMaillageFissure(self):
142 if self.references is not None:
143 self.referencesMaillageFissure = self.references
145 self.referencesMaillageFissure = dict(Entity_Quad_Pyramid = 0,
146 Entity_Quad_Triangle = 0,
147 Entity_Quad_Edge = 0,
148 Entity_Quad_Penta = 0,
149 Entity_Quad_Hexa = 0,
151 Entity_Quad_Tetra = 0,
152 Entity_Quad_Quadrangle = 0)