Salome HOME
Copyright update 2020
[modules/smesh.git] / src / Tools / blocFissure / gmu / orderEdgesFromWire.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 from .geomsmesh import geompy
23
24 # -----------------------------------------------------------------------------
25 # --- trouver les vertices intermediaires d'un wire
26
27 def orderEdgesFromWire(aWire):
28   """
29   fournit les edges ordonnées d'un wire selon ExtractShapes(,,False), 
30   et l'ordre des edges selon le sens de parcours (ordre des indices de la liste d'edges)
31   """
32   logging.info("start")
33   edges = geompy.ExtractShapes(aWire, geompy.ShapeType["EDGE"], False)
34   
35   idverts = {}
36   for i, edge in enumerate(edges):
37     verts = geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], True)
38 #    idverts[(i,0)] = verts[0]
39 #    idverts[(i,1)] = verts[1]
40     v0 = geompy.MakeVertexOnCurve(edge, 0.0)
41     dist = geompy.MinDistance(v0, verts[0])
42     if dist < 1.e-4:
43       idverts[(i,0)] = verts[0]
44       idverts[(i,1)] = verts[1]
45     else:
46       idverts[(i,0)] = verts[1]
47       idverts[(i,1)] = verts[0]
48      
49   idsubs = {}
50   for kv, sub in idverts.items():
51     subid = geompy.GetSubShapeID(aWire, sub)
52     if subid in list(idsubs.keys()):
53       idsubs[subid].append(kv)
54     else:
55       idsubs[subid] = [kv]
56   
57   debut = -1
58   fin = -1    
59   for k, kvs in idsubs.items():
60     if len(kvs) == 1: # une extremité
61       kv = kvs[0]
62       if kv[1] == 0:
63         debut = kv[0]
64       else:
65         fin = kv[0]
66   logging.debug("nombre d'edges: %s, indice edge début: %s, fin: %s",len(edges), debut, fin)
67   if debut < 0:
68     logging.critical("les edges du wire ne sont pas orientées dans le même sens: pas de début trouvé")
69     return edges, list(range(len(edges)))
70   
71   orderedList = [debut]
72   while len(orderedList) < len(edges):
73     bout = orderedList[-1]
74     vertex = idverts[(bout,1)]
75     for k, v in idverts.items():
76       if k[0] not in orderedList:
77         if geompy.MinDistance(vertex, v) < 1.e-4:
78           if k[1] == 0:
79             orderedList.append(k[0])
80             break
81           else:
82             logging.critical("les edges du wire ne sont pas orientées dans le même sens: une edge à l'envers")
83             return edges, list(range(len(edges)))
84
85   logging.debug("liste des edges ordonnées selon le sens de parcours: %s", orderedList)
86   accessList = list(range(len(orderedList)))
87   for i,k in enumerate(orderedList):
88     accessList[k] = i
89   logging.info("position ordonnée des edges selon le sens de parcours: %s", accessList)
90   return edges, accessList