def read_vtk(self, file_name): """ Import a graph from a vtk file """ import numpy as np try: from mesh import Mesh except ImportError: raise ImportError("read_vtk requires pymesh") # initialize the vtk reader reader = Mesh() # read the vtk reader.ReadFromFileVtk(file_name) # add nodes to the graph for index, node in enumerate(reader.node_coord): self.graph.add_node(index, pos=reader.node_coord[index]) ''' chuncker Principe basé sur le stockage CSR ou CRS (Compressed Row Storage) dont voici une illustration : Soient six nœuds numérotes de 0 à 5 et quatre ́el ́ements form ́es par les nœuds (0, 2, 3) pour l' el ement 0, (1, 2, 4) pour l'element, (0, 1, 3, 4) pour l’ ́el ́e- ment 2 et (1, 5) pour l’ ́el ́ement 3. Deux tableaux sont utilis ́es, l’un pour stocker de fa ̧con contigu ̈e les listes de nœuds qui composent les ́el ́ements (table 1), l’autre pour indiquer la position, dans ce tableau, ou` commence chacune de ces listes (table 2). Ainsi, le chiffre 6 en position 2 dans le tableau p elem2node indique que le premier nœud de l’ ́el ́ement 2 se trouve en position 6 du tableau elem2node. La derni`ere valeur dans p elem2node correspond au nombre de cellules (la taille) du tableau elem2node. elem2node 0 | 2 | 3 | 1 | 2 | 4 | 0 | 1 | 3 | 4 | 1 | 5 1 2 3 4 5 6 7 8 9 10 11 12 ^ ^ ^ ^ ^ p_elem2node 0 | 3 | 6 | 10 | 12 1 2 3 4 4 ''' def chuncker(array, p_array): return [ array[p_array[i]:p_array[i + 1]] for i in range(len(p_array) - 1) ] # given a cell returns the edges implicitely defined in it def pairwise(seq): return [seq[i:i + 2] for i in range(len(seq) - 2)] + \ [[seq[0], seq[len(seq) - 1]]] datas = np.asarray( [data['pos'] for _, data in self.graph.nodes(data=True)]) def distance3D(u, v, datas): xi = datas[u][0] yi = datas[u][1] zi = datas[u][2] xj = datas[v][0] yj = datas[v][1] zj = datas[v][2] return math.sqrt((xi - xj) * (xi - xj) + (yi - yj) * (yi - yj) + (zi - zj) * (zi - zj)) # add edges to the graph for cell in chuncker(reader.elem2node, reader.p_elem2node): for u, v in pairwise(cell): if u not in self.graph[v]: self.graph.add_edge(u, v, weight=distance3D(u, v, datas))