Commit 81fb1e0216dd1990d27c67d8b60f8e93409d18ea

Authored by Pavel Govyadinov
1 parent 6eb102f5

rewrote the selection of individual fibers

Showing 1 changed file with 75 additions and 18 deletions   Show diff stats
GraphCanvas.py
... ... @@ -23,6 +23,37 @@ from subgraph_shaders import vert_s, frag_s, vs_s, fs_s
23 23  
24 24 DEBUG = False
25 25  
  26 +#class storing the path. a vertex in the path is defined as a vertex idx
  27 +#and a list of all vertices required to reach the next point in the path
  28 +class path_point:
  29 + #Init an empty vertex with no path
  30 + def __init__(self, idx):
  31 + self.idx = idx
  32 + self.v_path = []
  33 + self.e_path = []
  34 +
  35 + #Remove all future path vertices attached to this vertex
  36 + def clear_path(self):
  37 + self.v_path = []
  38 + self.e_path = []
  39 +
  40 + # == comparison operator
  41 + def __eq__(self, other):
  42 + if self.idx == other.idx:
  43 + return True
  44 + else:
  45 + return False
  46 + # != comparison operator
  47 + def __ne__(self, other):
  48 + if self.idx != other.idx:
  49 + return True
  50 + else:
  51 + return False
  52 +
  53 + def __str__(self):
  54 + print("PathPoint[", self.idx, "], Chain = [", self.v_path, "]")
  55 +
  56 +
26 57 #The graph canvas class that
27 58 class GraphCanvas(scene.SceneCanvas):
28 59  
... ... @@ -1096,19 +1127,31 @@ class GraphCanvas(scene.SceneCanvas):
1096 1127 Generates paths our of consecutive paths out of the selected vertices.
1097 1128 """
1098 1129 def on_mouse_double_click(self, event):
  1130 +
  1131 + #Method to update the vertex buffer of the nodes in the graph view
1099 1132 def update_vbo(self):
1100 1133 self.vbo = gloo.VertexBuffer(self.data)
1101 1134 self.program.bind(self.vbo)
1102 1135 self.update()
1103 1136  
  1137 + #updates the path structure of the class
  1138 + #source and target are of type "source" defined in this class.
1104 1139 def add_to_path(self, source, target):
1105   - vl, el = nwt.gt.graph_tool.topology.shortest_path(self.G, self.G.vertex(source), self.G.vertex(target), weights=self.G.edge_properties["av_radius"])
1106   - for v in vl:
1107   - if(int(v) not in self.path):
1108   - self.G.vertex_properties["selection"][v] = 2.0
1109   - self.data['a_selection'][int(v)] = 2.0
1110   - if(int(v) not in self.full_path):
1111   - self.full_path.append(int(v))
  1140 + vl, el = nwt.gt.graph_tool.topology.shortest_path(self.G, self.G.vertex(source.idx), self.G.vertex(target.idx), weights=self.G.edge_properties["av_radius"])
  1141 + for v in range(1, len(vl)-1):
  1142 + if (self.G.vertex_properties["selection"][vl[v]] != 1.0):
  1143 + self.G.vertex_properties["selection"][vl[v]] = 2.0
  1144 + self.data['a_selection'][int(vl[v])] = 2.0
  1145 + source.v_path.append(int(vl[v]))
  1146 + for e in el:
  1147 + source.e_path.append(e)
  1148 +
  1149 +
  1150 + def remove_from_path(self, source):
  1151 + for v in source.v_path:
  1152 + self.G.vertex_properties["selection"][self.G.vertex(v)] = 0.0
  1153 + self.data['a_selection'][v] = 0.0
  1154 + source.clear_path()
1112 1155  
1113 1156 if (event.button == 1):
1114 1157 if(self.view[0][0] > 0.0010):
... ... @@ -1119,32 +1162,46 @@ class GraphCanvas(scene.SceneCanvas):
1119 1162 #if it is, select that node and turn the pathing variable on.
1120 1163 self.G.vertex_properties["selection"][self.G.vertex(c_id)] = 1.0
1121 1164 self.pathing = True
1122   - if(c_id not in self.path):
1123   - self.path.append(c_id)
1124   - self.data['a_selection'][c_id] = 1.0
1125   - update_vbo(self)
  1165 + self.path.append(path_point(c_id))
  1166 + self.data['a_selection'][c_id] = 1.0
  1167 + update_vbo(self)
1126 1168 print("I turned on the first node")
1127 1169 else:
  1170 + #If the node is selected already, unselect it and remove from path the last occurance in the path
1128 1171 if(self.G.vertex_properties["selection"][self.G.vertex(c_id)] == 1.0):
1129 1172 self.G.vertex_properties["selection"][self.G.vertex(c_id)] = 0.0
1130   - self.path.remove(c_id)
1131 1173 self.data['a_selection'][c_id] = 0.0
1132   - update_vbo(self)
  1174 + s_id = self.path.index(path_point(c_id))
  1175 + if(s_id == 0):
  1176 + remove_from_path(self, self.path[s_id])
  1177 + else:
  1178 + remove_from_path(self, self.path[s_id-1])
  1179 + remove_from_path(self, self.path[s_id])
  1180 + self.path.remove(path_point(c_id))
  1181 + #self.data['a_selection'][c_id] = 0.0
  1182 + #update_vbo(self)
1133 1183 print("I turned off a node")
1134 1184 elif(self.G.vertex_properties["selection"][self.G.vertex(c_id)] == 0.0):
1135 1185 self.G.vertex_properties["selection"][self.G.vertex(c_id)] = 1.0
1136   - if(c_id not in self.path):
1137   - self.path.append(c_id)
  1186 + #if the source is not in the path add it
  1187 + if(path_point(c_id) not in self.path):
  1188 + self.path.append(path_point(c_id))
  1189 + self.G.vertex_properties["selection"][self.G.vertex(c_id)] = 1.0
  1190 + self.data['a_selection'][c_id] = 1.0
  1191 + #if the source is not LAST in the path, add it.
  1192 + elif(self.path[len(self.path)-1] != path_point(c_id)):
  1193 + self.path.append(path_point(c_id))
  1194 + self.G.vertex_properties["selection"][self.G.vertex(c_id)] = 1.0
1138 1195 self.data['a_selection'][c_id] = 1.0
1139   - update_vbo(self)
1140 1196 print("I turned on a node")
1141   - if(len(self.path) >= 2):
  1197 + if(len(self.path) >= 1):
1142 1198 for i in range(len(self.path)-1):
1143 1199 add_to_path(self, self.path[i], self.path[i+1])
1144   - update_vbo(self)
  1200 + update_vbo(self)
1145 1201 #THIS IS WHERE I LEFT IT OFF.
1146 1202 if(np.sum(self.G.vertex_properties["selection"].get_array()) == 0):
1147 1203 self.pathing = False
  1204 + update_vbo(self)
1148 1205  
1149 1206  
1150 1207  
... ...