1 # -*- coding: utf-8 -*-
5 from geomsmesh import geompy
6 from geomsmesh import geomPublish
7 from geomsmesh import geomPublishInFather
10 from substractSubShapes import substractSubShapes
12 def identifieEdgesPeau(edgesFissExtPipe,verticesPipePeau, facePeau, facesPeauSorted,
13 edgesPeauFondIn, fillingFaceExterne, aretesVivesC, aretesVivesCoupees):
15 identification précise des edges et disques des faces de peau selon index extremité fissure
19 facesPipePeau = [None for i in range(len(edgesFissExtPipe))]
20 endsEdgeFond = [None for i in range(len(edgesFissExtPipe))]
21 edgeRadFacePipePeau = [None for i in range(len(edgesFissExtPipe))]
26 if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
28 for face in facesPeauSorted[:-1]: # la ou les faces débouchantes, pas la grande face de peau
29 logging.debug("examen face debouchante circulaire")
30 for i,efep in enumerate(edgesFissExtPipe):
31 dist = geompy.MinDistance(face, efep)
32 logging.debug(" distance face circulaire edge %s", dist)
34 for ik, edpfi in enumerate(edgesPeauFondIn):
35 if geompy.MinDistance(face, edpfi) < 1e-3:
37 sharedVertices = geompy.GetSharedShapesMulti([face, edgesPeauFondIn[ik]], geompy.ShapeType["VERTEX"])
38 nameFace = "facePipePeau%d"%i
39 nameVert = "endEdgeFond%d"%i
40 nameEdge = "edgeRadFacePipePeau%d"%i
41 facesPipePeau[i] = face
42 endsEdgeFond[i] = sharedVertices[0]
43 geomPublish(initLog.debug, face, nameFace)
44 geomPublish(initLog.debug, sharedVertices[0], nameVert)
45 edgesFace = geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], True)
46 for edge in edgesFace:
47 if geompy.MinDistance(edge, sharedVertices[0]) < 1e-3:
48 edgeRadFacePipePeau[i] = edge
49 geomPublish(initLog.debug, edge, nameEdge)
56 # --- edges circulaires de la face de peau et points de jonction de la face externe de fissure
57 logging.debug("facesPipePeau: %s", facesPipePeau)
58 edgesCircPeau = [None for i in range(len(facesPipePeau))]
59 verticesCircPeau = [None for i in range(len(facesPipePeau))]
60 for i,fcirc in enumerate(facesPipePeau):
61 edges = geompy.GetSharedShapesMulti([facePeau, fcirc], geompy.ShapeType["EDGE"])
62 grpEdgesCirc = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
63 geompy.UnionList(grpEdgesCirc, edges)
64 edgesCircPeau[i] = grpEdgesCirc
66 geomPublishInFather(initLog.debug, facePeau, grpEdgesCirc, name)
67 edgesListees = edgesListees + edges
68 vertices = geompy.GetSharedShapesMulti([facePeau, fcirc], geompy.ShapeType["VERTEX"])
69 grpVertCircPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["VERTEX"])
70 geompy.UnionList(grpVertCircPeau, vertices)
71 verticesCircPeau[i] = grpVertCircPeau
72 name = "pointEdgeCirc%d"%i
73 geomPublishInFather(initLog.debug, facePeau, grpVertCircPeau, name)
75 pass # --- au moins une extrémité du pipe sur cette face de peau
77 # --- edges de bord de la face de peau
79 edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
81 for i, edge in enumerate(edgesFilling):
82 edgepeau = geompy.GetInPlace(facePeau, edge)
84 geomPublishInFather(initLog.debug, facePeau,edgepeau, name)
85 logging.debug("edgepeau %s", geompy.ShapeInfo(edgepeau))
86 if geompy.ShapeInfo(edgepeau)['EDGE'] > 1:
87 logging.debug(" EDGES multiples")
88 edgs = geompy.ExtractShapes(edgepeau, geompy.ShapeType["EDGE"], False)
92 logging.debug(" EDGE")
93 edgesBords.append(edgepeau)
94 edgesListees.append(edgepeau)
95 groupEdgesBordPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
96 geompy.UnionList(groupEdgesBordPeau, edgesBords)
98 if aretesVivesC is not None:
99 logging.debug("identification des bords vifs par GetInPlace")
100 bordsVifs = geompy.GetInPlace(facePeau, aretesVivesC)
101 if bordsVifs is None:
102 logging.debug("pas d'identification des bords vifs par GetInPlace: test par distance")
104 arvives = geompy.ExtractShapes(aretesVivesC, geompy.ShapeType["EDGE"], False)
105 edgs = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
107 vxs = geompy.ExtractShapes(ed, geompy.ShapeType["VERTEX"], False)
109 d = geompy.MinDistance(vxs[0], ar)
110 d += geompy.MinDistance(vxs[1], ar)
111 logging.debug("test distance bord face peau - arete vive: %s",d)
116 bordsVifs = geompy.CreateGroup(facePeau,geompy.ShapeType["EDGE"])
118 geompy.AddObject(bordsVifs, geompy.GetSubShapeID(facePeau, ed))
119 if bordsVifs is not None:
120 geomPublishInFather(initLog.debug, facePeau, bordsVifs, "bordsVifs")
121 groupEdgesBordPeau = geompy.CutGroups(groupEdgesBordPeau, bordsVifs)
123 if len(aretesVivesCoupees) > 0:
124 grpC = geompy.MakeCompound(aretesVivesCoupees)
125 grptmp = geompy.GetInPlace(facePeau, grpC)
126 if grptmp is not None:
127 grpnew = geompy.CutGroups(bordsVifs, grptmp) # ce qui est nouveau dans bordsVifs
130 if grpnew is not None:
131 edv = geompy.ExtractShapes(grpnew, geompy.ShapeType["EDGE"], False)
132 aretesVivesCoupees += edv
133 logging.debug("aretesVivesCoupees %s",aretesVivesCoupees)
134 geomPublishInFather(initLog.debug, facePeau, groupEdgesBordPeau , "EdgesBords")
136 # --- edges de la face de peau partagées avec la face de fissure
138 edgesPeau = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
139 edges = substractSubShapes(facePeau, edgesPeau, edgesListees)
140 edgesFissurePeau = []
141 if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
142 edgesFissurePeau = [None for i in range(len(verticesCircPeau))] # edges associés aux extrémités du pipe, en premier
144 for i, grpVert in enumerate(verticesCircPeau):
145 if (geompy.MinDistance(grpVert, edge) < 1.e-3) and (edge not in edgesFissurePeau):
146 edgesFissurePeau[i] = edge
147 name = "edgeFissurePeau%d"%i
148 geomPublishInFather(initLog.debug, facePeau, edge, name)
149 for edge in edges: # on ajoute après les edges manquantes
150 if edge not in edgesFissurePeau:
151 edgesFissurePeau.append(edge)
153 for i, edge in enumerate(edges):
154 edgesFissurePeau.append(edge)
155 name = "edgeFissurePeau%d"%i
156 geomPublishInFather(initLog.debug, facePeau, edge, name)
158 return (endsEdgeFond, facesPipePeau, edgeRadFacePipePeau,
159 edgesCircPeau, verticesCircPeau, groupEdgesBordPeau,
160 bordsVifs, edgesFissurePeau, aretesVivesCoupees)