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