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