Salome HOME
Merge branch V7_3_1_BR
[modules/smesh.git] / src / Tools / Verima / Scripts / excavation.py
1 # -*- coding: iso-8859-1 -*-
2 """
3 Maillage du tunnel
4 Copyright EDF R&D 2012-2014
5
6  Gérald NICOLAS
7  (+33/0)1.47.65.56.94
8
9  25/04/2013 : prise en compte de Builder
10 """
11 __revision__ = "V2.2"
12
13 import os
14 import sys
15 import salome
16
17 salome.salome_init()
18 theStudy = salome.myStudy
19
20 import iparameters
21 ipar = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", 1))
22
23 erreur = 0
24
25 import math
26 import SALOMEDS
27 #==================== Personnalisation - Debut =========================
28 HOME = os.environ["HOME"]
29 rep_GEOM_MAIL = os.path.join(HOME, "ASTER_USER", "TEST", "Excavation", "GEOM_MAIL")
30 # Les fichiers MED des deux maillages seront exportes dans ce repertoire.
31 # Comportement par defaut : l'export est inactive (line 45)
32 # The MED files for both two meshes are exported in this directory.
33 # Default behaviour : no export (line 45)
34 #
35 # Symetrie ? Tout ?
36 l_cas = [ "tout", "syme" ]
37 #
38 # création de la géométrie 1/0 ?
39 cree_geom = 1
40 #
41 # création du maillage 1/0 ?
42 cree_mail = 1
43 #
44 # export MED 1/0 ?
45 export_med = 0
46 #
47 # Creation des mailles doubles 1/0 ?
48 double = 1
49 #
50 # Controle vis-a-vis d'une reference 1/0 ?
51 controle = 1
52 #==================== Personnalisation - Fin ===========================
53 #
54 verbose = 1
55 verbose_max = 0
56 #
57 # A. GEOMETRIE
58 #
59 if cree_geom :
60 #
61   import GEOM
62   from salome.geom import geomBuilder
63   geompy = geomBuilder.New(theStudy)
64   #
65   # 0. Les conventions d'orientation des axes sont les suivantes :
66   #    . l'axe Z s'enfonce dans le plan du dessin, son origine étant dans le plan
67   #    . l'axe Y est vers le haut
68   #    . l'axe X est vers la gauche.
69   #    . l'origine du repere est au centre du tunnel
70   #    Remarque : Les suffixes G (gauche), D (droit), B(bas) et H (haut) doivent
71   #    etre compris quand on regarde depuis l'entree du tunnel, sa partie
72   #    plane etant en bas.
73   #
74   # 1. Dimensions globales
75   # 1.1. Dimensions caracteristiques du domaine
76   #      Taille generale du bloc contenant le tunnel
77   LG_ARETE_BLOC = 4.6
78   #      Taille generale du massif
79   LG_ARETE_MASSIF = LG_ARETE_BLOC*15.0
80   #      Longueur du tunnel
81   LGTUNNEL = 20.0
82   #      Abscisse du centre du cylindre de percage 1 (+ ou -)
83   X1 = 2.0
84   #      Abscisse du centre du cylindre de percage 2 (+ ou -)
85   X2 = 1.0
86   #      Nombre de couches dans le tunnel
87   NC = 20
88   #
89   # 1.2. Dimensions deduites
90   #
91   # 1.2.1. Rayons des cylindres de percement
92   #      . Rayon du cylindre superieur
93   RAYON_H = 0.5*LG_ARETE_BLOC
94   #      . Rayon du premier cylindre inferieur
95   RAYON_1 = RAYON_H + X1
96   #      . Rayon du premier cylindre inferieur
97   #      sinus = sin(angle), angle entre le plan horizontal et
98   #      le plan d'intersection des deux cylindres inférieurs
99   sinus = ( (X1+X2)**2 - X1**2 ) / ( (X1+X2)**2 + X1**2 )
100   if verbose_max :
101     print "sinus =", sinus
102   tangente = math.tan(math.asin(sinus))
103   if verbose_max :
104     print "tangente =", tangente
105   Y2 = - (X1+X2)*tangente
106   if verbose_max :
107     print "Y2 =", Y2
108   RAYON_2 = RAYON_H + Y2
109   #
110   if verbose_max :
111     print "RAYON_H =", RAYON_H
112     print "RAYON_1 =", RAYON_1
113     print "RAYON_2 =", RAYON_2
114   #
115   # 1.2.2. Longueur de la boite qui servira a la construction des cavites
116   LG_OUTIL = 2.0 * LG_ARETE_MASSIF
117   #
118   # 1.2.3. Decalage pour que tout le massif soit traverse
119   DELTA = 0.01*LG_ARETE_MASSIF
120   #
121   # 2. Les cylindres du tunnelier
122   #
123   d_cyl = {}
124   #
125   LG_OUTIL = LG_OUTIL + 2.*DELTA
126   #
127   OUTIL_H = geompy.MakeCylinderRH(RAYON_H, LG_OUTIL)
128   TRX = 0.0
129   TRY = 0.0
130   TRZ = - DELTA
131   geompy.TranslateDXDYDZ(OUTIL_H, TRX, TRY, TRZ)
132   d_cyl["TUN_H"] = (RAYON_H, TRX, TRY)
133   #
134   OUTIL_G_1 = geompy.MakeCylinderRH(RAYON_1, LG_OUTIL)
135   TRX = -X1
136   geompy.TranslateDXDYDZ(OUTIL_G_1, TRX, TRY, TRZ)
137   d_cyl["TUN_G1"] = (RAYON_1, TRX, TRY)
138   #
139   OUTIL_D_1 = geompy.MakeCylinderRH(RAYON_1, LG_OUTIL)
140   TRX = X1
141   geompy.TranslateDXDYDZ(OUTIL_D_1, TRX, TRY, TRZ)
142   d_cyl["TUN_D1"] = (RAYON_1, TRX, TRY)
143   #
144   OUTIL_G_2 = geompy.MakeCylinderRH(RAYON_2, LG_OUTIL)
145   TRX = X2
146   TRY = Y2
147   geompy.TranslateDXDYDZ(OUTIL_G_2, TRX, TRY, TRZ)
148   d_cyl["TUN_G2"] = (RAYON_2, TRX, TRY)
149   #
150   OUTIL_D_2 = geompy.MakeCylinderRH(RAYON_2, LG_OUTIL)
151   TRX = -X2
152   geompy.TranslateDXDYDZ(OUTIL_D_2, TRX, TRY, TRZ)
153   d_cyl["TUN_D2"] = (RAYON_2, TRX, TRY)
154   #
155   if verbose :
156     print "Cylindre"
157     for cle in d_cyl.keys() :
158       t_aux = d_cyl[cle]
159       print cle, ": rayon =", t_aux[0], ", centre (", t_aux[1], ",", t_aux[2], ")"
160   #
161   # 3. L'empreinte de decoupe
162   # 3.1. Les boites de base
163   #
164   DX = 2.0*LG_ARETE_BLOC
165   DY = 2.0*LG_ARETE_BLOC
166   DZ = LG_OUTIL
167   B_B = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
168   #    En haut
169   TRX = -LG_ARETE_BLOC
170   TRY = 0.0
171   TRZ = - DELTA
172   B_H = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
173   #    A gauche
174   TRX = X2
175   TRY = -2.0*LG_ARETE_BLOC
176   B_G = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
177   #    A droite
178   TRX = -2.0*LG_ARETE_BLOC - X2
179   TRY = -2.0*LG_ARETE_BLOC
180   B_D = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
181   #    En bas
182   TRX = -LG_ARETE_BLOC
183   TRY = -2.5*LG_ARETE_BLOC
184   geompy.TranslateDXDYDZ(B_B, TRX, TRY, TRZ)
185   #
186   # 3.2. Plans d'intersection entre les cylindres inférieurs
187   #      Centre des premiers cylindres inférieurs
188   DX = -X1
189   DY = 0.0
190   DZ = 0.0
191   CG1 = geompy.MakeVertex(DX, DY, DZ)
192   DX = X1
193   CD1 = geompy.MakeVertex(DX, DY, DZ)
194   #      Vecteurs normaux aux plans des intersections des cylindres inférieurs
195   DX = -Y2
196   DY = X1+X2
197   DZ = 0.0
198   VG = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
199   DX = Y2
200   VD = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
201   #      Plans des intersections des cylindres inférieurs
202   DZ = 2.0*LG_OUTIL
203   PG = geompy.MakePlane(CG1, VG, DZ)
204   PD = geompy.MakePlane(CD1, VD, DZ)
205   #
206   # 3.3. Decoupes
207   # 3.3.1. Partie superieure
208   B_H1 = geompy.MakeCut(B_H, OUTIL_H)
209   #
210   # 3.3.2. Partie gauche
211   # . Séparation par le plan de l'intersection
212   B_G1 = geompy.MakeHalfPartition(B_G, PG)
213   # . Création des deux volumes internes
214   L_AUX = geompy.MakeBlockExplode(B_G1, 6, 6)
215   # . Repérage du volume interne supérieur
216   DX = 2.0*LG_ARETE_BLOC + 2.0*DELTA
217   DY = 2.0*LG_ARETE_BLOC + 2.0*DELTA
218   DZ = LG_OUTIL + 2.0*DELTA
219   boite_aux_G = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
220   TRX = 0.0
221   TRY = -2.0*LG_ARETE_BLOC + DELTA
222   TRZ = - 2.0*DELTA
223   geompy.TranslateDXDYDZ(boite_aux_G, TRX, TRY, TRZ)
224   l_aux = geompy.GetShapesOnBox (boite_aux_G, B_G1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
225   #print "l_aux =", l_aux
226   B_G2 = geompy.MakeCut(l_aux[0], OUTIL_G_1)
227   # . Repérage du volume interne inférieur
228   TRX = 0.0
229   TRY = -RAYON_H - DELTA
230   TRZ = 0.0
231   geompy.TranslateDXDYDZ(boite_aux_G, TRX, TRY, TRZ)
232   l_aux = geompy.GetShapesOnBox (boite_aux_G, B_G1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
233   B_G3 = geompy.MakeCut(l_aux[0], OUTIL_G_2)
234   #
235   # 3.3.3. Partie droite
236   # . Séparation par le plan de l'intersection
237   B_D1 = geompy.MakeHalfPartition(B_D, PD)
238   # . Création des deux volumes internes
239   L_AUX = geompy.MakeBlockExplode(B_D1, 6, 6)
240   # . Repérage du volume interne supérieur
241   DX = 2.0*LG_ARETE_BLOC + 2.0*DELTA
242   DY = 2.0*LG_ARETE_BLOC + 2.0*DELTA
243   DZ = LG_OUTIL + 2.0*DELTA
244   boite_aux_D = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
245   TRX = -DX
246   TRY = -2.0*LG_ARETE_BLOC + DELTA
247   TRZ = - 2.0*DELTA
248   geompy.TranslateDXDYDZ(boite_aux_D, TRX, TRY, TRZ)
249   l_aux = geompy.GetShapesOnBox (boite_aux_D, B_D1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
250   if ( verbose_max ) :
251     print "3.3.3. supérieur l_aux =", l_aux
252   B_D2 = geompy.MakeCut(l_aux[0], OUTIL_D_1)
253   # . Repérage du volume interne inférieur
254   TRX = 0.0
255   TRY = -RAYON_H - DELTA
256   TRZ = 0.0
257   geompy.TranslateDXDYDZ(boite_aux_D, TRX, TRY, TRZ)
258   l_aux = geompy.GetShapesOnBox (boite_aux_D, B_D1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
259   if ( verbose_max ) :
260     print "3.3.3. inférieur l_aux =", l_aux
261   B_D3 = geompy.MakeCut(l_aux[0], OUTIL_D_2)
262   #
263   # 3.3. Fusion
264   #
265   Union_1 = geompy.MakeFuse(B_B    , B_G3)
266   Union_2 = geompy.MakeFuse(Union_1, B_D3)
267   Union_3 = geompy.MakeFuse(Union_2, B_G2)
268   Union_4 = geompy.MakeFuse(Union_3, B_D2)
269   EMPREINTE = geompy.MakeFuse(Union_4, B_H1)
270   #
271   # 4. Le tunnel
272   # 4.1. La base
273   #
274   DX = LG_ARETE_BLOC + 2.0*DELTA
275   DY = LG_ARETE_BLOC + 2.0*DELTA
276   DZ = LGTUNNEL
277   BOITE_TUNNEL = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
278   TRX = -RAYON_H - DELTA
279   TRY = -RAYON_H - DELTA
280   TRZ = 0.0
281   geompy.TranslateDXDYDZ(BOITE_TUNNEL, TRX, TRY, TRZ)
282   #
283   TUNNEL_PLEIN = geompy.MakeCut(BOITE_TUNNEL, EMPREINTE)
284   #
285   # 4.2. Partitionnement par les cavites
286   #
287   DX = LG_ARETE_BLOC + 2.0*DELTA
288   DY = LG_ARETE_BLOC + 2.0*DELTA
289   DZ = LGTUNNEL/NC
290   boite_cav = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
291   TRX = -0.5*LG_ARETE_BLOC - DELTA
292   TRY = -0.5*LG_ARETE_BLOC - DELTA
293   TRZ = 0.0
294   geompy.TranslateDXDYDZ(boite_cav, TRX, TRY, TRZ)
295   TRX = 0.0
296   TRY = 0.0
297   TRZ = LGTUNNEL/NC
298   l_aux = [TUNNEL_PLEIN]
299   for iaux in range(NC) :
300     TUNNEL = geompy.MakePartition(l_aux, [boite_cav], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
301     l_aux = [TUNNEL]
302     if iaux<NC-1 :
303       geompy.TranslateDXDYDZ(boite_cav, TRX, TRY, TRZ)
304   #
305   # 5. La structure générale
306   #
307   dico_struct = {}
308   groupe_g = {}
309   for cas in l_cas :
310   #
311     if verbose :
312       print ". Geometrie du cas", cas
313   #
314     DX = LG_ARETE_MASSIF
315     if cas == "syme" :
316       DX = 0.5*DX
317     DY = LG_ARETE_MASSIF
318     DZ = LG_ARETE_MASSIF
319     MASSIF_00 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
320     if cas == "tout" :
321       TRX = -0.5*LG_ARETE_MASSIF
322     else :
323       TRX = 0.0
324     TRY = -0.5*LG_ARETE_MASSIF
325     TRZ = 0.0
326     geompy.TranslateDXDYDZ(MASSIF_00, TRX, TRY, TRZ)
327     MASSIF_G = geompy.MakePartition([MASSIF_00], [TUNNEL], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
328     #print MASSIF_G
329   #
330     dico_struct[cas] = MASSIF_G
331   #
332   # 6. Les groupes
333   #    * Volumes :
334   #    ===========
335   #      ROCHE : le massif complet
336   #      . Pour nn valant 01, 02, 03, ..., 19, 20 :
337   #        ROCHE_nn : la partie du massif qui reste quand on etudie l'excavation de la couche nn
338   #        CAV_nn : la partie du massif qui est extraite pour l'excavation de la couche nn
339   #                 ces morceaux sont disjoints ; on ne s'interesse qu'a ce qui est retire
340   #                 au moment de l'attaque de la couche n
341   #      Vu autrement : ROCHE = ROCHE_01 + CAV_01
342   #                     ROCHE = ROCHE_02 + CAV_01 + CAV_02
343   #                     ROCHE = ROCHE_03 + CAV_01 + CAV_02 + CAV_03
344   #                     ... ... ... ... ... ...
345   #                     ROCHE = ROCHE_20 + CAV_01 + CAV_02 + CAV_03 + ... + CAV_20
346   #
347   #      Toutes les mailles de ces groupes seront dupliquees (memes noeuds) et rassemblees
348   #      dans des groupes miroirs :
349   #        R_00_b est l'analogue de ROCHE
350   #        R_nn_b est l'analogue de ROCHE_nn
351   #        CAV_nn_b est l'analogue de CAV_nn
352   #
353   #    * Faces :
354   #    =========
355   #      . Les bords exterieurs du domaine
356   #      ---------------------------------
357   #        BAS  : la face inferieure du massif
358   #        HAUT : la face superieure du massif
359   #        DEVANT   : la face avant du massif
360   #        DERRIERE : la face arriere du massif
361   #        GAUCHE : la face gauche du massif
362   #        Pour la geometrie complete :
363   #          DROITE : la face droite du massif
364   #        sinon (pour la geometrie avec symetrie) :
365   #          SYME_nn : la face a droite bordant la roche au cours de l'excavation de la couche nn,
366   #                    nn valant 00, 01, 02, 03, ..., 19, 20
367   #          Remarque : SYME_00 equivaut a DROITE
368   #
369   #      . Les bords des cavites
370   #      -----------------------
371   #        Pour nn valant 01, 02, 03, ..., 19, 20 :
372   #        FOND_nn : la paroi qui est le fond de la cavite n, jouxtant la cavite (n+1)
373   #        BORD_nn : la paroi peripherique de la cavite n
374   #        PAROI_nn : les parois peripheriques des cavites 1, 2, ..., n-1 (n>1)
375   #          Vu autrement : PAROI_02 = BORD_01
376   #                         PAROI_03 = BORD_01 + BORD_02
377   #                         PAROI_04 = BORD_01 + BORD_02 + BORD_03
378   #                         ... ... ... ... ... ...
379   #                         PAROI_20 = BORD_01 + BORD_02 + BORD_03 + ... + BORD_19
380   #        FRONT_nn : la frontiere complete de la cavite n
381   #          Vu autrement : FRONT_01 = FOND_01 + BORD_01
382   #                         FRONT_02 = FOND_02 + BORD_01 + BORD_02
383   #                         ... ... ... ... ... ...
384   #                         FRONT_20 = FOND_20 + BORD_01 + BORD_02 + BORD_03 + ... + BORD_20
385   #          Vu autrement : FRONT_nn = PAROI_nn + FOND_nn + BORD_nn (nn>1)
386   #
387   #      . Les bords du tunnel
388   #      ---------------------
389   #        TUN_H  : la face superieure du tunnel
390   #        TUN_G1 : la face gauche et en haut du tunnel
391   #        TUN_G2 : la face gauche et en bas du tunnel
392   #        TUN_BASE : la face inferieure du tunnel
393   #        Pour la geometrie complete :
394   #          TUN_D1 : la face droite et en haut du tunnel
395   #          TUN_D2 : la face droite et en bas du tunnel
396   #        Remarque : les groupes TUN_xx recouvrent les bords des cavites sur toute la longueur de l'excavation
397   #
398     l_cav_toutes_v_id = []
399     l_cav_toutes_p_id = []
400     l_groupe_cav_g = []
401     l_groupe_roche_g = []
402     l_groupe_cav_f_g = []
403     l_groupe_cav_p_g = []
404     l_groupe_cav_e_g = []
405     l_face_avant_cav = []
406     l_groupe_tunnel_g = []
407   #
408   # 6.1. La roche
409   #
410     DX = LG_ARETE_MASSIF + 2.0*DELTA
411     DY = LG_ARETE_MASSIF + 2.0*DELTA
412     DZ = LG_ARETE_MASSIF + 2.0*DELTA
413     boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
414     TRX = -0.5*LG_ARETE_MASSIF - DELTA
415     TRY = -0.5*LG_ARETE_MASSIF - DELTA
416     TRZ = - DELTA
417     geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
418     l_solid_id = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["SOLID"], GEOM.ST_IN )
419     if ( verbose_max ) :
420       print "6.1. l_solid_id =", l_solid_id
421     ROCHE_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
422     geompy.UnionIDs ( ROCHE_G, l_solid_id )
423   #
424   # 6.2. Les faces externes
425   # 6.2.1. Paralleles a Oyz
426   # 6.2.1.1. Parallele a Oyz : face gauche
427   #
428     DX = 2.0*DELTA
429     DY = LG_ARETE_MASSIF + 2.0*DELTA
430     DZ = LG_ARETE_MASSIF + 2.0*DELTA
431     boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
432     TRX =  0.5*LG_ARETE_MASSIF - DELTA
433     TRY = -0.5*LG_ARETE_MASSIF - DELTA
434     TRZ = - DELTA
435     geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
436     l_aux  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
437     if ( verbose_max ) :
438       print "6.2.1.1. Gauche l_aux =", l_aux
439     GAUCHE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
440     geompy.UnionIDs ( GAUCHE_G, l_aux )
441   #
442   # 6.2.1.2. Parallele a Oyz : face droite dans le cas complet, plan de symetrie sinon
443   #
444     l_groupe_cav_s_g = []
445     l_face_id_syme = []
446     if cas == "tout" :
447       TRX = -LG_ARETE_MASSIF
448       TRY = 0.0
449       TRZ = 0.0
450       geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
451       l_aux  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
452       if ( verbose_max ) :
453         print "6.2.1.2. Droite l_aux =", l_aux
454       DROITE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
455       geompy.UnionIDs ( DROITE_G, l_aux )
456   #
457     else :
458   #   L'ensemble des faces
459       TRX = -0.5*LG_ARETE_MASSIF
460       TRY = 0.0
461       TRZ = 0.0
462       geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
463       l_face_id_syme  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
464       if ( verbose_max ) :
465         print "6.2.1.2. Symetrie - tout l_face_id_syme =", l_face_id_syme
466       l_aux = []
467       for face_id in l_face_id_syme :
468         l_aux.append(face_id)
469       GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
470       geompy.UnionIDs ( GR_CAV_G, l_aux )
471       l_groupe_cav_s_g.append((GR_CAV_G, "SYME_00"))
472   #   Les faces bordant le tunnel
473       DX = 2.0*DELTA
474       DY = LG_ARETE_BLOC + 2.0*DELTA
475       DZ = LGTUNNEL/NC + 2.0*DELTA
476       boite_2 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
477       TRX = - DELTA
478       TRY = -0.5*LG_ARETE_BLOC - DELTA
479       TRZ = - DELTA
480       geompy.TranslateDXDYDZ(boite_2, TRX, TRY, TRZ)
481       TRX = 0.0
482       TRY = 0.0
483       TRZ = LGTUNNEL/NC
484       l_aux_3 = []
485       for iaux in range(NC) :
486         if ( verbose_max ) :
487           print "6.2.1.2. Cavite %02d" % (iaux+1)
488         # Les id des faces bordant la cavite courante
489         l_aux_2 = geompy.GetShapesOnBoxIDs (boite_2, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
490         if ( verbose_max ) :
491           print ".. id des faces bordant la cavite % d =" % (iaux+1), l_aux_2
492         for face_id in l_aux_2 :
493           l_aux.remove(face_id)
494           l_aux_3.append(face_id)
495         GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
496         geompy.UnionIDs ( GR_CAV_G, l_aux )
497         l_groupe_cav_s_g.append((GR_CAV_G, "SYME_%02d" % (iaux+1)))
498   # On translate les boites selon Z, d'une distance égale à l'épaisseur d'une cavité
499         if iaux<NC-1 :
500           geompy.TranslateDXDYDZ(boite_2, TRX, TRY, TRZ)
501       if ( verbose_max ) :
502         print ".. id des faces bordant les cavites =", l_aux_3
503       GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
504       geompy.UnionIDs ( GR_CAV_G, l_aux_3 )
505       l_groupe_cav_s_g.append((GR_CAV_G, "SYME_CAV"))
506   #
507   # 6.2.2. Paralleles a Oxz : faces haut & bas
508   #
509     DX = LG_ARETE_MASSIF + 2.0*DELTA
510     DY = 2.0*DELTA
511     DZ = LG_ARETE_MASSIF + 2.0*DELTA
512     boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
513     TRX = -0.5*LG_ARETE_MASSIF - DELTA
514     TRY =  0.5*LG_ARETE_MASSIF - DELTA
515     TRZ = - DELTA
516     geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
517     l_aux  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
518     if ( verbose_max ) :
519       print "6.2.2. Haut l_aux =", l_aux
520     HAUT_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
521     geompy.UnionIDs ( HAUT_G, l_aux )
522   #
523     TRX = 0.0
524     TRY = -LG_ARETE_MASSIF
525     TRZ = 0.0
526     geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
527     l_aux  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
528     if ( verbose_max ) :
529       print "6.2.2. Bas l_aux =", l_aux
530     BAS_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
531     geompy.UnionIDs ( BAS_G, l_aux )
532   #
533   # 6.2.3. Paralleles a Oxy
534   # 6.2.3.1. Faces debouchant du tunnel : toutes les faces contenues dans la boite
535   #         d'epaisseur quasi-nulle en dZ, de tailles debordant l'empreinte du tunnel en X/Y et centree en (0.,0.,0.)
536     DX = LG_ARETE_BLOC + 2.0*DELTA
537     DY = LG_ARETE_BLOC + 2.0*DELTA
538     DZ = 2.0*DELTA
539     boite_aux_1 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
540     TRX = -0.5*LG_ARETE_BLOC - DELTA
541     TRY = -0.5*LG_ARETE_BLOC - DELTA
542     TRZ = - DELTA
543     geompy.TranslateDXDYDZ(boite_aux_1, TRX, TRY, TRZ)
544     l_face_avant_tunnel  = geompy.GetShapesOnBoxIDs (boite_aux_1, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
545     if ( verbose_max ) :
546       print "6.2.3.1. Devant l_face_avant_tunnel =", l_face_avant_tunnel
547     # Création du groupe de la face avant
548     GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
549     geompy.UnionIDs ( GR_CAV_G, l_face_avant_tunnel )
550     l_groupe_cav_f_g.append((GR_CAV_G, "FOND_00"))
551   #
552   # 6.2.3.2. Faces avant du massif : toutes les faces contenues dans la boite
553   #          d'epaisseur quasi-nulle en dZ, de tailles extremes en X/Y et centree en (0.,0.,0.)
554     DX = LG_ARETE_MASSIF + 2.0*DELTA
555     DY = LG_ARETE_MASSIF + 2.0*DELTA
556     DZ = 2.0*DELTA
557     boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
558     TRX = -0.5*LG_ARETE_MASSIF - DELTA
559     TRY = -0.5*LG_ARETE_MASSIF - DELTA
560     TRZ = - DELTA
561     geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
562     l_aux_2  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
563     if ( verbose_max ) :
564       print "6.2.3.2. Devant l_aux_2  =", l_aux_2
565   # Pour le groupe, on retire les faces correspondant a l'empreinte du tunnel
566     l_aux = []
567     for face_id in l_aux_2 :
568       if face_id not in l_face_avant_tunnel :
569         l_aux.append(face_id)
570     if ( verbose_max ) :
571       print "6.2.3.2. Devant l_aux  =", l_aux
572     DEVANT_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
573     geompy.UnionIDs ( DEVANT_G, l_aux )
574   #
575   # 6.2.3.3. Faces avant du massif : toutes les faces contenues dans la boite
576   #          d'epaisseur quasi-nulle en dZ, de tailles extremes en X/Y et centree en (0.,0.,extremite)
577     TRX = 0.0
578     TRY = 0.0
579     TRZ = LG_ARETE_MASSIF
580     geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
581     l_aux  = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
582     if ( verbose_max ) :
583       print "6.2.3.3. Derriere l_aux =", l_aux
584     DERRIERE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
585     geompy.UnionIDs ( DERRIERE_G, l_aux )
586   #
587   # 6.3. Les faces et les solides internes au tunnel
588     l_cyl_supp = []
589   #
590   # 6.3.1. Les faces de la base
591   #        Le plan support
592     DX = 0.0
593     DY = LG_ARETE_BLOC
594     DZ = 0.0
595     normale = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
596     DY = -0.5*LG_ARETE_BLOC
597     point = geompy.MakeVertex(DX, DY, DZ)
598     #        Les faces posees sur ce plan
599     liste_face_tunnel_base = geompy.GetShapesOnPlaneWithLocationIDs (MASSIF_G, geompy.ShapeType["FACE"], normale, point, GEOM.ST_ON )
600     if ( verbose_max ) :
601       print "6.3.1. liste_face_tunnel_base =", liste_face_tunnel_base
602   #        Création du groupe associe
603     GR_TUNNEL_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
604     geompy.UnionIDs ( GR_TUNNEL_G, liste_face_tunnel_base )
605     l_groupe_tunnel_g.append((GR_TUNNEL_G, "TUN_BASE"))
606   #
607   # 6.3.2. Les faces sur les portions cylindriques
608   #        On distingue chaque cylindre pour les futurs suivis de frontiere dans HOMARD
609   #        Remarque : il serait plus logique de proceder avec GetShapesOnCylinderWithLocationIDs mais
610   #                   je n'arrive pas donc je repere les faces dans un tube englobant la surface de chaque cylindre. Bug ? Mauvaise utilisation ?
611   #                   Du coup, il faut s'assurer que l'on ne capte pas des faces planes precedentes (6.3.1).
612   #                   Cela peut arriver si les dimensions sont peu serrees
613     TRZ = - DELTA
614     for cle in d_cyl.keys() :
615       t_aux = d_cyl[cle]
616     # Creation du tube encadrant le cylindre support
617       if ( verbose_max ) :
618         print "6.3.2.", cle, ": rayon =", t_aux[0], ", centre (", t_aux[1], ",", t_aux[2], ")"
619       cyl_1 = geompy.MakeCylinderRH(1.1*t_aux[0], LG_OUTIL)
620       cyl_2 = geompy.MakeCylinderRH(0.9*t_aux[0], LG_OUTIL)
621       boite = geompy.MakeCut(cyl_1, cyl_2)
622       TRX = t_aux[1]
623       TRY = t_aux[2]
624       geompy.TranslateDXDYDZ(boite, TRX, TRY, TRZ)
625       l_cyl_supp.append((boite, cle))
626     # Reperage des faces
627       l_aux_1 = geompy.GetShapesOnShapeIDs (boite, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
628       if ( verbose_max ) :
629         print ".. l_aux_1 =", l_aux_1
630       l_aux = []
631       for face_id in l_aux_1 :
632         if face_id not in liste_face_tunnel_base :
633           l_aux.append(face_id)
634       if ( verbose_max ) :
635         print ".. l_aux =", l_aux
636       # Création du groupe associe
637       if len(l_aux) > 0 :
638         GR_TUNNEL_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
639         geompy.UnionIDs ( GR_TUNNEL_G, l_aux )
640         l_groupe_tunnel_g.append((GR_TUNNEL_G, cle))
641   #
642   # 6.3.3. Creation de boites :
643   #        . une qui englobe le volume d'une cavite
644   #
645     DX = LG_ARETE_BLOC + 2.0*DELTA
646     DY = LG_ARETE_BLOC + 2.0*DELTA
647     DZ = LGTUNNEL/NC + 2.0*DELTA
648     boite_cav_v = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
649     TRX = -0.5*LG_ARETE_BLOC - DELTA
650     TRY = -0.5*LG_ARETE_BLOC - DELTA
651     TRZ = - DELTA
652     geompy.TranslateDXDYDZ(boite_cav_v, TRX, TRY, TRZ)
653   #
654   #        . une qui englobe une le fond d'une cavite
655     DZ = 2.0*DELTA
656     boite_cav_f = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
657     TRX = -0.5*LG_ARETE_BLOC - DELTA
658     TRY = -0.5*LG_ARETE_BLOC - DELTA
659     TRZ = LGTUNNEL/NC - DELTA
660     geompy.TranslateDXDYDZ(boite_cav_f, TRX, TRY, TRZ)
661   #
662   # 6.3.4. On deplace ces boites au fur et a mesure des couches
663   #        On memorise les faces et volumes contenus dans les boites et
664   #        on cree les groupes a la volee
665   #
666     TRX = 0.0
667     TRY = 0.0
668     TRZ = LGTUNNEL/NC
669     for face_id in l_face_avant_tunnel :
670       l_face_avant_cav.append(face_id)
671     for iaux in range(NC) :
672       if ( verbose_max ) :
673         print "6.3.4. Cavite %02d" % (iaux+1)
674       # Création du groupe de l'exterieur des cavites
675       if iaux > 0 :
676         GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
677         geompy.UnionIDs ( GR_CAV_G, l_cav_toutes_p_id )
678         l_groupe_cav_e_g.append((GR_CAV_G, "PAROI_%02d" % (iaux+1)))
679       # Les id des solides dans la cavite courante
680       l_aux_1 = geompy.GetShapesOnBoxIDs (boite_cav_v, MASSIF_G, geompy.ShapeType["SOLID"], GEOM.ST_IN )
681       if ( verbose_max ) :
682         print ".. l_aux_1 =", l_aux_1
683       # Création du groupe solide de la cavite courante
684       CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
685       geompy.UnionIDs ( CAV_G, l_aux_1 )
686       l_groupe_cav_g.append((CAV_G, "CAV_%02d" % (iaux+1)))
687       # On ajoute ces id a la liste de tous ceux depuis le debut des cavites (i.e. le percement du tunnel)
688       for solid_id in l_aux_1 :
689         l_cav_toutes_v_id.append(solid_id)
690       if ( verbose_max ) :
691         print ".. l_cav_toutes_v_id =", l_cav_toutes_v_id
692       # On repere les id des solides du massif mais qui ne sont pas dans les cavites precedemment traitées
693       l_solid_id_1 = []
694       for solid_id in l_solid_id :
695         if solid_id not in l_cav_toutes_v_id :
696           l_solid_id_1.append(solid_id)
697       if ( verbose_max ) :
698         print ".. l_solid_id_1 =", l_solid_id_1
699       # Création du groupe solide de la roche de laquelle on a retiré tous les creusements effectués
700       GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
701       geompy.UnionIDs ( GR_CAV_G, l_solid_id_1 )
702       l_groupe_roche_g.append((GR_CAV_G, "ROCHE_%02d" % (iaux+1)))
703       # Les id des faces du fond de la cavite courante
704       l_aux_1 = geompy.GetShapesOnBoxIDs (boite_cav_f, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
705       if ( verbose_max ) :
706         print ".. l_aux_1 =", l_aux_1
707       # Création du groupe du fond de la cavite
708       GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
709       geompy.UnionIDs ( GR_CAV_G, l_aux_1 )
710       l_groupe_cav_f_g.append((GR_CAV_G, "FOND_%02d" % (iaux+1)))
711       # Les id des faces dans la cavite courante
712       l_aux_2 = geompy.GetShapesOnBoxIDs (boite_cav_v, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
713       if ( verbose_max ) :
714         print ".. l_aux_2 =", l_aux_2
715       # Création du groupe du pourtour de la cavite : penser a retirer les fonds et l'eventuel plan de symetrie !
716       # On cumule tous les pourtours depuis le debut
717       l_aux = []
718       for face_id in l_aux_2 :
719         if face_id not in l_aux_1 + l_face_avant_cav + l_face_id_syme :
720           l_aux.append(face_id)
721           l_cav_toutes_p_id.append(face_id)
722       if ( verbose_max ) :
723         print ".. l_aux =", l_aux
724       GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
725       geompy.UnionIDs ( GR_CAV_G, l_aux )
726       l_groupe_cav_p_g.append((GR_CAV_G, "BORD_%02d" % (iaux+1)))
727       # Création du groupe de l'exterieur des cavites
728       GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
729       geompy.UnionIDs ( GR_CAV_G, l_cav_toutes_p_id+l_aux_1 )
730       l_groupe_cav_e_g.append((GR_CAV_G, "FRONT_%02d" % (iaux+1)))
731       # On translate les boites selon Z, d'une distance égale à l'épaisseur d'une cavité
732       if iaux<NC-1 :
733         geompy.TranslateDXDYDZ(boite_cav_v, TRX, TRY, TRZ)
734         geompy.TranslateDXDYDZ(boite_cav_f, TRX, TRY, TRZ)
735         l_face_avant_cav = []
736         for face_id in l_aux_1 :
737           l_face_avant_cav.append(face_id)
738   #
739   # 6.4. Archivage
740   #
741     groupe_g[("ROCHE_G", cas)] = ROCHE_G
742     groupe_g[("GAUCHE_G", cas)] = GAUCHE_G
743     if cas == "tout" :
744       groupe_g[("DROITE_G", cas)] = DROITE_G
745     groupe_g[("HAUT_G", cas)] = HAUT_G
746     groupe_g[("BAS_G", cas)] = BAS_G
747     groupe_g[("DEVANT_G", cas)] = DEVANT_G
748     groupe_g[("DERRIERE_G", cas)] = DERRIERE_G
749     groupe_g[("cav", cas)] = l_groupe_cav_g
750     groupe_g[("roche", cas)] = l_groupe_roche_g
751     groupe_g[("tunnel", cas)] = l_groupe_tunnel_g
752     groupe_g[("cav_f", cas)] = l_groupe_cav_f_g
753     groupe_g[("cav_p", cas)] = l_groupe_cav_p_g
754     groupe_g[("cav_e", cas)] = l_groupe_cav_e_g
755     groupe_g[("cav_s", cas)] = l_groupe_cav_s_g
756   #
757   # 7. Affichage
758   # 7.1. Les objets de construction
759   #
760   geompy.addToStudy( OUTIL_H, 'OUTIL_H' )
761   geompy.addToStudy( OUTIL_G_1, 'OUTIL_G_1' )
762   geompy.addToStudy( OUTIL_D_1, 'OUTIL_D_1' )
763   geompy.addToStudy( OUTIL_G_2, 'OUTIL_G_2' )
764   geompy.addToStudy( OUTIL_D_2, 'OUTIL_D_2' )
765   geompy.addToStudy( B_B, 'B_B' )
766   geompy.addToStudy( B_H, 'B_H' )
767   geompy.addToStudy( B_G, 'B_G' )
768   geompy.addToStudy( B_D, 'B_D' )
769   geompy.addToStudy( CG1, 'CG1' )
770   geompy.addToStudy( VG, 'VG' )
771   geompy.addToStudy( PG, 'PG' )
772   geompy.addToStudy( CD1, 'CD1' )
773   geompy.addToStudy( VD, 'VD' )
774   geompy.addToStudy( PD, 'PD' )
775   geompy.addToStudy( B_H1, 'B_H1' )
776   geompy.addToStudy( B_G1, 'B_G1' )
777   geompy.addToStudy( boite_aux_G, 'boite_aux_G' )
778   geompy.addToStudy( B_G2, 'B_G2' )
779   geompy.addToStudy( B_G3, 'B_G3' )
780   geompy.addToStudy( B_D1, 'B_D1' )
781   geompy.addToStudy( boite_aux_D, 'boite_aux_D' )
782   geompy.addToStudy( B_D2, 'B_D2' )
783   geompy.addToStudy( B_D3, 'B_D3' )
784   geompy.addToStudy( EMPREINTE, 'EMPREINTE' )
785   geompy.addToStudy( BOITE_TUNNEL, 'BOITE_TUNNEL' )
786   geompy.addToStudy( TUNNEL_PLEIN, 'TUNNEL_PLEIN' )
787   geompy.addToStudy( boite_cav, 'boite_cav' )
788   geompy.addToStudy( TUNNEL, 'TUNNEL' )
789   geompy.addToStudy( MASSIF_00, 'MASSIF_00' )
790   geompy.addToStudy( boite_aux, 'boite_aux' )
791   geompy.addToStudy( boite_aux_1, 'boite_aux_1' )
792   geompy.addToStudy( normale, 'normale' )
793   geompy.addToStudy( point, 'point' )
794   geompy.addToStudy( boite_cav_v, 'boite_cav_v' )
795   geompy.addToStudy( boite_cav_f, 'boite_cav_f' )
796   for objet in l_cyl_supp :
797     geompy.addToStudy( objet[0], objet[1] )
798   #
799   # 7.2. La structure a etudier et ses groupes
800   #
801   for cas in l_cas :
802   #
803     MASSIF_G = dico_struct[cas]
804     #print MASSIF_G
805     geompy.addToStudy( MASSIF_G, "MASSIF"+cas )
806     geompy.addToStudyInFather( MASSIF_G, groupe_g[("ROCHE_G", cas)], "ROCHE" )
807     l_groupe_cav_g = groupe_g[("cav", cas)]
808     for groupe in l_groupe_cav_g :
809       geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
810     l_groupe_roche_g = groupe_g[("roche", cas)]
811     for groupe in l_groupe_roche_g :
812       geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
813     geompy.addToStudyInFather( MASSIF_G, groupe_g[("GAUCHE_G", cas)], "GAUCHE" )
814     if cas == "tout" :
815       geompy.addToStudyInFather( MASSIF_G, groupe_g[("DROITE_G", cas)], "DROITE" )
816     geompy.addToStudyInFather( MASSIF_G, groupe_g[("HAUT_G", cas)], "HAUT" )
817     geompy.addToStudyInFather( MASSIF_G, groupe_g[("BAS_G", cas)], "BAS" )
818     geompy.addToStudyInFather( MASSIF_G, groupe_g[("DEVANT_G", cas)], "DEVANT" )
819     geompy.addToStudyInFather( MASSIF_G, groupe_g[("DERRIERE_G", cas)], "DERRIERE" )
820     l_groupe_tunnel_g = groupe_g[("tunnel", cas)]
821     for groupe in l_groupe_tunnel_g :
822       geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
823     l_groupe_cav_f_g = groupe_g[("cav_f", cas)]
824     l_groupe_cav_p_g = groupe_g[("cav_p", cas)]
825     l_groupe_cav_e_g = groupe_g[("cav_e", cas)]
826     l_groupe_cav_s_g = groupe_g[("cav_s", cas)]
827     for groupe in l_groupe_cav_f_g + l_groupe_cav_p_g + l_groupe_cav_e_g + l_groupe_cav_s_g :
828       geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
829 #
830 #
831 # B. MAILLAGE
832 #
833 if not erreur and cree_mail :
834 #
835   import  SMESH, SALOMEDS
836   from salome.smesh import smeshBuilder
837 #
838   smesh = smeshBuilder.New(theStudy)
839   from salome.BLSURFPlugin import BLSURFPluginBuilder
840   from salome.NETGENPlugin import NETGENPluginBuilder
841 #
842   prem = 1
843   for cas in l_cas :
844   #
845     if verbose :
846       print ". Maillage du cas", cas
847   #
848     MASSIF_G = dico_struct[cas]
849   #
850   # 1. Maillage
851   #
852     MASSIF_M = smesh.Mesh(MASSIF_G)
853   #
854   # 2. Parametres du maillage volumique
855   #
856     if prem :
857       GHS3D_3D = MASSIF_M.Tetrahedron(algo=smeshBuilder.GHS3D)
858       GHS3D_Parameters = smesh.CreateHypothesis('GHS3D_Parameters', 'GHS3DEngine')
859       # Niveau d'optimisation : 3 ==> standard +
860       GHS3D_Parameters.SetOptimizationLevel( 3 )
861     else :
862       isdone = MASSIF_M.AddHypothesis(GHS3D_Parameters)
863       GHS3D_3D_1 = MASSIF_M.Tetrahedron(algo=smeshBuilder.GHS3D)
864   #
865   # 3. Parametres du maillage surfacique
866   #
867     if prem :
868       #
869       BLSURF = MASSIF_M.Triangle(algo=smeshBuilder.BLSURF)
870       BLSURF_Parameters = BLSURF.Parameters()
871       # Geometrical mesh - if set to "Custom", allows user input in Angle Mesh S, Angle Mesh C and Gradation fields.
872       # These fields control computation of the element size, so called geometrical size, conform to the
873       # surface geometry considering local curvatures.
874       # If both the User size and the geometrical size are defined, the eventual element size correspond to the least of the two.
875       BLSURF_Parameters.SetGeometricMesh( 1 )
876       # Gradation - maximum ratio between the lengths of two adjacent edges.
877       BLSURF_Parameters.SetGradation( 2.5 )
878       # Angle Mesh S - maximum angle between the mesh face and the tangent to the geometrical surface at each mesh node, in degrees.
879       BLSURF_Parameters.SetAngleMeshS( 16. )
880       # Angle Mesh C - maximum angle between the mesh edge and the tangent to the geometrical curve at each mesh node, in degrees.
881       BLSURF_Parameters.SetAngleMeshC( 16. )
882       # Taille de maille globale
883       daux = LG_ARETE_BLOC*5
884       BLSURF_Parameters.SetPhySize( daux )
885       # Taille de maille locale autour du tunnel
886       daux = 0.9 * ( LGTUNNEL / NC )
887       saux = "% e" % daux
888       for groupe in l_groupe_cav_s_g :
889         if ( groupe[1] == "SYME_CAV" ) :
890           #print groupe[1], groupe[0]
891           BLSURF_Parameters.SetSizeMap(groupe[0], saux )
892           BLSURF_Parameters.SetSizeMap(groupe[0], 'def f(u,v): return '+saux )
893       for groupe in l_groupe_tunnel_g :
894         BLSURF_Parameters.SetSizeMap(groupe[0], saux )
895         BLSURF_Parameters.SetSizeMap(groupe[0], 'def f(u,v): return '+saux )
896       # Taille de maille maximale
897       BLSURF_Parameters.SetMaxSize( LG_ARETE_MASSIF )
898       # Taille de maille minimale
899       daux = LG_ARETE_BLOC/10.
900       BLSURF_Parameters.SetMinSize( daux )
901       # Distance maximale entre le maillage et la CAO
902       daux = LG_ARETE_BLOC/10.
903       BLSURF_Parameters.SetChordalError( daux )
904     else :
905       isdone = MASSIF_M.AddHypothesis(BLSURF_Parameters)
906       BLSURF_1 = MASSIF_M.Triangle(algo=smeshBuilder.BLSURF)
907   #
908   # 4. Calcul
909   #
910     isDone = MASSIF_M.Compute()
911   #
912     MASSIF_M.ConvertToQuadratic( 1 )
913   #
914   # 5. Groupes
915   # 5.1. Groupes issus de la géométrie : volume et limites externes
916   #
917     ROCHE_M = MASSIF_M.Group(groupe_g[("ROCHE_G", cas)])
918   #
919     GAUCHE_M = MASSIF_M.Group(groupe_g[("GAUCHE_G", cas)])
920     if cas == "tout" :
921       DROITE_M = MASSIF_M.Group(groupe_g[("DROITE_G", cas)])
922     HAUT_M = MASSIF_M.Group(groupe_g[("HAUT_G", cas)])
923     BAS_M = MASSIF_M.Group(groupe_g[("BAS_G", cas)])
924     DEVANT_M = MASSIF_M.Group(groupe_g[("DEVANT_G", cas)])
925     DERRIERE_M = MASSIF_M.Group(groupe_g[("DERRIERE_G", cas)])
926   #
927   # 5.2. Groupes issus de la géométrie : gestion des cavités
928   #      On mémorise dans l_groupe_b les groupes qui correspondent à des mailles
929   #      qu'il faudra dédoubler pour le calcul de second gradient : la roche finale et les cavités
930   #
931     l_groupe_roche_g = groupe_g[("roche", cas)]
932     l_groupe_cav_g = groupe_g[("cav", cas)]
933     l_groupe_cav_f_g = groupe_g[("cav_f", cas)]
934     l_groupe_cav_p_g = groupe_g[("cav_p", cas)]
935     l_groupe_cav_e_g = groupe_g[("cav_e", cas)]
936     l_groupe_cav_s_g = groupe_g[("cav_s", cas)]
937     l_groupe_tunnel_g = groupe_g[("tunnel", cas)]
938     l_groupe_m = []
939     l_groupe_b = []
940     for groupe in l_groupe_roche_g + l_groupe_cav_g + l_groupe_cav_f_g + l_groupe_cav_p_g + l_groupe_cav_e_g + l_groupe_cav_s_g + l_groupe_tunnel_g :
941       GR_M = MASSIF_M.Group(groupe[0])
942       l_groupe_m.append((GR_M, groupe[1]))
943       if groupe in l_groupe_cav_g :
944         l_groupe_b.append(GR_M)
945       elif groupe[1] == "ROCHE_20" :
946         l_groupe_b.append(GR_M)
947   #
948   # 6. Duplication des mailles dans la roche finale et les cavités
949   #
950     if double :
951   #
952       d_aux = {}
953       for groupe in l_groupe_b :
954   #
955   #   6.1. Nom du groupe et nombre de mailles qu'il contient
956   #
957         name = groupe.GetName()
958         size_groupe = groupe.Size()
959         if verbose_max :
960           print "Longueur du groupe",name, ":", size_groupe
961   #
962   #   6.2. Pour chaque maille du groupe, on repere la liste des noeuds
963   #        et on cree une maille avec ces memes noeuds
964   #
965         l_aux = []
966         for jaux in range (size_groupe) :
967           id_elem = groupe.GetID(jaux+1)
968           #if name == "CAV_01" :
969             #print ".. element",jaux,":", id_elem
970           l_nodes = MASSIF_M.GetElemNodes ( id_elem )
971           ##print ".. l_nodes :", l_nodes
972           id_elem_new = MASSIF_M.AddVolume(l_nodes)
973           ##print ".. nouvel element :", id_elem_new
974           l_aux.append(id_elem_new)
975   #
976   #   6.3. Creation d'un groupe contenant ces mailles doubles creees
977   #
978         name = name + "_b"
979         if name[0:1] == "R" :
980           name = "R_20_b"
981         #print "name :", name
982         ElementType = groupe.GetType();
983         groupe_new = MASSIF_M.MakeGroupByIds( name, ElementType, l_aux )
984         smesh.SetName(groupe_new, name)
985         d_aux[name] = groupe_new
986         if verbose_max :
987           size_groupe_new = groupe_new.Size()
988           print "Longueur du groupe",name, ":", size_groupe
989   #
990   # 6.4. Creation des groupes contenant les mailles doubles creees pour chacune
991   #      des situations d'excavation :
992   #      Couche 20 : R_20_b
993   #      Couche 19 : R_19_b = R_20_b + CAV_20_b
994   #      Couche 18 : R_18_b = R_20_b + CAV_20_b + CAV_19_b
995   #      ... etc ...
996   #      Couche 01 : R_01_b = R_20_b + CAV_20_b + CAV_19_b + ... + CAV_02_b
997   #      Roche     : R_00_b = R_20_b + CAV_20_b + CAV_19_b + ... + CAV_02_b + CAV_01_b
998   #
999       groupe_d = d_aux["R_20_b"]
1000       for nro_cav in range(NC-1, -1, -1 ) :
1001         name = "R_%02d_b" % nro_cav
1002         groupe_new = MASSIF_M.UnionGroups ( groupe_d, d_aux["CAV_%02d_b" % (nro_cav+1)], name)
1003         smesh.SetName(groupe_new, name)
1004         groupe_d = groupe_new
1005   #
1006   # 7. Tests
1007   #
1008     val_calc = {}
1009     val_calc["no"] = MASSIF_M.NbNodes()
1010     val_calc["ed"] = MASSIF_M.NbEdges()
1011     val_calc["tr"] = MASSIF_M.NbTriangles()
1012     val_calc["te"] = MASSIF_M.NbTetras()
1013   #
1014     if verbose :
1015       print "Nombre de noeuds      :", val_calc["no"]
1016       print "Nombre d'aretes       :", val_calc["ed"]
1017       print "Nombre de triangles   :", val_calc["tr"]
1018       print "Nombre de tetraedres  :", val_calc["te"]
1019       ## Get Information About Mesh by GetMeshInfo
1020       #info = smesh.GetMeshInfo(MASSIF_M)
1021       #keys = info.keys()
1022       #if len(keys) > 0 :
1023         #print "\nInformation sur le maillage avec GetMeshInfo:"
1024         #keys.sort()
1025         #for iaux in keys :
1026           #if info[iaux] > 0 :
1027             #print "  %s   :  %d" % ( iaux, info[iaux] )
1028   #
1029     if controle :
1030   #
1031       val_ref = {}
1032       val_ref[("tout","no")] =  8301
1033       val_ref[("tout","ed")] =   572
1034       val_ref[("tout","tr")] =  1478
1035       val_ref[("tout","te")] = 11940
1036       val_ref[("syme","no")] =  4128
1037       val_ref[("syme","ed")] =   428
1038       val_ref[("syme","tr")] =  1068
1039       val_ref[("syme","te")] =  5484
1040       daux = {}
1041   #
1042       for entite in ( "no", "ed", "tr", "te" ) :
1043         daux[entite] = float(val_calc[entite]-val_ref[(cas,entite)]) / float(val_ref[(cas,entite)])
1044         saux = "==> ecart relatif " + entite + " = %f " % (daux[entite]*100.)
1045         saux += "%"
1046         if ( abs(daux[entite]) ) > 0.05 :
1047           erreur += 1
1048           print ". val_ref[(", cas, ",", entite, ")] =", val_ref[(cas,entite)]
1049           print ". val_calc[", entite, "] =", val_calc[entite]
1050           print saux
1051         elif verbose :
1052           print saux
1053   #
1054     prem = 0
1055   #
1056   # 8. Nommage
1057   #
1058   ## set object names
1059     smesh.SetName(BLSURF.GetAlgorithm(), 'BLSURF')
1060     smesh.SetName(BLSURF_Parameters, 'BLSURF Parameters')
1061     smesh.SetName(GHS3D_3D.GetAlgorithm(), 'GHS3D_3D')
1062     smesh.SetName(GHS3D_Parameters, 'GHS3D Parameters')
1063     if cas == "tout" :
1064       smesh.SetName(MASSIF_M.GetMesh(), 'MASSIF')
1065     else :
1066       smesh.SetName(MASSIF_M.GetMesh(), 'MASSIF_sym')
1067   #
1068     smesh.SetName(GAUCHE_M, 'GAUCHE')
1069     if cas == "tout" :
1070       smesh.SetName(DROITE_M, 'DROITE')
1071     smesh.SetName(HAUT_M, 'HAUT')
1072     smesh.SetName(BAS_M, 'BAS')
1073     smesh.SetName(DEVANT_M, 'DEVANT')
1074     smesh.SetName(DERRIERE_M, 'DERRIERE')
1075     smesh.SetName(ROCHE_M, 'ROCHE')
1076   #
1077     l_groupe_m = []
1078     for groupe in l_groupe_m :
1079       smesh.SetName(groupe[0], groupe[1])
1080 #
1081 #
1082 #
1083 # 7. Ecriture
1084 #
1085 fichierMedResult = '/tmp/MASSIF.new.med'
1086 MASSIF_M.ExportMED( fichierMedResult, 0, SMESH.MED_V2_2, 1 )
1087 #
1088 #___________________________________________________________
1089 # Ajout PN : statistiques sur les Mailles
1090 #___________________________________________________________
1091
1092 from Stats.getStats import getStatsMaillage, getStatsGroupes, genHistogram
1093
1094 fichierStatMailles=fichierMedResult.replace('.med','.res')
1095 fichierStatRatio=fichierMedResult.replace('.med','.ratio')
1096 fichierStatTailles=fichierMedResult.replace('.med','.taille')
1097
1098 getStatsMaillage(MASSIF_M,fichierStatMailles)
1099 getStatsGroupes(MASSIF_M,fichierMedResult)
1100 genHistogram(MASSIF_M, SMESH.FT_AspectRatio3D, 20, False, fichierStatRatio,theStudy)
1101 genHistogram(MASSIF_M, SMESH.FT_MaxElementLength3D, 20, False, fichierStatTailles,theStudy)