Salome HOME
Copyright update 2020
[modules/smesh.git] / src / Tools / blocFissure / gmu / identifieEdgesPeau.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020  EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 import logging
22
23 from .geomsmesh import geompy
24 from .geomsmesh import geomPublish
25 from .geomsmesh import geomPublishInFather
26 from . import initLog
27
28 from .substractSubShapes import substractSubShapes
29
30 def identifieEdgesPeau(edgesFissExtPipe,verticesPipePeau, facePeau, facesPeauSorted,
31                        edgesPeauFondIn, fillingFaceExterne, aretesVivesC, aretesVivesCoupees):
32   """
33   identification précise des edges et disques des faces de peau selon index extremité fissure
34   """
35   logging.info('start')
36
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))]
40
41   edgesListees = []
42   edgesCircPeau = []
43   verticesCircPeau = []
44   if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
45
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)
51         if dist < 1e-3:
52           for ik, edpfi in enumerate(edgesPeauFondIn):
53             if geompy.MinDistance(face, edpfi) < 1e-3:
54               break
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)
68               break
69             pass
70           pass
71         pass
72       pass
73
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
83       name = "edgeCirc%d"%i
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)
92       pass
93     pass # --- au moins une extrémité du pipe sur cette face de peau
94
95   # --- edges de bord de la face de peau
96
97   edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
98   edgesBords = []
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)
107       edgesBords += edgs
108       edgesListees += edgs
109     else:
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)
115   bordsVifs = None
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")
121       edvifs = []
122       arvives = geompy.ExtractShapes(aretesVivesC, geompy.ShapeType["EDGE"], False)
123       edgs = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
124       for ed in edgs:
125         vxs = geompy.ExtractShapes(ed, geompy.ShapeType["VERTEX"], False)
126         for ar in arvives:
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)
130           if d < 0.001:
131             edvifs.append(ed)
132             break
133       if len(edvifs) >0:
134         bordsVifs = geompy.CreateGroup(facePeau,geompy.ShapeType["EDGE"])
135         for ed in edvifs:
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)
140     grptmp = None
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
146     else:
147       grpnew = 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")
153
154   # ---  edges de la face de peau partagées avec la face de fissure
155
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
161     for edge in edges:
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)
170   else:
171     for i, edge in enumerate(edges):
172       edgesFissurePeau.append(edge)
173       name = "edgeFissurePeau%d"%i
174       geomPublishInFather(initLog.debug, facePeau,  edge, name)
175
176   return (endsEdgeFond, facesPipePeau, edgeRadFacePipePeau,
177           edgesCircPeau, verticesCircPeau, groupEdgesBordPeau,
178           bordsVifs, edgesFissurePeau, aretesVivesCoupees)