@cornerstonejs/core 5.4.15 → 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.
@@ -62,7 +62,8 @@ declare class PlanarViewReferenceController {
62
62
  private normalizeVolumeViewReference;
63
63
  private deriveOrientationFromPlaneRestriction;
64
64
  private isPlaneRestrictionCompatibleWithNormal;
65
- private resolveVolumeReferenceImageIdIndex;
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 nextImageIdIndex = this.resolveVolumeReferenceImageIdIndex(referenceContext, normalizedViewRef, effectiveViewPlaneNormal, isOppositeNormal);
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
- (typeof nextImageIdIndex === 'number'
271
- ? this.host.getVolumeSliceWorldPointForImageIdIndex(nextImageIdIndex)
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
- resolveVolumeReferenceImageIdIndex(referenceContext, viewRef, effectiveViewPlaneNormal, isOppositeNormal) {
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 Math.min(Math.max(0, targetSliceIndex), maxImageIdIndex);
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
- return this.findImageIdIndexByReference(imageIds, referencedImageId);
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 Math.min(Math.max(0, viewRef.sliceIndex), maxImageIdIndex);
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);
@@ -1 +1 @@
1
- export declare const version = "5.4.15";
1
+ export declare const version = "5.4.16";
@@ -1 +1 @@
1
- export const version = '5.4.15';
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.15",
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.15",
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.15"
95
+ "@cornerstonejs/metadata": "5.4.16"
96
96
  },
97
97
  "peerDependencies": {
98
- "@cornerstonejs/metadata": "5.4.15",
99
- "@cornerstonejs/utils": "5.4.15"
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": "642314b8d345265edfff3fb7c18c2d2b8b53f88a"
112
+ "gitHead": "6d2d80bfa445c91deafe0d7e4a02b8de1a4a4da8"
113
113
  }