1 # -*- coding: iso-8859-1 -*-
4 Copyright EDF R&D 2012-2014
9 25/04/2013 : prise en compte de Builder
18 theStudy = salome.myStudy
21 ipar = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", 1))
27 #==================== Personnalisation - Debut =========================
28 HOME = os.environ["HOME"]
29 rep_GEOM_MAIL = os.path.join(HOME, "ASTER_USER", "TEST", "Excavation", "GEOM_MAIL")
30 # Les fichiers MED des deux maillages seront exportes dans ce repertoire.
31 # Comportement par defaut : l'export est inactive (line 45)
32 # The MED files for both two meshes are exported in this directory.
33 # Default behaviour : no export (line 45)
36 l_cas = [ "tout", "syme" ]
38 # création de la géométrie 1/0 ?
41 # création du maillage 1/0 ?
47 # Creation des mailles doubles 1/0 ?
50 # Controle vis-a-vis d'une reference 1/0 ?
52 #==================== Personnalisation - Fin ===========================
62 from salome.geom import geomBuilder
63 geompy = geomBuilder.New(theStudy)
65 # 0. Les conventions d'orientation des axes sont les suivantes :
66 # . l'axe Z s'enfonce dans le plan du dessin, son origine étant dans le plan
67 # . l'axe Y est vers le haut
68 # . l'axe X est vers la gauche.
69 # . l'origine du repere est au centre du tunnel
70 # Remarque : Les suffixes G (gauche), D (droit), B(bas) et H (haut) doivent
71 # etre compris quand on regarde depuis l'entree du tunnel, sa partie
74 # 1. Dimensions globales
75 # 1.1. Dimensions caracteristiques du domaine
76 # Taille generale du bloc contenant le tunnel
78 # Taille generale du massif
79 LG_ARETE_MASSIF = LG_ARETE_BLOC*15.0
82 # Abscisse du centre du cylindre de percage 1 (+ ou -)
84 # Abscisse du centre du cylindre de percage 2 (+ ou -)
86 # Nombre de couches dans le tunnel
89 # 1.2. Dimensions deduites
91 # 1.2.1. Rayons des cylindres de percement
92 # . Rayon du cylindre superieur
93 RAYON_H = 0.5*LG_ARETE_BLOC
94 # . Rayon du premier cylindre inferieur
95 RAYON_1 = RAYON_H + X1
96 # . Rayon du premier cylindre inferieur
97 # sinus = sin(angle), angle entre le plan horizontal et
98 # le plan d'intersection des deux cylindres inférieurs
99 sinus = ( (X1+X2)**2 - X1**2 ) / ( (X1+X2)**2 + X1**2 )
101 print "sinus =", sinus
102 tangente = math.tan(math.asin(sinus))
104 print "tangente =", tangente
105 Y2 = - (X1+X2)*tangente
108 RAYON_2 = RAYON_H + Y2
111 print "RAYON_H =", RAYON_H
112 print "RAYON_1 =", RAYON_1
113 print "RAYON_2 =", RAYON_2
115 # 1.2.2. Longueur de la boite qui servira a la construction des cavites
116 LG_OUTIL = 2.0 * LG_ARETE_MASSIF
118 # 1.2.3. Decalage pour que tout le massif soit traverse
119 DELTA = 0.01*LG_ARETE_MASSIF
121 # 2. Les cylindres du tunnelier
125 LG_OUTIL = LG_OUTIL + 2.*DELTA
127 OUTIL_H = geompy.MakeCylinderRH(RAYON_H, LG_OUTIL)
131 geompy.TranslateDXDYDZ(OUTIL_H, TRX, TRY, TRZ)
132 d_cyl["TUN_H"] = (RAYON_H, TRX, TRY)
134 OUTIL_G_1 = geompy.MakeCylinderRH(RAYON_1, LG_OUTIL)
136 geompy.TranslateDXDYDZ(OUTIL_G_1, TRX, TRY, TRZ)
137 d_cyl["TUN_G1"] = (RAYON_1, TRX, TRY)
139 OUTIL_D_1 = geompy.MakeCylinderRH(RAYON_1, LG_OUTIL)
141 geompy.TranslateDXDYDZ(OUTIL_D_1, TRX, TRY, TRZ)
142 d_cyl["TUN_D1"] = (RAYON_1, TRX, TRY)
144 OUTIL_G_2 = geompy.MakeCylinderRH(RAYON_2, LG_OUTIL)
147 geompy.TranslateDXDYDZ(OUTIL_G_2, TRX, TRY, TRZ)
148 d_cyl["TUN_G2"] = (RAYON_2, TRX, TRY)
150 OUTIL_D_2 = geompy.MakeCylinderRH(RAYON_2, LG_OUTIL)
152 geompy.TranslateDXDYDZ(OUTIL_D_2, TRX, TRY, TRZ)
153 d_cyl["TUN_D2"] = (RAYON_2, TRX, TRY)
157 for cle in d_cyl.keys() :
159 print cle, ": rayon =", t_aux[0], ", centre (", t_aux[1], ",", t_aux[2], ")"
161 # 3. L'empreinte de decoupe
162 # 3.1. Les boites de base
164 DX = 2.0*LG_ARETE_BLOC
165 DY = 2.0*LG_ARETE_BLOC
167 B_B = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
172 B_H = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
175 TRY = -2.0*LG_ARETE_BLOC
176 B_G = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
178 TRX = -2.0*LG_ARETE_BLOC - X2
179 TRY = -2.0*LG_ARETE_BLOC
180 B_D = geompy.MakeTranslation(B_B, TRX, TRY, TRZ)
183 TRY = -2.5*LG_ARETE_BLOC
184 geompy.TranslateDXDYDZ(B_B, TRX, TRY, TRZ)
186 # 3.2. Plans d'intersection entre les cylindres inférieurs
187 # Centre des premiers cylindres inférieurs
191 CG1 = geompy.MakeVertex(DX, DY, DZ)
193 CD1 = geompy.MakeVertex(DX, DY, DZ)
194 # Vecteurs normaux aux plans des intersections des cylindres inférieurs
198 VG = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
200 VD = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
201 # Plans des intersections des cylindres inférieurs
203 PG = geompy.MakePlane(CG1, VG, DZ)
204 PD = geompy.MakePlane(CD1, VD, DZ)
207 # 3.3.1. Partie superieure
208 B_H1 = geompy.MakeCut(B_H, OUTIL_H)
210 # 3.3.2. Partie gauche
211 # . Séparation par le plan de l'intersection
212 B_G1 = geompy.MakeHalfPartition(B_G, PG)
213 # . Création des deux volumes internes
214 L_AUX = geompy.MakeBlockExplode(B_G1, 6, 6)
215 # . Repérage du volume interne supérieur
216 DX = 2.0*LG_ARETE_BLOC + 2.0*DELTA
217 DY = 2.0*LG_ARETE_BLOC + 2.0*DELTA
218 DZ = LG_OUTIL + 2.0*DELTA
219 boite_aux_G = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
221 TRY = -2.0*LG_ARETE_BLOC + DELTA
223 geompy.TranslateDXDYDZ(boite_aux_G, TRX, TRY, TRZ)
224 l_aux = geompy.GetShapesOnBox (boite_aux_G, B_G1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
225 #print "l_aux =", l_aux
226 B_G2 = geompy.MakeCut(l_aux[0], OUTIL_G_1)
227 # . Repérage du volume interne inférieur
229 TRY = -RAYON_H - DELTA
231 geompy.TranslateDXDYDZ(boite_aux_G, TRX, TRY, TRZ)
232 l_aux = geompy.GetShapesOnBox (boite_aux_G, B_G1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
233 B_G3 = geompy.MakeCut(l_aux[0], OUTIL_G_2)
235 # 3.3.3. Partie droite
236 # . Séparation par le plan de l'intersection
237 B_D1 = geompy.MakeHalfPartition(B_D, PD)
238 # . Création des deux volumes internes
239 L_AUX = geompy.MakeBlockExplode(B_D1, 6, 6)
240 # . Repérage du volume interne supérieur
241 DX = 2.0*LG_ARETE_BLOC + 2.0*DELTA
242 DY = 2.0*LG_ARETE_BLOC + 2.0*DELTA
243 DZ = LG_OUTIL + 2.0*DELTA
244 boite_aux_D = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
246 TRY = -2.0*LG_ARETE_BLOC + DELTA
248 geompy.TranslateDXDYDZ(boite_aux_D, TRX, TRY, TRZ)
249 l_aux = geompy.GetShapesOnBox (boite_aux_D, B_D1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
251 print "3.3.3. supérieur l_aux =", l_aux
252 B_D2 = geompy.MakeCut(l_aux[0], OUTIL_D_1)
253 # . Repérage du volume interne inférieur
255 TRY = -RAYON_H - DELTA
257 geompy.TranslateDXDYDZ(boite_aux_D, TRX, TRY, TRZ)
258 l_aux = geompy.GetShapesOnBox (boite_aux_D, B_D1, geompy.ShapeType["SOLID"], GEOM.ST_IN )
260 print "3.3.3. inférieur l_aux =", l_aux
261 B_D3 = geompy.MakeCut(l_aux[0], OUTIL_D_2)
265 Union_1 = geompy.MakeFuse(B_B , B_G3)
266 Union_2 = geompy.MakeFuse(Union_1, B_D3)
267 Union_3 = geompy.MakeFuse(Union_2, B_G2)
268 Union_4 = geompy.MakeFuse(Union_3, B_D2)
269 EMPREINTE = geompy.MakeFuse(Union_4, B_H1)
274 DX = LG_ARETE_BLOC + 2.0*DELTA
275 DY = LG_ARETE_BLOC + 2.0*DELTA
277 BOITE_TUNNEL = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
278 TRX = -RAYON_H - DELTA
279 TRY = -RAYON_H - DELTA
281 geompy.TranslateDXDYDZ(BOITE_TUNNEL, TRX, TRY, TRZ)
283 TUNNEL_PLEIN = geompy.MakeCut(BOITE_TUNNEL, EMPREINTE)
285 # 4.2. Partitionnement par les cavites
287 DX = LG_ARETE_BLOC + 2.0*DELTA
288 DY = LG_ARETE_BLOC + 2.0*DELTA
290 boite_cav = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
291 TRX = -0.5*LG_ARETE_BLOC - DELTA
292 TRY = -0.5*LG_ARETE_BLOC - DELTA
294 geompy.TranslateDXDYDZ(boite_cav, TRX, TRY, TRZ)
298 l_aux = [TUNNEL_PLEIN]
299 for iaux in range(NC) :
300 TUNNEL = geompy.MakePartition(l_aux, [boite_cav], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
303 geompy.TranslateDXDYDZ(boite_cav, TRX, TRY, TRZ)
305 # 5. La structure générale
312 print ". Geometrie du cas", cas
319 MASSIF_00 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
321 TRX = -0.5*LG_ARETE_MASSIF
324 TRY = -0.5*LG_ARETE_MASSIF
326 geompy.TranslateDXDYDZ(MASSIF_00, TRX, TRY, TRZ)
327 MASSIF_G = geompy.MakePartition([MASSIF_00], [TUNNEL], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
330 dico_struct[cas] = MASSIF_G
335 # ROCHE : le massif complet
336 # . Pour nn valant 01, 02, 03, ..., 19, 20 :
337 # ROCHE_nn : la partie du massif qui reste quand on etudie l'excavation de la couche nn
338 # CAV_nn : la partie du massif qui est extraite pour l'excavation de la couche nn
339 # ces morceaux sont disjoints ; on ne s'interesse qu'a ce qui est retire
340 # au moment de l'attaque de la couche n
341 # Vu autrement : ROCHE = ROCHE_01 + CAV_01
342 # ROCHE = ROCHE_02 + CAV_01 + CAV_02
343 # ROCHE = ROCHE_03 + CAV_01 + CAV_02 + CAV_03
344 # ... ... ... ... ... ...
345 # ROCHE = ROCHE_20 + CAV_01 + CAV_02 + CAV_03 + ... + CAV_20
347 # Toutes les mailles de ces groupes seront dupliquees (memes noeuds) et rassemblees
348 # dans des groupes miroirs :
349 # R_00_b est l'analogue de ROCHE
350 # R_nn_b est l'analogue de ROCHE_nn
351 # CAV_nn_b est l'analogue de CAV_nn
355 # . Les bords exterieurs du domaine
356 # ---------------------------------
357 # BAS : la face inferieure du massif
358 # HAUT : la face superieure du massif
359 # DEVANT : la face avant du massif
360 # DERRIERE : la face arriere du massif
361 # GAUCHE : la face gauche du massif
362 # Pour la geometrie complete :
363 # DROITE : la face droite du massif
364 # sinon (pour la geometrie avec symetrie) :
365 # SYME_nn : la face a droite bordant la roche au cours de l'excavation de la couche nn,
366 # nn valant 00, 01, 02, 03, ..., 19, 20
367 # Remarque : SYME_00 equivaut a DROITE
369 # . Les bords des cavites
370 # -----------------------
371 # Pour nn valant 01, 02, 03, ..., 19, 20 :
372 # FOND_nn : la paroi qui est le fond de la cavite n, jouxtant la cavite (n+1)
373 # BORD_nn : la paroi peripherique de la cavite n
374 # PAROI_nn : les parois peripheriques des cavites 1, 2, ..., n-1 (n>1)
375 # Vu autrement : PAROI_02 = BORD_01
376 # PAROI_03 = BORD_01 + BORD_02
377 # PAROI_04 = BORD_01 + BORD_02 + BORD_03
378 # ... ... ... ... ... ...
379 # PAROI_20 = BORD_01 + BORD_02 + BORD_03 + ... + BORD_19
380 # FRONT_nn : la frontiere complete de la cavite n
381 # Vu autrement : FRONT_01 = FOND_01 + BORD_01
382 # FRONT_02 = FOND_02 + BORD_01 + BORD_02
383 # ... ... ... ... ... ...
384 # FRONT_20 = FOND_20 + BORD_01 + BORD_02 + BORD_03 + ... + BORD_20
385 # Vu autrement : FRONT_nn = PAROI_nn + FOND_nn + BORD_nn (nn>1)
387 # . Les bords du tunnel
388 # ---------------------
389 # TUN_H : la face superieure du tunnel
390 # TUN_G1 : la face gauche et en haut du tunnel
391 # TUN_G2 : la face gauche et en bas du tunnel
392 # TUN_BASE : la face inferieure du tunnel
393 # Pour la geometrie complete :
394 # TUN_D1 : la face droite et en haut du tunnel
395 # TUN_D2 : la face droite et en bas du tunnel
396 # Remarque : les groupes TUN_xx recouvrent les bords des cavites sur toute la longueur de l'excavation
398 l_cav_toutes_v_id = []
399 l_cav_toutes_p_id = []
401 l_groupe_roche_g = []
402 l_groupe_cav_f_g = []
403 l_groupe_cav_p_g = []
404 l_groupe_cav_e_g = []
405 l_face_avant_cav = []
406 l_groupe_tunnel_g = []
410 DX = LG_ARETE_MASSIF + 2.0*DELTA
411 DY = LG_ARETE_MASSIF + 2.0*DELTA
412 DZ = LG_ARETE_MASSIF + 2.0*DELTA
413 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
414 TRX = -0.5*LG_ARETE_MASSIF - DELTA
415 TRY = -0.5*LG_ARETE_MASSIF - DELTA
417 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
418 l_solid_id = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["SOLID"], GEOM.ST_IN )
420 print "6.1. l_solid_id =", l_solid_id
421 ROCHE_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
422 geompy.UnionIDs ( ROCHE_G, l_solid_id )
424 # 6.2. Les faces externes
425 # 6.2.1. Paralleles a Oyz
426 # 6.2.1.1. Parallele a Oyz : face gauche
429 DY = LG_ARETE_MASSIF + 2.0*DELTA
430 DZ = LG_ARETE_MASSIF + 2.0*DELTA
431 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
432 TRX = 0.5*LG_ARETE_MASSIF - DELTA
433 TRY = -0.5*LG_ARETE_MASSIF - DELTA
435 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
436 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
438 print "6.2.1.1. Gauche l_aux =", l_aux
439 GAUCHE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
440 geompy.UnionIDs ( GAUCHE_G, l_aux )
442 # 6.2.1.2. Parallele a Oyz : face droite dans le cas complet, plan de symetrie sinon
444 l_groupe_cav_s_g = []
447 TRX = -LG_ARETE_MASSIF
450 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
451 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
453 print "6.2.1.2. Droite l_aux =", l_aux
454 DROITE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
455 geompy.UnionIDs ( DROITE_G, l_aux )
458 # L'ensemble des faces
459 TRX = -0.5*LG_ARETE_MASSIF
462 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
463 l_face_id_syme = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
465 print "6.2.1.2. Symetrie - tout l_face_id_syme =", l_face_id_syme
467 for face_id in l_face_id_syme :
468 l_aux.append(face_id)
469 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
470 geompy.UnionIDs ( GR_CAV_G, l_aux )
471 l_groupe_cav_s_g.append((GR_CAV_G, "SYME_00"))
472 # Les faces bordant le tunnel
474 DY = LG_ARETE_BLOC + 2.0*DELTA
475 DZ = LGTUNNEL/NC + 2.0*DELTA
476 boite_2 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
478 TRY = -0.5*LG_ARETE_BLOC - DELTA
480 geompy.TranslateDXDYDZ(boite_2, TRX, TRY, TRZ)
485 for iaux in range(NC) :
487 print "6.2.1.2. Cavite %02d" % (iaux+1)
488 # Les id des faces bordant la cavite courante
489 l_aux_2 = geompy.GetShapesOnBoxIDs (boite_2, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
491 print ".. id des faces bordant la cavite % d =" % (iaux+1), l_aux_2
492 for face_id in l_aux_2 :
493 l_aux.remove(face_id)
494 l_aux_3.append(face_id)
495 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
496 geompy.UnionIDs ( GR_CAV_G, l_aux )
497 l_groupe_cav_s_g.append((GR_CAV_G, "SYME_%02d" % (iaux+1)))
498 # On translate les boites selon Z, d'une distance égale à l'épaisseur d'une cavité
500 geompy.TranslateDXDYDZ(boite_2, TRX, TRY, TRZ)
502 print ".. id des faces bordant les cavites =", l_aux_3
503 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
504 geompy.UnionIDs ( GR_CAV_G, l_aux_3 )
505 l_groupe_cav_s_g.append((GR_CAV_G, "SYME_CAV"))
507 # 6.2.2. Paralleles a Oxz : faces haut & bas
509 DX = LG_ARETE_MASSIF + 2.0*DELTA
511 DZ = LG_ARETE_MASSIF + 2.0*DELTA
512 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
513 TRX = -0.5*LG_ARETE_MASSIF - DELTA
514 TRY = 0.5*LG_ARETE_MASSIF - DELTA
516 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
517 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
519 print "6.2.2. Haut l_aux =", l_aux
520 HAUT_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
521 geompy.UnionIDs ( HAUT_G, l_aux )
524 TRY = -LG_ARETE_MASSIF
526 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
527 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
529 print "6.2.2. Bas l_aux =", l_aux
530 BAS_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
531 geompy.UnionIDs ( BAS_G, l_aux )
533 # 6.2.3. Paralleles a Oxy
534 # 6.2.3.1. Faces debouchant du tunnel : toutes les faces contenues dans la boite
535 # d'epaisseur quasi-nulle en dZ, de tailles debordant l'empreinte du tunnel en X/Y et centree en (0.,0.,0.)
536 DX = LG_ARETE_BLOC + 2.0*DELTA
537 DY = LG_ARETE_BLOC + 2.0*DELTA
539 boite_aux_1 = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
540 TRX = -0.5*LG_ARETE_BLOC - DELTA
541 TRY = -0.5*LG_ARETE_BLOC - DELTA
543 geompy.TranslateDXDYDZ(boite_aux_1, TRX, TRY, TRZ)
544 l_face_avant_tunnel = geompy.GetShapesOnBoxIDs (boite_aux_1, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
546 print "6.2.3.1. Devant l_face_avant_tunnel =", l_face_avant_tunnel
547 # Création du groupe de la face avant
548 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
549 geompy.UnionIDs ( GR_CAV_G, l_face_avant_tunnel )
550 l_groupe_cav_f_g.append((GR_CAV_G, "FOND_00"))
552 # 6.2.3.2. Faces avant du massif : toutes les faces contenues dans la boite
553 # d'epaisseur quasi-nulle en dZ, de tailles extremes en X/Y et centree en (0.,0.,0.)
554 DX = LG_ARETE_MASSIF + 2.0*DELTA
555 DY = LG_ARETE_MASSIF + 2.0*DELTA
557 boite_aux = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
558 TRX = -0.5*LG_ARETE_MASSIF - DELTA
559 TRY = -0.5*LG_ARETE_MASSIF - DELTA
561 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
562 l_aux_2 = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
564 print "6.2.3.2. Devant l_aux_2 =", l_aux_2
565 # Pour le groupe, on retire les faces correspondant a l'empreinte du tunnel
567 for face_id in l_aux_2 :
568 if face_id not in l_face_avant_tunnel :
569 l_aux.append(face_id)
571 print "6.2.3.2. Devant l_aux =", l_aux
572 DEVANT_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
573 geompy.UnionIDs ( DEVANT_G, l_aux )
575 # 6.2.3.3. Faces avant du massif : toutes les faces contenues dans la boite
576 # d'epaisseur quasi-nulle en dZ, de tailles extremes en X/Y et centree en (0.,0.,extremite)
579 TRZ = LG_ARETE_MASSIF
580 geompy.TranslateDXDYDZ(boite_aux, TRX, TRY, TRZ)
581 l_aux = geompy.GetShapesOnBoxIDs (boite_aux, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
583 print "6.2.3.3. Derriere l_aux =", l_aux
584 DERRIERE_G = geompy.CreateGroup ( MASSIF_G, geompy.ShapeType["FACE"] )
585 geompy.UnionIDs ( DERRIERE_G, l_aux )
587 # 6.3. Les faces et les solides internes au tunnel
590 # 6.3.1. Les faces de la base
595 normale = geompy.MakeVectorDXDYDZ(DX, DY, DZ)
596 DY = -0.5*LG_ARETE_BLOC
597 point = geompy.MakeVertex(DX, DY, DZ)
598 # Les faces posees sur ce plan
599 liste_face_tunnel_base = geompy.GetShapesOnPlaneWithLocationIDs (MASSIF_G, geompy.ShapeType["FACE"], normale, point, GEOM.ST_ON )
601 print "6.3.1. liste_face_tunnel_base =", liste_face_tunnel_base
602 # Création du groupe associe
603 GR_TUNNEL_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
604 geompy.UnionIDs ( GR_TUNNEL_G, liste_face_tunnel_base )
605 l_groupe_tunnel_g.append((GR_TUNNEL_G, "TUN_BASE"))
607 # 6.3.2. Les faces sur les portions cylindriques
608 # On distingue chaque cylindre pour les futurs suivis de frontiere dans HOMARD
609 # Remarque : il serait plus logique de proceder avec GetShapesOnCylinderWithLocationIDs mais
610 # je n'arrive pas donc je repere les faces dans un tube englobant la surface de chaque cylindre. Bug ? Mauvaise utilisation ?
611 # Du coup, il faut s'assurer que l'on ne capte pas des faces planes precedentes (6.3.1).
612 # Cela peut arriver si les dimensions sont peu serrees
614 for cle in d_cyl.keys() :
616 # Creation du tube encadrant le cylindre support
618 print "6.3.2.", cle, ": rayon =", t_aux[0], ", centre (", t_aux[1], ",", t_aux[2], ")"
619 cyl_1 = geompy.MakeCylinderRH(1.1*t_aux[0], LG_OUTIL)
620 cyl_2 = geompy.MakeCylinderRH(0.9*t_aux[0], LG_OUTIL)
621 boite = geompy.MakeCut(cyl_1, cyl_2)
624 geompy.TranslateDXDYDZ(boite, TRX, TRY, TRZ)
625 l_cyl_supp.append((boite, cle))
627 l_aux_1 = geompy.GetShapesOnShapeIDs (boite, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
629 print ".. l_aux_1 =", l_aux_1
631 for face_id in l_aux_1 :
632 if face_id not in liste_face_tunnel_base :
633 l_aux.append(face_id)
635 print ".. l_aux =", l_aux
636 # Création du groupe associe
638 GR_TUNNEL_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
639 geompy.UnionIDs ( GR_TUNNEL_G, l_aux )
640 l_groupe_tunnel_g.append((GR_TUNNEL_G, cle))
642 # 6.3.3. Creation de boites :
643 # . une qui englobe le volume d'une cavite
645 DX = LG_ARETE_BLOC + 2.0*DELTA
646 DY = LG_ARETE_BLOC + 2.0*DELTA
647 DZ = LGTUNNEL/NC + 2.0*DELTA
648 boite_cav_v = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
649 TRX = -0.5*LG_ARETE_BLOC - DELTA
650 TRY = -0.5*LG_ARETE_BLOC - DELTA
652 geompy.TranslateDXDYDZ(boite_cav_v, TRX, TRY, TRZ)
654 # . une qui englobe une le fond d'une cavite
656 boite_cav_f = geompy.MakeBoxDXDYDZ(DX, DY, DZ)
657 TRX = -0.5*LG_ARETE_BLOC - DELTA
658 TRY = -0.5*LG_ARETE_BLOC - DELTA
659 TRZ = LGTUNNEL/NC - DELTA
660 geompy.TranslateDXDYDZ(boite_cav_f, TRX, TRY, TRZ)
662 # 6.3.4. On deplace ces boites au fur et a mesure des couches
663 # On memorise les faces et volumes contenus dans les boites et
664 # on cree les groupes a la volee
669 for face_id in l_face_avant_tunnel :
670 l_face_avant_cav.append(face_id)
671 for iaux in range(NC) :
673 print "6.3.4. Cavite %02d" % (iaux+1)
674 # Création du groupe de l'exterieur des cavites
676 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
677 geompy.UnionIDs ( GR_CAV_G, l_cav_toutes_p_id )
678 l_groupe_cav_e_g.append((GR_CAV_G, "PAROI_%02d" % (iaux+1)))
679 # Les id des solides dans la cavite courante
680 l_aux_1 = geompy.GetShapesOnBoxIDs (boite_cav_v, MASSIF_G, geompy.ShapeType["SOLID"], GEOM.ST_IN )
682 print ".. l_aux_1 =", l_aux_1
683 # Création du groupe solide de la cavite courante
684 CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
685 geompy.UnionIDs ( CAV_G, l_aux_1 )
686 l_groupe_cav_g.append((CAV_G, "CAV_%02d" % (iaux+1)))
687 # On ajoute ces id a la liste de tous ceux depuis le debut des cavites (i.e. le percement du tunnel)
688 for solid_id in l_aux_1 :
689 l_cav_toutes_v_id.append(solid_id)
691 print ".. l_cav_toutes_v_id =", l_cav_toutes_v_id
692 # On repere les id des solides du massif mais qui ne sont pas dans les cavites precedemment traitées
694 for solid_id in l_solid_id :
695 if solid_id not in l_cav_toutes_v_id :
696 l_solid_id_1.append(solid_id)
698 print ".. l_solid_id_1 =", l_solid_id_1
699 # Création du groupe solide de la roche de laquelle on a retiré tous les creusements effectués
700 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["SOLID"])
701 geompy.UnionIDs ( GR_CAV_G, l_solid_id_1 )
702 l_groupe_roche_g.append((GR_CAV_G, "ROCHE_%02d" % (iaux+1)))
703 # Les id des faces du fond de la cavite courante
704 l_aux_1 = geompy.GetShapesOnBoxIDs (boite_cav_f, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
706 print ".. l_aux_1 =", l_aux_1
707 # Création du groupe du fond de la cavite
708 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
709 geompy.UnionIDs ( GR_CAV_G, l_aux_1 )
710 l_groupe_cav_f_g.append((GR_CAV_G, "FOND_%02d" % (iaux+1)))
711 # Les id des faces dans la cavite courante
712 l_aux_2 = geompy.GetShapesOnBoxIDs (boite_cav_v, MASSIF_G, geompy.ShapeType["FACE"], GEOM.ST_IN )
714 print ".. l_aux_2 =", l_aux_2
715 # Création du groupe du pourtour de la cavite : penser a retirer les fonds et l'eventuel plan de symetrie !
716 # On cumule tous les pourtours depuis le debut
718 for face_id in l_aux_2 :
719 if face_id not in l_aux_1 + l_face_avant_cav + l_face_id_syme :
720 l_aux.append(face_id)
721 l_cav_toutes_p_id.append(face_id)
723 print ".. l_aux =", l_aux
724 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
725 geompy.UnionIDs ( GR_CAV_G, l_aux )
726 l_groupe_cav_p_g.append((GR_CAV_G, "BORD_%02d" % (iaux+1)))
727 # Création du groupe de l'exterieur des cavites
728 GR_CAV_G = geompy.CreateGroup(MASSIF_G, geompy.ShapeType["FACE"])
729 geompy.UnionIDs ( GR_CAV_G, l_cav_toutes_p_id+l_aux_1 )
730 l_groupe_cav_e_g.append((GR_CAV_G, "FRONT_%02d" % (iaux+1)))
731 # On translate les boites selon Z, d'une distance égale à l'épaisseur d'une cavité
733 geompy.TranslateDXDYDZ(boite_cav_v, TRX, TRY, TRZ)
734 geompy.TranslateDXDYDZ(boite_cav_f, TRX, TRY, TRZ)
735 l_face_avant_cav = []
736 for face_id in l_aux_1 :
737 l_face_avant_cav.append(face_id)
741 groupe_g[("ROCHE_G", cas)] = ROCHE_G
742 groupe_g[("GAUCHE_G", cas)] = GAUCHE_G
744 groupe_g[("DROITE_G", cas)] = DROITE_G
745 groupe_g[("HAUT_G", cas)] = HAUT_G
746 groupe_g[("BAS_G", cas)] = BAS_G
747 groupe_g[("DEVANT_G", cas)] = DEVANT_G
748 groupe_g[("DERRIERE_G", cas)] = DERRIERE_G
749 groupe_g[("cav", cas)] = l_groupe_cav_g
750 groupe_g[("roche", cas)] = l_groupe_roche_g
751 groupe_g[("tunnel", cas)] = l_groupe_tunnel_g
752 groupe_g[("cav_f", cas)] = l_groupe_cav_f_g
753 groupe_g[("cav_p", cas)] = l_groupe_cav_p_g
754 groupe_g[("cav_e", cas)] = l_groupe_cav_e_g
755 groupe_g[("cav_s", cas)] = l_groupe_cav_s_g
758 # 7.1. Les objets de construction
760 geompy.addToStudy( OUTIL_H, 'OUTIL_H' )
761 geompy.addToStudy( OUTIL_G_1, 'OUTIL_G_1' )
762 geompy.addToStudy( OUTIL_D_1, 'OUTIL_D_1' )
763 geompy.addToStudy( OUTIL_G_2, 'OUTIL_G_2' )
764 geompy.addToStudy( OUTIL_D_2, 'OUTIL_D_2' )
765 geompy.addToStudy( B_B, 'B_B' )
766 geompy.addToStudy( B_H, 'B_H' )
767 geompy.addToStudy( B_G, 'B_G' )
768 geompy.addToStudy( B_D, 'B_D' )
769 geompy.addToStudy( CG1, 'CG1' )
770 geompy.addToStudy( VG, 'VG' )
771 geompy.addToStudy( PG, 'PG' )
772 geompy.addToStudy( CD1, 'CD1' )
773 geompy.addToStudy( VD, 'VD' )
774 geompy.addToStudy( PD, 'PD' )
775 geompy.addToStudy( B_H1, 'B_H1' )
776 geompy.addToStudy( B_G1, 'B_G1' )
777 geompy.addToStudy( boite_aux_G, 'boite_aux_G' )
778 geompy.addToStudy( B_G2, 'B_G2' )
779 geompy.addToStudy( B_G3, 'B_G3' )
780 geompy.addToStudy( B_D1, 'B_D1' )
781 geompy.addToStudy( boite_aux_D, 'boite_aux_D' )
782 geompy.addToStudy( B_D2, 'B_D2' )
783 geompy.addToStudy( B_D3, 'B_D3' )
784 geompy.addToStudy( EMPREINTE, 'EMPREINTE' )
785 geompy.addToStudy( BOITE_TUNNEL, 'BOITE_TUNNEL' )
786 geompy.addToStudy( TUNNEL_PLEIN, 'TUNNEL_PLEIN' )
787 geompy.addToStudy( boite_cav, 'boite_cav' )
788 geompy.addToStudy( TUNNEL, 'TUNNEL' )
789 geompy.addToStudy( MASSIF_00, 'MASSIF_00' )
790 geompy.addToStudy( boite_aux, 'boite_aux' )
791 geompy.addToStudy( boite_aux_1, 'boite_aux_1' )
792 geompy.addToStudy( normale, 'normale' )
793 geompy.addToStudy( point, 'point' )
794 geompy.addToStudy( boite_cav_v, 'boite_cav_v' )
795 geompy.addToStudy( boite_cav_f, 'boite_cav_f' )
796 for objet in l_cyl_supp :
797 geompy.addToStudy( objet[0], objet[1] )
799 # 7.2. La structure a etudier et ses groupes
803 MASSIF_G = dico_struct[cas]
805 geompy.addToStudy( MASSIF_G, "MASSIF"+cas )
806 geompy.addToStudyInFather( MASSIF_G, groupe_g[("ROCHE_G", cas)], "ROCHE" )
807 l_groupe_cav_g = groupe_g[("cav", cas)]
808 for groupe in l_groupe_cav_g :
809 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
810 l_groupe_roche_g = groupe_g[("roche", cas)]
811 for groupe in l_groupe_roche_g :
812 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
813 geompy.addToStudyInFather( MASSIF_G, groupe_g[("GAUCHE_G", cas)], "GAUCHE" )
815 geompy.addToStudyInFather( MASSIF_G, groupe_g[("DROITE_G", cas)], "DROITE" )
816 geompy.addToStudyInFather( MASSIF_G, groupe_g[("HAUT_G", cas)], "HAUT" )
817 geompy.addToStudyInFather( MASSIF_G, groupe_g[("BAS_G", cas)], "BAS" )
818 geompy.addToStudyInFather( MASSIF_G, groupe_g[("DEVANT_G", cas)], "DEVANT" )
819 geompy.addToStudyInFather( MASSIF_G, groupe_g[("DERRIERE_G", cas)], "DERRIERE" )
820 l_groupe_tunnel_g = groupe_g[("tunnel", cas)]
821 for groupe in l_groupe_tunnel_g :
822 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
823 l_groupe_cav_f_g = groupe_g[("cav_f", cas)]
824 l_groupe_cav_p_g = groupe_g[("cav_p", cas)]
825 l_groupe_cav_e_g = groupe_g[("cav_e", cas)]
826 l_groupe_cav_s_g = groupe_g[("cav_s", cas)]
827 for groupe in l_groupe_cav_f_g + l_groupe_cav_p_g + l_groupe_cav_e_g + l_groupe_cav_s_g :
828 geompy.addToStudyInFather( MASSIF_G, groupe[0], groupe[1] )
833 if not erreur and cree_mail :
835 import SMESH, SALOMEDS
836 from salome.smesh import smeshBuilder
838 smesh = smeshBuilder.New(theStudy)
839 from salome.BLSURFPlugin import BLSURFPluginBuilder
840 from salome.NETGENPlugin import NETGENPluginBuilder
846 print ". Maillage du cas", cas
848 MASSIF_G = dico_struct[cas]
852 MASSIF_M = smesh.Mesh(MASSIF_G)
854 # 2. Parametres du maillage volumique
857 GHS3D_3D = MASSIF_M.Tetrahedron(algo=smeshBuilder.GHS3D)
858 GHS3D_Parameters = smesh.CreateHypothesis('GHS3D_Parameters', 'GHS3DEngine')
859 # Niveau d'optimisation : 3 ==> standard +
860 GHS3D_Parameters.SetOptimizationLevel( 3 )
862 isdone = MASSIF_M.AddHypothesis(GHS3D_Parameters)
863 GHS3D_3D_1 = MASSIF_M.Tetrahedron(algo=smeshBuilder.GHS3D)
865 # 3. Parametres du maillage surfacique
869 BLSURF = MASSIF_M.Triangle(algo=smeshBuilder.BLSURF)
870 BLSURF_Parameters = BLSURF.Parameters()
871 # Geometrical mesh - if set to "Custom", allows user input in Angle Mesh S, Angle Mesh C and Gradation fields.
872 # These fields control computation of the element size, so called geometrical size, conform to the
873 # surface geometry considering local curvatures.
874 # If both the User size and the geometrical size are defined, the eventual element size correspond to the least of the two.
875 BLSURF_Parameters.SetGeometricMesh( 1 )
876 # Gradation - maximum ratio between the lengths of two adjacent edges.
877 BLSURF_Parameters.SetGradation( 2.5 )
878 # Angle Mesh S - maximum angle between the mesh face and the tangent to the geometrical surface at each mesh node, in degrees.
879 BLSURF_Parameters.SetAngleMeshS( 16. )
880 # Angle Mesh C - maximum angle between the mesh edge and the tangent to the geometrical curve at each mesh node, in degrees.
881 BLSURF_Parameters.SetAngleMeshC( 16. )
882 # Taille de maille globale
883 daux = LG_ARETE_BLOC*5
884 BLSURF_Parameters.SetPhySize( daux )
885 # Taille de maille locale autour du tunnel
886 daux = 0.9 * ( LGTUNNEL / NC )
888 for groupe in l_groupe_cav_s_g :
889 if ( groupe[1] == "SYME_CAV" ) :
890 #print groupe[1], groupe[0]
891 BLSURF_Parameters.SetSizeMap(groupe[0], saux )
892 BLSURF_Parameters.SetSizeMap(groupe[0], 'def f(u,v): return '+saux )
893 for groupe in l_groupe_tunnel_g :
894 BLSURF_Parameters.SetSizeMap(groupe[0], saux )
895 BLSURF_Parameters.SetSizeMap(groupe[0], 'def f(u,v): return '+saux )
896 # Taille de maille maximale
897 BLSURF_Parameters.SetMaxSize( LG_ARETE_MASSIF )
898 # Taille de maille minimale
899 daux = LG_ARETE_BLOC/10.
900 BLSURF_Parameters.SetMinSize( daux )
901 # Distance maximale entre le maillage et la CAO
902 daux = LG_ARETE_BLOC/10.
903 BLSURF_Parameters.SetChordalError( daux )
905 isdone = MASSIF_M.AddHypothesis(BLSURF_Parameters)
906 BLSURF_1 = MASSIF_M.Triangle(algo=smeshBuilder.BLSURF)
910 isDone = MASSIF_M.Compute()
912 MASSIF_M.ConvertToQuadratic( 1 )
915 # 5.1. Groupes issus de la géométrie : volume et limites externes
917 ROCHE_M = MASSIF_M.Group(groupe_g[("ROCHE_G", cas)])
919 GAUCHE_M = MASSIF_M.Group(groupe_g[("GAUCHE_G", cas)])
921 DROITE_M = MASSIF_M.Group(groupe_g[("DROITE_G", cas)])
922 HAUT_M = MASSIF_M.Group(groupe_g[("HAUT_G", cas)])
923 BAS_M = MASSIF_M.Group(groupe_g[("BAS_G", cas)])
924 DEVANT_M = MASSIF_M.Group(groupe_g[("DEVANT_G", cas)])
925 DERRIERE_M = MASSIF_M.Group(groupe_g[("DERRIERE_G", cas)])
927 # 5.2. Groupes issus de la géométrie : gestion des cavités
928 # On mémorise dans l_groupe_b les groupes qui correspondent à des mailles
929 # qu'il faudra dédoubler pour le calcul de second gradient : la roche finale et les cavités
931 l_groupe_roche_g = groupe_g[("roche", cas)]
932 l_groupe_cav_g = groupe_g[("cav", cas)]
933 l_groupe_cav_f_g = groupe_g[("cav_f", cas)]
934 l_groupe_cav_p_g = groupe_g[("cav_p", cas)]
935 l_groupe_cav_e_g = groupe_g[("cav_e", cas)]
936 l_groupe_cav_s_g = groupe_g[("cav_s", cas)]
937 l_groupe_tunnel_g = groupe_g[("tunnel", cas)]
940 for groupe in l_groupe_roche_g + l_groupe_cav_g + l_groupe_cav_f_g + l_groupe_cav_p_g + l_groupe_cav_e_g + l_groupe_cav_s_g + l_groupe_tunnel_g :
941 GR_M = MASSIF_M.Group(groupe[0])
942 l_groupe_m.append((GR_M, groupe[1]))
943 if groupe in l_groupe_cav_g :
944 l_groupe_b.append(GR_M)
945 elif groupe[1] == "ROCHE_20" :
946 l_groupe_b.append(GR_M)
948 # 6. Duplication des mailles dans la roche finale et les cavités
953 for groupe in l_groupe_b :
955 # 6.1. Nom du groupe et nombre de mailles qu'il contient
957 name = groupe.GetName()
958 size_groupe = groupe.Size()
960 print "Longueur du groupe",name, ":", size_groupe
962 # 6.2. Pour chaque maille du groupe, on repere la liste des noeuds
963 # et on cree une maille avec ces memes noeuds
966 for jaux in range (size_groupe) :
967 id_elem = groupe.GetID(jaux+1)
968 #if name == "CAV_01" :
969 #print ".. element",jaux,":", id_elem
970 l_nodes = MASSIF_M.GetElemNodes ( id_elem )
971 ##print ".. l_nodes :", l_nodes
972 id_elem_new = MASSIF_M.AddVolume(l_nodes)
973 ##print ".. nouvel element :", id_elem_new
974 l_aux.append(id_elem_new)
976 # 6.3. Creation d'un groupe contenant ces mailles doubles creees
979 if name[0:1] == "R" :
981 #print "name :", name
982 ElementType = groupe.GetType();
983 groupe_new = MASSIF_M.MakeGroupByIds( name, ElementType, l_aux )
984 smesh.SetName(groupe_new, name)
985 d_aux[name] = groupe_new
987 size_groupe_new = groupe_new.Size()
988 print "Longueur du groupe",name, ":", size_groupe
990 # 6.4. Creation des groupes contenant les mailles doubles creees pour chacune
991 # des situations d'excavation :
993 # Couche 19 : R_19_b = R_20_b + CAV_20_b
994 # Couche 18 : R_18_b = R_20_b + CAV_20_b + CAV_19_b
996 # Couche 01 : R_01_b = R_20_b + CAV_20_b + CAV_19_b + ... + CAV_02_b
997 # Roche : R_00_b = R_20_b + CAV_20_b + CAV_19_b + ... + CAV_02_b + CAV_01_b
999 groupe_d = d_aux["R_20_b"]
1000 for nro_cav in range(NC-1, -1, -1 ) :
1001 name = "R_%02d_b" % nro_cav
1002 groupe_new = MASSIF_M.UnionGroups ( groupe_d, d_aux["CAV_%02d_b" % (nro_cav+1)], name)
1003 smesh.SetName(groupe_new, name)
1004 groupe_d = groupe_new
1009 val_calc["no"] = MASSIF_M.NbNodes()
1010 val_calc["ed"] = MASSIF_M.NbEdges()
1011 val_calc["tr"] = MASSIF_M.NbTriangles()
1012 val_calc["te"] = MASSIF_M.NbTetras()
1015 print "Nombre de noeuds :", val_calc["no"]
1016 print "Nombre d'aretes :", val_calc["ed"]
1017 print "Nombre de triangles :", val_calc["tr"]
1018 print "Nombre de tetraedres :", val_calc["te"]
1019 ## Get Information About Mesh by GetMeshInfo
1020 #info = smesh.GetMeshInfo(MASSIF_M)
1023 #print "\nInformation sur le maillage avec GetMeshInfo:"
1026 #if info[iaux] > 0 :
1027 #print " %s : %d" % ( iaux, info[iaux] )
1032 val_ref[("tout","no")] = 8301
1033 val_ref[("tout","ed")] = 572
1034 val_ref[("tout","tr")] = 1478
1035 val_ref[("tout","te")] = 11940
1036 val_ref[("syme","no")] = 4128
1037 val_ref[("syme","ed")] = 428
1038 val_ref[("syme","tr")] = 1068
1039 val_ref[("syme","te")] = 5484
1042 for entite in ( "no", "ed", "tr", "te" ) :
1043 daux[entite] = float(val_calc[entite]-val_ref[(cas,entite)]) / float(val_ref[(cas,entite)])
1044 saux = "==> ecart relatif " + entite + " = %f " % (daux[entite]*100.)
1046 if ( abs(daux[entite]) ) > 0.05 :
1048 print ". val_ref[(", cas, ",", entite, ")] =", val_ref[(cas,entite)]
1049 print ". val_calc[", entite, "] =", val_calc[entite]
1059 smesh.SetName(BLSURF.GetAlgorithm(), 'BLSURF')
1060 smesh.SetName(BLSURF_Parameters, 'BLSURF Parameters')
1061 smesh.SetName(GHS3D_3D.GetAlgorithm(), 'GHS3D_3D')
1062 smesh.SetName(GHS3D_Parameters, 'GHS3D Parameters')
1064 smesh.SetName(MASSIF_M.GetMesh(), 'MASSIF')
1066 smesh.SetName(MASSIF_M.GetMesh(), 'MASSIF_sym')
1068 smesh.SetName(GAUCHE_M, 'GAUCHE')
1070 smesh.SetName(DROITE_M, 'DROITE')
1071 smesh.SetName(HAUT_M, 'HAUT')
1072 smesh.SetName(BAS_M, 'BAS')
1073 smesh.SetName(DEVANT_M, 'DEVANT')
1074 smesh.SetName(DERRIERE_M, 'DERRIERE')
1075 smesh.SetName(ROCHE_M, 'ROCHE')
1078 for groupe in l_groupe_m :
1079 smesh.SetName(groupe[0], groupe[1])
1085 fichierMedResult = '/tmp/MASSIF.new.med'
1086 MASSIF_M.ExportMED( fichierMedResult, 0, SMESH.MED_V2_2, 1 )
1088 #___________________________________________________________
1089 # Ajout PN : statistiques sur les Mailles
1090 #___________________________________________________________
1092 from Stats.getStats import getStatsMaillage, getStatsGroupes, genHistogram
1094 fichierStatMailles=fichierMedResult.replace('.med','.res')
1095 fichierStatRatio=fichierMedResult.replace('.med','.ratio')
1096 fichierStatTailles=fichierMedResult.replace('.med','.taille')
1098 getStatsMaillage(MASSIF_M,fichierStatMailles)
1099 getStatsGroupes(MASSIF_M,fichierMedResult)
1100 genHistogram(MASSIF_M, SMESH.FT_AspectRatio3D, 20, False, fichierStatRatio,theStudy)
1101 genHistogram(MASSIF_M, SMESH.FT_MaxElementLength3D, 20, False, fichierStatTailles,theStudy)