Salome HOME
Merge tag 'V8_3_0a2' into ngr/python3_dev
[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 from . 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       logging.debug("meshFacePeau %d intacte", ifil)
36       # --- edges de bord de la face de filling
37       filling = facesDefaut[ifil]
38       edgesFilling = geompy.ExtractShapes(filling, geompy.ShapeType["EDGE"], False)
39       groupEdgesBordPeau = geompy.CreateGroup(filling, geompy.ShapeType["EDGE"])
40       geompy.UnionList(groupEdgesBordPeau, edgesFilling)
41       geomPublishInFather(initLog.debug,filling, groupEdgesBordPeau , "EdgesBords")
42       
43       meshFacePeau = smesh.Mesh(facesDefaut[ifil])
44       
45       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
46       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
47       putName(algo1d.GetSubMesh(), "bordsLibres", ifil)
48       putName(algo1d, "algo1d_bordsLibres", ifil)
49       putName(hypo1d, "hypo1d_bordsLibres", ifil)
50       
51     else:
52       
53       logging.debug("meshFacePeau %d coupée par la fissure", ifil)
54       facePeau           = facesPeaux[ifil] # pour chaque face : la face de peau finale a mailler (percée des faces débouchantes)
55       edgesCircPeau      = edCircPeau[ifil] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe]
56       verticesCircPeau   = ptCircPeau[ifil] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe]
57       groupEdgesBordPeau = gpedgeBord[ifil] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine
58       bordsVifs          = gpedgeVifs[ifil] # pour chaque face de peau : groupe subshape des edges aux bords correspondant à des arêtes vives
59       edgesFissurePeau   = edFissPeau[ifil] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes]
60
61       meshFacePeau = smesh.Mesh(facePeau)
62       
63       algo1d = meshFacePeau.UseExisting1DElements(geom=groupEdgesBordPeau)
64       hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
65       putName(algo1d.GetSubMesh(), "bordsLibres", ifil)
66       putName(algo1d, "algo1d_bordsLibres", ifil)
67       putName(hypo1d, "hypo1d_bordsLibres", ifil)
68       
69       algo1d = meshFacePeau.UseExisting1DElements(geom=geompy.MakeCompound(edgesFissurePeau))
70       hypo1d = algo1d.SourceEdges([ grpEdgesPeauFissureExterne ],0,0)
71       putName(algo1d.GetSubMesh(), "edgePeauFiss", ifil)
72       putName(algo1d, "algo1d_edgePeauFiss", ifil)
73       putName(hypo1d, "hypo1d_edgePeauFiss", ifil)
74       
75       if bordsVifs is not None:
76         algo1d = meshFacePeau.UseExisting1DElements(geom=bordsVifs)
77         hypo1d = algo1d.SourceEdges([ grpAretesVives ],0,0)
78         putName(algo1d.GetSubMesh(), "bordsVifs", ifil)
79         putName(algo1d, "algo1d_bordsVifs", ifil)
80         putName(hypo1d, "hypo1d_bordsVifs", ifil)
81         
82       for i, edgeCirc in enumerate(edgesCircPeau):
83         if edgeCirc is not None:
84           algo1d = meshFacePeau.UseExisting1DElements(geom=edgeCirc)
85           if boutFromIfil[ifil] is None:
86             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[i] ],0,0)
87           else:
88             hypo1d = algo1d.SourceEdges([ edgesCircPipeGroup[boutFromIfil[ifil]] ],0,0)
89           name = "cercle%d"%i
90           putName(algo1d.GetSubMesh(), name, ifil)
91           putName(algo1d, "algo1d_" + name, ifil)
92           putName(hypo1d, "hypo1d_" + name, ifil)
93    
94     algo2d = meshFacePeau.Triangle(algo=smeshBuilder.NETGEN_1D2D)
95     hypo2d = algo2d.Parameters()
96     hypo2d.SetMaxSize( dmoyen )
97     hypo2d.SetOptimize( 1 )
98     hypo2d.SetFineness( 2 )
99     hypo2d.SetMinSize( rayonPipe/float(nbsegRad) )
100     hypo2d.SetQuadAllowed( 0 )
101     putName(algo2d.GetSubMesh(), "facePeau", ifil)
102     putName(algo2d, "algo2d_facePeau", ifil)
103     putName(hypo2d, "hypo2d_facePeau", ifil)
104       
105     isDone = meshFacePeau.Compute()
106     logging.info("meshFacePeau %d fini", ifil)
107     GroupFaces = meshFacePeau.CreateEmptyGroup( SMESH.FACE, "facePeau%d"%ifil )
108     nbAdd = GroupFaces.AddFrom( meshFacePeau.GetMesh() )
109     meshesFacesPeau.append(meshFacePeau)
110
111   return meshesFacesPeau