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 .sortEdges import sortEdges
30 def construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks,
31 facesPipePeau, edgeRadFacePipePeau, nbsegCercle):
33 construction des listes d'edges radiales sur chaque extrémité débouchante
37 # --- listes de nappes radiales en filling à chaque extrémité débouchante
39 facesDebouchantes = [False, False]
40 idFacesDebouchantes = [-1, -1] # contiendra les indices des faces disque débouchantes (facesPipePeau)
42 for i, idisk in enumerate(idisklim):
44 logging.debug("extremité %s, indices disques interne %s, externe %s",i, idisk, numout)
46 if (idisk != 0) and (idisk != len(gptsdisks)-1): # si extrémité débouchante
47 for k in range(nbsegCercle):
49 iddeb = max(0, numout)
50 idfin = max(iddeb+3,idisk+1) # il faut 3 rayons pour faire un filling qui suive le fond de fissure
51 #logging.debug("extremité %s, indices retenus interne %s, externe %s",i, idfin, iddeb)
52 comp = geompy.MakeCompound(raydisks[k][iddeb:idfin])
53 name='compoundRay%d'%k
54 geomPublish(initLog.debug, comp, name)
56 idfin = min(len(gptsdisks), numout+1)
57 iddeb = min(idfin-3, idisk) # il faut 3 rayons pour faire un filling qui suive le fond de fissure
58 #logging.debug("extremité %s, indices retenus interne %s, externe %s",i, idfin, iddeb)
59 comp = geompy.MakeCompound(raydisks[k][iddeb:idfin])
60 name='compoundRay%d'%k
61 geomPublish(initLog.debug, comp, name)
62 nappe = geompy.MakeFilling(comp, 2, 5, 0.0001, 0.0001, 0, GEOM.FOM_Default)
65 geomPublish(initLog.debug, nappe, name)
66 facesDebouchantes[i] = True
67 listNappes.append(nappes)
69 # --- mise en correspondance avec les indices des faces disque débouchantes (facesPipePeau)
70 for i, nappes in enumerate(listNappes):
71 if facesDebouchantes[i]:
72 for k, face in enumerate(facesPipePeau):
73 #logging.debug('i, k, face, nappes[0] %s %s %s %s', i, k, face, nappes[0])
74 #geomPublish(initLog.debug, nappes[0], 'lanappe')
75 #geomPublish(initLog.debug, face, 'laface')
76 edge = geompy.MakeSection(face, nappes[0])
77 if geompy.NbShapes(edge, geompy.ShapeType["EDGE"]) > 0:
78 idFacesDebouchantes[i] = k
80 logging.debug("idFacesDebouchantes: %s", idFacesDebouchantes)
82 # --- construction des listes d'edges radiales sur chaque extrémité débouchante
84 for i, nappes in enumerate(listNappes):
85 ifd = idFacesDebouchantes[i] # indice de face débouchante (facesPipePeau)
89 face = facesPipePeau[ifd]
90 edges = [edgeRadFacePipePeau[ifd]]
91 for k, nappe in enumerate(nappes):
93 obj = geompy.MakeSection(face, nappes[k]) # normalement une edge, parfois un compound d'edges dont un tout petit
95 vs = geompy.ExtractShapes(obj, geompy.ShapeType["VERTEX"], False)
97 eds = geompy.ExtractShapes(obj, geompy.ShapeType["EDGE"], False)
98 [edsorted, minl,maxl] = sortEdges(eds)
101 maxl = geompy.BasicProperties(edge)[0]
102 if maxl < 0.01: # problème MakeSection
103 logging.info("problème MakeSection recherche edge radiale %s, longueur trop faible: %s, utilisation partition", k, maxl)
104 partNappeFace = geompy.MakePartition([face, nappes[k]], [] , [], [], geompy.ShapeType["FACE"], 0, [], 0)
105 edps= geompy.ExtractShapes(partNappeFace, geompy.ShapeType["EDGE"], False)
107 for ii, ed in enumerate(edps):
109 vxs = geompy.ExtractShapes(ed, geompy.ShapeType["VERTEX"], False)
110 distx = [geompy.MinDistance(vx, face) for vx in vxs]
111 distx += [geompy.MinDistance(vx, nappes[k]) for vx in vxs]
113 lgedge = geompy.BasicProperties(ed)[0]
114 logging.debug(" dmax %s, longueur edge %s",dmax, lgedge)
115 if dmax < 0.01 and lgedge > 0.01:
117 if (len(ednouv) > 0):
118 logging.debug(" edges issues de la partition: %s", ednouv)
119 for ii, ed in enumerate(ednouv):
120 geomPublish(initLog.debug, ed, "ednouv%d"%ii)
121 [edsorted, minl,maxl] = sortEdges(ednouv)
122 logging.debug(" longueur edge trouvée: %s", maxl)
125 logging.info("problème partition recherche edge radiale %s", k)
126 vxs = geompy.ExtractShapes(partNappeFace, geompy.ShapeType["VERTEX"], False)
128 for ii,vx in enumerate(vxs):
129 distx = geompy.MinDistance(vx, face)
130 distx += geompy.MinDistance(vx, nappes[k])
131 logging.debug("vertex distance: %s", distx)
134 logging.debug("nombre vertex candidats %s", len(vxnouv))
136 eds = [geompy.MakeEdge(vxnouv[j],vxnouv[(j+1)%len(vxnouv)]) for j in range(len(vxnouv))]
137 [edsorted2, minl,maxl] = sortEdges(eds)
139 logging.debug("lg edge: %s", maxl)
141 logging.debug("problème recherche edge radiale %s non résolu", k)
143 name = 'edgeEndPipe%d'%k
144 geomPublish(initLog.debug, edge, name)
145 listEdges.append(edges)
147 return (listEdges, idFacesDebouchantes)