@cornerstonejs/core 5.4.14 → 5.4.16
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/GenericViewport/Planar/DefaultPlanarDataProvider.js +14 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewReferenceController.d.ts +2 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewReferenceController.js +24 -8
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.js +10 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarSliceBasis.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarSliceBasis.js +13 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +6 -6
|
@@ -29,11 +29,24 @@ export class DefaultPlanarDataProvider {
|
|
|
29
29
|
const imageIds = imageVolume.imageIds
|
|
30
30
|
? imageVolume.imageIds
|
|
31
31
|
: dataSet.imageIds;
|
|
32
|
+
let volumeInitialImageIdIndex = initialImageIdIndex;
|
|
33
|
+
if (initialImageIdIndex !== undefined && imageIds !== dataSet.imageIds) {
|
|
34
|
+
const requestedImageId = dataSet.imageIds[initialImageIdIndex];
|
|
35
|
+
const remappedIndex = imageIds.indexOf(requestedImageId);
|
|
36
|
+
if (remappedIndex >= 0) {
|
|
37
|
+
volumeInitialImageIdIndex = remappedIndex;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.warn(`[PlanarViewport] initialImageIdIndex remap failed: imageId ` +
|
|
41
|
+
`"${requestedImageId}" not found in the volume imageIds; ` +
|
|
42
|
+
`using the original index ${initialImageIdIndex}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
32
45
|
return {
|
|
33
46
|
id: dataId,
|
|
34
47
|
type: 'image',
|
|
35
48
|
imageIds,
|
|
36
|
-
initialImageIdIndex,
|
|
49
|
+
initialImageIdIndex: volumeInitialImageIdIndex,
|
|
37
50
|
acquisitionOrientation: options.acquisitionOrientation,
|
|
38
51
|
imageData: dataSet.imageData,
|
|
39
52
|
imageVolume,
|
|
@@ -62,7 +62,8 @@ declare class PlanarViewReferenceController {
|
|
|
62
62
|
private normalizeVolumeViewReference;
|
|
63
63
|
private deriveOrientationFromPlaneRestriction;
|
|
64
64
|
private isPlaneRestrictionCompatibleWithNormal;
|
|
65
|
-
private
|
|
65
|
+
private resolveVolumeReferenceSliceTarget;
|
|
66
|
+
private toVolumeSliceTarget;
|
|
66
67
|
private getImageIdsForReferenceContext;
|
|
67
68
|
private findImageIdIndexByReference;
|
|
68
69
|
private getCurrentPlanarRendering;
|
|
@@ -4,6 +4,7 @@ import getClosestImageId from '../../../utilities/getClosestImageId.js';
|
|
|
4
4
|
import imageIdToURI from '../../../utilities/imageIdToURI.js';
|
|
5
5
|
import isEqual from '../../../utilities/isEqual.js';
|
|
6
6
|
import { getDimensionGroupReferenceContext, } from '../genericViewportReferenceCompatibility.js';
|
|
7
|
+
import { getVolumeImageIdIndexWorldPoint } from './planarSliceBasis.js';
|
|
7
8
|
import { getPlanarReferencedImageId, getPlanarViewReference, getPlanarViewReferenceId, isPlanarPlaneViewable, } from './planarViewReference.js';
|
|
8
9
|
import { resolvePlanarViewportView } from './PlanarResolvedView.js';
|
|
9
10
|
class PlanarViewReferenceController {
|
|
@@ -254,7 +255,7 @@ class PlanarViewReferenceController {
|
|
|
254
255
|
const effectiveViewPlaneNormal = refViewPlaneNormal ?? currentViewPlaneNormal;
|
|
255
256
|
const isOppositeNormal = !shouldReorient &&
|
|
256
257
|
this.areNormalsOpposite(currentViewPlaneNormal, effectiveViewPlaneNormal);
|
|
257
|
-
const
|
|
258
|
+
const sliceTarget = this.resolveVolumeReferenceSliceTarget(referenceContext, normalizedViewRef, effectiveViewPlaneNormal, isOppositeNormal);
|
|
258
259
|
const viewStatePatch = {};
|
|
259
260
|
if (shouldReorient && refViewPlaneNormal) {
|
|
260
261
|
viewStatePatch.orientation = {
|
|
@@ -267,8 +268,9 @@ class PlanarViewReferenceController {
|
|
|
267
268
|
};
|
|
268
269
|
}
|
|
269
270
|
const sliceWorldPoint = normalizedViewRef.cameraFocalPoint ??
|
|
270
|
-
|
|
271
|
-
|
|
271
|
+
sliceTarget?.sliceWorldPoint ??
|
|
272
|
+
(typeof sliceTarget?.imageIdIndex === 'number'
|
|
273
|
+
? this.host.getVolumeSliceWorldPointForImageIdIndex(sliceTarget.imageIdIndex)
|
|
272
274
|
: undefined);
|
|
273
275
|
if (sliceWorldPoint) {
|
|
274
276
|
viewStatePatch.slice = {
|
|
@@ -346,7 +348,7 @@ class PlanarViewReferenceController {
|
|
|
346
348
|
(!planeRestriction.inPlaneVector2 ||
|
|
347
349
|
isEqual(0, vec3.dot(viewPlaneNormal, planeRestriction.inPlaneVector2))));
|
|
348
350
|
}
|
|
349
|
-
|
|
351
|
+
resolveVolumeReferenceSliceTarget(referenceContext, viewRef, effectiveViewPlaneNormal, isOppositeNormal) {
|
|
350
352
|
const { rendering } = referenceContext;
|
|
351
353
|
if (rendering.renderMode !== ActorRenderMode.CPU_VOLUME &&
|
|
352
354
|
rendering.renderMode !== ActorRenderMode.VTK_VOLUME_SLICE) {
|
|
@@ -360,21 +362,35 @@ class PlanarViewReferenceController {
|
|
|
360
362
|
const targetSliceIndex = isOppositeNormal
|
|
361
363
|
? maxImageIdIndex - viewRef.sliceIndex
|
|
362
364
|
: viewRef.sliceIndex;
|
|
363
|
-
return
|
|
365
|
+
return {
|
|
366
|
+
imageIdIndex: Math.min(Math.max(0, targetSliceIndex), maxImageIdIndex),
|
|
367
|
+
};
|
|
364
368
|
}
|
|
365
369
|
const referencedImageIndex = this.findImageIdIndexByReference(imageIds, viewRef.referencedImageId, viewRef.referencedImageURI);
|
|
366
370
|
if (typeof referencedImageIndex === 'number') {
|
|
367
|
-
return referencedImageIndex;
|
|
371
|
+
return this.toVolumeSliceTarget(rendering.imageVolume, referencedImageIndex);
|
|
368
372
|
}
|
|
369
373
|
const targetPoint = viewRef.cameraFocalPoint ?? viewRef.planeRestriction?.point;
|
|
370
374
|
if (targetPoint) {
|
|
371
375
|
const referencedImageId = getClosestImageId(rendering.imageVolume, targetPoint, effectiveViewPlaneNormal);
|
|
372
|
-
|
|
376
|
+
const closestImageIndex = this.findImageIdIndexByReference(imageIds, referencedImageId);
|
|
377
|
+
if (typeof closestImageIndex === 'number') {
|
|
378
|
+
return this.toVolumeSliceTarget(rendering.imageVolume, closestImageIndex);
|
|
379
|
+
}
|
|
380
|
+
return;
|
|
373
381
|
}
|
|
374
382
|
if (typeof viewRef.sliceIndex === 'number') {
|
|
375
|
-
return
|
|
383
|
+
return {
|
|
384
|
+
imageIdIndex: Math.min(Math.max(0, viewRef.sliceIndex), maxImageIdIndex),
|
|
385
|
+
};
|
|
376
386
|
}
|
|
377
387
|
}
|
|
388
|
+
toVolumeSliceTarget(imageVolume, imageIdListIndex) {
|
|
389
|
+
const sliceWorldPoint = getVolumeImageIdIndexWorldPoint(imageVolume, imageIdListIndex);
|
|
390
|
+
return sliceWorldPoint
|
|
391
|
+
? { sliceWorldPoint }
|
|
392
|
+
: { imageIdIndex: imageIdListIndex };
|
|
393
|
+
}
|
|
378
394
|
getImageIdsForReferenceContext(referenceContext) {
|
|
379
395
|
return (referenceContext.data.imageVolume?.imageIds ||
|
|
380
396
|
referenceContext.data.imageIds);
|
|
@@ -24,7 +24,7 @@ import { cloneDisplayArea, createDefaultPlanarViewState, normalizePlanarViewStat
|
|
|
24
24
|
import { normalizePlanarScale, } from './planarCameraScale.js';
|
|
25
25
|
import { getPlanarProjectionPan, getPlanarProjectionScale, getPlanarProjectionSnapshot, getPlanarProjectionZoom, } from './planarProjectionAdapter.js';
|
|
26
26
|
import { getPlanarViewStateCanvasDimensions, resolvePlanarViewportView, } from './PlanarResolvedView.js';
|
|
27
|
-
import { createPlanarCpuVolumeSliceBasis, createPlanarVolumeSliceBasis, } from './planarSliceBasis.js';
|
|
27
|
+
import { createPlanarCpuVolumeSliceBasis, createPlanarVolumeSliceBasis, getVolumeImageIdIndexWorldPoint, } from './planarSliceBasis.js';
|
|
28
28
|
import PlanarMountedData from './PlanarMountedData.js';
|
|
29
29
|
import PlanarViewReferenceController from './PlanarViewReferenceController.js';
|
|
30
30
|
class PlanarViewport extends GenericViewport {
|
|
@@ -1069,6 +1069,15 @@ class PlanarViewport extends GenericViewport {
|
|
|
1069
1069
|
const initialImageIdIndex = orientation === OrientationAxis.ACQUISITION
|
|
1070
1070
|
? planarData.initialImageIdIndex
|
|
1071
1071
|
: undefined;
|
|
1072
|
+
if (typeof initialImageIdIndex === 'number') {
|
|
1073
|
+
const sliceWorldPoint = getVolumeImageIdIndexWorldPoint(planarData.imageVolume, initialImageIdIndex);
|
|
1074
|
+
if (sliceWorldPoint) {
|
|
1075
|
+
return {
|
|
1076
|
+
kind: 'volumePoint',
|
|
1077
|
+
sliceWorldPoint,
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1072
1081
|
const { sliceBasis } = createSliceBasis({
|
|
1073
1082
|
canvasHeight: height,
|
|
1074
1083
|
canvasWidth: width,
|
|
@@ -20,6 +20,7 @@ export declare function createPlanarCpuImageSliceBasis(args: {
|
|
|
20
20
|
canvasWidth: number;
|
|
21
21
|
canvasHeight: number;
|
|
22
22
|
}): PlanarSliceBasis;
|
|
23
|
+
export declare function getVolumeImageIdIndexWorldPoint(imageVolume: IImageVolume | undefined, imageIdIndex: number): Point3 | undefined;
|
|
23
24
|
export declare function resolvePlanarVolumeImageIdIndex(args: {
|
|
24
25
|
viewState?: PlanarViewState;
|
|
25
26
|
fallbackImageIdIndex?: number;
|
|
@@ -139,6 +139,19 @@ function getGeometricImageVolumeCenter(imageVolume, viewPlaneNormal) {
|
|
|
139
139
|
}
|
|
140
140
|
return vec3.scale(center, center, 1 / corners.length);
|
|
141
141
|
}
|
|
142
|
+
export function getVolumeImageIdIndexWorldPoint(imageVolume, imageIdIndex) {
|
|
143
|
+
const imageData = imageVolume?.imageData;
|
|
144
|
+
if (!imageData) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const dimensions = imageData.getDimensions();
|
|
148
|
+
const k = Math.min(Math.max(0, imageIdIndex), dimensions[2] - 1);
|
|
149
|
+
return imageData.indexToWorld([
|
|
150
|
+
(dimensions[0] - 1) / 2,
|
|
151
|
+
(dimensions[1] - 1) / 2,
|
|
152
|
+
k,
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
142
155
|
function getSliceMetrics(args) {
|
|
143
156
|
const { imageVolume, viewPlaneNormal } = args;
|
|
144
157
|
const corners = buildImageVolumeCorners(imageVolume);
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "5.4.
|
|
1
|
+
export declare const version = "5.4.16";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '5.4.
|
|
1
|
+
export const version = '5.4.16';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/core",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.16",
|
|
4
4
|
"description": "Cornerstone3D Core",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/esm/index.d.ts",
|
|
@@ -85,18 +85,18 @@
|
|
|
85
85
|
"prepublishOnly": "pnpm run build"
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"@cornerstonejs/utils": "5.4.
|
|
88
|
+
"@cornerstonejs/utils": "5.4.16",
|
|
89
89
|
"@kitware/vtk.js": "35.5.3",
|
|
90
90
|
"comlink": "4.4.2",
|
|
91
91
|
"gl-matrix": "3.4.3",
|
|
92
92
|
"loglevel": "1.9.2"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
|
-
"@cornerstonejs/metadata": "5.4.
|
|
95
|
+
"@cornerstonejs/metadata": "5.4.16"
|
|
96
96
|
},
|
|
97
97
|
"peerDependencies": {
|
|
98
|
-
"@cornerstonejs/metadata": "5.4.
|
|
99
|
-
"@cornerstonejs/utils": "5.4.
|
|
98
|
+
"@cornerstonejs/metadata": "5.4.16",
|
|
99
|
+
"@cornerstonejs/utils": "5.4.16"
|
|
100
100
|
},
|
|
101
101
|
"contributors": [
|
|
102
102
|
{
|
|
@@ -109,5 +109,5 @@
|
|
|
109
109
|
"type": "individual",
|
|
110
110
|
"url": "https://ohif.org/donate"
|
|
111
111
|
},
|
|
112
|
-
"gitHead": "
|
|
112
|
+
"gitHead": "6d2d80bfa445c91deafe0d7e4a02b8de1a4a4da8"
|
|
113
113
|
}
|