Commit e82c89cee51c88e21339c9f6b6b537b7a4d97263
1 parent
e7bc240b
Exists in
command-line
No-gui doing less work when creating surface
Showing
3 changed files
with
117 additions
and
101 deletions
Show diff stats
app.py
| @@ -361,7 +361,6 @@ def export(path_, threshold_range): | @@ -361,7 +361,6 @@ def export(path_, threshold_range): | ||
| 361 | } | 361 | } |
| 362 | Publisher.sendMessage('Create surface from index', surface_options) | 362 | Publisher.sendMessage('Create surface from index', surface_options) |
| 363 | Publisher.sendMessage('Export surface to file', (path_, const.FILETYPE_STL)) | 363 | Publisher.sendMessage('Export surface to file', (path_, const.FILETYPE_STL)) |
| 364 | - Publisher.sendMessage('Remove surfaces', [0]) | ||
| 365 | 364 | ||
| 366 | 365 | ||
| 367 | def print_events(data): | 366 | def print_events(data): |
invesalius/data/slice_.py
| @@ -353,19 +353,19 @@ class Slice(object): | @@ -353,19 +353,19 @@ class Slice(object): | ||
| 353 | 353 | ||
| 354 | # TODO: merge this code with apply_slice_buffer_to_mask | 354 | # TODO: merge this code with apply_slice_buffer_to_mask |
| 355 | b_mask = self.buffer_slices["AXIAL"].mask | 355 | b_mask = self.buffer_slices["AXIAL"].mask |
| 356 | - if b_mask: | 356 | + if b_mask is not None: |
| 357 | n = self.buffer_slices["AXIAL"].index + 1 | 357 | n = self.buffer_slices["AXIAL"].index + 1 |
| 358 | self.current_mask.matrix[n, 1:, 1:] = b_mask | 358 | self.current_mask.matrix[n, 1:, 1:] = b_mask |
| 359 | self.current_mask.matrix[n, 0, 0] = 1 | 359 | self.current_mask.matrix[n, 0, 0] = 1 |
| 360 | 360 | ||
| 361 | b_mask = self.buffer_slices["CORONAL"].mask | 361 | b_mask = self.buffer_slices["CORONAL"].mask |
| 362 | - if b_mask: | 362 | + if b_mask is not None: |
| 363 | n = self.buffer_slices["CORONAL"].index + 1 | 363 | n = self.buffer_slices["CORONAL"].index + 1 |
| 364 | self.current_mask.matrix[1:, n, 1:] = b_mask | 364 | self.current_mask.matrix[1:, n, 1:] = b_mask |
| 365 | self.current_mask.matrix[0, n, 0] = 1 | 365 | self.current_mask.matrix[0, n, 0] = 1 |
| 366 | 366 | ||
| 367 | b_mask = self.buffer_slices["SAGITAL"].mask | 367 | b_mask = self.buffer_slices["SAGITAL"].mask |
| 368 | - if b_mask: | 368 | + if b_mask is not None: |
| 369 | n = self.buffer_slices["SAGITAL"].index + 1 | 369 | n = self.buffer_slices["SAGITAL"].index + 1 |
| 370 | self.current_mask.matrix[1:, 1:, n] = b_mask | 370 | self.current_mask.matrix[1:, 1:, n] = b_mask |
| 371 | self.current_mask.matrix[0, 0, n] = 1 | 371 | self.current_mask.matrix[0, 0, n] = 1 |
| @@ -885,7 +885,7 @@ class Slice(object): | @@ -885,7 +885,7 @@ class Slice(object): | ||
| 885 | self.current_mask.matrix[n+1, 1:, 1:] = m | 885 | self.current_mask.matrix[n+1, 1:, 1:] = m |
| 886 | else: | 886 | else: |
| 887 | slice_ = self.buffer_slices[orientation].image | 887 | slice_ = self.buffer_slices[orientation].image |
| 888 | - if slice_: | 888 | + if slice_ is not None: |
| 889 | self.buffer_slices[orientation].mask = (255 * ((slice_ >= thresh_min) & (slice_ <= thresh_max))).astype('uint8') | 889 | self.buffer_slices[orientation].mask = (255 * ((slice_ >= thresh_min) & (slice_ <= thresh_max))).astype('uint8') |
| 890 | 890 | ||
| 891 | # Update viewer | 891 | # Update viewer |
invesalius/data/surface.py
| @@ -661,7 +661,6 @@ class SurfaceManager(): | @@ -661,7 +661,6 @@ class SurfaceManager(): | ||
| 661 | # polydata.SetSource(None) | 661 | # polydata.SetSource(None) |
| 662 | del decimation | 662 | del decimation |
| 663 | 663 | ||
| 664 | - to_measure = polydata | ||
| 665 | #to_measure.Register(None) | 664 | #to_measure.Register(None) |
| 666 | # to_measure.SetSource(None) | 665 | # to_measure.SetSource(None) |
| 667 | 666 | ||
| @@ -700,115 +699,133 @@ class SurfaceManager(): | @@ -700,115 +699,133 @@ class SurfaceManager(): | ||
| 700 | # polydata.DebugOn() | 699 | # polydata.DebugOn() |
| 701 | del filled_polydata | 700 | del filled_polydata |
| 702 | 701 | ||
| 703 | - normals = vtk.vtkPolyDataNormals() | ||
| 704 | - # normals.ReleaseDataFlagOn() | ||
| 705 | - normals_ref = weakref.ref(normals) | ||
| 706 | - normals_ref().AddObserver("ProgressEvent", lambda obj,evt: | ||
| 707 | - UpdateProgress(normals_ref(), _("Creating 3D surface..."))) | ||
| 708 | - normals.SetInputData(polydata) | ||
| 709 | - normals.SetFeatureAngle(80) | ||
| 710 | - normals.AutoOrientNormalsOn() | ||
| 711 | - # normals.GetOutput().ReleaseDataFlagOn() | ||
| 712 | - normals.Update() | ||
| 713 | - del polydata | ||
| 714 | - polydata = normals.GetOutput() | ||
| 715 | - #polydata.Register(None) | ||
| 716 | - # polydata.SetSource(None) | ||
| 717 | - del normals | ||
| 718 | - | ||
| 719 | - # Improve performance | ||
| 720 | - stripper = vtk.vtkStripper() | ||
| 721 | - # stripper.ReleaseDataFlagOn() | ||
| 722 | - stripper_ref = weakref.ref(stripper) | ||
| 723 | - stripper_ref().AddObserver("ProgressEvent", lambda obj,evt: | ||
| 724 | - UpdateProgress(stripper_ref(), _("Creating 3D surface..."))) | ||
| 725 | - stripper.SetInputData(polydata) | ||
| 726 | - stripper.PassThroughCellIdsOn() | ||
| 727 | - stripper.PassThroughPointIdsOn() | ||
| 728 | - # stripper.GetOutput().ReleaseDataFlagOn() | ||
| 729 | - stripper.Update() | ||
| 730 | - del polydata | ||
| 731 | - polydata = stripper.GetOutput() | ||
| 732 | - #polydata.Register(None) | ||
| 733 | - # polydata.SetSource(None) | ||
| 734 | - del stripper | 702 | + to_measure = polydata |
| 735 | 703 | ||
| 736 | - # Map polygonal data (vtkPolyData) to graphics primitives. | ||
| 737 | - mapper = vtk.vtkPolyDataMapper() | ||
| 738 | - mapper.SetInputData(polydata) | ||
| 739 | - mapper.ScalarVisibilityOff() | ||
| 740 | - # mapper.ReleaseDataFlagOn() | ||
| 741 | - mapper.ImmediateModeRenderingOn() # improve performance | 704 | + # If InVesalius is running without GUI |
| 705 | + if wx.GetApp() is None: | ||
| 706 | + proj = prj.Project() | ||
| 707 | + #Create Surface instance | ||
| 708 | + if overwrite: | ||
| 709 | + surface = Surface(index = self.last_surface_index) | ||
| 710 | + proj.ChangeSurface(surface) | ||
| 711 | + else: | ||
| 712 | + surface = Surface(name=surface_name) | ||
| 713 | + index = proj.AddSurface(surface) | ||
| 714 | + surface.index = index | ||
| 715 | + self.last_surface_index = index | ||
| 716 | + surface.colour = colour | ||
| 717 | + surface.polydata = polydata | ||
| 742 | 718 | ||
| 743 | - # Represent an object (geometry & properties) in the rendered scene | ||
| 744 | - actor = vtk.vtkActor() | ||
| 745 | - actor.SetMapper(mapper) | ||
| 746 | - del mapper | ||
| 747 | - #Create Surface instance | ||
| 748 | - if overwrite: | ||
| 749 | - surface = Surface(index = self.last_surface_index) | 719 | + # With GUI |
| 750 | else: | 720 | else: |
| 751 | - surface = Surface(name=surface_name) | ||
| 752 | - surface.colour = colour | ||
| 753 | - surface.polydata = polydata | ||
| 754 | - del polydata | 721 | + normals = vtk.vtkPolyDataNormals() |
| 722 | + # normals.ReleaseDataFlagOn() | ||
| 723 | + normals_ref = weakref.ref(normals) | ||
| 724 | + normals_ref().AddObserver("ProgressEvent", lambda obj,evt: | ||
| 725 | + UpdateProgress(normals_ref(), _("Creating 3D surface..."))) | ||
| 726 | + normals.SetInputData(polydata) | ||
| 727 | + normals.SetFeatureAngle(80) | ||
| 728 | + normals.AutoOrientNormalsOn() | ||
| 729 | + # normals.GetOutput().ReleaseDataFlagOn() | ||
| 730 | + normals.Update() | ||
| 731 | + del polydata | ||
| 732 | + polydata = normals.GetOutput() | ||
| 733 | + #polydata.Register(None) | ||
| 734 | + # polydata.SetSource(None) | ||
| 735 | + del normals | ||
| 755 | 736 | ||
| 756 | - # Set actor colour and transparency | ||
| 757 | - actor.GetProperty().SetColor(colour) | ||
| 758 | - actor.GetProperty().SetOpacity(1-surface.transparency) | 737 | + # Improve performance |
| 738 | + stripper = vtk.vtkStripper() | ||
| 739 | + # stripper.ReleaseDataFlagOn() | ||
| 740 | + stripper_ref = weakref.ref(stripper) | ||
| 741 | + stripper_ref().AddObserver("ProgressEvent", lambda obj,evt: | ||
| 742 | + UpdateProgress(stripper_ref(), _("Creating 3D surface..."))) | ||
| 743 | + stripper.SetInputData(polydata) | ||
| 744 | + stripper.PassThroughCellIdsOn() | ||
| 745 | + stripper.PassThroughPointIdsOn() | ||
| 746 | + # stripper.GetOutput().ReleaseDataFlagOn() | ||
| 747 | + stripper.Update() | ||
| 748 | + del polydata | ||
| 749 | + polydata = stripper.GetOutput() | ||
| 750 | + #polydata.Register(None) | ||
| 751 | + # polydata.SetSource(None) | ||
| 752 | + del stripper | ||
| 759 | 753 | ||
| 760 | - prop = actor.GetProperty() | 754 | + # Map polygonal data (vtkPolyData) to graphics primitives. |
| 755 | + mapper = vtk.vtkPolyDataMapper() | ||
| 756 | + mapper.SetInputData(polydata) | ||
| 757 | + mapper.ScalarVisibilityOff() | ||
| 758 | + # mapper.ReleaseDataFlagOn() | ||
| 759 | + mapper.ImmediateModeRenderingOn() # improve performance | ||
| 761 | 760 | ||
| 762 | - interpolation = int(ses.Session().surface_interpolation) | 761 | + # Represent an object (geometry & properties) in the rendered scene |
| 762 | + actor = vtk.vtkActor() | ||
| 763 | + actor.SetMapper(mapper) | ||
| 764 | + del mapper | ||
| 765 | + #Create Surface instance | ||
| 766 | + if overwrite: | ||
| 767 | + surface = Surface(index = self.last_surface_index) | ||
| 768 | + else: | ||
| 769 | + surface = Surface(name=surface_name) | ||
| 770 | + surface.colour = colour | ||
| 771 | + surface.polydata = polydata | ||
| 772 | + del polydata | ||
| 763 | 773 | ||
| 764 | - prop.SetInterpolation(interpolation) | 774 | + # Set actor colour and transparency |
| 775 | + actor.GetProperty().SetColor(colour) | ||
| 776 | + actor.GetProperty().SetOpacity(1-surface.transparency) | ||
| 765 | 777 | ||
| 766 | - proj = prj.Project() | ||
| 767 | - if overwrite: | ||
| 768 | - proj.ChangeSurface(surface) | ||
| 769 | - else: | ||
| 770 | - index = proj.AddSurface(surface) | ||
| 771 | - surface.index = index | ||
| 772 | - self.last_surface_index = index | 778 | + prop = actor.GetProperty() |
| 773 | 779 | ||
| 774 | - session = ses.Session() | ||
| 775 | - session.ChangeProject() | 780 | + interpolation = int(ses.Session().surface_interpolation) |
| 776 | 781 | ||
| 777 | - # The following lines have to be here, otherwise all volumes disappear | ||
| 778 | - measured_polydata = vtk.vtkMassProperties() | ||
| 779 | - # measured_polydata.ReleaseDataFlagOn() | ||
| 780 | - measured_polydata.SetInputData(to_measure) | ||
| 781 | - volume = float(measured_polydata.GetVolume()) | ||
| 782 | - area = float(measured_polydata.GetSurfaceArea()) | ||
| 783 | - surface.volume = volume | ||
| 784 | - surface.area = area | ||
| 785 | - self.last_surface_index = surface.index | ||
| 786 | - del measured_polydata | ||
| 787 | - del to_measure | 782 | + prop.SetInterpolation(interpolation) |
| 788 | 783 | ||
| 789 | - Publisher.sendMessage('Load surface actor into viewer', actor) | 784 | + proj = prj.Project() |
| 785 | + if overwrite: | ||
| 786 | + proj.ChangeSurface(surface) | ||
| 787 | + else: | ||
| 788 | + index = proj.AddSurface(surface) | ||
| 789 | + surface.index = index | ||
| 790 | + self.last_surface_index = index | ||
| 790 | 791 | ||
| 791 | - # Send actor by pubsub to viewer's render | ||
| 792 | - if overwrite and self.actors_dict.keys(): | ||
| 793 | - old_actor = self.actors_dict[self.last_surface_index] | ||
| 794 | - Publisher.sendMessage('Remove surface actor from viewer', old_actor) | 792 | + session = ses.Session() |
| 793 | + session.ChangeProject() | ||
| 795 | 794 | ||
| 796 | - # Save actor for future management tasks | ||
| 797 | - self.actors_dict[surface.index] = actor | 795 | + measured_polydata = vtk.vtkMassProperties() |
| 796 | + # measured_polydata.ReleaseDataFlagOn() | ||
| 797 | + measured_polydata.SetInputData(to_measure) | ||
| 798 | + volume = float(measured_polydata.GetVolume()) | ||
| 799 | + area = float(measured_polydata.GetSurfaceArea()) | ||
| 800 | + surface.volume = volume | ||
| 801 | + surface.area = area | ||
| 802 | + self.last_surface_index = surface.index | ||
| 803 | + del measured_polydata | ||
| 804 | + del to_measure | ||
| 798 | 805 | ||
| 799 | - Publisher.sendMessage('Update surface info in GUI', | ||
| 800 | - (surface.index, surface.name, | ||
| 801 | - surface.colour, surface.volume, | ||
| 802 | - surface.area, | ||
| 803 | - surface.transparency)) | ||
| 804 | - | ||
| 805 | - #When you finalize the progress. The bar is cleaned. | ||
| 806 | - UpdateProgress = vu.ShowProgress(1) | ||
| 807 | - UpdateProgress(0, _("Ready")) | ||
| 808 | - Publisher.sendMessage('Update status text in GUI', _("Ready")) | ||
| 809 | - | ||
| 810 | - Publisher.sendMessage('End busy cursor') | ||
| 811 | - del actor | 806 | + Publisher.sendMessage('Load surface actor into viewer', actor) |
| 807 | + | ||
| 808 | + # Send actor by pubsub to viewer's render | ||
| 809 | + if overwrite and self.actors_dict.keys(): | ||
| 810 | + old_actor = self.actors_dict[self.last_surface_index] | ||
| 811 | + Publisher.sendMessage('Remove surface actor from viewer', old_actor) | ||
| 812 | + | ||
| 813 | + # Save actor for future management tasks | ||
| 814 | + self.actors_dict[surface.index] = actor | ||
| 815 | + | ||
| 816 | + Publisher.sendMessage('Update surface info in GUI', | ||
| 817 | + (surface.index, surface.name, | ||
| 818 | + surface.colour, surface.volume, | ||
| 819 | + surface.area, | ||
| 820 | + surface.transparency)) | ||
| 821 | + | ||
| 822 | + #When you finalize the progress. The bar is cleaned. | ||
| 823 | + UpdateProgress = vu.ShowProgress(1) | ||
| 824 | + UpdateProgress(0, _("Ready")) | ||
| 825 | + Publisher.sendMessage('Update status text in GUI', _("Ready")) | ||
| 826 | + | ||
| 827 | + Publisher.sendMessage('End busy cursor') | ||
| 828 | + del actor | ||
| 812 | 829 | ||
| 813 | def UpdateSurfaceInterpolation(self, pub_evt): | 830 | def UpdateSurfaceInterpolation(self, pub_evt): |
| 814 | interpolation = int(ses.Session().surface_interpolation) | 831 | interpolation = int(ses.Session().surface_interpolation) |