diff --git a/Wrappers/Python/ccpi/viewer/CILViewer2D.py b/Wrappers/Python/ccpi/viewer/CILViewer2D.py index e2cc5f4f..be3a033a 100644 --- a/Wrappers/Python/ccpi/viewer/CILViewer2D.py +++ b/Wrappers/Python/ccpi/viewer/CILViewer2D.py @@ -245,7 +245,10 @@ def InitialiseBox(self, clickPosition): def OnMouseWheelForward(self, interactor, event): if self.GetInputData() is None: return - maxSlice = self.GetInputData().GetExtent()[self.GetSliceOrientation() * 2 + 1] + if self._viewer._reader is None: + maxSlice = self.GetInputData().GetExtent()[self.GetSliceOrientation() * 2 + 1] + else: + maxSlice = self._viewer._reader.GetWholeExtent()[self.GetSliceOrientation() * 2 + 1] shift = interactor.GetShiftKey() advance = 1 if shift: @@ -265,6 +268,10 @@ def OnMouseWheelBackward(self, interactor, event): if self.GetInputData() is None: return minSlice = self.GetInputData().GetExtent()[self.GetSliceOrientation() * 2] + if self._viewer._reader is None: + minSlice = self.GetInputData().GetExtent()[self.GetSliceOrientation() * 2] + else: + minSlice = self._viewer._reader.GetWholeExtent()[self.GetSliceOrientation() * 2] shift = interactor.GetShiftKey() advance = 1 if shift: @@ -1140,6 +1147,9 @@ def __init__(self, dimx=600, dimy=600, ren=None, renWin=None, iren=None, debug=T self.imageTracer.AutoCloseOn() self.imageTracer.AddObserver(vtk.vtkWidgetEvent.Select, self.style.OnTracerModifiedEvent, 1.0) + # input reader + self._reader = None + self.__vis_mode = CILViewer2D.IMAGE_WITH_OVERLAY self.setVisualisationToImageWithOverlay() @@ -1153,10 +1163,23 @@ def setInput3DData(self, imageData): def setInputData(self, imageData): self.log("setInputData") - self.img3D = imageData + self._img3D = imageData + self.installPipeline() + self.axes_initialised = True + + def setInputDataReader(self, reader): + self._reader = reader self.installPipeline() self.axes_initialised = True + @property + def img3D(self): + if self._reader is None: + return self._img3D + else: + self._reader.Update() + return self._reader.GetOutput() + def setInputData2(self, imageData): self.image2 = imageData # TODO resample on image1 @@ -1196,9 +1219,9 @@ def setInputAsNumpy(self, shiftScaler.SetShift(-iMin) shiftScaler.SetOutputScalarType(dtype) shiftScaler.Update() - self.img3D = shiftScaler.GetOutput() + self._img3D = shiftScaler.GetOutput() else: - self.img3D = importer.GetOutput() + self._img3D = importer.GetOutput() self.installPipeline() @@ -1228,6 +1251,9 @@ def updateMainVOI(self): extent = [i for i in self.img3D.GetExtent()] extent[self.sliceOrientation * 2] = self.getActiveSlice() extent[self.sliceOrientation * 2 + 1] = self.getActiveSlice() + if self._reader is not None: + self._reader.SetTargetZExtent((extent[4], extent[5])) + self._reader.Update() self.voi.SetVOI(extent[0], extent[1], extent[2], extent[3], extent[4], extent[5]) self.log("extent {0}".format(extent)) self.voi.Update() @@ -1352,8 +1378,6 @@ def installImageWithOverlayPipeline(self): self.voi.SetVOI(extent[0], extent[1], extent[2], extent[3], extent[4], extent[5]) - self.voi.SetVOI(extent[0], extent[1], extent[2], extent[3], extent[4], extent[5]) - self.voi.Update() # set window/level for slice based on values in entire volume: diff --git a/Wrappers/Python/ccpi/viewer/utils/conversion.py b/Wrappers/Python/ccpi/viewer/utils/conversion.py index c6982a72..487f4680 100644 --- a/Wrappers/Python/ccpi/viewer/utils/conversion.py +++ b/Wrappers/Python/ccpi/viewer/utils/conversion.py @@ -22,7 +22,7 @@ import os import math import numpy -import vtk +import vtkmodules.all as vtk from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase from vtk.util import numpy_support @@ -1421,6 +1421,21 @@ def GetTargetZExtent(self): Get the target extent to crop to on the z axis. ''' return self._TargetZExtent + + def GetShape(self): + readshape = self.GetStoredArrayShape() + is_fortran = self.GetIsFortran() + + if is_fortran: + shape = list(readshape) + else: + shape = list(readshape)[::-1] + return shape + + def GetWholeExtent(self): + shape = self.GetShape() + extent = (0, shape[0] - 1, 0, shape[1] - 1, 0, shape[2] - 1) + return extent def RequestData(self, request, inInfo, outInfo): outData = vtk.vtkImageData.GetData(outInfo) @@ -1429,14 +1444,8 @@ def RequestData(self, request, inInfo, outInfo): # get basic info big_endian = self.GetBigEndian() - readshape = self.GetStoredArrayShape() file_header_length = self.GetFileHeaderLength() - is_fortran = self.GetIsFortran() - - if is_fortran: - shape = list(readshape) - else: - shape = list(readshape)[::-1] + shape = self.GetShape() tmpdir = tempfile.mkdtemp() header_filename = os.path.join(tmpdir, "header.mhd") diff --git a/Wrappers/Python/examples/display_full_slice.py b/Wrappers/Python/examples/display_full_slice.py new file mode 100644 index 00000000..b55a5bb2 --- /dev/null +++ b/Wrappers/Python/examples/display_full_slice.py @@ -0,0 +1,26 @@ +from ccpi.viewer import viewer2D +from ccpi.viewer.utils.conversion import cilTIFFCroppedReader, cilNumpyCroppedReader +import os, glob + + +data_dir = os.path.abspath('C:/Users/ofn77899/Data/dvc/') + +ftype = 'tiff' + +if ftype == 'npy': + fname = os.path.abspath('C:/Users/ofn77899/Data/dvc/frame_000_f.npy') + reader = cilNumpyCroppedReader() + reader.SetFileName(fname) +elif ftype == 'tiff': + reader = cilTIFFCroppedReader() + data_dir = os.path.abspath('C:/Users/ofn77899/Data/dvc/frame_000') + fnames = glob.glob(os.path.join(data_dir, '*.tiff')) + reader.SetFileName(fnames) + + +v = viewer2D() + +v.setInputDataReader(reader) + +v.startRenderLoop() +