1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 from .geomsmesh import geompy
24 from .geomsmesh import geomPublish
25 from .geomsmesh import geomPublishInFather
28 from .substractSubShapes import substractSubShapes
30 def identifieEdgesPeau(edgesFissExtPipe,verticesPipePeau, facePeau, facesPeauSorted,
31 edgesPeauFondIn, fillingFaceExterne, aretesVivesC, aretesVivesCoupees):
33 identification précise des edges et disques des faces de peau selon index extremité fissure
37 facesPipePeau = [None for i in range(len(edgesFissExtPipe))]
38 endsEdgeFond = [None for i in range(len(edgesFissExtPipe))]
39 edgeRadFacePipePeau = [None for i in range(len(edgesFissExtPipe))]
44 if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
46 for face in facesPeauSorted[:-1]: # la ou les faces débouchantes, pas la grande face de peau
47 logging.debug("examen face debouchante circulaire")
48 for i,efep in enumerate(edgesFissExtPipe):
49 dist = geompy.MinDistance(face, efep)
50 logging.debug(" distance face circulaire edge %s", dist)
52 for ik, edpfi in enumerate(edgesPeauFondIn):
53 if geompy.MinDistance(face, edpfi) < 1e-3:
55 sharedVertices = geompy.GetSharedShapesMulti([face, edgesPeauFondIn[ik]], geompy.ShapeType["VERTEX"])
56 nameFace = "facePipePeau%d"%i
57 nameVert = "endEdgeFond%d"%i
58 nameEdge = "edgeRadFacePipePeau%d"%i
59 facesPipePeau[i] = face
60 endsEdgeFond[i] = sharedVertices[0]
61 geomPublish(initLog.debug, face, nameFace)
62 geomPublish(initLog.debug, sharedVertices[0], nameVert)
63 edgesFace = geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], True)
64 for edge in edgesFace:
65 if geompy.MinDistance(edge, sharedVertices[0]) < 1e-3:
66 edgeRadFacePipePeau[i] = edge
67 geomPublish(initLog.debug, edge, nameEdge)
74 # --- edges circulaires de la face de peau et points de jonction de la face externe de fissure
75 logging.debug("facesPipePeau: %s", facesPipePeau)
76 edgesCircPeau = [None for i in range(len(facesPipePeau))]
77 verticesCircPeau = [None for i in range(len(facesPipePeau))]
78 for i,fcirc in enumerate(facesPipePeau):
79 edges = geompy.GetSharedShapesMulti([facePeau, fcirc], geompy.ShapeType["EDGE"])
80 grpEdgesCirc = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
81 geompy.UnionList(grpEdgesCirc, edges)
82 edgesCircPeau[i] = grpEdgesCirc
84 geomPublishInFather(initLog.debug, facePeau, grpEdgesCirc, name)
85 edgesListees = edgesListees + edges
86 vertices = geompy.GetSharedShapesMulti([facePeau, fcirc], geompy.ShapeType["VERTEX"])
87 grpVertCircPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["VERTEX"])
88 geompy.UnionList(grpVertCircPeau, vertices)
89 verticesCircPeau[i] = grpVertCircPeau
90 name = "pointEdgeCirc%d"%i
91 geomPublishInFather(initLog.debug, facePeau, grpVertCircPeau, name)
93 pass # --- au moins une extrémité du pipe sur cette face de peau
95 # --- edges de bord de la face de peau
97 edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
99 for i, edge in enumerate(edgesFilling):
100 edgepeau = geompy.GetInPlace(facePeau, edge)
101 name = "edgepeau%d"%i
102 geomPublishInFather(initLog.debug, facePeau,edgepeau, name)
103 logging.debug("edgepeau %s", geompy.ShapeInfo(edgepeau))
104 if geompy.ShapeInfo(edgepeau)['EDGE'] > 1:
105 logging.debug(" EDGES multiples")
106 edgs = geompy.ExtractShapes(edgepeau, geompy.ShapeType["EDGE"], False)
110 logging.debug(" EDGE")
111 edgesBords.append(edgepeau)
112 edgesListees.append(edgepeau)
113 groupEdgesBordPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
114 geompy.UnionList(groupEdgesBordPeau, edgesBords)
116 if aretesVivesC is not None:
117 logging.debug("identification des bords vifs par GetInPlace")
118 bordsVifs = geompy.GetInPlace(facePeau, aretesVivesC)
119 if bordsVifs is None:
120 logging.debug("pas d'identification des bords vifs par GetInPlace: test par distance")
122 arvives = geompy.ExtractShapes(aretesVivesC, geompy.ShapeType["EDGE"], False)
123 edgs = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
125 vxs = geompy.ExtractShapes(ed, geompy.ShapeType["VERTEX"], False)
127 d = geompy.MinDistance(vxs[0], ar)
128 d += geompy.MinDistance(vxs[1], ar)
129 logging.debug("test distance bord face peau - arete vive: %s",d)
134 bordsVifs = geompy.CreateGroup(facePeau,geompy.ShapeType["EDGE"])
136 geompy.AddObject(bordsVifs, geompy.GetSubShapeID(facePeau, ed))
137 if bordsVifs is not None:
138 geomPublishInFather(initLog.debug, facePeau, bordsVifs, "bordsVifs")
139 groupEdgesBordPeau = geompy.CutGroups(groupEdgesBordPeau, bordsVifs)
141 if len(aretesVivesCoupees) > 0:
142 grpC = geompy.MakeCompound(aretesVivesCoupees)
143 grptmp = geompy.GetInPlace(facePeau, grpC)
144 if grptmp is not None:
145 grpnew = geompy.CutGroups(bordsVifs, grptmp) # ce qui est nouveau dans bordsVifs
148 if grpnew is not None:
149 edv = geompy.ExtractShapes(grpnew, geompy.ShapeType["EDGE"], False)
150 aretesVivesCoupees += edv
151 logging.debug("aretesVivesCoupees %s",aretesVivesCoupees)
152 geomPublishInFather(initLog.debug, facePeau, groupEdgesBordPeau , "EdgesBords")
154 # --- edges de la face de peau partagées avec la face de fissure
156 edgesPeau = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
157 edges = substractSubShapes(facePeau, edgesPeau, edgesListees)
158 edgesFissurePeau = []
159 if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
160 edgesFissurePeau = [None for i in range(len(verticesCircPeau))] # edges associés aux extrémités du pipe, en premier
162 for i, grpVert in enumerate(verticesCircPeau):
163 if (geompy.MinDistance(grpVert, edge) < 1.e-3) and (edge not in edgesFissurePeau):
164 edgesFissurePeau[i] = edge
165 name = "edgeFissurePeau%d"%i
166 geomPublishInFather(initLog.debug, facePeau, edge, name)
167 for edge in edges: # on ajoute après les edges manquantes
168 if edge not in edgesFissurePeau:
169 edgesFissurePeau.append(edge)
171 for i, edge in enumerate(edges):
172 edgesFissurePeau.append(edge)
173 name = "edgeFissurePeau%d"%i
174 geomPublishInFather(initLog.debug, facePeau, edge, name)
176 return (endsEdgeFond, facesPipePeau, edgeRadFacePipePeau,
177 edgesCircPeau, verticesCircPeau, groupEdgesBordPeau,
178 bordsVifs, edgesFissurePeau, aretesVivesCoupees)