diff --git a/Sources/Interaction/Style/InteractorStyleImage/index.js b/Sources/Interaction/Style/InteractorStyleImage/index.js index c77e5a9f2fe..f34a44048a6 100644 --- a/Sources/Interaction/Style/InteractorStyleImage/index.js +++ b/Sources/Interaction/Style/InteractorStyleImage/index.js @@ -223,25 +223,19 @@ function vtkInteractorStyleImage(publicAPI, model) { model.currentImageNumber = i; function propMatch(j, prop, targetIndex) { - return ( - prop.isA('vtkImageSlice') && - j === targetIndex && - prop.getNestedPickable() - ); + return j === targetIndex && prop.getNestedPickable(); } - const props = renderer.getViewProps(); + const props = renderer + .getViewProps() + .filter((prop) => prop.isA('vtkImageSlice')); let targetIndex = i; if (i < 0) { targetIndex += props.length; } - let imageProp = null; - for (let j = 0; j < props.length; ++j) { - if (propMatch(j, props[j], targetIndex)) { - imageProp = props[j]; - break; - } - } + const imageProp = props.find((prop, index) => + propMatch(index, prop, targetIndex) + ); if (imageProp) { publicAPI.setCurrentImageProperty(imageProp.getProperty()); @@ -263,7 +257,7 @@ const DEFAULT_VALUES = { windowLevelCurrentPosition: [0, 0], lastSlicePosition: 0, windowLevelInitial: [1.0, 0.5], - currentImageProperty: 0, + // currentImageProperty: null, currentImageNumber: -1, interactionMode: 'IMAGE2D', xViewRightVector: [0, 1, 0], @@ -284,6 +278,7 @@ export function extend(publicAPI, model, initialValues = {}) { // Create get-set macros macro.setGet(publicAPI, model, ['interactionMode']); + macro.get(publicAPI, model, ['currentImageProperty']); // For more macro methods, see "Sources/macros.js" diff --git a/Sources/Interaction/Style/InteractorStyleImage/test/testInteractorStyleImage.js b/Sources/Interaction/Style/InteractorStyleImage/test/testInteractorStyleImage.js new file mode 100644 index 00000000000..7dcbc987888 --- /dev/null +++ b/Sources/Interaction/Style/InteractorStyleImage/test/testInteractorStyleImage.js @@ -0,0 +1,85 @@ +import test from 'tape-catch'; + +import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor'; +import vtkGenericRenderWindow from 'vtk.js/Sources/Rendering/Misc/GenericRenderWindow'; +import vtkImageMapper from 'vtk.js/Sources/Rendering/Core/ImageMapper'; +import vtkImageSlice from 'vtk.js/Sources/Rendering/Core/ImageSlice'; +import vtkInteractorStyleImage from 'vtk.js/Sources/Interaction/Style/InteractorStyleImage'; +import vtkSplineWidget from 'vtk.js/Sources/Widgets/Widgets3D/SplineWidget'; +import vtkWidgetManager from 'vtk.js/Sources/Widgets/Core/WidgetManager'; + +test('Test vtkInteractorStyleImage.setCurrentImageNumber', (t) => { + const container = document.querySelector('body'); + const renderWindowContainer = document.createElement('div'); + container.appendChild(renderWindowContainer); + const grw = vtkGenericRenderWindow.newInstance(); + grw.setContainer(renderWindowContainer); + grw.resize(); + + const renderer = grw.getRenderer(); + const interactor = grw.getInteractor(); + interactor.setEnabled(false); + + const interactorStyle = vtkInteractorStyleImage.newInstance(); + interactor.setInteractorStyle(interactorStyle); + + const imageSlices = []; + for (let i = 0; i < 5; ++i) { + const imageMapper = vtkImageMapper.newInstance(); + const imageActor = vtkImageSlice.newInstance(); + imageActor.setMapper(imageMapper); + imageSlices.push(imageActor); + } + const widgetManager = vtkWidgetManager.newInstance(); + widgetManager.setRenderer(renderer); + + // Populate renderer with props other than image slice. + renderer.addActor(vtkActor.newInstance()); + const widgetFactory = vtkSplineWidget.newInstance(); + + widgetManager.addWidget(widgetFactory); // Adds a widget in the renderer + + renderer.addActor(imageSlices[0]); + widgetManager.addWidget(widgetFactory); + renderer.addActor(vtkActor.newInstance()); + renderer.addActor(imageSlices[1]); + widgetManager.addWidget(widgetFactory); + renderer.addActor(vtkActor.newInstance()); + renderer.addActor(imageSlices[2]); + widgetManager.addWidget(widgetFactory); + renderer.addActor(vtkActor.newInstance()); + renderer.addActor(imageSlices[3]); + widgetManager.addWidget(widgetFactory); + renderer.addActor(vtkActor.newInstance()); + renderer.addActor(imageSlices[4]); + widgetManager.addWidget(widgetFactory); + renderer.addActor(vtkActor.newInstance()); + + // Test setCurrentImageNumber() + interactorStyle.setCurrentImageNumber(0); + t.equal( + interactorStyle.getCurrentImageProperty(), + imageSlices[0].getProperty() + ); + interactorStyle.setCurrentImageNumber(1); + t.equal( + interactorStyle.getCurrentImageProperty(), + imageSlices[1].getProperty() + ); + interactorStyle.setCurrentImageNumber(4); + t.equal( + interactorStyle.getCurrentImageProperty(), + imageSlices[4].getProperty() + ); + interactorStyle.setCurrentImageNumber(-1); + t.equal( + interactorStyle.getCurrentImageProperty(), + imageSlices[4].getProperty() + ); + interactorStyle.setCurrentImageNumber(-2); + t.equal( + interactorStyle.getCurrentImageProperty(), + imageSlices[3].getProperty() + ); + t.end(); +}); diff --git a/Sources/tests.js b/Sources/tests.js index 671aab3b6eb..a75a8a534a3 100644 --- a/Sources/tests.js +++ b/Sources/tests.js @@ -41,6 +41,7 @@ import './Filters/Sources/PointSource/test/testPointSource'; import './Filters/Texture/TextureMapToPlane/test/testTextureMapToPlane'; import './Filters/Texture/TextureMapToSphere/test/testTextureMapToSphere'; import './Imaging/Core/ImageReslice/test/testImageReslice'; +import './Interaction/Style/InteractorStyleImage/test/testInteractorStyleImage'; import './IO/Misc/PDBReader/test/testMolecule'; import './Proxy/Core/PiecewiseFunctionProxy/test/testPiecewiseFunctionProxy'; import './Rendering/Core/AbstractMapper/test/testAbstractMapper';