Salome HOME
888eb2163ace36444b7e4ddbf2d5a95130aabb40
[modules/smesh.git] / src / Tools / blocFissure / gmu / orderEdgesFromWire.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 from .geomsmesh import geompy
5
6 # -----------------------------------------------------------------------------
7 # --- trouver les vertices intermediaires d'un wire
8
9 def orderEdgesFromWire(aWire):
10   """
11   fournit les edges ordonnees d'un wire selon ExtractShapes(,,False), 
12   et l'ordre des edges selon le sens de parcours (ordre des indices de la liste d'edges)
13   """
14   logging.info("start")
15   edges = geompy.ExtractShapes(aWire, geompy.ShapeType["EDGE"], False)
16   
17   idverts = {}
18   for i, edge in enumerate(edges):
19     verts = geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], True)
20 #    idverts[(i,0)] = verts[0]
21 #    idverts[(i,1)] = verts[1]
22     v0 = geompy.MakeVertexOnCurve(edge, 0.0)
23     dist = geompy.MinDistance(v0, verts[0])
24     if dist < 1.e-4:
25       idverts[(i,0)] = verts[0]
26       idverts[(i,1)] = verts[1]
27     else:
28       idverts[(i,0)] = verts[1]
29       idverts[(i,1)] = verts[0]
30      
31   idsubs = {}
32   for kv, sub in idverts.items():
33     subid = geompy.GetSubShapeID(aWire, sub)
34     if subid in list(idsubs.keys()):
35       idsubs[subid].append(kv)
36     else:
37       idsubs[subid] = [kv]
38   
39   debut = -1
40   fin = -1    
41   for k, kvs in idsubs.items():
42     if len(kvs) == 1: # une extremite
43       kv = kvs[0]
44       if kv[1] == 0:
45         debut = kv[0]
46       else:
47         fin = kv[0]
48   logging.debug("nombre d'edges: %s, indice edge debut: %s, fin: %s",len(edges), debut, fin)
49   if debut < 0:
50     logging.critical("les edges du wire ne sont pas orientees dans le meme sens: pas de debut trouve")
51     return edges, list(range(len(edges)))
52   
53   orderedList = [debut]
54   while len(orderedList) < len(edges):
55     bout = orderedList[-1]
56     vertex = idverts[(bout,1)]
57     for k, v in idverts.items():
58       if k[0] not in orderedList:
59         if geompy.MinDistance(vertex, v) < 1.e-4:
60           if k[1] == 0:
61             orderedList.append(k[0])
62             break
63           else:
64             logging.critical("les edges du wire ne sont pas orientees dans le meme sens: une edge a l'envers")
65             return edges, list(range(len(edges)))
66
67   logging.debug("liste des edges ordonnees selon le sens de parcours: %s", orderedList)
68   accessList = list(range(len(orderedList)))
69   for i,k in enumerate(orderedList):
70     accessList[k] = i
71   logging.info("position ordonnee des edges selon le sens de parcours: %s", accessList)
72   return edges, accessList