@cornerstonejs/core 5.1.0 → 5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.d.ts +1 -0
- package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.js +16 -6
- package/dist/esm/RenderingEngine/GenericViewport/GenericViewport.d.ts +6 -1
- package/dist/esm/RenderingEngine/GenericViewport/GenericViewport.js +20 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/CpuImageSliceRenderPath.js +12 -3
- package/dist/esm/RenderingEngine/GenericViewport/Planar/CpuVolumeSliceRenderPath.js +3 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/DefaultPlanarDataProvider.js +5 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.js +26 -9
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.d.ts +15 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.js +174 -10
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewportTypes.d.ts +4 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/VtkImageMapperRenderPath.js +42 -9
- package/dist/esm/RenderingEngine/GenericViewport/Planar/VtkVolumeSliceRenderPath.js +3 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarImageEvents.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarImageEvents.js +11 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarVolumePresentation.js +30 -3
- package/dist/esm/RenderingEngine/GenericViewport/Video/VideoViewport.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Video/VideoViewport.js +3 -0
- package/dist/esm/RenderingEngine/GenericViewport/Volume3D/viewport3D.d.ts +5 -1
- package/dist/esm/RenderingEngine/GenericViewport/Volume3D/viewport3D.js +15 -1
- package/dist/esm/RenderingEngine/GenericViewport/genericViewportReferenceCompatibility.js +26 -4
- package/dist/esm/RenderingEngine/helpers/planarImageRendering.d.ts +5 -1
- package/dist/esm/RenderingEngine/helpers/planarImageRendering.js +19 -5
- package/dist/esm/RenderingEngine/helpers/stats/RenderModesPanel.d.ts +4 -0
- package/dist/esm/RenderingEngine/helpers/stats/RenderModesPanel.js +48 -1
- package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.js +66 -9
- package/dist/esm/init.js +1 -1
- package/dist/esm/types/IGenericViewport.d.ts +24 -0
- package/dist/esm/types/IGenericViewport.js +0 -0
- package/dist/esm/types/ScalingDescriptor.d.ts +5 -0
- package/dist/esm/types/ScalingDescriptor.js +0 -0
- package/dist/esm/types/index.d.ts +4 -1
- package/dist/esm/utilities/VoxelManager.d.ts +2 -0
- package/dist/esm/utilities/VoxelManager.js +12 -1
- package/dist/esm/utilities/getScalingDescriptor.d.ts +10 -0
- package/dist/esm/utilities/getScalingDescriptor.js +41 -0
- package/dist/esm/utilities/getTargetVolumeAndSpacingInNormalDir.js +4 -5
- package/dist/esm/utilities/getViewportModality.js +5 -14
- package/dist/esm/utilities/index.d.ts +4 -2
- package/dist/esm/utilities/index.js +5 -2
- package/dist/esm/utilities/isPTPrescaledWithSUV.d.ts +1 -1
- package/dist/esm/utilities/isPTPrescaledWithSUV.js +1 -1
- package/dist/esm/utilities/resolveGenericViewportVolumeId.d.ts +2 -0
- package/dist/esm/utilities/resolveGenericViewportVolumeId.js +12 -0
- package/dist/esm/utilities/viewportCapabilities.d.ts +10 -1
- package/dist/esm/utilities/viewportCapabilities.js +22 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +6 -6
|
@@ -2,7 +2,7 @@ import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
|
|
|
2
2
|
import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';
|
|
3
3
|
import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
|
|
4
4
|
import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
|
|
5
|
-
import { InterpolationType } from '../../enums';
|
|
5
|
+
import { InterpolationType, VOILUTFunctionType } from '../../enums';
|
|
6
6
|
import type { ColormapPublic, IImage, Point3, VOIRange } from '../../types';
|
|
7
7
|
export interface PlanarCameraState {
|
|
8
8
|
focalPoint: Point3;
|
|
@@ -17,6 +17,7 @@ export interface PlanarImagePresentation {
|
|
|
17
17
|
interpolationType?: InterpolationType;
|
|
18
18
|
colormap?: ColormapPublic;
|
|
19
19
|
voiRange?: VOIRange;
|
|
20
|
+
voiLUTFunction?: VOILUTFunctionType;
|
|
20
21
|
invert?: boolean;
|
|
21
22
|
}
|
|
22
23
|
export interface PlanarImageViewState {
|
|
@@ -32,17 +33,20 @@ export declare function createEmptyVTKImageData(args: {
|
|
|
32
33
|
spacing: Point3;
|
|
33
34
|
}): vtkImageData;
|
|
34
35
|
export declare function createVTKImageDataFromImage(image: IImage): vtkImageData;
|
|
36
|
+
export declare function updateVTKImageDataGeometryFromImage(imageData: vtkImageData, image: IImage): void;
|
|
35
37
|
export declare function getDefaultImageVOIRange(image: IImage): VOIRange | undefined;
|
|
36
38
|
export declare function getPlanarCameraState(renderer: vtkRenderer): PlanarCameraState;
|
|
37
39
|
export declare function applyPlanarImagePresentation(args: {
|
|
38
40
|
actor: vtkImageSlice;
|
|
39
41
|
defaultVOIRange?: VOIRange;
|
|
42
|
+
defaultVOILUTFunction?: VOILUTFunctionType;
|
|
40
43
|
props?: PlanarImagePresentation;
|
|
41
44
|
}): void;
|
|
42
45
|
export declare function createPlanarRGBTransferFunction(args: {
|
|
43
46
|
colormap?: ColormapPublic;
|
|
44
47
|
invert?: boolean;
|
|
45
48
|
voiRange: VOIRange;
|
|
49
|
+
voiLUTFunction?: VOILUTFunctionType;
|
|
46
50
|
}): vtkColorTransferFunction;
|
|
47
51
|
export declare function applyPlanarCameraViewState(args: {
|
|
48
52
|
initialCamera: PlanarCameraState;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
|
|
2
2
|
import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
|
|
3
3
|
import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
|
|
4
|
-
import { InterpolationType } from '../../enums';
|
|
4
|
+
import { InterpolationType, VOILUTFunctionType } from '../../enums';
|
|
5
5
|
import createLinearRGBTransferFunction from '../../utilities/createLinearRGBTransferFunction';
|
|
6
|
+
import createSigmoidRGBTransferFunction from '../../utilities/createSigmoidRGBTransferFunction';
|
|
6
7
|
import getVOIRangeFromWindowLevel from '../../utilities/getVOIRangeFromWindowLevel';
|
|
8
|
+
import isPTPrescaledWithSUV from '../../utilities/isPTPrescaledWithSUV';
|
|
7
9
|
import { getImageDataMetadata } from '../../utilities/getImageDataMetadata';
|
|
8
10
|
import invertRgbTransferFunction from '../../utilities/invertRgbTransferFunction';
|
|
9
11
|
import { resolveColormap } from '../../utilities/colormap';
|
|
@@ -32,7 +34,7 @@ export function createEmptyVTKImageData(args) {
|
|
|
32
34
|
}
|
|
33
35
|
export function createVTKImageDataFromImage(image) {
|
|
34
36
|
const { dimensions, direction, numberOfComponents, origin, spacing } = getImageDataMetadata(image);
|
|
35
|
-
const pixelArray = image.voxelManager.getScalarData();
|
|
37
|
+
const pixelArray = image.voxelManager.getScalarData().slice();
|
|
36
38
|
const imageData = createEmptyVTKImageData({
|
|
37
39
|
dimensions,
|
|
38
40
|
direction: Array.from(direction),
|
|
@@ -44,7 +46,16 @@ export function createVTKImageDataFromImage(image) {
|
|
|
44
46
|
updateVTKImageDataWithCornerstoneImage(imageData, image);
|
|
45
47
|
return imageData;
|
|
46
48
|
}
|
|
49
|
+
export function updateVTKImageDataGeometryFromImage(imageData, image) {
|
|
50
|
+
const { direction, origin, spacing } = getImageDataMetadata(image);
|
|
51
|
+
imageData.setOrigin(origin);
|
|
52
|
+
imageData.setDirection(new Float32Array(Array.from(direction)));
|
|
53
|
+
imageData.setSpacing(spacing);
|
|
54
|
+
}
|
|
47
55
|
export function getDefaultImageVOIRange(image) {
|
|
56
|
+
if (isPTPrescaledWithSUV(image)) {
|
|
57
|
+
return { lower: 0, upper: 5 };
|
|
58
|
+
}
|
|
48
59
|
return getVOIRangeFromWindowLevel(image.windowWidth, image.windowCenter, image.voiLUTFunction);
|
|
49
60
|
}
|
|
50
61
|
export function getPlanarCameraState(renderer) {
|
|
@@ -58,7 +69,7 @@ export function getPlanarCameraState(renderer) {
|
|
|
58
69
|
};
|
|
59
70
|
}
|
|
60
71
|
export function applyPlanarImagePresentation(args) {
|
|
61
|
-
const { actor, defaultVOIRange, props } = args;
|
|
72
|
+
const { actor, defaultVOIRange, defaultVOILUTFunction, props } = args;
|
|
62
73
|
const property = actor.getProperty();
|
|
63
74
|
const voiRange = props?.voiRange ?? defaultVOIRange;
|
|
64
75
|
if (props?.visible !== undefined) {
|
|
@@ -77,15 +88,18 @@ export function applyPlanarImagePresentation(args) {
|
|
|
77
88
|
colormap: props?.colormap,
|
|
78
89
|
invert: props?.invert,
|
|
79
90
|
voiRange,
|
|
91
|
+
voiLUTFunction: props?.voiLUTFunction ?? defaultVOILUTFunction,
|
|
80
92
|
});
|
|
81
93
|
property.setUseLookupTableScalarRange(true);
|
|
82
94
|
property.setRGBTransferFunction(0, transferFunction);
|
|
83
95
|
}
|
|
84
96
|
export function createPlanarRGBTransferFunction(args) {
|
|
85
|
-
const { colormap, invert, voiRange } = args;
|
|
97
|
+
const { colormap, invert, voiRange, voiLUTFunction } = args;
|
|
86
98
|
const transferFunction = colormap?.name !== undefined
|
|
87
99
|
? createColormapTransferFunction(colormap, voiRange)
|
|
88
|
-
:
|
|
100
|
+
: voiLUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID
|
|
101
|
+
? createSigmoidRGBTransferFunction(voiRange)
|
|
102
|
+
: createLinearRGBTransferFunction(voiRange);
|
|
89
103
|
if (invert) {
|
|
90
104
|
invertRgbTransferFunction(transferFunction);
|
|
91
105
|
}
|
|
@@ -7,6 +7,7 @@ export declare class RenderModesPanel implements Panel {
|
|
|
7
7
|
setContent(entries: Array<{
|
|
8
8
|
renderingEngineId: string;
|
|
9
9
|
viewportId: string;
|
|
10
|
+
viewportType: string;
|
|
10
11
|
bindings: RenderModePanelBinding[];
|
|
11
12
|
}>): void;
|
|
12
13
|
}
|
|
@@ -16,4 +17,7 @@ export type RenderModePanelBinding = {
|
|
|
16
17
|
referencedId?: string;
|
|
17
18
|
renderMode: string;
|
|
18
19
|
role: 'source' | 'overlay' | 'data';
|
|
20
|
+
scalarType?: string;
|
|
21
|
+
scalarRange?: [number, number];
|
|
22
|
+
numberOfComponents?: number;
|
|
19
23
|
};
|
|
@@ -61,11 +61,19 @@ export class RenderModesPanel {
|
|
|
61
61
|
heading.title = viewportId;
|
|
62
62
|
heading.style.cssText = `
|
|
63
63
|
display:flex;
|
|
64
|
+
align-items:center;
|
|
64
65
|
justify-content:space-between;
|
|
65
66
|
gap:8px;
|
|
66
67
|
margin-bottom:6px;
|
|
67
68
|
color:#ffd84d;
|
|
68
69
|
font-weight:700;
|
|
70
|
+
`;
|
|
71
|
+
const left = document.createElement('div');
|
|
72
|
+
left.style.cssText = `
|
|
73
|
+
display:flex;
|
|
74
|
+
align-items:center;
|
|
75
|
+
gap:6px;
|
|
76
|
+
min-width:0;
|
|
69
77
|
`;
|
|
70
78
|
const name = document.createElement('span');
|
|
71
79
|
name.textContent = truncate(viewportId, 72);
|
|
@@ -75,7 +83,25 @@ export class RenderModesPanel {
|
|
|
75
83
|
text-overflow:ellipsis;
|
|
76
84
|
white-space:nowrap;
|
|
77
85
|
`;
|
|
78
|
-
|
|
86
|
+
left.appendChild(name);
|
|
87
|
+
if (entry.viewportType) {
|
|
88
|
+
const type = document.createElement('span');
|
|
89
|
+
type.textContent = entry.viewportType;
|
|
90
|
+
type.title = entry.viewportType;
|
|
91
|
+
type.style.cssText = `
|
|
92
|
+
flex:0 0 auto;
|
|
93
|
+
padding:2px 6px;
|
|
94
|
+
background:rgba(255, 204, 0, 0.14);
|
|
95
|
+
border:1px solid rgba(255, 204, 0, 0.4);
|
|
96
|
+
border-radius:3px;
|
|
97
|
+
color:#ffe08a;
|
|
98
|
+
font-size:${PANEL_CONFIG.FONT_SIZE}px;
|
|
99
|
+
font-weight:700;
|
|
100
|
+
letter-spacing:0.03em;
|
|
101
|
+
`;
|
|
102
|
+
left.appendChild(type);
|
|
103
|
+
}
|
|
104
|
+
heading.appendChild(left);
|
|
79
105
|
const count = document.createElement('span');
|
|
80
106
|
count.textContent = `${bindings.length} binding${bindings.length === 1 ? '' : 's'}`;
|
|
81
107
|
count.style.cssText = `
|
|
@@ -184,9 +210,30 @@ function createBindingRow(binding) {
|
|
|
184
210
|
binding.referencedId !== binding.actorUID) {
|
|
185
211
|
appendField(fields, 'ref', binding.referencedId, 76);
|
|
186
212
|
}
|
|
213
|
+
if (binding.scalarType) {
|
|
214
|
+
appendField(fields, 'type', formatScalarType(binding.scalarType, binding.numberOfComponents), 40);
|
|
215
|
+
}
|
|
216
|
+
if (binding.scalarRange) {
|
|
217
|
+
appendField(fields, 'range', formatScalarRange(binding.scalarRange), 56);
|
|
218
|
+
}
|
|
187
219
|
row.appendChild(fields);
|
|
188
220
|
return row;
|
|
189
221
|
}
|
|
222
|
+
function formatScalarType(scalarType, numberOfComponents) {
|
|
223
|
+
const friendly = scalarType.replace(/Array$/, '');
|
|
224
|
+
return numberOfComponents && numberOfComponents > 1
|
|
225
|
+
? `${friendly} x${numberOfComponents}`
|
|
226
|
+
: friendly;
|
|
227
|
+
}
|
|
228
|
+
function formatScalarRange([min, max]) {
|
|
229
|
+
return `${formatScalarValue(min)} .. ${formatScalarValue(max)}`;
|
|
230
|
+
}
|
|
231
|
+
function formatScalarValue(value) {
|
|
232
|
+
if (Number.isInteger(value)) {
|
|
233
|
+
return String(value);
|
|
234
|
+
}
|
|
235
|
+
return Number(value.toFixed(2)).toString();
|
|
236
|
+
}
|
|
190
237
|
function appendField(parent, label, value, maxLength) {
|
|
191
238
|
const field = document.createElement('div');
|
|
192
239
|
field.style.cssText = `
|
|
@@ -161,6 +161,7 @@ export class StatsOverlay {
|
|
|
161
161
|
entries.push({
|
|
162
162
|
renderingEngineId: renderingEngine.id,
|
|
163
163
|
viewportId: viewport.id,
|
|
164
|
+
viewportType: viewport.type,
|
|
164
165
|
bindings: this.getViewportBindingDebugEntries(debugViewport, renderModes ?? {}),
|
|
165
166
|
});
|
|
166
167
|
}
|
|
@@ -170,17 +171,32 @@ export class StatsOverlay {
|
|
|
170
171
|
getViewportBindingDebugEntries(viewport, renderModes) {
|
|
171
172
|
const actors = viewport.getActors?.() ?? [];
|
|
172
173
|
const sourceDataId = viewport.getSourceDataId?.();
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
const renderModeEntries = Object.entries(renderModes);
|
|
175
|
+
if (renderModeEntries.length) {
|
|
176
|
+
return renderModeEntries.map(([dataId, renderMode]) => {
|
|
177
|
+
const role = resolveBindingRole(viewport, dataId, sourceDataId);
|
|
178
|
+
const actor = role === 'source'
|
|
179
|
+
? viewport.getDefaultActor?.()
|
|
180
|
+
: findActorForDataId(actors, dataId);
|
|
181
|
+
return {
|
|
182
|
+
actorUID: actor?.uid,
|
|
183
|
+
dataId,
|
|
184
|
+
referencedId: actor?.referencedId,
|
|
185
|
+
renderMode,
|
|
186
|
+
role,
|
|
187
|
+
...getActorScalarInfo(actor),
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return actors.map((actor) => {
|
|
192
|
+
const dataId = actor.representationUID ?? actor.uid ?? '';
|
|
178
193
|
return {
|
|
179
|
-
actorUID: actor
|
|
194
|
+
actorUID: actor.uid,
|
|
180
195
|
dataId,
|
|
181
|
-
referencedId: actor
|
|
182
|
-
renderMode,
|
|
183
|
-
role,
|
|
196
|
+
referencedId: actor.referencedId,
|
|
197
|
+
renderMode: '-',
|
|
198
|
+
role: resolveBindingRole(viewport, dataId, sourceDataId),
|
|
199
|
+
...getActorScalarInfo(actor),
|
|
184
200
|
};
|
|
185
201
|
});
|
|
186
202
|
}
|
|
@@ -309,3 +325,44 @@ function findActorForDataId(actors, dataId) {
|
|
|
309
325
|
actor.representationUID === dataId ||
|
|
310
326
|
actor.referencedId === dataId);
|
|
311
327
|
}
|
|
328
|
+
function getActorScalarInfo(entry) {
|
|
329
|
+
const inputData = entry?.actor?.getMapper?.()?.getInputData?.();
|
|
330
|
+
if (!inputData) {
|
|
331
|
+
return {};
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
const scalars = inputData.getPointData?.()?.getScalars?.();
|
|
335
|
+
if (scalars?.getDataType) {
|
|
336
|
+
const numberOfComponents = scalars.getNumberOfComponents?.() ?? 1;
|
|
337
|
+
const range = numberOfComponents > 1 ? scalars.getRange?.(0) : scalars.getRange?.();
|
|
338
|
+
return {
|
|
339
|
+
scalarType: scalars.getDataType(),
|
|
340
|
+
scalarRange: normalizeRange(range),
|
|
341
|
+
numberOfComponents,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
const scalarData = inputData.getScalarData?.();
|
|
345
|
+
if (scalarData?.constructor?.name) {
|
|
346
|
+
const range = Number.isFinite(inputData.minPixelValue) &&
|
|
347
|
+
Number.isFinite(inputData.maxPixelValue)
|
|
348
|
+
? [inputData.minPixelValue, inputData.maxPixelValue]
|
|
349
|
+
: undefined;
|
|
350
|
+
return {
|
|
351
|
+
scalarType: scalarData.constructor.name,
|
|
352
|
+
scalarRange: normalizeRange(range),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
}
|
|
358
|
+
return {};
|
|
359
|
+
}
|
|
360
|
+
function normalizeRange(range) {
|
|
361
|
+
if (!range ||
|
|
362
|
+
range.length < 2 ||
|
|
363
|
+
!Number.isFinite(range[0]) ||
|
|
364
|
+
!Number.isFinite(range[1])) {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
return [range[0], range[1]];
|
|
368
|
+
}
|
package/dist/esm/init.js
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IViewport, ViewReference } from './IViewport';
|
|
2
|
+
import type ICamera from './ICamera';
|
|
3
|
+
import type ResolvedViewportView from '../RenderingEngine/GenericViewport/ResolvedViewportView';
|
|
4
|
+
export type ViewportContentMode = 'stack' | 'volume' | 'volume3d' | 'video' | 'wholeSlide' | 'ecg' | 'empty' | 'unknown';
|
|
5
|
+
export interface IGenericViewport extends IViewport {
|
|
6
|
+
setDisplaySets(...entries: Array<{
|
|
7
|
+
displaySetId: string;
|
|
8
|
+
options?: unknown;
|
|
9
|
+
}>): Promise<void>;
|
|
10
|
+
addDisplaySet(displaySetId: string, options: unknown): Promise<void>;
|
|
11
|
+
removeData(displaySetId: string): void;
|
|
12
|
+
setDisplaySetPresentation(props: unknown): void;
|
|
13
|
+
setDisplaySetPresentation(dataId: string, props: unknown): void;
|
|
14
|
+
getDisplaySetPresentation(displaySetId: string): unknown;
|
|
15
|
+
setViewState(viewStatePatch: unknown): void;
|
|
16
|
+
getViewState(): unknown;
|
|
17
|
+
updateViewState(updater: unknown): void;
|
|
18
|
+
resetViewState(options?: unknown): boolean;
|
|
19
|
+
getCurrentMode(): ViewportContentMode;
|
|
20
|
+
setViewReference(viewReference: ViewReference): void;
|
|
21
|
+
getResolvedView(): ResolvedViewportView<unknown, ICamera<unknown>> | undefined;
|
|
22
|
+
getCurrentImageId(): string | undefined;
|
|
23
|
+
}
|
|
24
|
+
export type { IGenericViewport as default };
|
|
File without changes
|
|
File without changes
|
|
@@ -15,6 +15,8 @@ import type IStreamingVolumeProperties from './IStreamingVolumeProperties';
|
|
|
15
15
|
import type CustomEventType from './CustomEventType';
|
|
16
16
|
import type { LocalVolumeOptions } from './../loaders/volumeLoader';
|
|
17
17
|
import type { IViewport, PublicViewportInput, ViewReferenceSpecifier, DataSetOptions, ReferenceCompatibleOptions, ViewReference, ViewPresentation, ViewPresentationSelector, ViewportInput, RenderingEngineResizeOptions } from './IViewport';
|
|
18
|
+
import type IGenericViewport from './IGenericViewport';
|
|
19
|
+
import type { ViewportContentMode } from './IGenericViewport';
|
|
18
20
|
import type { VolumeActor, Actor, ActorEntry, ActorMapperProxy, ImageActor, ICanvasActor } from './IActor';
|
|
19
21
|
import { ActorRenderMode } from './IActor';
|
|
20
22
|
import type { IImageLoadObject, IVolumeLoadObject, IGeometryLoadObject } from './ILoadObject';
|
|
@@ -36,6 +38,7 @@ import type CPUIImageData from './CPUIImageData';
|
|
|
36
38
|
import type { CPUImageData } from './CPUIImageData';
|
|
37
39
|
import type IImage from './IImage';
|
|
38
40
|
import type { PTScaling, Scaling, ScalingParameters } from './ScalingParameters';
|
|
41
|
+
import type { ScalingDescriptor } from './ScalingDescriptor';
|
|
39
42
|
import type StackViewportProperties from './StackViewportProperties';
|
|
40
43
|
import type VolumeViewportProperties from './VolumeViewportProperties';
|
|
41
44
|
import type IViewportId from './IViewportId';
|
|
@@ -112,5 +115,5 @@ import type { ResetCameraOptions } from './ICamera';
|
|
|
112
115
|
import type { ViewportType, ViewportTypeConstants, ViewportTypeRegistry } from './ViewportTypeRegistry';
|
|
113
116
|
export type * from './MetadataModuleTypes';
|
|
114
117
|
export type * from './InstanceTypes';
|
|
115
|
-
export type { Cornerstone3DConfig, IBaseStreamingImageVolume, ICamera, ResetCameraOptions, IStackViewport, IVideoViewport, IECGViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, RenderingEngineResizeOptions, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ActorMapperProxy, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, InternalECGCamera, ECGViewportInput, ECGChannel, ECGWaveformData, ECGViewportProperties, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, VtkOffscreenMultiRenderWindow, ViewportDataReference, ViewportType, ViewportTypeRegistry, ViewportTypeConstants, };
|
|
118
|
+
export type { Cornerstone3DConfig, IBaseStreamingImageVolume, ICamera, ResetCameraOptions, IStackViewport, IVideoViewport, IECGViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, ScalingDescriptor, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, IGenericViewport, ViewportContentMode, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, RenderingEngineResizeOptions, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ActorMapperProxy, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, InternalECGCamera, ECGViewportInput, ECGChannel, ECGWaveformData, ECGViewportProperties, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, VtkOffscreenMultiRenderWindow, ViewportDataReference, ViewportType, ViewportTypeRegistry, ViewportTypeConstants, };
|
|
116
119
|
export { ActorRenderMode };
|
|
@@ -23,6 +23,7 @@ export default class VoxelManager<T> {
|
|
|
23
23
|
invalidateCache?: () => void;
|
|
24
24
|
getRange: () => [number, number];
|
|
25
25
|
private scalarData;
|
|
26
|
+
private _scalarDataIsCachedExpansion;
|
|
26
27
|
private _sliceDataCache;
|
|
27
28
|
readonly _id: string;
|
|
28
29
|
points: Set<number>;
|
|
@@ -59,6 +60,7 @@ export default class VoxelManager<T> {
|
|
|
59
60
|
max: any;
|
|
60
61
|
};
|
|
61
62
|
setAtIndex: (index: any, v: any) => boolean;
|
|
63
|
+
private invalidateCachedScalarExpansion;
|
|
62
64
|
toIJK(index: number): Point3;
|
|
63
65
|
getMiddleSliceData: () => PixelDataTypedArray;
|
|
64
66
|
toIndex(ijk: Point3): number;
|
|
@@ -20,6 +20,7 @@ export default class VoxelManager {
|
|
|
20
20
|
[Infinity, -Infinity],
|
|
21
21
|
];
|
|
22
22
|
this.scalarData = null;
|
|
23
|
+
this._scalarDataIsCachedExpansion = false;
|
|
23
24
|
this._sliceDataCache = null;
|
|
24
25
|
this.getAtIJK = (i, j, k) => {
|
|
25
26
|
return this._get(i + j * this.width + k * this.frameSize);
|
|
@@ -30,6 +31,7 @@ export default class VoxelManager {
|
|
|
30
31
|
if (changed !== false) {
|
|
31
32
|
this.modifiedSlices.add(k);
|
|
32
33
|
VoxelManager.addBounds(this.boundsIJK, [i, j, k]);
|
|
34
|
+
this.invalidateCachedScalarExpansion();
|
|
33
35
|
}
|
|
34
36
|
return changed;
|
|
35
37
|
};
|
|
@@ -44,6 +46,7 @@ export default class VoxelManager {
|
|
|
44
46
|
const pointIJK = this.toIJK(index);
|
|
45
47
|
this.modifiedSlices.add(pointIJK[2]);
|
|
46
48
|
VoxelManager.addBounds(this.boundsIJK, pointIJK);
|
|
49
|
+
this.invalidateCachedScalarExpansion();
|
|
47
50
|
}
|
|
48
51
|
return changed;
|
|
49
52
|
};
|
|
@@ -209,6 +212,12 @@ export default class VoxelManager {
|
|
|
209
212
|
this.forEach(callback, { boundsIJK: this.getDefaultBounds() });
|
|
210
213
|
return { min, max };
|
|
211
214
|
}
|
|
215
|
+
invalidateCachedScalarExpansion() {
|
|
216
|
+
if (this._scalarDataIsCachedExpansion) {
|
|
217
|
+
this.scalarData = null;
|
|
218
|
+
this._scalarDataIsCachedExpansion = false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
212
221
|
toIJK(index) {
|
|
213
222
|
return [
|
|
214
223
|
index % this.width,
|
|
@@ -269,7 +278,8 @@ export default class VoxelManager {
|
|
|
269
278
|
if (this._getScalarData) {
|
|
270
279
|
const scalarData = this._getScalarData();
|
|
271
280
|
if (storeScalarData) {
|
|
272
|
-
|
|
281
|
+
this.scalarData = scalarData;
|
|
282
|
+
this._scalarDataIsCachedExpansion = true;
|
|
273
283
|
}
|
|
274
284
|
return scalarData;
|
|
275
285
|
}
|
|
@@ -277,6 +287,7 @@ export default class VoxelManager {
|
|
|
277
287
|
}
|
|
278
288
|
setScalarData(newScalarData) {
|
|
279
289
|
this.scalarData = newScalarData;
|
|
290
|
+
this._scalarDataIsCachedExpansion = false;
|
|
280
291
|
}
|
|
281
292
|
getScalarDataLength() {
|
|
282
293
|
if (this.scalarData) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IViewport } from '../types/IViewport';
|
|
2
|
+
import type { ScalingDescriptor } from '../types/ScalingDescriptor';
|
|
3
|
+
type VolumeLike = {
|
|
4
|
+
metadata?: {
|
|
5
|
+
Modality?: string;
|
|
6
|
+
};
|
|
7
|
+
scaling?: object;
|
|
8
|
+
} | undefined;
|
|
9
|
+
declare function _getScalingDescriptor(viewport: IViewport, targetId?: string, getVolume?: (volumeId: string) => VolumeLike): ScalingDescriptor | undefined;
|
|
10
|
+
export { _getScalingDescriptor };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isGenericViewport } from './viewportCapabilities';
|
|
2
|
+
import { getVolumeId } from './getVolumeId';
|
|
3
|
+
import { resolveGenericViewportVolumeId } from './resolveGenericViewportVolumeId';
|
|
4
|
+
function _getScalingDescriptor(viewport, targetId, getVolume) {
|
|
5
|
+
if (!getVolume) {
|
|
6
|
+
throw new Error('getVolume is required, use the utilities export instead');
|
|
7
|
+
}
|
|
8
|
+
if (isGenericViewport(viewport)) {
|
|
9
|
+
const resolvedVolumeId = resolveGenericViewportVolumeId(viewport, targetId);
|
|
10
|
+
const volume = resolvedVolumeId ? getVolume(resolvedVolumeId) : undefined;
|
|
11
|
+
const imageData = viewport.getImageData?.();
|
|
12
|
+
return {
|
|
13
|
+
modality: volume?.metadata?.Modality ?? imageData?.metadata?.Modality,
|
|
14
|
+
isPreScaled: isScalingPresent(volume?.scaling),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (typeof viewport.setVolumes === 'function') {
|
|
18
|
+
const volumeViewport = viewport;
|
|
19
|
+
const volumeId = targetId
|
|
20
|
+
? getVolumeId(targetId)
|
|
21
|
+
: volumeViewport.getVolumeId();
|
|
22
|
+
const volume = volumeId ? getVolume(volumeId) : undefined;
|
|
23
|
+
return {
|
|
24
|
+
modality: volume?.metadata?.Modality,
|
|
25
|
+
isPreScaled: isScalingPresent(volume?.scaling),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (typeof viewport.setStack === 'function') {
|
|
29
|
+
const stackViewport = viewport;
|
|
30
|
+
const { preScale } = stackViewport.getImageData() || {};
|
|
31
|
+
return {
|
|
32
|
+
modality: stackViewport.modality,
|
|
33
|
+
isPreScaled: !!preScale?.scaled,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
function isScalingPresent(scaling) {
|
|
39
|
+
return !!scaling && Object.keys(scaling).length > 0;
|
|
40
|
+
}
|
|
41
|
+
export { _getScalingDescriptor };
|
|
@@ -59,10 +59,9 @@ export default function getTargetVolumeAndSpacingInNormalDir(viewport, camera, t
|
|
|
59
59
|
return smallest;
|
|
60
60
|
}
|
|
61
61
|
function getSpacingInNormal(imageVolume, viewPlaneNormal, viewport, useSlabThickness = false) {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
spacingInNormalDirection = getSpacingInNormalDirection(imageVolume, viewPlaneNormal);
|
|
62
|
+
const slabThickness = viewport.getProperties?.()?.slabThickness;
|
|
63
|
+
if (slabThickness && useSlabThickness) {
|
|
64
|
+
return slabThickness;
|
|
66
65
|
}
|
|
67
|
-
return
|
|
66
|
+
return getSpacingInNormalDirection(imageVolume, viewPlaneNormal);
|
|
68
67
|
}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
|
+
import { _getScalingDescriptor } from './getScalingDescriptor';
|
|
1
2
|
function _getViewportModality(viewport, volumeId, getVolume) {
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
const descriptor = _getScalingDescriptor(viewport, volumeId, getVolume);
|
|
4
|
+
if (!descriptor) {
|
|
5
|
+
throw new Error('Invalid viewport type');
|
|
4
6
|
}
|
|
5
|
-
|
|
6
|
-
return viewport.modality;
|
|
7
|
-
}
|
|
8
|
-
if (viewport.setVolumes) {
|
|
9
|
-
volumeId = volumeId ?? viewport.getVolumeId();
|
|
10
|
-
if (!volumeId || !getVolume) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
const volume = getVolume(volumeId);
|
|
14
|
-
return volume.metadata.Modality;
|
|
15
|
-
}
|
|
16
|
-
throw new Error('Invalid viewport type');
|
|
7
|
+
return descriptor.modality;
|
|
17
8
|
}
|
|
18
9
|
export { _getViewportModality };
|
|
@@ -87,6 +87,7 @@ import FrameRange from './FrameRange';
|
|
|
87
87
|
import fnv1aHash from './fnv1aHash';
|
|
88
88
|
import { getImageDataMetadata } from './getImageDataMetadata';
|
|
89
89
|
import { buildMetadata } from './buildMetadata';
|
|
90
|
+
import { resolveGenericViewportVolumeId } from './resolveGenericViewportVolumeId';
|
|
90
91
|
import getDynamicVolumeInfo from './getDynamicVolumeInfo';
|
|
91
92
|
import autoLoad from './autoLoad';
|
|
92
93
|
import scaleArray from './scaleArray';
|
|
@@ -106,9 +107,10 @@ export * from './getPixelSpacingInformation';
|
|
|
106
107
|
export * from './getPlaneCubeIntersectionDimensions';
|
|
107
108
|
export * from './rotateToViewCoordinates';
|
|
108
109
|
import { asArray } from './asArray';
|
|
109
|
-
import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI } from './viewportCapabilities';
|
|
110
|
+
import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode } from './viewportCapabilities';
|
|
110
111
|
import { getNormalizedAspectRatio } from './getNormalizedAspectRatio';
|
|
111
112
|
export { updatePlaneRestriction } from './updatePlaneRestriction';
|
|
112
113
|
declare const getViewportModality: (viewport: IViewport, volumeId?: string) => string;
|
|
114
|
+
declare const getScalingDescriptor: (viewport: IViewport, targetId?: string) => import("../types").ScalingDescriptor;
|
|
113
115
|
export * from './isEqual';
|
|
114
|
-
export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, getNormalizedAspectRatio, };
|
|
116
|
+
export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, getScalingDescriptor, resolveGenericViewportVolumeId, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode, getNormalizedAspectRatio, };
|
|
@@ -87,6 +87,8 @@ import fnv1aHash from './fnv1aHash';
|
|
|
87
87
|
import { getImageDataMetadata } from './getImageDataMetadata';
|
|
88
88
|
import { buildMetadata } from './buildMetadata';
|
|
89
89
|
import { _getViewportModality } from './getViewportModality';
|
|
90
|
+
import { _getScalingDescriptor } from './getScalingDescriptor';
|
|
91
|
+
import { resolveGenericViewportVolumeId } from './resolveGenericViewportVolumeId';
|
|
90
92
|
import cache from '../cache/cache';
|
|
91
93
|
import getDynamicVolumeInfo from './getDynamicVolumeInfo';
|
|
92
94
|
import autoLoad from './autoLoad';
|
|
@@ -107,9 +109,10 @@ export * from './getPixelSpacingInformation';
|
|
|
107
109
|
export * from './getPlaneCubeIntersectionDimensions';
|
|
108
110
|
export * from './rotateToViewCoordinates';
|
|
109
111
|
import { asArray } from './asArray';
|
|
110
|
-
import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, } from './viewportCapabilities';
|
|
112
|
+
import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode, } from './viewportCapabilities';
|
|
111
113
|
import { getNormalizedAspectRatio } from './getNormalizedAspectRatio';
|
|
112
114
|
export { updatePlaneRestriction } from './updatePlaneRestriction';
|
|
113
115
|
const getViewportModality = (viewport, volumeId) => _getViewportModality(viewport, volumeId, cache.getVolume);
|
|
116
|
+
const getScalingDescriptor = (viewport, targetId) => _getScalingDescriptor(viewport, targetId, cache.getVolume);
|
|
114
117
|
export * from './isEqual';
|
|
115
|
-
export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, getNormalizedAspectRatio, };
|
|
118
|
+
export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, getScalingDescriptor, resolveGenericViewportVolumeId, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode, getNormalizedAspectRatio, };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getVolumeId } from './getVolumeId';
|
|
2
|
+
export function resolveGenericViewportVolumeId(viewport, targetId) {
|
|
3
|
+
const genericViewport = viewport;
|
|
4
|
+
const actors = genericViewport.getActors?.() ?? [];
|
|
5
|
+
const matchedActor = targetId
|
|
6
|
+
? (actors.find((actor) => actor.referencedId === targetId) ??
|
|
7
|
+
actors.find((actor) => actor.referencedId?.endsWith(`:${targetId}`)))
|
|
8
|
+
: undefined;
|
|
9
|
+
return (matchedActor?.referencedId ??
|
|
10
|
+
(targetId ? getVolumeId(targetId) : undefined) ??
|
|
11
|
+
genericViewport.getDefaultActor?.()?.referencedId);
|
|
12
|
+
}
|