1 # -*- coding: iso-8859-1 -*-
4 ### Copyright EDF R&D 2012
7 ### (33/0)1.47.65.56.94
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 ===========================
24 theStudy = salome.myStudy
31 l_cas = [ "tout", "syme" ]
41 geompy.init_geom(theStudy)
43 # 0. Les conventions d'orientation des axes sont les suivantes :
44 # . l'axe Z s'enfonce dans le plan du dessin, son origine étant dans le plan
45 # . l'axe Y est vers le haut
46 # . l'axe X est vers la gauche.
47 # . l'origine du repere est au centre du tunnel
48 # Remarque : Les suffixes G (gauche), D (droit), B(bas) et H (haut) doivent
49 # etre compris quand on regarde depuis l'entree du tunnel, sa partie
52 # 1. Dimensions globales
53 # 1.1. Dimensions caracteristiques du domaine
54 # Taille generale du bloc contenant le tunnel
56 # Taille generale du massif
57 LG_ARETE_MASSIF = LG_ARETE_BLOC*15.0
60 # Abscisse du centre du cylindre de percage 1 (+ ou -)
62 # Abscisse du centre du cylindre de percage 2 (+ ou -)
64 # Nombre de couches dans le tunnel
67 # 1.2. Dimensions deduites
69 # 1.2.1. Rayons des cylindres de percement
70 # . Rayon du cylindre superieur
71 RAYON_H = 0.5*LG_ARETE_BLOC
72 # . Rayon du premier cylindre inferieur
73 RAYON_1 = RAYON_H + X1
74 # . Rayon du premier cylindre inferieur
75 # sinus = sin(angle), angle entre le plan horizontal et
76 # le plan d'intersection des deux cylindres inférieurs
77 sinus = ( (X1+X2)**2 - X1**2 ) / ( (X1+X2)**2 + X1**2 )
79 print "sinus =", sinus
80 tangente = math.tan(math.asin(sinus))
82 print "tangente =", tangente
83 Y2 = - (X1+X2)*tangente
86 RAYON_2 = RAYON_H + Y2
89 print "RAYON_H =", RAYON_H
90 print "RAYON_1 =", RAYON_1
91 print "RAYON_2 =", RAYON_2
93 # 1.2.2. Longueur de la boite qui servira a la construction des cavites
94 LG_OUTIL = 2.0 * LG_ARETE_MASSIF
96 # 1.2.3. Decalage pour que tout le massif soit traverse
97 DELTA = 0.01*LG_ARETE_MASSIF
99 # 2. Les cylindres du tunnelier
103 LG_OUTIL = LG_OUTIL + 2.*DELTA
105 OUTIL_H = geompy.MakeCylinderRH(RAYON_H, LG_OUTIL)
109 geompy.TranslateDXDYDZ(OUTIL_H, TRX, TRY, TRZ)
110 d_cyl["TUN_H"] = (RAYON_H, TRX, TRY)
112 OUTIL_G_1 = geompy.MakeCylinderRH(RAYON_1, LG_OUTIL)
114 geompy.TranslateDXDYDZ(OUTIL_G_1, TRX, TRY, TRZ)
115 d_cyl["TUN_G1"] = (RAYON_1, TRX, TRY)
117 OUTIL_D_1 = geompy.MakeCylinderRH(RAYON_1, LG_OUTIL)
119 geompy.TranslateDXDYDZ(OUTIL_D_1, TRX, TRY, TRZ)
120 d_cyl["TUN_D1"] = (RAYON_1, TRX, TRY)
122 OUTIL_G_2 = geompy.MakeCylinderRH(RAYON_2, LG_OUTIL)
125 geompy.TranslateDXDYDZ(OUTIL_G_2, TRX, TRY, TRZ)
126 d_cyl["TUN_G2"] = (RAYON_2, TRX, TRY)
128 OUTIL_D_2 = geompy.MakeCylinderRH(RAYON_2, LG_OUTIL)
130 geompy.TranslateDXDYDZ(OUTIL_D_2, TRX, TRY, TRZ)
131 d_cyl["TUN_D2"] = (RAYON_2, TRX, TRY)
135 for cle in d_cyl.keys() :
137 print cle, ": rayon =", t_aux[0], ", centre (", t_aux[1], ",", t_aux[2], ")"
139 # 3. L'empreinte de decoupe
140 # 3.1. Les boites de base
142 DX = 2.0*LG_ARETE_BLOC
143 DY = 2.0*LG_ARETE_BLOC
145 B_B = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
150 B_H = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
153 TRY = -2.0*LG_ARETE_BLOC
154 B_G = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
156 TRX = -2.0*LG_ARETE_BLOC - X2
157 TRY = -2.0*LG_ARETE_BLOC
158 B_D = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
161 TRY = -2.5*LG_ARETE_BLOC
162 geompy.TranslateDXDYDZ(B_B, TRX, TRY, TRZ)
164 # 3.2. Plans d'intersection entre les cylindres inférieurs
165 # Centre des premiers cylindres inférieurs
169 CG1 = geompy.MakeVertex(DX, DY, DZ)
171 CD1 = geompy.MakeVertex(DX, DY, DZ)
172 # Vecteurs normaux aux plans des intersections des cylindres inférieurs
176 VG = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
178 VD = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
179 # Plans des intersections des cylindres inférieurs
181 PG = geompy.MakePlane(CG1, VG, DZ)
182 PD = geompy.MakePlane(CD1, VD, DZ)
185 # 3.3.1. Partie superieure
186 B_H1 = geompy.MakeCut(B_H, OUTIL_H)
188 # 3.3.2. Partie gauche
189 # . Séparation par le plan de l'intersection
190 B_G1 = geompy.MakeHalfPartition(B_G, PG)
191 # . Création des deux volumes internes
192 L_AUX = geompy.MakeBlockExplode(B_G1, 6, 6)
193 # . Repérage du volume interne supérieur
194 DX = 2.0*LG_ARETE_BLOC + 2.0*DELTA
195 DY = 2.0*LG_ARETE_BLOC + 2.0*DELTA
196 DZ = LG_OUTIL + 2.0*DELTA
197 boite_aux_G = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
199 TRY = -2.0*LG_ARETE_BLOC + DELTA
201 geompy.TranslateDXDYDZ(boite_aux_G, TRX, TRY, TRZ)
202 l_aux = geompy.GetShapesOnBox (boite_aux_G, B_G1, geompy.ShapeType["SOLID"], geompy.GEOM.ST_IN )
203 #print "l_aux =", l_aux
204 B_G2 = geompy.MakeCut(l_aux[0], OUTIL_G_1)
205 # . Repérage du volume interne inférieur
207 TRY = -RAYON_H - DELTA
209 geompy.TranslateDXDYDZ(boite_aux_G, TRX, TRY, TRZ)
210 l_aux = geompy.GetShapesOnBox (boite_aux_G, B_G1, geompy.ShapeType["SOLID"], geompy.GEOM.ST_IN )
211 B_G3 = geompy.MakeCut(l_aux[0], OUTIL_G_2)
213 # 3.3.3. Partie droite
214 # . Séparation par le plan de l'intersection
215 B_D1 = geompy.MakeHalfPartition(B_D, PD)
216 # . Création des deux volumes internes
217 L_AUX = geompy.MakeBlockExplode(B_D1, 6, 6)
218 # . Repérage du volume interne supérieur
219 DX = 2.0*LG_ARETE_BLOC + 2.0*DELTA
220 DY = 2.0*LG_ARETE_BLOC + 2.0*DELTA
221 DZ = LG_OUTIL + 2.0*DELTA
222 boite_aux_D = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
224 TRY = -2.0*LG_ARETE_BLOC + DELTA
226 geompy.TranslateDXDYDZ(boite_aux_D, TRX, TRY, TRZ)
227 l_aux = geompy.GetShapesOnBox (boite_aux_D, B_D1, geompy.ShapeType["SOLID"], geompy.GEOM.ST_IN )
229 print "3.3.3. supérieur l_aux =", l_aux
230 B_D2 = geompy.MakeCut(l_aux[0], OUTIL_D_1)
231 # . Repérage du volume interne inférieur
233 TRY = -RAYON_H - DELTA
235 geompy.TranslateDXDYDZ(boite_aux_D, TRX, TRY, TRZ)
236 l_aux = geompy.GetShapesOnBox (boite_aux_D, B_D1, geompy.ShapeType["SOLID"], geompy.GEOM.ST_IN )
238 print "3.3.3. inférieur l_aux =", l_aux
239 B_D3 = geompy.MakeCut(l_aux[0], OUTIL_D_2)
243 Union_1 = geompy.MakeFuse(B_B , B_G3)
244 Union_2 = geompy.MakeFuse(Union_1, B_D3)
245 Union_3 = geompy.MakeFuse(Union_2, B_G2)
246 Union_4 = geompy.MakeFuse(Union_3, B_D2)
247 EMPREINTE = geompy.MakeFuse(Union_4, B_H1)
252 DX = LG_ARETE_BLOC + 2.0*DELTA
253 DY = LG_ARETE_BLOC + 2.0*DELTA
255 BOITE_TUNNEL = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
256 TRX = -RAYON_H - DELTA
257 TRY = -RAYON_H - DELTA
259 geompy.TranslateDXDYDZ(BOITE_TUNNEL, TRX, TRY, TRZ)
261 TUNNEL_PLEIN = geompy.MakeCut(BOITE_TUNNEL, EMPREINTE)
263 # 4.2. Partitionnement par les cavites
265 DX = LG_ARETE_BLOC + 2.0*DELTA
266 DY = LG_ARETE_BLOC + 2.0*DELTA
268 boite_cav = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
269 TRX = -0.5*LG_ARETE_BLOC - DELTA
270 TRY = -0.5*LG_ARETE_BLOC - DELTA
272 geompy.TranslateDXDYDZ(boite_cav, TRX, TRY, TRZ)
276 l_aux = [TUNNEL_PLEIN]
277 for iaux in range(NC) :
278 TUNNEL = geompy.MakePartition(l_aux, [boite_cav], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
281 geompy.TranslateDXDYDZ(boite_cav, TRX, TRY, TRZ)
283 # 5. La structure générale
290 print ". Geometrie du cas", cas
297 MASSIF_00 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
299 TRX = -0.5*LG_ARETE_MASSIF
302 TRY = -0.5*LG_ARETE_MASSIF
304 geompy.TranslateDXDYDZ(MASSIF_00, TRX, TRY, TRZ)
305 MASSIF_G = geompy.MakePartition([MASSIF_00], [TUNNEL], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
308 dico_struct[cas] = MASSIF_G
313 # ROCHE : le massif complet
314 # . Pour nn valant 01, 02, 03, ..., 19, 20 :
315 # ROCHE_nn : la partie du massif qui reste quand on etudie l'excavation de la couche nn
316 # CAV_nn : la partie du massif qui est extraite pour l'excavation de la couche nn
317 # ces morceaux sont disjoints ; on ne s'interesse qu'a ce qui est retire
318 # au moment de l'attaque de la couche n
319 # Vu autrement : ROCHE = ROCHE_01 + CAV_01
320 # ROCHE = ROCHE_02 + CAV_01 + CAV_02
321 # ROCHE = ROCHE_03 + CAV_01 + CAV_02 + CAV_03
322 # ... ... ... ... ... ...
323 # ROCHE = ROCHE_20 + CAV_01 + CAV_02 + CAV_03 + ... + CAV_20
325 # Toutes les mailles de ces groupes seront dupliquees (memes noeuds) et rassemblees
326 # dans des groupes miroirs :
327 # R_00_b est l'analogue de ROCHE
328 # R_nn_b est l'analogue de ROCHE_nn
329 # CAV_nn_b est l'analogue de CAV_nn
333 # . Les bords exterieurs du domaine
334 # ---------------------------------
335 # BAS : la face inferieure du massif
336 # HAUT : la face superieure du massif
337 # DEVANT : la face avant du massif
338 # DERRIERE : la face arriere du massif
339 # GAUCHE : la face gauche du massif
340 # Pour la geometrie complete :
341 # DROITE : la face droite du massif
342 # sinon (pour la geometrie avec symetrie) :
343 # SYME_nn : la face a droite bordant la roche au cours de l'excavation de la couche nn,
344 # nn valant 00, 01, 02, 03, ..., 19, 20
345 # Remarque : SYME_00 equivaut a DROITE
347 # . Les bords des cavites
348 # -----------------------
349 # Pour nn valant 01, 02, 03, ..., 19, 20 :
350 # FOND_nn : la paroi qui est le fond de la cavite n, jouxtant la cavite (n+1)
351 # BORD_nn : la paroi peripherique de la cavite n
352 # PAROI_nn : les parois peripheriques des cavites 1, 2, ..., n-1
353 # Vu autrement : PAROI_02 = BORD_01
354 # PAROI_03 = BORD_01 + BORD_02
355 # PAROI_04 = BORD_01 + BORD_02 + BORD_03
356 # ... ... ... ... ... ...
357 # PAROI_20 = BORD_01 + BORD_02 + BORD_03 + ... + BORD_19
358 # FRONT_nn : la frontiere complete de la cavite n
359 # Vu autrement : FRONT_01 = FOND_01 + BORD_01
360 # FRONT_02 = FOND_02 + BORD_01 + BORD_02
361 # ... ... ... ... ... ...
362 # FRONT_20 = FOND_20 + BORD_01 + BORD_02 + BORD_03 + ... + BORD_20
363 # Vu autrement : FRONT_nn = PAROI_nn + FOND_nn + BORD_nn (nn>1)
365 # . Les bords du tunnel
366 # ---------------------
367 # TUN_H : la face superieure du tunnel
368 # TUN_G1 : la face gauche et en haut du tunnel
369 # TUN_G2 : la face gauche et en bas du tunnel
370 # TUN_BASE : la face inferieure du tunnel
371 # Pour la geometrie complete :
372 # TUN_D1 : la face droite et en haut du tunnel
373 # TUN_D2 : la face droite et en bas du tunnel
374 # Remarque : les groupes TUN_xx recouvrent les bords des cavites sur toute la longueur de l'excavation
376 l_cav_toutes_v_id = []
377 l_cav_toutes_p_id = []
379 l_groupe_roche_g = []
380 l_groupe_cav_f_g = []
381 l_groupe_cav_p_g = []
382 l_groupe_cav_e_g = []
383 l_face_avant_cav = []
384 l_groupe_tunnel_g = []
388 DX = LG_ARETE_MASSIF + 2.0*DELTA
389 DY = LG_ARETE_MASSIF + 2.0*DELTA
390 DZ = LG_ARETE_MASSIF + 2.0*DELTA
391 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
392 TRX = -0.5*LG_ARETE_MASSIF - DELTA
393 TRY = -0.5*LG_ARETE_MASSIF - DELTA
395 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
396 l_solid_id = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["SOLID"], geompy.GEOM.ST_IN )
398 print "6.1. l_solid_id =", l_solid_id
399 ROCHE_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
400 geompy.UnionIDs ( ROCHE_G, l_solid_id )
402 # 6.2. Les faces externes
403 # 6.2.1. Paralleles a Oyz
404 # 6.2.1.1. Parallele a Oyz : face gauche
407 DY = LG_ARETE_MASSIF + 2.0*DELTA
408 DZ = LG_ARETE_MASSIF + 2.0*DELTA
409 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
410 TRX = 0.5*LG_ARETE_MASSIF - DELTA
411 TRY = -0.5*LG_ARETE_MASSIF - DELTA
413 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
414 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
416 print "6.2.1.1. Gauche l_aux =", l_aux
417 GAUCHE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
418 geompy.UnionIDs ( GAUCHE_G, l_aux )
420 # 6.2.1.2. Parallele a Oyz : face droite dans le cas complet, plan de symetrie sinon
422 l_groupe_cav_s_g = []
425 TRX = -LG_ARETE_MASSIF
428 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
429 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
431 print "6.2.1.2. Droite l_aux =", l_aux
432 DROITE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
433 geompy.UnionIDs ( DROITE_G, l_aux )
436 # L'ensemble des faces
437 TRX = -0.5*LG_ARETE_MASSIF
440 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
441 l_face_id_syme = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
443 print "6.2.1.2. Symetrie - tout l_face_id_syme =", l_face_id_syme
445 for face_id in l_face_id_syme :
446 l_aux.append(face_id)
447 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
448 geompy.UnionIDs ( GR_CAV_G, l_aux )
449 l_groupe_cav_s_g.append((GR_CAV_G, "SYME_00"))
450 # Les faces bordant le tunnel
452 DY = LG_ARETE_BLOC + 2.0*DELTA
453 DZ = LGTUNNEL/NC + 2.0*DELTA
454 boite_2 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
456 TRY = -0.5*LG_ARETE_BLOC - DELTA
458 geompy.TranslateDXDYDZ(boite_2, TRX, TRY, TRZ)
462 for iaux in range(NC) :
464 print "6.2.1.2. Cavite %02d" % (iaux+1)
465 # Les id des faces bordant la cavite courante
466 l_aux_2 = geompy.GetShapesOnBoxIDs (boite_2, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
468 print ".. l_aux_2 =", l_aux_2
469 for face_id in l_aux_2 :
470 l_aux.remove(face_id)
471 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
472 geompy.UnionIDs ( GR_CAV_G, l_aux )
473 l_groupe_cav_s_g.append((GR_CAV_G, "SYME_%02d" % (iaux+1)))
474 # On translate les boites selon Z, d'une distance égale à l'épaisseur d'une cavité
476 geompy.TranslateDXDYDZ(boite_2, TRX, TRY, TRZ)
478 # 6.2.2. Paralleles a Oxz : faces haut & bas
480 DX = LG_ARETE_MASSIF + 2.0*DELTA
482 DZ = LG_ARETE_MASSIF + 2.0*DELTA
483 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
484 TRX = -0.5*LG_ARETE_MASSIF - DELTA
485 TRY = 0.5*LG_ARETE_MASSIF - DELTA
487 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
488 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
490 print "6.2.2. Haut l_aux =", l_aux
491 HAUT_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
492 geompy.UnionIDs ( HAUT_G, l_aux )
495 TRY = -LG_ARETE_MASSIF
497 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
498 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
500 print "6.2.2. Bas l_aux =", l_aux
501 BAS_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
502 geompy.UnionIDs ( BAS_G, l_aux )
504 # 6.2.3. Paralleles a Oxy
505 # 6.2.3.1. Faces debouchant du tunnel : toutes les faces contenues dans la boite
506 # d'epaisseur quasi-nulle en dZ, de tailles debordant l'empreinte du tunnel en X/Y et centree en (0.,0.,0.)
507 DX = LG_ARETE_BLOC + 2.0*DELTA
508 DY = LG_ARETE_BLOC + 2.0*DELTA
510 boite_aux_1 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
511 TRX = -0.5*LG_ARETE_BLOC - DELTA
512 TRY = -0.5*LG_ARETE_BLOC - DELTA
514 geompy.TranslateDXDYDZ(boite_aux_1, TRX, TRY, TRZ)
515 l_face_avant_tunnel = geompy.GetShapesOnBoxIDs (boite_aux_1, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
517 print "6.2.3.1. Devant l_face_avant_tunnel =", l_face_avant_tunnel
518 # Création du groupe de la face avant
519 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
520 geompy.UnionIDs ( GR_CAV_G, l_face_avant_tunnel )
521 l_groupe_cav_f_g.append((GR_CAV_G, "FOND_00"))
523 # 6.2.3.2. Faces avant du massif : toutes les faces contenues dans la boite
524 # d'epaisseur quasi-nulle en dZ, de tailles extremes en X/Y et centree en (0.,0.,0.)
525 DX = LG_ARETE_MASSIF + 2.0*DELTA
526 DY = LG_ARETE_MASSIF + 2.0*DELTA
528 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
529 TRX = -0.5*LG_ARETE_MASSIF - DELTA
530 TRY = -0.5*LG_ARETE_MASSIF - DELTA
532 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
533 l_aux_2 = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
535 print "6.2.3.2. Devant l_aux_2 =", l_aux_2
536 # Pour le groupe, on retire les faces correspondant a l'empreinte du tunnel
538 for face_id in l_aux_2 :
539 if face_id not in l_face_avant_tunnel :
540 l_aux.append(face_id)
542 print "6.2.3.2. Devant l_aux =", l_aux
543 DEVANT_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
544 geompy.UnionIDs ( DEVANT_G, l_aux )
546 # 6.2.3.3. Faces avant du massif : toutes les faces contenues dans la boite
547 # d'epaisseur quasi-nulle en dZ, de tailles extremes en X/Y et centree en (0.,0.,extremite)
550 TRZ = LG_ARETE_MASSIF
551 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
552 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
554 print "6.2.3.3. Derriere l_aux =", l_aux
555 DERRIERE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
556 geompy.UnionIDs ( DERRIERE_G, l_aux )
558 # 6.3. Les faces et les solides internes au tunnel
561 # 6.3.1. Les faces de la base
566 normale = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
567 DY = -0.5*LG_ARETE_BLOC
568 point = geompy.MakeVertex(DX, DY, DZ)
569 # Les faces posees sur ce plan
570 liste_face_tunnel_base = geompy.GetShapesOnPlaneWithLocationIDs (MASSIF_G, geompy.ShapeType["FACE"], normale, point, geompy.GEOM.ST_ON )
572 print "6.3.1. liste_face_tunnel_base =", liste_face_tunnel_base
573 # Création du groupe associe
574 GR_TUNNEL_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
575 geompy.UnionIDs ( GR_TUNNEL_G, liste_face_tunnel_base )
576 l_groupe_tunnel_g.append((GR_TUNNEL_G, "TUN_BASE"))
578 # 6.3.2. Les faces sur les portions cylindriques
579 # On distingue chaque cylindre pour les futurs suivis de frontiere dans HOMARD
580 # Remarque : il serait plus logique de proceder avec GetShapesOnCylinderWithLocationIDs mais
581 # je n'arrive pas donc je repere les faces dans un tube englobant la surface de chaque cylindre. Bug ? Mauvaise utilisation ?
582 # Du coup, il faut s'assurer que l'on ne capte pas des faces planes precedentes (6.3.1).
583 # Cela peut arriver si les dimensions sont peu serrees
585 for cle in d_cyl.keys() :
587 # Creation du tube encadrant le cylindre support
589 print "6.3.2.", cle, ": rayon =", t_aux[0], ", centre (", t_aux[1], ",", t_aux[2], ")"
590 cyl_1 = geompy.MakeCylinderRH(1.1*t_aux[0], LG_OUTIL)
591 cyl_2 = geompy.MakeCylinderRH(0.9*t_aux[0], LG_OUTIL)
592 boite = geompy.MakeCut(cyl_1, cyl_2)
595 geompy.TranslateDXDYDZ(boite, TRX, TRY, TRZ)
596 l_cyl_supp.append((boite, cle))
598 l_aux_1 = geompy.GetShapesOnShapeIDs (boite, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
600 print ".. l_aux_1 =", l_aux_1
602 for face_id in l_aux_1 :
603 if face_id not in liste_face_tunnel_base :
604 l_aux.append(face_id)
606 print ".. l_aux =", l_aux
607 # Création du groupe associe
609 GR_TUNNEL_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
610 geompy.UnionIDs ( GR_TUNNEL_G, l_aux )
611 l_groupe_tunnel_g.append((GR_TUNNEL_G, cle))
613 # 6.3.3. Creation de boites :
614 # . une qui englobe le volume d'une cavite
616 DX = LG_ARETE_BLOC + 2.0*DELTA
617 DY = LG_ARETE_BLOC + 2.0*DELTA
618 DZ = LGTUNNEL/NC + 2.0*DELTA
619 boite_cav_v = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
620 TRX = -0.5*LG_ARETE_BLOC - DELTA
621 TRY = -0.5*LG_ARETE_BLOC - DELTA
623 geompy.TranslateDXDYDZ(boite_cav_v, TRX, TRY, TRZ)
625 # . une qui englobe une le fond d'une cavite
627 boite_cav_f = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
628 TRX = -0.5*LG_ARETE_BLOC - DELTA
629 TRY = -0.5*LG_ARETE_BLOC - DELTA
630 TRZ = LGTUNNEL/NC - DELTA
631 geompy.TranslateDXDYDZ(boite_cav_f, TRX, TRY, TRZ)
633 # 6.3.4. On deplace ces boites au fur et a mesure des couches
634 # On memorise les faces et volumes contenus dans les boites et
635 # on cree les groupes a la volee
640 for face_id in l_face_avant_tunnel :
641 l_face_avant_cav.append(face_id)
642 for iaux in range(NC) :
644 print "6.3.4. Cavite %02d" % (iaux+1)
645 # Création du groupe de l'exterieur des cavites
647 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
648 geompy.UnionIDs ( GR_CAV_G, l_cav_toutes_p_id )
649 l_groupe_cav_e_g.append((GR_CAV_G, "PAROI_%02d" % (iaux+1)))
650 # Les id des solides dans la cavite courante
651 l_aux_1 = geompy.GetShapesOnBoxIDs (boite_cav_v, MASSIF_G, geompy.ShapeType["SOLID"], geompy.GEOM.ST_IN )
653 print ".. l_aux_1 =", l_aux_1
654 # Création du groupe solide de la cavite courante
655 CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
656 geompy.UnionIDs ( CAV_G, l_aux_1 )
657 l_groupe_cav_g.append((CAV_G, "CAV_%02d" % (iaux+1)))
658 # On ajoute ces id a la liste de tous ceux depuis le debut des cavites (i.e. le percement du tunnel)
659 for solid_id in l_aux_1 :
660 l_cav_toutes_v_id.append(solid_id)
662 print ".. l_cav_toutes_v_id =", l_cav_toutes_v_id
663 # On repere les id des solides du massif mais qui ne sont pas dans les cavites precedemment traitées
665 for solid_id in l_solid_id :
666 if solid_id not in l_cav_toutes_v_id :
667 l_solid_id_1.append(solid_id)
669 print ".. l_solid_id_1 =", l_solid_id_1
670 # Création du groupe solide de la roche de laquelle on a retiré tous les creusements effectués
671 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
672 geompy.UnionIDs ( GR_CAV_G, l_solid_id_1 )
673 l_groupe_roche_g.append((GR_CAV_G, "ROCHE_%02d" % (iaux+1)))
674 # Les id des faces du fond de la cavite courante
675 l_aux_1 = geompy.GetShapesOnBoxIDs (boite_cav_f, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
677 print ".. l_aux_1 =", l_aux_1
678 # Création du groupe du fond de la cavite
679 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
680 geompy.UnionIDs ( GR_CAV_G, l_aux_1 )
681 l_groupe_cav_f_g.append((GR_CAV_G, "FOND_%02d" % (iaux+1)))
682 # Les id des faces dans la cavite courante
683 l_aux_2 = geompy.GetShapesOnBoxIDs (boite_cav_v, MASSIF_G, geompy.ShapeType["FACE"], geompy.GEOM.ST_IN )
685 print ".. l_aux_2 =", l_aux_2
686 # Création du groupe du pourtour de la cavite : penser a retirer les fonds et l'eventuel plan de symetrie !
687 # On cumule tous les pourtours depuis le debut
689 for face_id in l_aux_2 :
690 if face_id not in l_aux_1 + l_face_avant_cav + l_face_id_syme :
691 l_aux.append(face_id)
692 l_cav_toutes_p_id.append(face_id)
694 print ".. l_aux =", l_aux
695 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
696 geompy.UnionIDs ( GR_CAV_G, l_aux )
697 l_groupe_cav_p_g.append((GR_CAV_G, "BORD_%02d" % (iaux+1)))
698 # Création du groupe de l'exterieur des cavites
699 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
700 geompy.UnionIDs ( GR_CAV_G, l_cav_toutes_p_id+l_aux_1 )
701 l_groupe_cav_e_g.append((GR_CAV_G, "FRONT_%02d" % (iaux+1)))
702 # On translate les boites selon Z, d'une distance égale à l'épaisseur d'une cavité
704 geompy.TranslateDXDYDZ(boite_cav_v, TRX, TRY, TRZ)
705 geompy.TranslateDXDYDZ(boite_cav_f, TRX, TRY, TRZ)
706 l_face_avant_cav = []
707 for face_id in l_aux_1 :
708 l_face_avant_cav.append(face_id)
712 groupe_g[("ROCHE_G", cas)] = ROCHE_G
713 groupe_g[("GAUCHE_G", cas)] = GAUCHE_G
715 groupe_g[("DROITE_G", cas)] = DROITE_G
716 groupe_g[("HAUT_G", cas)] = HAUT_G
717 groupe_g[("BAS_G", cas)] = BAS_G
718 groupe_g[("DEVANT_G", cas)] = DEVANT_G
719 groupe_g[("DERRIERE_G", cas)] = DERRIERE_G
720 groupe_g[("cav", cas)] = l_groupe_cav_g
721 groupe_g[("roche", cas)] = l_groupe_roche_g
722 groupe_g[("tunnel", cas)] = l_groupe_tunnel_g
723 groupe_g[("cav_f", cas)] = l_groupe_cav_f_g
724 groupe_g[("cav_p", cas)] = l_groupe_cav_p_g
725 groupe_g[("cav_e", cas)] = l_groupe_cav_e_g
726 groupe_g[("cav_s", cas)] = l_groupe_cav_s_g
729 # 7.1. Les objets de construction
731 geompy.addToStudy( OUTIL_H, 'OUTIL_H' )
732 geompy.addToStudy( OUTIL_G_1, 'OUTIL_G_1' )
733 geompy.addToStudy( OUTIL_D_1, 'OUTIL_D_1' )
734 geompy.addToStudy( OUTIL_G_2, 'OUTIL_G_2' )
735 geompy.addToStudy( OUTIL_D_2, 'OUTIL_D_2' )
736 geompy.addToStudy( B_B, 'B_B' )
737 geompy.addToStudy( B_H, 'B_H' )
738 geompy.addToStudy( B_G, 'B_G' )
739 geompy.addToStudy( B_D, 'B_D' )
740 geompy.addToStudy( CG1, 'CG1' )
741 geompy.addToStudy( VG, 'VG' )
742 geompy.addToStudy( PG, 'PG' )
743 geompy.addToStudy( CD1, 'CD1' )
744 geompy.addToStudy( VD, 'VD' )
745 geompy.addToStudy( PD, 'PD' )
746 geompy.addToStudy( B_H1, 'B_H1' )
747 geompy.addToStudy( B_G1, 'B_G1' )
748 geompy.addToStudy( boite_aux_G, 'boite_aux_G' )
749 geompy.addToStudy( B_G2, 'B_G2' )
750 geompy.addToStudy( B_G3, 'B_G3' )
751 geompy.addToStudy( B_D1, 'B_D1' )
752 geompy.addToStudy( boite_aux_D, 'boite_aux_D' )
753 geompy.addToStudy( B_D2, 'B_D2' )
754 geompy.addToStudy( B_D3, 'B_D3' )
755 geompy.addToStudy( EMPREINTE, 'EMPREINTE' )
756 geompy.addToStudy( BOITE_TUNNEL, 'BOITE_TUNNEL' )
757 geompy.addToStudy( TUNNEL_PLEIN, 'TUNNEL_PLEIN' )
758 geompy.addToStudy( boite_cav, 'boite_cav' )
759 geompy.addToStudy( TUNNEL, 'TUNNEL' )
760 geompy.addToStudy( MASSIF_00, 'MASSIF_00' )
761 geompy.addToStudy( boite_aux, 'boite_aux' )
762 geompy.addToStudy( boite_aux_1, 'boite_aux_1' )
763 geompy.addToStudy( normale, 'normale' )
764 geompy.addToStudy( point, 'point' )
765 geompy.addToStudy( boite_cav_v, 'boite_cav_v' )
766 geompy.addToStudy( boite_cav_f, 'boite_cav_f' )
767 for objet in l_cyl_supp :
768 geompy.addToStudy( objet[0], objet[1] )
770 # 7.2. La structure a etudier et ses groupes
774 MASSIF_G = dico_struct[cas]
776 geompy.addToStudy( MASSIF_G, "MASSIF"+cas )
777 geompy.addToStudyInFather( MASSIF_G, groupe_g[("ROCHE_G", cas)], "ROCHE" )
778 l_groupe_cav_g = groupe_g[("cav", cas)]
779 for groupe in l_groupe_cav_g :
780 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
781 l_groupe_roche_g = groupe_g[("roche", cas)]
782 for groupe in l_groupe_roche_g :
783 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
784 geompy.addToStudyInFather( MASSIF_G, groupe_g[("GAUCHE_G", cas)], "GAUCHE" )
786 geompy.addToStudyInFather( MASSIF_G, groupe_g[("DROITE_G", cas)], "DROITE" )
787 geompy.addToStudyInFather( MASSIF_G, groupe_g[("HAUT_G", cas)], "HAUT" )
788 geompy.addToStudyInFather( MASSIF_G, groupe_g[("BAS_G", cas)], "BAS" )
789 geompy.addToStudyInFather( MASSIF_G, groupe_g[("DEVANT_G", cas)], "DEVANT" )
790 geompy.addToStudyInFather( MASSIF_G, groupe_g[("DERRIERE_G", cas)], "DERRIERE" )
791 l_groupe_tunnel_g = groupe_g[("tunnel", cas)]
792 for groupe in l_groupe_tunnel_g :
793 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
794 l_groupe_cav_f_g = groupe_g[("cav_f", cas)]
795 l_groupe_cav_p_g = groupe_g[("cav_p", cas)]
796 l_groupe_cav_e_g = groupe_g[("cav_e", cas)]
797 l_groupe_cav_s_g = groupe_g[("cav_s", cas)]
798 for groupe in l_groupe_cav_f_g + l_groupe_cav_p_g + l_groupe_cav_e_g + l_groupe_cav_s_g :
799 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
802 ###=======================================================================
804 ###=======================================================================
806 import smesh, SMESH, SALOMEDS
808 smesh.SetCurrentStudy(theStudy)
815 print ". Maillage du cas", cas
817 MASSIF_G = dico_struct[cas]
821 MASSIF_M = smesh.Mesh(MASSIF_G)
823 # 2. Parametres du maillage volumique
826 GHS3D_3D = MASSIF_M.Tetrahedron(algo=smesh.GHS3D)
827 GHS3D_Parameters = smesh.CreateHypothesis('GHS3D_Parameters', 'GHS3DEngine')
828 # Niveau d'optimisation : 3 ==> standard +
829 GHS3D_Parameters.SetOptimizationLevel( 3 )
831 isdone = MASSIF_M.AddHypothesis(GHS3D_Parameters)
832 GHS3D_3D_1 = MASSIF_M.Tetrahedron(algo=smesh.GHS3D)
834 # 3. Parametres du maillage surfacique
838 BLSURF = MASSIF_M.Triangle(algo=smesh.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. )
854 isdone = MASSIF_M.AddHypothesis(BLSURF_Parameters)
855 BLSURF_1 = MASSIF_M.Triangle(algo=smesh.BLSURF)
859 isDone = MASSIF_M.Compute()
861 MASSIF_M.ConvertToQuadratic( 1 )
864 # 5.1. Groupes issus de la géométrie : volume et limites externes
866 ROCHE_M = MASSIF_M.Group(groupe_g[("ROCHE_G", cas)])
868 GAUCHE_M = MASSIF_M.Group(groupe_g[("GAUCHE_G", cas)])
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)])
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
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)]
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)
897 # 6. Duplication des mailles dans la roche finale et les cavités
900 for groupe in l_groupe_b :
902 # 6.1. Nom du groupe et nombre de mailles qu'il contient
904 name = groupe.GetName()
905 size_groupe = groupe.Size()
907 print "Longueur du groupe",name, ":", size_groupe
909 # 6.2. Pour chaque maille du groupe, on repere la liste des noeuds
910 # et on cree une maille avec ces memes noeuds
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)
923 # 6.3. Creation d'un groupe contenant ces mailles doubles creees
926 if name[0:1] == "R" :
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
934 size_groupe_new = groupe_new.Size()
935 print "Longueur du groupe",name, ":", size_groupe
937 # 6.4. Creation des groupes contenant les mailles doubles creees pour chacune
938 # des situations d'excavation :
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
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
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
955 fichierMedResult = '/tmp/MASSIF.new.med'
956 MASSIF_M.ExportMED( fichierMedResult, 0, SMESH.MED_V2_2, 1 )
958 #___________________________________________________________
959 # Ajout PN : statistiques sur les Mailles
960 #___________________________________________________________
961 fichierStatResult=fichierMedResult.replace('.med','.res')
962 from getStats import getStatsMaillage
963 getStatsMaillage(MASSIF_M,fichierStatResult)