Commit d8df5d576e393f5c8db03d2308e5e6c2d2e3c49e
1 parent
77023ee3
Exists in
master
and in
68 other branches
FIX: Bug in CursorRectangle, if movimented cursor balanced
Showing
1 changed file
with
72 additions
and
109 deletions
Show diff stats
invesalius/data/cursor_actors.py
... | ... | @@ -110,7 +110,6 @@ class CursorCircle: |
110 | 110 | def SetOrientation(self, orientation): |
111 | 111 | self.orientation = orientation |
112 | 112 | proj = Project() |
113 | - | |
114 | 113 | orig_orien = proj.original_orientation |
115 | 114 | if (orig_orien == const.SAGITAL): |
116 | 115 | if orientation == "CORONAL": |
... | ... | @@ -151,7 +150,6 @@ class CursorCircle: |
151 | 150 | xs, ys, zs = self.spacing |
152 | 151 | proj = Project() |
153 | 152 | orig_orien = proj.original_orientation |
154 | - | |
155 | 153 | xy1 = lambda x,y: (px + x / xs, py+(y/ys), pz) |
156 | 154 | xy2 = lambda x,y: (px+(x/xs), py, pz+(y/zs)) |
157 | 155 | xy3 = lambda x,y: (px, py+(x/ys), pz+(y/zs)) |
... | ... | @@ -178,21 +176,8 @@ class CursorCircle: |
178 | 176 | # TODO: Optimize this!!!! |
179 | 177 | yield function_orientation(pixel_0, pixel_1) |
180 | 178 | |
181 | - | |
182 | -#------------------------------------------------------------------------------- | |
183 | -#------------------------------------------------------------------------------- | |
184 | -#------------------------------------------------------------------------------- | |
185 | -#------------------------------------------------------------------------------- | |
186 | -#------------------------------------------------------------------------------- | |
187 | -#------------------------------------------------------------------------------- | |
188 | -#------------------------------------------------------------------------------- | |
189 | -#------------------------------------------------------------------------------- | |
190 | -#------------------------------------------------------------------------------- | |
191 | -#------------------------------------------------------------------------------- | |
192 | -#------------------------------------------------------------------------------- | |
193 | -#------------------------------------------------------------------------------- | |
194 | -#------------------------------------------------------------------------------- | |
195 | -#------------------------------------------------------------------------------- | |
179 | + | |
180 | + | |
196 | 181 | |
197 | 182 | class CursorRectangle: |
198 | 183 | |
... | ... | @@ -208,51 +193,16 @@ class CursorRectangle: |
208 | 193 | self.position = (0 ,0) |
209 | 194 | self.orientation = "AXIAL" |
210 | 195 | self.spacing = (1, 1, 1) |
211 | - | |
212 | - self.mapper = vtk.vtkPolyDataMapper() | |
213 | - | |
214 | - self.retangle = vtk.vtkCubeSource() | |
215 | - self.actor = vtk.vtkActor() | |
216 | - | |
217 | - self.seeds_yi = vtk.vtkLineSource() | |
218 | - self.seeds_yf = vtk.vtkLineSource() | |
219 | - self.seeds_xi = vtk.vtkLineSource() | |
220 | - self.seeds_xf = vtk.vtkLineSource() | |
221 | - self.join_lines = vtk.vtkAppendPolyData() | |
222 | - | |
196 | + | |
223 | 197 | self.__build_actor() |
224 | 198 | self.__calculate_area_pixels() |
225 | 199 | |
226 | 200 | def SetSize(self, size): |
227 | - print "SetSize", size | |
228 | 201 | self.x_length = size |
229 | 202 | self.y_length = size |
230 | 203 | retangle = self.retangle |
231 | 204 | retangle.SetXLength(size) |
232 | - retangle.SetYLength(size) | |
233 | - | |
234 | - seeds_yi = self.seeds_yi | |
235 | - seeds_yi.SetPoint1(0, 0, 0) | |
236 | - seeds_yi.SetPoint2(0, self.y_length, 0) | |
237 | - | |
238 | - seeds_yf = self.seeds_yf | |
239 | - seeds_yf.SetPoint1(self.x_length, self.y_length, 0) | |
240 | - seeds_yf.SetPoint2(self.x_length, 0, 0) | |
241 | - | |
242 | - seeds_xi = self.seeds_xi | |
243 | - seeds_xi.SetPoint1(0, self.y_length, 0) | |
244 | - seeds_xi.SetPoint2(self.x_length, self.y_length, 0) | |
245 | - | |
246 | - seeds_xf = self.seeds_xf | |
247 | - seeds_xf.SetPoint1(0, 0, 0) | |
248 | - seeds_xf.SetPoint2(self.x_length, 0, 0) | |
249 | - | |
250 | - #join_lines = self.join_lines | |
251 | - #join_lines.AddInput(seeds_yi.GetOutput()) | |
252 | - #join_lines.AddInput(seeds_yf.GetOutput()) | |
253 | - #join_lines.AddInput(seeds_xi.GetOutput()) | |
254 | - #join_lines.AddInput(seeds_xf.GetOutput()) | |
255 | - | |
205 | + retangle.SetYLength(size) | |
256 | 206 | self.__calculate_area_pixels() |
257 | 207 | |
258 | 208 | def SetOrientation(self, orientation): |
... | ... | @@ -264,24 +214,29 @@ class CursorRectangle: |
264 | 214 | |
265 | 215 | def SetOrientation(self, orientation): |
266 | 216 | self.orientation = orientation |
267 | - | |
268 | - if orientation == "CORONAL": | |
269 | - self.actor.RotateX(90) | |
270 | - | |
271 | - if orientation == "SAGITAL": | |
272 | - self.actor.RotateY(90) | |
217 | + proj = Project() | |
218 | + orig_orien = proj.original_orientation | |
219 | + if (orig_orien == const.SAGITAL): | |
220 | + if orientation == "CORONAL": | |
221 | + self.actor.RotateY(90) | |
222 | + if orientation == "AXIAL": | |
223 | + self.actor.RotateX(90) | |
224 | + elif(orig_orien == const.CORONAL): | |
225 | + if orientation == "AXIAL": | |
226 | + self.actor.RotateX(270) | |
227 | + if orientation == "SAGITAL": | |
228 | + self.actor.RotateY(90) | |
229 | + else: | |
230 | + if orientation == "CORONAL": | |
231 | + self.actor.RotateX(90) | |
232 | + if orientation == "SAGITAL": | |
233 | + self.actor.RotateY(90) | |
273 | 234 | |
274 | 235 | def SetPosition(self, position): |
275 | 236 | x,y,z = position |
276 | - x_half = self.x_length / 2.0 | |
277 | - y_half = self.y_length / 2.0 | |
278 | - orientation_position_based = {"AXIAL" : (x - x_half,y - y_half, z), | |
279 | - "CORONAL" : (x - x_half, y, z - y_half), | |
280 | - "SAGITAL" : (x, y - y_half, z + x_half)} | |
281 | - xc,yc,zc = orientation_position_based[self.orientation] | |
282 | - self.position = (xc,yc,zc) | |
283 | - self.actor.SetPosition(xc,yc,zc) | |
284 | - | |
237 | + self.position = position | |
238 | + self.actor.SetPosition(x,y,z) | |
239 | + | |
285 | 240 | def SetEditionPosition(self, position): |
286 | 241 | self.edition_position = position |
287 | 242 | |
... | ... | @@ -298,40 +253,17 @@ class CursorRectangle: |
298 | 253 | """ |
299 | 254 | Function to plot the Retangle |
300 | 255 | """ |
301 | - retangle = self.retangle | |
302 | - retangle.SetXLength(self.x_length) | |
303 | - retangle.SetYLength(self.y_length) | |
304 | - | |
305 | - seeds_yi = self.seeds_yi | |
306 | - seeds_yi.SetPoint1(0, 0, 0) | |
307 | - seeds_yi.SetPoint2(0, self.y_length, 0) | |
308 | - | |
309 | - seeds_yf = self.seeds_yf | |
310 | - seeds_yf.SetPoint1(self.x_length, self.y_length, 0) | |
311 | - seeds_yf.SetPoint2(self.x_length, 0, 0) | |
312 | - | |
313 | - seeds_xi = self.seeds_xi | |
314 | - seeds_xi.SetPoint1(0, self.y_length, 0) | |
315 | - seeds_xi.SetPoint2(self.x_length, self.y_length, 0) | |
316 | - | |
317 | - seeds_xf = self.seeds_xf | |
318 | - seeds_xf.SetPoint1(0, 0, 0) | |
319 | - seeds_xf.SetPoint2(self.x_length, 0, 0) | |
256 | + mapper = vtk.vtkPolyDataMapper() | |
257 | + self.retangle = vtk.vtkCubeSource() | |
258 | + self.actor = actor = vtk.vtkActor() | |
320 | 259 | |
321 | - join_lines = self.join_lines | |
322 | - join_lines.AddInput(seeds_yi.GetOutput()) | |
323 | - join_lines.AddInput(seeds_yf.GetOutput()) | |
324 | - join_lines.AddInput(seeds_xi.GetOutput()) | |
325 | - join_lines.AddInput(seeds_xf.GetOutput()) | |
326 | - | |
327 | - mapper = self.mapper | |
328 | - mapper.SetScalarRange(0, 360) | |
260 | + prop = vtk.vtkProperty() | |
261 | + prop.SetRepresentationToWireframe() | |
262 | + self.actor.SetProperty(prop) | |
329 | 263 | |
330 | - actor = self.actor | |
331 | - | |
332 | - mapper.SetInput(join_lines.GetOutput()) | |
333 | - actor.SetPosition(self.position[0]-self.x_length/2, # if filled remov - | |
334 | - self.position[1]-self.y_length/2, 1) # idem | |
264 | + mapper.SetInput(self.retangle.GetOutput()) | |
265 | + actor.SetPosition(self.position[0] - self.x_length,\ | |
266 | + self.position[1] - self.y_length, 1) | |
335 | 267 | |
336 | 268 | actor.SetMapper(mapper) |
337 | 269 | actor.GetProperty().SetOpacity(self.opacity) |
... | ... | @@ -343,9 +275,27 @@ class CursorRectangle: |
343 | 275 | yc = 0 |
344 | 276 | z = 0 |
345 | 277 | xs, ys, zs = self.spacing |
346 | - orientation_based_spacing = {"AXIAL" : (xs, ys), | |
347 | - "SAGITAL" : (ys, zs), | |
348 | - "CORONAL" : (xs, zs)} | |
278 | + | |
279 | + proj = Project() | |
280 | + orig_orien = proj.original_orientation | |
281 | + | |
282 | + xy = (xs, ys) | |
283 | + yz = (ys, zs) | |
284 | + xz = (xs, zs) | |
285 | + | |
286 | + if (orig_orien == const.SAGITAL): | |
287 | + orientation_based_spacing = {"SAGITAL" : xy, | |
288 | + "AXIAL" : yz, | |
289 | + "CORONAL" : xz} | |
290 | + elif(orig_orien == const.CORONAL): | |
291 | + orientation_based_spacing = {"CORONAL" : xy, | |
292 | + "AXIAL" : xz, | |
293 | + "SAGITAL" : yz} | |
294 | + else: | |
295 | + orientation_based_spacing = {"AXIAL" : xy, | |
296 | + "SAGITAL" : yz, | |
297 | + "CORONAL" : xz} | |
298 | + | |
349 | 299 | xs, ys = orientation_based_spacing[self.orientation] |
350 | 300 | self.pixel_list = [] |
351 | 301 | for i in utils.frange(yc - self.y_length/2, yc + self.y_length/2, ys): |
... | ... | @@ -360,11 +310,24 @@ class CursorRectangle: |
360 | 310 | px, py, pz = self.edition_position |
361 | 311 | orient = self.orientation |
362 | 312 | xs, ys, zs = self.spacing |
363 | - abs_pixel = {"AXIAL": lambda x,y: (px + x / xs, py+(y/ys), pz), | |
364 | - "CORONAL": lambda x,y: (px+(x/xs), py, | |
365 | - pz+(y/zs)), | |
366 | - "SAGITAL": lambda x,y: (px, py+(x/ys), | |
367 | - pz+(y/zs))} | |
313 | + proj = Project() | |
314 | + orig_orien = proj.original_orientation | |
315 | + xy1 = lambda x,y: (px + x / xs, py+(y/ys), pz) | |
316 | + xy2 = lambda x,y: (px+(x/xs), py, pz+(y/zs)) | |
317 | + xy3 = lambda x,y: (px, py+(x/ys), pz+(y/zs)) | |
318 | + | |
319 | + if (orig_orien == const.SAGITAL): | |
320 | + abs_pixel = {"SAGITAL": xy1, | |
321 | + "AXIAL": xy2, | |
322 | + "CORONAL": xy3} | |
323 | + elif(orig_orien == const.CORONAL): | |
324 | + abs_pixel = {"CORONAL": xy1, | |
325 | + "SAGITAL": xy3, | |
326 | + "AXIAL": xy2} | |
327 | + else: | |
328 | + abs_pixel = {"AXIAL": xy1, | |
329 | + "CORONAL": xy2, | |
330 | + "SAGITAL": xy3} | |
368 | 331 | function_orientation = abs_pixel[orient] |
369 | 332 | for pixel_0,pixel_1 in self.pixel_list: |
370 | 333 | # The position of the pixels in this list is relative (based only on | ... | ... |