Salome HOME
efb7df915efb61bcd9ca67f930427c2f6c483d0d
[modules/smesh.git] / src / Tools / blocFissure / gmu / identifieEdgesPeau.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4
5 from geomsmesh import geompy
6 from geomsmesh import geomPublishDebug
7 from geomsmesh import geomPublishDebugInFather
8
9 from substractSubShapes import substractSubShapes
10
11 def identifieEdgesPeau(edgesFissExtPipe,verticesPipePeau, facePeau, facesPeauSorted,
12                        edgesPeauFondIn, fillingFaceExterne, aretesVivesC, aretesVivesCoupees):
13   """
14   identification précise des edges et disques des faces de peau selon index extremité fissure
15   """
16   logging.info('start')
17   
18   facesPipePeau = [None for i in range(len(edgesFissExtPipe))]
19   endsEdgeFond = [None for i in range(len(edgesFissExtPipe))]
20   edgeRadFacePipePeau = [None for i in range(len(edgesFissExtPipe))]
21   
22   edgesListees = []
23   edgesCircPeau = []
24   verticesCircPeau = []
25   if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
26     
27     for face in facesPeauSorted[:-1]: # la ou les faces débouchantes, pas la grande face de peau
28       logging.debug("examen face debouchante circulaire")
29       for i,efep in enumerate(edgesFissExtPipe):
30         dist = geompy.MinDistance(face, efep)
31         logging.debug("  distance face circulaire edge %s", dist)
32         if dist < 1e-3:
33           for ik, edpfi in enumerate(edgesPeauFondIn):
34             if geompy.MinDistance(face, edpfi) < 1e-3:
35               break
36           sharedVertices = geompy.GetSharedShapesMulti([face, edgesPeauFondIn[ik]], geompy.ShapeType["VERTEX"])
37           nameFace = "facePipePeau%d"%i
38           nameVert = "endEdgeFond%d"%i
39           nameEdge = "edgeRadFacePipePeau%d"%i
40           facesPipePeau[i] = face
41           endsEdgeFond[i] = sharedVertices[0]
42           geomPublishDebug(face, nameFace)
43           geomPublishDebug(sharedVertices[0], nameVert)
44           edgesFace = geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], True)
45           for edge in edgesFace:
46             if geompy.MinDistance(edge, sharedVertices[0]) < 1e-3:
47               edgeRadFacePipePeau[i] = edge
48               geomPublishDebug(edge, nameEdge)
49               break
50             pass
51           pass
52         pass
53       pass
54     
55     # --- edges circulaires de la face de peau et points de jonction de la face externe de fissure
56     logging.debug("facesPipePeau: %s", facesPipePeau)
57     edgesCircPeau = [None for i in range(len(facesPipePeau))]
58     verticesCircPeau = [None for i in range(len(facesPipePeau))]        
59     for i,fcirc in enumerate(facesPipePeau):
60       edges = geompy.GetSharedShapesMulti([facePeau, fcirc], geompy.ShapeType["EDGE"])
61       grpEdgesCirc = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
62       geompy.UnionList(grpEdgesCirc, edges)
63       edgesCircPeau[i] = grpEdgesCirc
64       name = "edgeCirc%d"%i
65       geomPublishDebugInFather(facePeau, grpEdgesCirc, name)
66       edgesListees = edgesListees + edges
67       vertices = geompy.GetSharedShapesMulti([facePeau, fcirc], geompy.ShapeType["VERTEX"])
68       grpVertCircPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["VERTEX"])
69       geompy.UnionList(grpVertCircPeau, vertices)
70       verticesCircPeau[i] = grpVertCircPeau
71       name = "pointEdgeCirc%d"%i
72       geomPublishDebugInFather(facePeau, grpVertCircPeau, name)
73       pass
74     pass # --- au moins une extrémité du pipe sur cette face de peau
75
76   # --- edges de bord de la face de peau
77
78   edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
79   edgesBords = []
80   for i, edge in enumerate(edgesFilling):
81     edgepeau = geompy.GetInPlace(facePeau, edge)
82     name = "edgepeau%d"%i
83     geomPublishDebugInFather(facePeau,edgepeau, name)
84     logging.debug("edgepeau %s", geompy.ShapeInfo(edgepeau))
85     if geompy.ShapeInfo(edgepeau)['EDGE'] > 1:
86       logging.debug("  EDGES multiples")
87       edgs = geompy.ExtractShapes(edgepeau, geompy.ShapeType["EDGE"], False)
88       edgesBords += edgs
89       edgesListees += edgs
90     else:
91       logging.debug("  EDGE")
92       edgesBords.append(edgepeau)
93       edgesListees.append(edgepeau)
94   groupEdgesBordPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
95   geompy.UnionList(groupEdgesBordPeau, edgesBords)
96   bordsVifs = None
97   if aretesVivesC is not None:
98     bordsVifs = geompy.GetInPlace(facePeau, aretesVivesC)
99   if bordsVifs is not None:
100     geomPublishDebugInFather(facePeau, bordsVifs, "bordsVifs")
101     groupEdgesBordPeau = geompy.CutGroups(groupEdgesBordPeau, bordsVifs)
102     grptmp = None
103     if len(aretesVivesCoupees) > 0:
104       grpC = geompy.MakeCompound(aretesVivesCoupees)
105       grptmp = geompy.GetInPlace(facePeau, grpC)
106     if grptmp is not None:
107       grpnew = geompy.CutGroups(bordsVifs, grptmp) # ce qui est nouveau dans bordsVifs
108     else:
109       grpnew = bordsVifs
110     if grpnew is not None:
111       edv = geompy.ExtractShapes(grpnew, geompy.ShapeType["EDGE"], False)
112       aretesVivesCoupees += edv
113   logging.debug("aretesVivesCoupees %s",aretesVivesCoupees)
114   geomPublishDebugInFather(facePeau, groupEdgesBordPeau , "EdgesBords")
115     
116   # ---  edges de la face de peau partagées avec la face de fissure
117   
118   edgesPeau = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
119   edges = substractSubShapes(facePeau, edgesPeau, edgesListees)
120   edgesFissurePeau = []
121   if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
122     edgesFissurePeau = [None for i in range(len(verticesCircPeau))] # edges associés aux extrémités du pipe, en premier
123     for edge in edges:
124       for i, grpVert in enumerate(verticesCircPeau):
125         if (geompy.MinDistance(grpVert, edge) < 1.e-3) and (edge not in edgesFissurePeau):
126           edgesFissurePeau[i] = edge
127           name = "edgeFissurePeau%d"%i
128           geomPublishDebugInFather(facePeau,  edge, name)
129     for edge in edges: # on ajoute après les edges manquantes
130       if edge not in edgesFissurePeau:
131         edgesFissurePeau.append(edge)
132   else:
133     for i, edge in enumerate(edges):
134       edgesFissurePeau.append(edge)
135       name = "edgeFissurePeau%d"%i
136       geomPublishDebugInFather(facePeau,  edge, name)
137       
138   return (endsEdgeFond, facesPipePeau, edgeRadFacePipePeau,
139           edgesCircPeau, verticesCircPeau, groupEdgesBordPeau,
140           bordsVifs, edgesFissurePeau, aretesVivesCoupees)