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