Salome HOME
Merge branch 'V8_3_BR' into ngr/python3_dev
[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 geomPublish
7 from .geomsmesh import geomPublishInFather
8 from . import initLog
9
10 from .substractSubShapes import substractSubShapes
11
12 def identifieEdgesPeau(edgesFissExtPipe,verticesPipePeau, facePeau, facesPeauSorted,
13                        edgesPeauFondIn, fillingFaceExterne, aretesVivesC, aretesVivesCoupees):
14   """
15   identification précise des edges et disques des faces de peau selon index extremité fissure
16   """
17   logging.info('start')
18
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))]
22
23   edgesListees = []
24   edgesCircPeau = []
25   verticesCircPeau = []
26   if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
27
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)
33         if dist < 1e-3:
34           for ik, edpfi in enumerate(edgesPeauFondIn):
35             if geompy.MinDistance(face, edpfi) < 1e-3:
36               break
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)
50               break
51             pass
52           pass
53         pass
54       pass
55
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
65       name = "edgeCirc%d"%i
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)
74       pass
75     pass # --- au moins une extrémité du pipe sur cette face de peau
76
77   # --- edges de bord de la face de peau
78
79   edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
80   edgesBords = []
81   for i, edge in enumerate(edgesFilling):
82     edgepeau = geompy.GetInPlace(facePeau, edge)
83     name = "edgepeau%d"%i
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)
89       edgesBords += edgs
90       edgesListees += edgs
91     else:
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)
97   bordsVifs = None
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")
103       edvifs = []
104       arvives = geompy.ExtractShapes(aretesVivesC, geompy.ShapeType["EDGE"], False)
105       edgs = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
106       for ed in edgs:
107         vxs = geompy.ExtractShapes(ed, geompy.ShapeType["VERTEX"], False)
108         for ar in arvives:
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)
112           if d < 0.001:
113             edvifs.append(ed)
114             break
115       if len(edvifs) >0:
116         bordsVifs = geompy.CreateGroup(facePeau,geompy.ShapeType["EDGE"])
117         for ed in edvifs:
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)
122     grptmp = None
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
128     else:
129       grpnew = 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")
135
136   # ---  edges de la face de peau partagées avec la face de fissure
137
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
143     for edge in edges:
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)
152   else:
153     for i, edge in enumerate(edges):
154       edgesFissurePeau.append(edge)
155       name = "edgeFissurePeau%d"%i
156       geomPublishInFather(initLog.debug, facePeau,  edge, name)
157
158   return (endsEdgeFond, facesPipePeau, edgeRadFacePipePeau,
159           edgesCircPeau, verticesCircPeau, groupEdgesBordPeau,
160           bordsVifs, edgesFissurePeau, aretesVivesCoupees)