Salome HOME
merge manuel developpements Olivier Hoareau
[modules/smesh.git] / src / Tools / blocFissure / casStandard.py
1 # -*- coding: utf-8 -*-
2
3 import os
4 from blocFissure import gmu
5 from blocFissure.gmu.geomsmesh import geompy, smesh
6
7 import math
8 import GEOM
9 import SALOMEDS
10 import SMESH
11 #import StdMeshers
12 #import GHS3DPlugin
13 #import NETGENPlugin
14 import logging
15
16 from blocFissure.gmu.fissureGenerique import fissureGenerique
17
18 from blocFissure.gmu.initEtude import initEtude
19 from blocFissure.gmu.triedreBase import triedreBase
20 from blocFissure.gmu.genereMeshCalculZoneDefaut import genereMeshCalculZoneDefaut
21 from blocFissure.gmu.creeZoneDefautDansObjetSain import creeZoneDefautDansObjetSain
22 from blocFissure.gmu.insereFissureGenerale import insereFissureGenerale
23
24 O, OX, OY, OZ = triedreBase()
25
26 class casStandard(fissureGenerique):
27   """
28   problème de fissure standard, défini par :
29   - un maillage sain (hexaèdres),
30   - une face géométrique de fissure, qui doit légèrement dépasser hors du volume maillé
31   - les numéros d'arêtes (edges géométriques) correspondant au fond de fissure
32   - les paramètres de maillage de la fissure
33   """
34
35   # ---------------------------------------------------------------------------
36   def __init__ (self, dicoParams, references = None, numeroCas = 0):
37     initEtude()
38     self.references = references
39     self.dicoParams = dicoParams
40     if self.dicoParams.has_key('nomCas'):
41       self.nomCas = self.dicoParams['nomCas']
42     else:
43       self.nomCas = 'casStandard'    
44     self.numeroCas = numeroCas
45     if self.numeroCas != 0:
46       self.nomCas = self.nomProbleme +"_%d"%(self.numeroCas)
47     else:
48       self.nomProbleme = self.nomCas
49     if self.dicoParams.has_key('lenSegPipe'):
50       self.lenSegPipe = self.dicoParams['lenSegPipe']
51     else:
52       self.lenSegPipe =self.dicoParams['rayonPipe']
53     if self.dicoParams.has_key('step'):
54       step = self.dicoParams['step']
55     else:
56       step = -1 # exécuter toutes les étapes
57     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
58       self.executeProbleme(step)
59     
60   # ---------------------------------------------------------------------------
61   def genereMaillageSain(self, geometriesSaines, meshParams):
62     logging.info("genereMaillageSain %s", self.nomCas)
63
64     ([objetSain], status) = smesh.CreateMeshesFromMED(self.dicoParams['maillageSain'])
65     smesh.SetName(objetSain.GetMesh(), 'objetSain')
66
67     return [objetSain, True] # True : maillage hexa
68
69   # ---------------------------------------------------------------------------
70   def setParamShapeFissure(self):
71     """
72     paramètres de la fissure pour méthode insereFissureGenerale
73     lgInfluence : distance autour de la shape de fissure a remailler (A ajuster selon le maillage)
74     rayonPipe   : le rayon du pile maillé en hexa autour du fond de fissure
75     convexe     : True : la face est convexe (vue de l'exterieur) sert si on ne donne pas de point interne
76     pointIn_x   : optionnel : coordonnée x d'un point dans le solide sain (pour orienter la face - idem avec y,z)
77     """
78     logging.info("setParamShapeFissure %s", self.nomCas)
79     if self.dicoParams.has_key('pointInterieur'):
80       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
81                                      rayonPipe   = self.dicoParams['rayonPipe'],
82                                      lenSegPipe  = self.lenSegPipe,
83                                      pointIn_x   = self.dicoParams['pointInterieur'][0],
84                                      pointIn_y   = self.dicoParams['pointInterieur'][1],
85                                      pointIn_z   = self.dicoParams['pointInterieur'][2])
86     else:
87       self.shapeFissureParams = dict(lgInfluence = self.dicoParams['lgInfluence'],
88                                      rayonPipe   = self.dicoParams['rayonPipe'],
89                                      lenSegPipe  = self.lenSegPipe)
90
91   # ---------------------------------------------------------------------------
92   def genereShapeFissure( self, geometriesSaines, geomParams, shapeFissureParams):
93     logging.info("genereShapeFissure %s", self.nomCas)
94
95     lgInfluence = shapeFissureParams['lgInfluence']
96
97     shellFiss = geompy.ImportFile( self.dicoParams['brepFaceFissure'], "BREP")
98     fondFiss = geompy.CreateGroup(shellFiss, geompy.ShapeType["EDGE"])
99     geompy.UnionIDs(fondFiss, self.dicoParams['edgeFissIds'] )
100     geompy.addToStudy( shellFiss, 'shellFiss' )
101     geompy.addToStudyInFather( shellFiss, fondFiss, 'fondFiss' )
102
103
104     coordsNoeudsFissure = genereMeshCalculZoneDefaut(shellFiss, self.dicoParams['meshBrep'][0] ,self.dicoParams['meshBrep'][1])
105
106     centre = None
107     return [shellFiss, centre, lgInfluence, coordsNoeudsFissure, fondFiss]
108
109   # ---------------------------------------------------------------------------
110   def setParamMaillageFissure(self):
111     self.maillageFissureParams = dict(nomRep           = '.',
112                                       nomFicSain       = self.nomCas,
113                                       nomFicFissure    = 'fissure_' + self.nomCas,
114                                       nbsegRad         = self.dicoParams['nbSegRad'],
115                                       nbsegCercle      = self.dicoParams['nbSegCercle'],
116                                       areteFaceFissure = self.dicoParams['areteFaceFissure'])
117
118   # ---------------------------------------------------------------------------
119   def genereZoneDefaut(self, geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams):
120     elementsDefaut = creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, shapeFissureParams, maillageFissureParams)
121     return elementsDefaut
122
123   # ---------------------------------------------------------------------------
124   def genereMaillageFissure(self, geometriesSaines, maillagesSains,
125                             shapesFissure, shapeFissureParams,
126                             maillageFissureParams, elementsDefaut, step):
127     maillageFissure = insereFissureGenerale(maillagesSains,
128                                             shapesFissure, shapeFissureParams,
129                                             maillageFissureParams, elementsDefaut, step)
130     return maillageFissure
131
132   # ---------------------------------------------------------------------------
133   def setReferencesMaillageFissure(self):
134     if self.references is not None:
135       self.referencesMaillageFissure = self.references
136     else:
137       self.referencesMaillageFissure = dict(Entity_Quad_Pyramid    = 0,
138                                             Entity_Quad_Triangle   = 0,
139                                             Entity_Quad_Edge       = 0,
140                                             Entity_Quad_Penta      = 0,
141                                             Entity_Quad_Hexa       = 0,
142                                             Entity_Node            = 0,
143                                             Entity_Quad_Tetra      = 0,
144                                             Entity_Quad_Quadrangle = 0)
145