Salome HOME
generalisation publication conditionnelle
[modules/smesh.git] / src / Tools / blocFissure / gmu / mailleFacesPeau.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4
5 from geomsmesh import geompy
6 from geomsmesh import geomPublish
7 from geomsmesh import geomPublishInFather
8 import initLog
9 from geomsmesh import smesh
10 from salome.smesh import smeshBuilder
11 import SMESH
12
13 from putName import putName
14
15 def mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut,
16                     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau,
17                     bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives,
18                     edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad):
19   """
20   maillage faces de peau
21   """
22   logging.info('start')
23   nbFacesFilling = len(partitionsPeauFissFond)
24   boutFromIfil = [None for i in range(nbFacesFilling)]
25   if idFillingFromBout[0] != idFillingFromBout[1]: # repérage des extremites du pipe quand elles débouchent sur des faces différentes
26     boutFromIfil[idFillingFromBout[0]] = 0
27     boutFromIfil[idFillingFromBout[1]] = 1
28   
29   logging.debug("---------------------------- maillage faces de peau --------------")
30   meshesFacesPeau = []
31   for ifil in range(nbFacesFilling):
32     meshFacePeau = None
33     if partitionsPeauFissFond[ifil] is None: # face de peau maillage sain intacte
34       
35       # --- edges de bord de la face de filling
36       filling = facesDefaut[ifil]
37       edgesFilling = geompy.ExtractShapes(filling, geompy.ShapeType["EDGE"], False)
38       groupEdgesBordPeau = geompy.CreateGroup(filling, geompy.ShapeType["EDGE"])
39       geompy.UnionList(groupEdgesBordPeau, edgesFilling)
40       geomPublishInFather(initLog.debug,filling, groupEdgesBordPeau , "EdgesBords")
41       
42       meshFacePeau = smesh.Mesh(facesDefaut[ifil])
43       
44       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
45       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
46       putName(algo1d.GetSubMesh(), "bordsLibres", ifil)
47       putName(algo1d, "algo1d_bordsLibres", ifil)
48       putName(hypo1d, "hypo1d_bordsLibres", ifil)
49       
50     else:
51       
52       facePeau           = facesPeaux[ifil] # pour chaque face : la face de peau finale a mailler (percée des faces débouchantes)
53       edgesCircPeau      = edCircPeau[ifil] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe]
54       verticesCircPeau   = ptCircPeau[ifil] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe]
55       groupEdgesBordPeau = gpedgeBord[ifil] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine
56       bordsVifs          = gpedgeVifs[ifil] # pour chaque face de peau : groupe subshape des edges aux bords correspondant à des arêtes vives
57       edgesFissurePeau   = edFissPeau[ifil] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes]
58
59       meshFacePeau = smesh.Mesh(facePeau)
60       
61       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
62       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
63       putName(algo1d.GetSubMesh(), "bordsLibres", ifil)
64       putName(algo1d, "algo1d_bordsLibres", ifil)
65       putName(hypo1d, "hypo1d_bordsLibres", ifil)
66       
67       algo1d = meshFacePeau.UseExisting1DElements(geom=geompy.MakeCompound(edgesFissurePeau))
68       hypo1d = algo1d.SourceEdges([ grpEdgesPeauFissureExterne ],0,0)
69       putName(algo1d.GetSubMesh(), "edgePeauFiss", ifil)
70       putName(algo1d, "algo1d_edgePeauFiss", ifil)
71       putName(hypo1d, "hypo1d_edgePeauFiss", ifil)
72       
73       if bordsVifs is not None:
74         algo1d = meshFacePeau.UseExisting1DElements(geom=bordsVifs)
75         hypo1d = algo1d.SourceEdges([ grpAretesVives ],0,0)
76         putName(algo1d.GetSubMesh(), "bordsVifs", ifil)
77         putName(algo1d, "algo1d_bordsVifs", ifil)
78         putName(hypo1d, "hypo1d_bordsVifs", ifil)
79         
80       for i, edgeCirc in enumerate(edgesCircPeau):
81         if edgeCirc is not None:
82           algo1d = meshFacePeau.UseExisting1DElements(geom=edgeCirc)
83           if boutFromIfil[ifil] is None:
84             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[i] ],0,0)
85           else:
86             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[boutFromIfil[ifil]] ],0,0)
87           name = "cercle%d"%i
88           putName(algo1d.GetSubMesh(), name, ifil)
89           putName(algo1d, "algo1d_" + name, ifil)
90           putName(hypo1d, "hypo1d_" + name, ifil)
91    
92     algo2d = meshFacePeau.Triangle(algo=smeshBuilder.NETGEN_1D2D)
93     hypo2d = algo2d.Parameters()
94     hypo2d.SetMaxSize( dmoyen )
95     hypo2d.SetOptimize( 1 )
96     hypo2d.SetFineness( 2 )
97     hypo2d.SetMinSize( rayonPipe/float(nbsegRad) )
98     hypo2d.SetQuadAllowed( 0 )
99     putName(algo2d.GetSubMesh(), "facePeau", ifil)
100     putName(algo2d, "algo2d_facePeau", ifil)
101     putName(hypo2d, "hypo2d_facePeau", ifil)
102       
103     isDone = meshFacePeau.Compute()
104     logging.info("meshFacePeau %d fini", ifil)
105     GroupFaces = meshFacePeau.CreateEmptyGroup( SMESH.FACE, "facePeau%d"%ifil )
106     nbAdd = GroupFaces.AddFrom( meshFacePeau.GetMesh() )
107     meshesFacesPeau.append(meshFacePeau)
108
109   return meshesFacesPeau