Salome HOME
e03027fea78b95d2773d497b2dfcc9bf613a1d05
[modules/smesh.git] / src / Tools / blocFissure / gmu / casStandard.py
1 # -*- coding: utf-8 -*-
2
3 import os
4 from geomsmesh import geompy, smesh
5 from geomsmesh import geomPublish
6 from geomsmesh import geomPublishInFather
7 import initLog
8
9 import math
10 import GEOM
11 import SALOMEDS
12 import SMESH
13 #import StdMeshers
14 #import GHS3DPlugin
15 #import NETGENPlugin
16 import logging
17
18 from fissureGenerique import fissureGenerique
19
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
25
26 O, OX, OY, OZ = triedreBase()
27
28 class casStandard(fissureGenerique):
29   """
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
35   """
36
37   # ---------------------------------------------------------------------------
38   def __init__ (self, dicoParams, references = None, numeroCas = 0):
39     initEtude()
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]
46     else:
47       self.nomCas = 'casStandard'
48     if self.dicoParams.has_key('reptrav'):
49       self.reptrav = self.dicoParams['reptrav']
50     else:
51       reptrav = '.'  
52     self.numeroCas = numeroCas
53     if self.numeroCas != 0:
54       self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
55     else:
56       self.nomProbleme = self.nomCas
57     if self.dicoParams.has_key('lenSegPipe'):
58       self.lenSegPipe = self.dicoParams['lenSegPipe']
59     else:
60       self.lenSegPipe =self.dicoParams['rayonPipe']
61     if self.dicoParams.has_key('step'):
62       step = self.dicoParams['step']
63     else:
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)
67     
68   # ---------------------------------------------------------------------------
69   def genereMaillageSain(self, geometriesSaines, meshParams):
70     logging.info("genereMaillageSain %s", self.nomCas)
71
72     ([objetSain], status) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
73     smesh.SetName(objetSain.GetMesh(), 'objetSain')
74
75     return [objetSain, True] # True : maillage hexa
76
77   # ---------------------------------------------------------------------------
78   def setParamShapeFissure(self):
79     """
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)
85     """
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])
94     else:
95       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
96                                      rayonPipe   = self.dicoParams['rayonPipe'],
97                                      lenSegPipe  = self.lenSegPipe)
98
99   # ---------------------------------------------------------------------------
100   def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams):
101     logging.info("genereShapeFissure %s", self.nomCas)
102
103     lgInfluence = shapeFissureParams['lgInfluence']
104
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' )
110
111
112     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1])
113
114     centre = None
115     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
116
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'])
125
126   # ---------------------------------------------------------------------------
127   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
128     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
129     return elementsDefaut
130
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
139
140   # ---------------------------------------------------------------------------
141   def setReferencesMaillageFissure(self):
142     if self.references is not None:
143       self.referencesMaillageFissure = self.references
144     else:
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,
150                                             Entity_Node            = 0,
151                                             Entity_Quad_Tetra      = 0,
152                                             Entity_Quad_Quadrangle = 0)
153