Commit 81fb1e0216dd1990d27c67d8b60f8e93409d18ea
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 | ... | ... |