Commit b7a728d9f0c667ecd7584c8f8927074c0d165bf3
1 parent
7b7b807a
Exists in
master
and in
67 other branches
Some cleaning in code
Showing
2 changed files
with
23 additions
and
314 deletions
Show diff stats
invesalius/data/slice_.py
| ... | ... | @@ -24,12 +24,13 @@ import wx.lib.pubsub as ps |
| 24 | 24 | |
| 25 | 25 | import constants as const |
| 26 | 26 | import imagedata_utils as iu |
| 27 | -from mask import Mask | |
| 28 | 27 | import style as st |
| 29 | -from project import Project | |
| 30 | 28 | import session as ses |
| 31 | 29 | import utils |
| 32 | 30 | |
| 31 | +from mask import Mask | |
| 32 | +from project import Project | |
| 33 | + | |
| 33 | 34 | class SliceBuffer(object): |
| 34 | 35 | """ |
| 35 | 36 | This class is used as buffer that mantains the vtkImageData and numpy array |
| ... | ... | @@ -169,14 +170,12 @@ class Slice(object): |
| 169 | 170 | edition_threshold_range = original_mask.edition_threshold_range, |
| 170 | 171 | edited_points = original_mask.edited_points) |
| 171 | 172 | |
| 172 | - | |
| 173 | 173 | def OnEnableStyle(self, pubsub_evt): |
| 174 | 174 | state = pubsub_evt.data |
| 175 | 175 | if (state in const.SLICE_STYLES): |
| 176 | 176 | new_state = self.interaction_style.AddState(state) |
| 177 | 177 | ps.Publisher().sendMessage('Set slice interaction style', new_state) |
| 178 | 178 | |
| 179 | - | |
| 180 | 179 | def OnDisableStyle(self, pubsub_evt): |
| 181 | 180 | state = pubsub_evt.data |
| 182 | 181 | if (state in const.SLICE_STYLES): |
| ... | ... | @@ -186,7 +185,6 @@ class Slice(object): |
| 186 | 185 | if (state == const.SLICE_STATE_EDITOR): |
| 187 | 186 | ps.Publisher().sendMessage('Set interactor default cursor') |
| 188 | 187 | |
| 189 | - | |
| 190 | 188 | def OnCloseProject(self, pubsub_evt): |
| 191 | 189 | self.CloseProject() |
| 192 | 190 | |
| ... | ... | @@ -198,7 +196,6 @@ class Slice(object): |
| 198 | 196 | #self.blend_filter = None |
| 199 | 197 | #self.num_gradient = 0 |
| 200 | 198 | |
| 201 | - | |
| 202 | 199 | def __set_current_mask_threshold_limits(self, pubsub_evt): |
| 203 | 200 | thresh_min = pubsub_evt.data[0] |
| 204 | 201 | thresh_max = pubsub_evt.data[1] |
| ... | ... | @@ -206,14 +203,9 @@ class Slice(object): |
| 206 | 203 | index = self.current_mask.index |
| 207 | 204 | self.SetMaskEditionThreshold(index, (thresh_min, thresh_max)) |
| 208 | 205 | |
| 209 | - | |
| 210 | - | |
| 211 | 206 | #--------------------------------------------------------------------------- |
| 212 | 207 | # BEGIN PUBSUB_EVT METHODS |
| 213 | 208 | #--------------------------------------------------------------------------- |
| 214 | - #def __get_mask_data_for_surface_creation(self, pubsub_evt): | |
| 215 | - # mask_index = pubsub_evt.data | |
| 216 | - # CreateSurfaceFromIndex | |
| 217 | 209 | |
| 218 | 210 | def __add_mask(self, pubsub_evt): |
| 219 | 211 | mask_name = pubsub_evt.data |
| ... | ... | @@ -242,9 +234,6 @@ class Slice(object): |
| 242 | 234 | def __set_current_mask_threshold(self, evt_pubsub): |
| 243 | 235 | threshold_range = evt_pubsub.data |
| 244 | 236 | index = self.current_mask.index |
| 245 | - #self.SetMaskThreshold(index, threshold_range) | |
| 246 | - #Clear edited points | |
| 247 | - self.current_mask.edited_points = {} | |
| 248 | 237 | self.num_gradient += 1 |
| 249 | 238 | self.current_mask.matrix[:] = 0 |
| 250 | 239 | |
| ... | ... | @@ -256,8 +245,6 @@ class Slice(object): |
| 256 | 245 | self.SetMaskThreshold(index, threshold_range, |
| 257 | 246 | self.buffer_slices[orientation].index, |
| 258 | 247 | orientation) |
| 259 | - #Clear edited points | |
| 260 | - self.current_mask.edited_points = {} | |
| 261 | 248 | self.num_gradient += 1 |
| 262 | 249 | |
| 263 | 250 | ps.Publisher().sendMessage('Reload actual slice') |
| ... | ... | @@ -282,71 +269,8 @@ class Slice(object): |
| 282 | 269 | if self.current_mask: |
| 283 | 270 | index, value = pubsub_evt.data |
| 284 | 271 | self.ShowMask(index, value) |
| 285 | - #--------------------------------------------------------------------------- | |
| 286 | - def erase_mask_pixel(self, index, position, radius, orientation): | |
| 287 | - mask = self.buffer_slices[orientation].mask | |
| 288 | - image = self.buffer_slices[orientation].image | |
| 289 | - | |
| 290 | - if hasattr(position, '__iter__'): | |
| 291 | - py, px = position | |
| 292 | - if orientation == 'AXIAL': | |
| 293 | - sx = self.spacing[0] | |
| 294 | - sy = self.spacing[1] | |
| 295 | - elif orientation == 'CORONAL': | |
| 296 | - sx = self.spacing[0] | |
| 297 | - sy = self.spacing[2] | |
| 298 | - elif orientation == 'SAGITAL': | |
| 299 | - sx = self.spacing[1] | |
| 300 | - sy = self.spacing[2] | |
| 301 | - | |
| 302 | - else: | |
| 303 | - if orientation == 'AXIAL': | |
| 304 | - sx = self.spacing[0] | |
| 305 | - sy = self.spacing[1] | |
| 306 | - py = position / mask.shape[1] | |
| 307 | - px = position % mask.shape[1] | |
| 308 | - elif orientation == 'CORONAL': | |
| 309 | - sx = self.spacing[0] | |
| 310 | - sy = self.spacing[2] | |
| 311 | - py = position / mask.shape[1] | |
| 312 | - px = position % mask.shape[1] | |
| 313 | - elif orientation == 'SAGITAL': | |
| 314 | - sx = self.spacing[1] | |
| 315 | - sy = self.spacing[2] | |
| 316 | - py = position / mask.shape[1] | |
| 317 | - px = position % mask.shape[1] | |
| 318 | - | |
| 319 | - xi = px - math.ceil(radius/sx) | |
| 320 | - xf = px + math.ceil(radius/sx) | |
| 321 | - yi = py - math.ceil(radius/sy) | |
| 322 | - yf = py + math.ceil(radius/sy) | |
| 323 | - | |
| 324 | - if yi < 0: | |
| 325 | - index = index[abs(yi):,:] | |
| 326 | - yi = 0 | |
| 327 | - if yf > image.shape[0]: | |
| 328 | - index = index[:index.shape[0]-(yf-image.shape[0]), :] | |
| 329 | - yf = image.shape[0] | |
| 330 | - | |
| 331 | - if xi < 0: | |
| 332 | - index = index[:,abs(xi):] | |
| 333 | - xi = 0 | |
| 334 | - if xf > image.shape[1]: | |
| 335 | - index = index[:,:index.shape[1]-(xf-image.shape[1])] | |
| 336 | - xf = image.shape[1] | |
| 337 | - | |
| 338 | - # Verifying if the points is over the image array. | |
| 339 | - if (not 0 < xi < image.shape[1] and not 0 < xf < image.shape[1]) or \ | |
| 340 | - (not 0 < yi < image.shape[0] and not 0 < yf < image.shape[0]): | |
| 341 | - return | |
| 342 | - | |
| 343 | - roi_m = mask[yi:yf,xi:xf] | |
| 344 | - roi_i = image[yi:yf, xi:xf] | |
| 345 | - | |
| 346 | - roi_m[index] = 1 | |
| 347 | - self.buffer_slices[orientation].discard_vtk_mask() | |
| 348 | 272 | |
| 349 | - def edit_mask_pixel(self, index, position, radius, orientation): | |
| 273 | + def edit_mask_pixel(self, operation, index, position, radius, orientation): | |
| 350 | 274 | mask = self.buffer_slices[orientation].mask |
| 351 | 275 | image = self.buffer_slices[orientation].image |
| 352 | 276 | thresh_min, thresh_max = self.current_mask.edition_threshold_range |
| ... | ... | @@ -407,101 +331,17 @@ class Slice(object): |
| 407 | 331 | roi_m = mask[yi:yf,xi:xf] |
| 408 | 332 | roi_i = image[yi:yf, xi:xf] |
| 409 | 333 | |
| 410 | - # It's a trick to make points between threshold gets value 254 | |
| 411 | - # (1 * 253 + 1) and out ones gets value 1 (0 * 253 + 1). | |
| 412 | - roi_m[index] = (((roi_i[index] >= thresh_min) | |
| 413 | - & (roi_i[index] <= thresh_max)) * 253) + 1 | |
| 334 | + if operation == const.BRUSH_THRESH: | |
| 335 | + # It's a trick to make points between threshold gets value 254 | |
| 336 | + # (1 * 253 + 1) and out ones gets value 1 (0 * 253 + 1). | |
| 337 | + roi_m[index] = (((roi_i[index] >= thresh_min) | |
| 338 | + & (roi_i[index] <= thresh_max)) * 253) + 1 | |
| 339 | + elif operation == const.BRUSH_DRAW: | |
| 340 | + roi_m[index] = 254 | |
| 341 | + elif operation == const.BRUSH_ERASE: | |
| 342 | + roi_m[index] = 1 | |
| 414 | 343 | self.buffer_slices[orientation].discard_vtk_mask() |
| 415 | 344 | |
| 416 | - def add_mask_pixel(self, index, position, radius, orientation): | |
| 417 | - #mask = self.buffer_slices[orientation].mask | |
| 418 | - #if orientation == 'AXIAL': | |
| 419 | - #sx = self.spacing[0] | |
| 420 | - #sy = self.spacing[1] | |
| 421 | - #py = position / mask.shape[1] | |
| 422 | - #px = position % mask.shape[1] | |
| 423 | - #elif orientation == 'CORONAL': | |
| 424 | - #sx = self.spacing[0] | |
| 425 | - #sy = self.spacing[2] | |
| 426 | - #py = position / mask.shape[1] | |
| 427 | - #px = position % mask.shape[1] | |
| 428 | - #elif orientation == 'SAGITAL': | |
| 429 | - #sx = self.spacing[1] | |
| 430 | - #sy = self.spacing[2] | |
| 431 | - #py = position / mask.shape[1] | |
| 432 | - #px = position % mask.shape[1] | |
| 433 | - | |
| 434 | - #print "->px, py", px, py | |
| 435 | - #print "->position", position | |
| 436 | - #print '->shape', mask.shape | |
| 437 | - | |
| 438 | - #mask[py - radius / sy: py + radius / sy, | |
| 439 | - #px - radius / sx: px + radius / sx] = 255 | |
| 440 | - #self.buffer_slices[orientation].discard_vtk_mask() | |
| 441 | - mask = self.buffer_slices[orientation].mask | |
| 442 | - image = self.buffer_slices[orientation].image | |
| 443 | - | |
| 444 | - if hasattr(position, '__iter__'): | |
| 445 | - py, px = position | |
| 446 | - if orientation == 'AXIAL': | |
| 447 | - sx = self.spacing[0] | |
| 448 | - sy = self.spacing[1] | |
| 449 | - elif orientation == 'CORONAL': | |
| 450 | - sx = self.spacing[0] | |
| 451 | - sy = self.spacing[2] | |
| 452 | - elif orientation == 'SAGITAL': | |
| 453 | - sx = self.spacing[1] | |
| 454 | - sy = self.spacing[2] | |
| 455 | - | |
| 456 | - else: | |
| 457 | - if orientation == 'AXIAL': | |
| 458 | - sx = self.spacing[0] | |
| 459 | - sy = self.spacing[1] | |
| 460 | - py = position / mask.shape[1] | |
| 461 | - px = position % mask.shape[1] | |
| 462 | - elif orientation == 'CORONAL': | |
| 463 | - sx = self.spacing[0] | |
| 464 | - sy = self.spacing[2] | |
| 465 | - py = position / mask.shape[1] | |
| 466 | - px = position % mask.shape[1] | |
| 467 | - elif orientation == 'SAGITAL': | |
| 468 | - sx = self.spacing[1] | |
| 469 | - sy = self.spacing[2] | |
| 470 | - py = position / mask.shape[1] | |
| 471 | - px = position % mask.shape[1] | |
| 472 | - | |
| 473 | - xi = px - math.ceil(radius/sx) | |
| 474 | - xf = px + math.ceil(radius/sx) | |
| 475 | - yi = py - math.ceil(radius/sy) | |
| 476 | - yf = py + math.ceil(radius/sy) | |
| 477 | - | |
| 478 | - if yi < 0: | |
| 479 | - index = index[abs(yi):,:] | |
| 480 | - yi = 0 | |
| 481 | - if yf > image.shape[0]: | |
| 482 | - index = index[:index.shape[0]-(yf-image.shape[0]), :] | |
| 483 | - yf = image.shape[0] | |
| 484 | - | |
| 485 | - if xi < 0: | |
| 486 | - index = index[:,abs(xi):] | |
| 487 | - xi = 0 | |
| 488 | - if xf > image.shape[1]: | |
| 489 | - index = index[:,:index.shape[1]-(xf-image.shape[1])] | |
| 490 | - xf = image.shape[1] | |
| 491 | - | |
| 492 | - # Verifying if the points is over the image array. | |
| 493 | - if (not 0 < xi < image.shape[1] and not 0 < xf < image.shape[1]) or \ | |
| 494 | - (not 0 < yi < image.shape[0] and not 0 < yf < image.shape[0]): | |
| 495 | - return | |
| 496 | - | |
| 497 | - roi_m = mask[yi:yf,xi:xf] | |
| 498 | - roi_i = image[yi:yf, xi:xf] | |
| 499 | - | |
| 500 | - roi_m[index] = 254 | |
| 501 | - self.buffer_slices[orientation].discard_vtk_mask() | |
| 502 | - #--------------------------------------------------------------------------- | |
| 503 | - # END PUBSUB_EVT METHODS | |
| 504 | - #--------------------------------------------------------------------------- | |
| 505 | 345 | |
| 506 | 346 | def GetSlices(self, orientation, slice_number): |
| 507 | 347 | if self.buffer_slices[orientation].index == slice_number: |
| ... | ... | @@ -566,7 +406,6 @@ class Slice(object): |
| 566 | 406 | """ |
| 567 | 407 | It gets the from actual mask the given slice from given orientation |
| 568 | 408 | """ |
| 569 | - | |
| 570 | 409 | # It's necessary because the first position for each dimension from |
| 571 | 410 | # mask matrix is used as flags to control if the mask in the |
| 572 | 411 | # slice_number position has been generated. |
| ... | ... | @@ -616,10 +455,6 @@ class Slice(object): |
| 616 | 455 | proj.mask_dict[index].colour = colour |
| 617 | 456 | |
| 618 | 457 | (r,g,b) = colour |
| 619 | - #scalar_range = int(self.imagedata.GetScalarRange()[1]) | |
| 620 | - #self.lut_mask.SetTableValue(0, 0, 0, 0, 0.0) | |
| 621 | - #self.lut_mask.SetTableValue(scalar_range - 1, r, g, b, 1.0) | |
| 622 | - | |
| 623 | 458 | colour_wx = [r*255, g*255, b*255] |
| 624 | 459 | ps.Publisher().sendMessage('Change mask colour in notebook', |
| 625 | 460 | (index, (r,g,b))) |
| ... | ... | @@ -633,7 +468,6 @@ class Slice(object): |
| 633 | 468 | session = ses.Session() |
| 634 | 469 | session.ChangeProject() |
| 635 | 470 | |
| 636 | - | |
| 637 | 471 | def SetMaskName(self, index, name): |
| 638 | 472 | "Rename a mask given its index and the new name" |
| 639 | 473 | proj = Project() |
| ... | ... | @@ -642,7 +476,6 @@ class Slice(object): |
| 642 | 476 | session = ses.Session() |
| 643 | 477 | session.ChangeProject() |
| 644 | 478 | |
| 645 | - | |
| 646 | 479 | def SetMaskEditionThreshold(self, index, threshold_range): |
| 647 | 480 | "Set threshold bounds to be used while editing slice" |
| 648 | 481 | proj = Project() |
| ... | ... | @@ -660,22 +493,7 @@ class Slice(object): |
| 660 | 493 | thresh_min, thresh_max = threshold_range |
| 661 | 494 | |
| 662 | 495 | if self.current_mask.index == index: |
| 663 | - ## Update pipeline (this must be here, so pipeline is not broken) | |
| 664 | - #self.img_thresh_mask.SetInput(self.imagedata) | |
| 665 | - #self.img_thresh_mask.ThresholdBetween(float(thresh_min), | |
| 666 | - #float(thresh_max)) | |
| 667 | - #self.img_thresh_mask.Update() | |
| 668 | - | |
| 669 | - ## Create imagedata copy so the pipeline is not broken | |
| 670 | - #imagedata = self.img_thresh_mask.GetOutput() | |
| 671 | - #self.current_mask.imagedata.DeepCopy(imagedata) | |
| 672 | - #self.current_mask.threshold_range = threshold_range | |
| 673 | - | |
| 674 | - ## Update pipeline (this must be here, so pipeline is not broken) | |
| 675 | - #self.img_colours_mask.SetInput(self.current_mask.imagedata) | |
| 676 | - | |
| 677 | 496 | # TODO: find out a better way to do threshold |
| 678 | - | |
| 679 | 497 | if slice_number is None: |
| 680 | 498 | for n, slice_ in enumerate(self.matrix): |
| 681 | 499 | m = numpy.ones(slice_.shape, self.current_mask.matrix.dtype) |
| ... | ... | @@ -702,7 +520,6 @@ class Slice(object): |
| 702 | 520 | proj = Project() |
| 703 | 521 | proj.mask_dict[self.current_mask.index].threshold_range = threshold_range |
| 704 | 522 | |
| 705 | - | |
| 706 | 523 | def ShowMask(self, index, value): |
| 707 | 524 | "Show a mask given its index and 'show' value (0: hide, other: show)" |
| 708 | 525 | proj = Project() |
| ... | ... | @@ -713,45 +530,7 @@ class Slice(object): |
| 713 | 530 | buffer_.discard_mask() |
| 714 | 531 | ps.Publisher().sendMessage('Reload actual slice') |
| 715 | 532 | #--------------------------------------------------------------------------- |
| 716 | - def ErasePixel(self, position): | |
| 717 | - "Delete pixel, based on x, y and z position coordinates." | |
| 718 | - x, y, z = round(position[0],0), round(position[1],0),position[2] | |
| 719 | - colour = self.imagedata.GetScalarRange()[0] | |
| 720 | - imagedata = self.current_mask.imagedata | |
| 721 | - imagedata.SetScalarComponentFromDouble(x, y, z, 0, colour) | |
| 722 | - self.current_mask.edited_points[(x, y, z)] = colour | |
| 723 | 533 | |
| 724 | - session = ses.Session() | |
| 725 | - session.ChangeProject() | |
| 726 | - | |
| 727 | - | |
| 728 | - def DrawPixel(self, position, colour=None): | |
| 729 | - "Draw pixel, based on x, y and z position coordinates." | |
| 730 | - x, y, z = round(position[0],0), round(position[1],0),position[2] | |
| 731 | - colour = self.imagedata.GetScalarRange()[1] | |
| 732 | - imagedata = self.current_mask.imagedata | |
| 733 | - imagedata.SetScalarComponentFromDouble(x, y, z, 0, colour) | |
| 734 | - self.current_mask.edited_points[(x, y, z)] = colour | |
| 735 | - | |
| 736 | - session = ses.Session() | |
| 737 | - session.ChangeProject() | |
| 738 | - | |
| 739 | - | |
| 740 | - def EditPixelBasedOnThreshold(self, position): | |
| 741 | - "Erase or draw pixel based on edition threshold range." | |
| 742 | - x, y, z = round(position[0],0), round(position[1],0),position[2] | |
| 743 | - colour = self.imagedata.GetScalarComponentAsDouble(x, y, z, 0) | |
| 744 | - thresh_min, thresh_max = self.current_mask.edition_threshold_range | |
| 745 | - if (colour >= thresh_min) and (colour <= thresh_max): | |
| 746 | - self.DrawPixel(position, colour) | |
| 747 | - else: | |
| 748 | - self.ErasePixel(position) | |
| 749 | - | |
| 750 | - session = ses.Session() | |
| 751 | - session.ChangeProject() | |
| 752 | - | |
| 753 | - | |
| 754 | - #--------------------------------------------------------------------------- | |
| 755 | 534 | def SelectCurrentMask(self, index): |
| 756 | 535 | "Insert mask data, based on given index, into pipeline." |
| 757 | 536 | # This condition is not necessary in Linux, only under mac and windows |
| ... | ... | @@ -805,6 +584,7 @@ class Slice(object): |
| 805 | 584 | return self.blend_filter.GetOutput() |
| 806 | 585 | |
| 807 | 586 | def SetInput(self, imagedata, mask_dict): |
| 587 | + print "SETINPUT!" | |
| 808 | 588 | self.imagedata = imagedata |
| 809 | 589 | self.extent = imagedata.GetExtent() |
| 810 | 590 | |
| ... | ... | @@ -857,7 +637,6 @@ class Slice(object): |
| 857 | 637 | return img_colours_bg.GetOutput() |
| 858 | 638 | |
| 859 | 639 | def UpdateWindowLevelBackground(self, pubsub_evt): |
| 860 | - | |
| 861 | 640 | window, level = pubsub_evt.data |
| 862 | 641 | self.window_width = window |
| 863 | 642 | self.window_level = level |
| ... | ... | @@ -867,20 +646,6 @@ class Slice(object): |
| 867 | 646 | |
| 868 | 647 | ps.Publisher().sendMessage('Reload actual slice') |
| 869 | 648 | |
| 870 | - #window_level = self.window_level | |
| 871 | - | |
| 872 | - #if not((window == window_level.GetWindow()) and\ | |
| 873 | - #(level == window_level.GetLevel())): | |
| 874 | - | |
| 875 | - #window_level.SetWindow(window) | |
| 876 | - #window_level.SetLevel(level) | |
| 877 | - #window_level.SetOutputFormatToLuminance() | |
| 878 | - #window_level.Update() | |
| 879 | - | |
| 880 | - #thresh_min, thresh_max = window_level.GetOutput().GetScalarRange() | |
| 881 | - #self.lut_bg.SetTableRange(thresh_min, thresh_max) | |
| 882 | - #self.img_colours_bg.SetInput(window_level.GetOutput()) | |
| 883 | - | |
| 884 | 649 | def UpdateColourTableBackground(self, pubsub_evt): |
| 885 | 650 | values = pubsub_evt.data |
| 886 | 651 | |
| ... | ... | @@ -925,39 +690,13 @@ class Slice(object): |
| 925 | 690 | future_mask.edition_threshold_range = edition_threshold_range |
| 926 | 691 | if edited_points: |
| 927 | 692 | future_mask.edited_points = edited_points |
| 928 | - | |
| 929 | - ## this is not the first mask, so we will import data from old imagedata | |
| 930 | - #if imagedata is None: | |
| 931 | - #old_mask = self.current_mask | |
| 932 | - #imagedata = old_mask.imagedata | |
| 933 | - #future_mask.threshold_range = old_mask.threshold_range | |
| 934 | - | |
| 935 | - #if threshold_range: | |
| 936 | - #future_mask.threshold_range = threshold_range | |
| 937 | - #future_mask.imagedata = self.__create_mask_threshold(self.imagedata, | |
| 938 | - #threshold_range) | |
| 939 | - #else: | |
| 940 | - #future_mask.imagedata = vtk.vtkImageData() | |
| 941 | - #future_mask.imagedata.DeepCopy(imagedata) | |
| 942 | - #future_mask.imagedata.Update() | |
| 943 | - | |
| 944 | - | |
| 945 | - ## when this is not the first instance, user will have defined a name | |
| 946 | - #if name is not None: | |
| 947 | - #future_mask.name = name | |
| 948 | - #if future_mask.is_shown: | |
| 949 | - #self.blend_filter.SetOpacity(1, future_mask.opacity) | |
| 950 | - #else: | |
| 951 | - #self.blend_filter.SetOpacity(1, 0) | |
| 952 | - #self.blend_filter.Update() | |
| 693 | + if threshold_range: | |
| 694 | + future_mask.threshold_range = threshold_range | |
| 953 | 695 | |
| 954 | 696 | # insert new mask into project and retrieve its index |
| 955 | 697 | proj = Project() |
| 956 | 698 | index = proj.AddMask(future_mask) |
| 957 | 699 | future_mask.index = index |
| 958 | - #if threshold_range: | |
| 959 | - #self.SetMaskThreshold(index, threshold_range) | |
| 960 | - #future_mask.edited_points = {} | |
| 961 | 700 | |
| 962 | 701 | ## update gui related to mask |
| 963 | 702 | ps.Publisher().sendMessage('Add mask', |
| ... | ... | @@ -968,12 +707,9 @@ class Slice(object): |
| 968 | 707 | |
| 969 | 708 | self.current_mask = future_mask |
| 970 | 709 | |
| 971 | - print self.current_mask.matrix | |
| 972 | - | |
| 973 | 710 | ps.Publisher().sendMessage('Change mask selected', future_mask.index) |
| 974 | 711 | ps.Publisher().sendMessage('Update slice viewer') |
| 975 | 712 | |
| 976 | - | |
| 977 | 713 | def __load_masks(self, imagedata, mask_dict): |
| 978 | 714 | keys = mask_dict.keys() |
| 979 | 715 | keys.sort() |
| ... | ... | @@ -996,8 +732,6 @@ class Slice(object): |
| 996 | 732 | ps.Publisher().sendMessage('Update slice viewer') |
| 997 | 733 | |
| 998 | 734 | def do_ww_wl(self, image): |
| 999 | - print "WW, WL", self.window_width, self.window_level | |
| 1000 | - print image.GetScalarRange() | |
| 1001 | 735 | colorer = vtk.vtkImageMapToWindowLevelColors() |
| 1002 | 736 | colorer.SetInput(image) |
| 1003 | 737 | colorer.SetWindow(self.window_width) |
| ... | ... | @@ -1049,9 +783,9 @@ class Slice(object): |
| 1049 | 783 | return img_colours_mask.GetOutput() |
| 1050 | 784 | |
| 1051 | 785 | def do_blend(self, imagedata, mask): |
| 1052 | - # blend both imagedatas, so it can be inserted into viewer | |
| 1053 | - print "Blending Spacing", imagedata.GetSpacing(), mask.GetSpacing() | |
| 1054 | - | |
| 786 | + """ | |
| 787 | + blend image with the mask. | |
| 788 | + """ | |
| 1055 | 789 | blend_imagedata = vtk.vtkImageBlend() |
| 1056 | 790 | blend_imagedata.SetBlendModeToNormal() |
| 1057 | 791 | # blend_imagedata.SetOpacity(0, 1.0) |
| ... | ... | @@ -1060,8 +794,6 @@ class Slice(object): |
| 1060 | 794 | blend_imagedata.AddInput(mask) |
| 1061 | 795 | blend_imagedata.Update() |
| 1062 | 796 | |
| 1063 | - # return colorer.GetOutput() | |
| 1064 | - | |
| 1065 | 797 | return blend_imagedata.GetOutput() |
| 1066 | 798 | |
| 1067 | 799 | def apply_slice_buffer_to_mask(self, orientation): |
| ... | ... | @@ -1070,7 +802,6 @@ class Slice(object): |
| 1070 | 802 | """ |
| 1071 | 803 | b_mask = self.buffer_slices[orientation].mask |
| 1072 | 804 | index = self.buffer_slices[orientation].index |
| 1073 | - print "-> ORIENTATION", orientation, index, b_mask | |
| 1074 | 805 | if orientation == 'AXIAL': |
| 1075 | 806 | self.current_mask.matrix[index+1,1:,1:] = b_mask |
| 1076 | 807 | elif orientation == 'CORONAL': |
| ... | ... | @@ -1127,7 +858,6 @@ class Slice(object): |
| 1127 | 858 | |
| 1128 | 859 | return img_colours_mask.GetOutput() |
| 1129 | 860 | |
| 1130 | - | |
| 1131 | 861 | def __create_mask_threshold(self, imagedata, threshold_range=None): |
| 1132 | 862 | if not threshold_range: |
| 1133 | 863 | thresh_min, thresh_max = self.current_mask.threshold_range |
| ... | ... | @@ -1150,7 +880,6 @@ class Slice(object): |
| 1150 | 880 | |
| 1151 | 881 | return imagedata_mask |
| 1152 | 882 | |
| 1153 | - | |
| 1154 | 883 | def OnExportMask(self, pubsub_evt): |
| 1155 | 884 | #imagedata = self.current_mask.imagedata |
| 1156 | 885 | imagedata = self.imagedata | ... | ... |
invesalius/data/viewer_slice.py
| ... | ... | @@ -634,19 +634,9 @@ class Viewer(wx.Panel): |
| 634 | 634 | |
| 635 | 635 | if position < 0: |
| 636 | 636 | position = self.calculate_matrix_position(coord) |
| 637 | - | |
| 638 | 637 | |
| 639 | - # TODO: Call slice_ functions instead of to use pubsub message, | |
| 640 | - # maybe we can get some performances improvements here. | |
| 641 | - if self._brush_cursor_op == const.BRUSH_ERASE: | |
| 642 | - self.slice_.erase_mask_pixel(cursor.GetPixels(), position, radius, | |
| 643 | - self.orientation) | |
| 644 | - elif self._brush_cursor_op == const.BRUSH_DRAW: | |
| 645 | - self.slice_.add_mask_pixel(cursor.GetPixels(), position, radius, | |
| 646 | - self.orientation) | |
| 647 | - elif self._brush_cursor_op == const.BRUSH_THRESH: | |
| 648 | - self.slice_.edit_mask_pixel(cursor.GetPixels(), position, radius, | |
| 649 | - self.orientation) | |
| 638 | + self.slice_.edit_mask_pixel(self._brush_cursor_op, cursor.GetPixels(), | |
| 639 | + position, radius, self.orientation) | |
| 650 | 640 | |
| 651 | 641 | # TODO: To create a new function to reload images to viewer. |
| 652 | 642 | self.OnScrollBar() |
| ... | ... | @@ -685,18 +675,8 @@ class Viewer(wx.Panel): |
| 685 | 675 | if position < 0: |
| 686 | 676 | position = self.calculate_matrix_position(coord) |
| 687 | 677 | |
| 688 | - | |
| 689 | - # TODO: Call slice_ functions instead of to use pubsub message, | |
| 690 | - # maybe we can get some performances improvements here. | |
| 691 | - if self._brush_cursor_op == const.BRUSH_ERASE: | |
| 692 | - self.slice_.erase_mask_pixel(cursor.GetPixels(), position, radius, | |
| 693 | - self.orientation) | |
| 694 | - elif self._brush_cursor_op == const.BRUSH_DRAW: | |
| 695 | - self.slice_.add_mask_pixel(cursor.GetPixels(), position, radius, | |
| 696 | - self.orientation) | |
| 697 | - elif self._brush_cursor_op == const.BRUSH_THRESH: | |
| 698 | - self.slice_.edit_mask_pixel(cursor.GetPixels(), position, radius, | |
| 699 | - self.orientation) | |
| 678 | + self.slice_.edit_mask_pixel(self._brush_cursor_op, cursor.GetPixels(), | |
| 679 | + position, radius, self.orientation) | |
| 700 | 680 | |
| 701 | 681 | # TODO: To create a new function to reload images to viewer. |
| 702 | 682 | self.OnScrollBar() | ... | ... |