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