diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index c33ce5c25..3819d4868 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -539,7 +539,8 @@ class Viewport { return; } const renderer = this.getRenderer(); - renderer.removeViewProp(actorEntry.actor as vtkProp); // removeActor not implemented in vtk? + // the optional chaining is particularly for video viewports + renderer?.removeViewProp(actorEntry.actor as vtkProp); // removeActor not implemented in vtk? this._actors.delete(actorUID); } diff --git a/packages/core/src/loaders/imageLoader.ts b/packages/core/src/loaders/imageLoader.ts index dfffb13a0..2152ab9f3 100644 --- a/packages/core/src/loaders/imageLoader.ts +++ b/packages/core/src/loaders/imageLoader.ts @@ -340,7 +340,7 @@ export function createAndCacheDerivedImage( export function createAndCacheDerivedImages( referencedImageIds: string[], options: DerivedImageOptions & { - getDerivedImageId?: (referencedImageId: string) => string; + getDerivedImageId?: (referencedImageId: string, index: number) => string; targetBuffer?: { type: PixelDataTypedArrayString; }; @@ -356,7 +356,7 @@ export function createAndCacheDerivedImages( const images = referencedImageIds.map((referencedImageId, index) => { const newOptions: DerivedImageOptions = { imageId: - options?.getDerivedImageId?.(referencedImageId) || + options?.getDerivedImageId?.(referencedImageId, index) || `derived:${uuidv4()}`, ...options, }; diff --git a/packages/tools/examples/videoSegmentation/index.ts b/packages/tools/examples/videoSegmentation/index.ts index a8dceb0e1..bae2980da 100644 --- a/packages/tools/examples/videoSegmentation/index.ts +++ b/packages/tools/examples/videoSegmentation/index.ts @@ -224,11 +224,14 @@ async function run() { // We need the map on all image ids const allImageIds = viewport.getImageIds(); const firstImage = allImageIds[0]; - const segImages = await imageLoader.createAndCacheDerivedImages( - [firstImage], + const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( + allImageIds, { skipCreateBuffer: true, onCacheAdd: csUtils.VoxelManager.addInstanceToImage, + getDerivedImageId: (referenceImageId, index) => { + return `derived:${cornerstone.utilities.uuidv4()}/frames/${index + 1}`; + }, } ); diff --git a/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts b/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts index 20f0ac570..c53fe071e 100644 --- a/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts +++ b/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts @@ -8,6 +8,7 @@ import { getEnabledElementByIds, cache, utilities, + VideoViewport, } from '@cornerstonejs/core'; import { triggerSegmentationRender } from '../../stateManagement/segmentation/SegmentationRenderingEngine'; import { updateLabelmapSegmentationImageReferences } from '../../stateManagement/segmentation/updateLabelmapSegmentationImageReferences'; @@ -203,7 +204,11 @@ function _imageChangeEventListener(evt) { imageId: derivedImageId, representationUID: `${segmentationId}-${SegmentationRepresentations.Labelmap}`, callback: ({ imageActor }) => { - imageActor.getMapper().setInputData(imageData); + if (viewport instanceof VideoViewport) { + imageActor.getMapper().getInputData().setDerivedImage(imageData); + } else { + imageActor.getMapper().setInputData(imageData); + } }, }, ]);