Salome HOME
Merge branch V7_3_1_BR
[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 ordonnées 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.iteritems():
33     subid = geompy.GetSubShapeID(aWire, sub)
34     if subid in 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.iteritems():
42     if len(kvs) == 1: # une extremité
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 début: %s, fin: %s",len(edges), debut, fin)
49   if debut < 0:
50     logging.critical("les edges du wire ne sont pas orientées dans le même sens: pas de début trouvé")
51     return edges, 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.iteritems():
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 orientées dans le même sens: une edge à l'envers")
65             return edges, range(len(edges))
66
67   logging.debug("liste des edges ordonnées selon le sens de parcours: %s", orderedList)
68   accessList = range(len(orderedList))
69   for i,k in enumerate(orderedList):
70     accessList[k] = i
71   logging.info("position ordonnée des edges selon le sens de parcours: %s", accessList)
72   return edges, accessList