feat(VolumeViewport3D): add volumeViewport3Dd sample hp (#3241)

* feat(VolumeViewport3D)
- importing and using Cornerstone 3D's VolumeViewport3D viewport
- added mprAnd3DVolumeViewport hanging protocol
- allowed for W/L preset to be applied to a viewport

* Updated cornerstone core dependency

* Removed pan and zoom from the volume3d tool group so that tackballrotate is never dropped for that viewport.
Removed overlays from 3D volume viewport.
Throw an error and display a message whenever an unapplicable tool is selected.

* The default/initial orientation for a 3D volume viewport can now be set.
Using the 'interleaveTopToBottom' image load strategy for the 'mprAnd3DVolumeViewport' hanging protocol.

* Do not set orientation for stack viewport.
This commit is contained in:
Joe Boccanfuso authored and GitHub committed 2023-03-21 16:09:50 -04:00
1 parent 5ad5bd232d
commit 550918dd31
12 files changed
+230 -17

No files matched your search

@@ -62,12 +62,20 @@ class CornerstoneCacheService {
viewportData = await this._getStackViewportData(
dataSource,
displaySets,
initialImageIndex
initialImageIndex,
cs3DViewportType
);
}
if (cs3DViewportType === Enums.ViewportType.ORTHOGRAPHIC) {
viewportData = await this._getVolumeViewportData(dataSource, displaySets);
if (
cs3DViewportType === Enums.ViewportType.ORTHOGRAPHIC ||
cs3DViewportType === Enums.ViewportType.VOLUME_3D
) {
viewportData = await this._getVolumeViewportData(
dataSource,
displaySets,
cs3DViewportType
);
}
viewportData.viewportType = cs3DViewportType;
@@ -100,7 +108,8 @@ class CornerstoneCacheService {
const newViewportData = await this._getVolumeViewportData(
dataSource,
displaySets
displaySets,
viewportData.viewportType
);
return newViewportData;
@@ -109,7 +118,8 @@ class CornerstoneCacheService {
private _getStackViewportData(
dataSource,
displaySets,
initialImageIndex
initialImageIndex,
viewportType: Enums.ViewportType
): StackViewportData {
// For Stack Viewport we don't have fusion currently
const displaySet = displaySets[0];
@@ -126,7 +136,7 @@ class CornerstoneCacheService {
const { displaySetInstanceUID, StudyInstanceUID } = displaySet;
const StackViewportData: StackViewportData = {
viewportType: Enums.ViewportType.STACK,
viewportType,
data: {
StudyInstanceUID,
displaySetInstanceUID,
@@ -143,7 +153,8 @@ class CornerstoneCacheService {
private async _getVolumeViewportData(
dataSource,
displaySets
displaySets,
viewportType: Enums.ViewportType
): Promise<VolumeViewportData> {
// Todo: Check the cache for multiple scenarios to see if we need to
// decache the volume data from other viewports or not
@@ -207,7 +218,7 @@ class CornerstoneCacheService {
}
return {
viewportType: Enums.ViewportType.ORTHOGRAPHIC,
viewportType,
data: volumeData,
};
}
@@ -6,7 +6,10 @@ import {
getRenderingEngine,
utilities as csUtils,
VolumeViewport,
VolumeViewport3D,
cache,
utilities,
CONSTANTS,
} from '@cornerstonejs/core';
import { utilities as csToolsUtils } from '@cornerstonejs/tools';
@@ -682,7 +685,12 @@ class CornerstoneViewportService extends PubSubService
}
_getVOICallbacks(volumeId, displaySetOptions) {
const { voi, voiInverted: inverted, colormap } = displaySetOptions;
const {
voi,
voiInverted: inverted,
colormap,
presetName,
} = displaySetOptions;
const voiCallbackArray = [];
@@ -707,6 +715,16 @@ class CornerstoneViewportService extends PubSubService
);
}
if (presetName) {
voiCallbackArray.push(volumeActor => {
utilities.applyPreset(
volumeActor,
CONSTANTS.VIEWPORT_PRESETS.find(preset => {
return preset.name === presetName;
})
);
});
}
return voiCallbackArray;
}
@@ -723,7 +741,10 @@ class CornerstoneViewportService extends PubSubService
viewportInfo,
presentations
);
} else if (viewport instanceof VolumeViewport) {
} else if (
viewport instanceof VolumeViewport ||
viewport instanceof VolumeViewport3D
) {
this._setVolumeViewport(
viewport,
viewportData as VolumeViewportData,
@@ -63,6 +63,7 @@ export type PublicDisplaySetOptions = {
blendMode?: string;
slabThickness?: number;
colormap?: string;
presetName?: string;
};
export type DisplaySetOptions = {
@@ -72,6 +73,7 @@ export type DisplaySetOptions = {
blendMode?: Enums.BlendModes;
slabThickness?: number;
colormap?: string;
presetName?: string;
};
type VOI = {
@@ -84,7 +86,6 @@ export type DisplaySet = {
};
const STACK = 'stack';
const VOLUME = 'volume';
const DEFAULT_TOOLGROUP_ID = 'default';
class ViewportInfo {
@@ -198,10 +199,8 @@ class ViewportInfo {
}
// map SAGITTAL, AXIAL, CORONAL orientation to be used by cornerstone
if (viewportOptionsEntry.viewportType?.toLowerCase() === VOLUME) {
if (viewportOptionsEntry.viewportType?.toLowerCase() !== STACK) {
orientation = getCornerstoneOrientation(viewportOptionsEntry.orientation);
} else {
orientation = Enums.OrientationAxis.AXIAL;
}
this.setViewportOptions({
@@ -282,6 +281,7 @@ class ViewportInfo {
colormap: option.colormap,
slabThickness: option.slabThickness,
blendMode,
presetName: option.presetName,
});
});