@ohif/app 3.9.0-beta.23 → 3.9.0-beta.24

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.
Files changed (32) hide show
  1. package/dist/{117.bundle.772ce244eee25d9b7316.js → 117.bundle.ba41cf7978afb629dcff.js} +16 -3
  2. package/dist/{164.bundle.3221590f5e6855086889.js → 164.bundle.79cc35bc3e6b792636cd.js} +16 -3
  3. package/dist/{236.bundle.d3a631d79ee8952e3c60.js → 236.bundle.343bcd0be60d0ae61901.js} +8 -1
  4. package/dist/{363.bundle.7dd957eeb0177cdb808c.js → 363.bundle.27df904aebd9be296ee9.js} +88 -91
  5. package/dist/{370.bundle.baa389d217c390b0e92b.js → 370.bundle.b14c810be6e912b10b5c.js} +2 -2
  6. package/dist/{461.bundle.b44727b0b162f4b10b5e.js → 461.bundle.2c6ec9c73b2dc2419418.js} +2 -2
  7. package/dist/{501.bundle.7d5003758fa3ffbb344b.js → 501.bundle.3dcc63f03d9c252a9bee.js} +135 -65
  8. package/dist/{717.bundle.06a976a9200c0c4fa395.js → 717.bundle.0c1736a0b34262585bbb.js} +16 -7
  9. package/dist/{app.bundle.cf75c45a89282dfe58a9.js → app.bundle.c083b9fd68666d817dd8.js} +149 -73
  10. package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
  11. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
  12. package/dist/index.html +1 -1
  13. package/dist/{polySeg.bundle.b0392069f29e128b4efa.js → polySeg.bundle.4dcac8ade13133f637ed.js} +1 -1
  14. package/dist/{suv-peak-worker.bundle.8a7a3a0ab00929f3f6fd.js → suv-peak-worker.bundle.501ee603bb303e916068.js} +1 -1
  15. package/dist/sw.js +1 -1
  16. package/package.json +19 -19
  17. /package/dist/{121.bundle.0772f52e6bec8eb92dfa.js → 121.bundle.d832c214ab421d7e90f3.js} +0 -0
  18. /package/dist/{129.bundle.4dd38a22e6d9f79d834e.js → 129.bundle.a95b9a51ee8d9f0abbd8.js} +0 -0
  19. /package/dist/{14.bundle.4aa15daa6d5a84f58826.js → 14.bundle.1fd47132c905efb09179.js} +0 -0
  20. /package/dist/{140.bundle.70e79ec0e0d41b05b09d.js → 140.bundle.837657eee863ea8cff5d.js} +0 -0
  21. /package/dist/{194.bundle.179e4233aeb2ea81728a.js → 194.bundle.f230d7f0c45926e4a6af.js} +0 -0
  22. /package/dist/{211.bundle.56463a11e29c6304c2f9.js → 211.bundle.dad774eca76c3a064111.js} +0 -0
  23. /package/dist/{218.bundle.e495b3659417ef205b05.js → 218.bundle.1e987ac1168ab893d63e.js} +0 -0
  24. /package/dist/{382.bundle.4c3a26805bb21e47a701.js → 382.bundle.5bb7995aeb6dcdb01392.js} +0 -0
  25. /package/dist/{444.bundle.dc50143843f2284792b2.js → 444.bundle.84521e5aca976d4db33b.js} +0 -0
  26. /package/dist/{552.bundle.64b1b393ef9ac41329ad.js → 552.bundle.164ac71f797c74bea5dd.js} +0 -0
  27. /package/dist/{555.bundle.4c85d276f397d7f1fb4d.js → 555.bundle.8cb01f96a16c7e4d3281.js} +0 -0
  28. /package/dist/{799.bundle.1e13a8cb94b834736230.js → 799.bundle.f8b2e0f36d7f79051798.js} +0 -0
  29. /package/dist/{806.bundle.9bcf6087464cfced7555.js → 806.bundle.540d172cb731587a612e.js} +0 -0
  30. /package/dist/{853.bundle.b36c9d4b53215b761167.js → 853.bundle.6f574756d9deaada7209.js} +0 -0
  31. /package/dist/{920.bundle.69dd8ef2300c1d97fe2c.js → 920.bundle.b7fb54439f90df91aa13.js} +0 -0
  32. /package/dist/{989.bundle.84fdab7bf00463e08e18.js → 989.bundle.d13657ef9448c11751e6.js} +0 -0
@@ -8345,9 +8345,7 @@ async function createVolumeActor(props, element, viewportId, suppressEvents = fa
8345
8345
  if (numberOfComponents === 3) {
8346
8346
  volumeActor.getProperty().setIndependentComponents(false);
8347
8347
  }
8348
- if (imageVolume.imageIds?.length) {
8349
- await (0,setDefaultVolumeVOI/* default */.A)(volumeActor, imageVolume, useNativeDataType);
8350
- }
8348
+ await (0,setDefaultVolumeVOI/* default */.A)(volumeActor, imageVolume, useNativeDataType);
8351
8349
  if (callback) {
8352
8350
  callback({ volumeActor, volumeId });
8353
8351
  }
@@ -8438,21 +8436,19 @@ const PRIORITY = 0;
8438
8436
  const REQUEST_TYPE = _enums__WEBPACK_IMPORTED_MODULE_3__.RequestType.Prefetch;
8439
8437
  async function setDefaultVolumeVOI(volumeActor, imageVolume, useNativeDataType) {
8440
8438
  let voi = getVOIFromMetadata(imageVolume);
8441
- if (!voi) {
8439
+ if (!voi && imageVolume?.imageIds?.length) {
8442
8440
  voi = await getVOIFromMinMax(imageVolume, useNativeDataType);
8441
+ voi = handlePreScaledVolume(imageVolume, voi);
8443
8442
  }
8444
- if (!voi || voi.lower === undefined || voi.upper === undefined) {
8445
- throw new Error('Could not get VOI from metadata, nor from the min max of the image middle slice');
8446
- }
8447
- voi = handlePreScaledVolume(imageVolume, voi);
8448
- const { lower, upper } = voi;
8449
- if (lower === 0 && upper === 0) {
8443
+ if ((voi?.lower === 0 && voi?.upper === 0) ||
8444
+ voi?.lower === undefined ||
8445
+ voi?.upper === undefined) {
8450
8446
  return;
8451
8447
  }
8452
8448
  volumeActor
8453
8449
  .getProperty()
8454
8450
  .getRGBTransferFunction(0)
8455
- .setMappingRange(lower, upper);
8451
+ .setMappingRange(voi.lower, voi.upper);
8456
8452
  }
8457
8453
  function handlePreScaledVolume(imageVolume, voi) {
8458
8454
  const imageIds = imageVolume.imageIds;
@@ -8468,18 +8464,26 @@ function handlePreScaledVolume(imageVolume, voi) {
8468
8464
  return voi;
8469
8465
  }
8470
8466
  function getVOIFromMetadata(imageVolume) {
8471
- const { imageIds } = imageVolume;
8472
- const imageIdIndex = Math.floor(imageIds.length / 2);
8473
- const imageId = imageIds[imageIdIndex];
8474
- const voiLutModule = _metaData__WEBPACK_IMPORTED_MODULE_1__.get('voiLutModule', imageId);
8475
- if (voiLutModule && voiLutModule.windowWidth && voiLutModule.windowCenter) {
8476
- const { windowWidth, windowCenter } = voiLutModule;
8477
- const voi = {
8478
- windowWidth: Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,
8479
- windowCenter: Array.isArray(windowCenter)
8480
- ? windowCenter[0]
8481
- : windowCenter,
8482
- };
8467
+ const { imageIds, metadata } = imageVolume;
8468
+ let voi;
8469
+ if (imageIds.length) {
8470
+ const imageIdIndex = Math.floor(imageIds.length / 2);
8471
+ const imageId = imageIds[imageIdIndex];
8472
+ const voiLutModule = _metaData__WEBPACK_IMPORTED_MODULE_1__.get('voiLutModule', imageId);
8473
+ if (voiLutModule && voiLutModule.windowWidth && voiLutModule.windowCenter) {
8474
+ const { windowWidth, windowCenter } = voiLutModule;
8475
+ voi = {
8476
+ windowWidth: Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,
8477
+ windowCenter: Array.isArray(windowCenter)
8478
+ ? windowCenter[0]
8479
+ : windowCenter,
8480
+ };
8481
+ }
8482
+ }
8483
+ else {
8484
+ voi = metadata?.voiLut?.[0];
8485
+ }
8486
+ if (voi) {
8483
8487
  const { lower, upper } = _utilities__WEBPACK_IMPORTED_MODULE_2__.windowLevel.toLowHighRange(Number(voi.windowWidth), Number(voi.windowCenter));
8484
8488
  return {
8485
8489
  lower,
@@ -8542,13 +8546,13 @@ async function getVOIFromMinMax(imageVolume, useNativeDataType) {
8542
8546
  }
8543
8547
  function _getImageScalarDataFromImageVolume(imageVolume, byteOffset, bytePerPixel, voxelsPerImage) {
8544
8548
  const { scalarData } = imageVolume;
8545
- const { volumeBuffer } = scalarData;
8549
+ const { buffer } = scalarData;
8546
8550
  if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {
8547
8551
  byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;
8548
8552
  }
8549
8553
  const TypedArray = scalarData.constructor;
8550
8554
  const imageScalarData = new TypedArray(voxelsPerImage);
8551
- const volumeBufferView = new TypedArray(volumeBuffer, byteOffset, voxelsPerImage);
8555
+ const volumeBufferView = new TypedArray(buffer, byteOffset, voxelsPerImage);
8552
8556
  imageScalarData.set(volumeBufferView);
8553
8557
  return imageScalarData;
8554
8558
  }
@@ -25644,23 +25648,28 @@ const isPTPrescaledWithSUV = (image) => {
25644
25648
 
25645
25649
 
25646
25650
 
25647
- function renderToCanvasGPU(canvas, image, modality = undefined, renderingEngineId = '_thumbnails', viewportOptions = { displayArea: { imageArea: [1, 1] } }) {
25651
+ function renderToCanvasGPU(canvas, imageOrVolume, modality = undefined, renderingEngineId = '_thumbnails', viewportOptions = {
25652
+ displayArea: { imageArea: [1, 1] },
25653
+ }) {
25648
25654
  if (!canvas || !(canvas instanceof HTMLCanvasElement)) {
25649
25655
  throw new Error('canvas element is required');
25650
25656
  }
25651
- const imageIdToPrint = image.imageId;
25657
+ const isVolume = !imageOrVolume.imageId;
25658
+ const image = !isVolume && imageOrVolume;
25659
+ const volume = isVolume && imageOrVolume;
25660
+ const imageIdToPrint = image?.imageId || volume?.volumeId;
25652
25661
  const viewportId = `renderGPUViewport-${imageIdToPrint}`;
25653
- const imageId = image.imageId;
25654
25662
  const element = document.createElement('div');
25655
25663
  const devicePixelRatio = window.devicePixelRatio || 1;
25664
+ if (!viewportOptions.displayArea) {
25665
+ viewportOptions.displayArea = { imageArea: [1, 1] };
25666
+ }
25656
25667
  const originalWidth = canvas.width;
25657
25668
  const originalHeight = canvas.height;
25658
- element.style.width = `${originalWidth + getOrCreateCanvas/* EPSILON */.p8}px`;
25659
- element.style.height = `${originalHeight + getOrCreateCanvas/* EPSILON */.p8}px`;
25669
+ element.style.width = `${originalWidth / devicePixelRatio + getOrCreateCanvas/* EPSILON */.p8}px`;
25670
+ element.style.height = `${originalHeight / devicePixelRatio + getOrCreateCanvas/* EPSILON */.p8}px`;
25660
25671
  element.style.visibility = 'hidden';
25661
25672
  element.style.position = 'absolute';
25662
- canvas.width = originalWidth * devicePixelRatio;
25663
- canvas.height = originalHeight * devicePixelRatio;
25664
25673
  document.body.appendChild(element);
25665
25674
  const uniqueId = viewportId.split(':').join('-');
25666
25675
  element.setAttribute('viewport-id-for-remove', uniqueId);
@@ -25669,26 +25678,44 @@ function renderToCanvasGPU(canvas, image, modality = undefined, renderingEngineI
25669
25678
  new RenderingEngine/* default */.Ay(renderingEngineId);
25670
25679
  let viewport = renderingEngine.getViewport(viewportId);
25671
25680
  if (!viewport) {
25672
- const stackViewportInput = {
25681
+ const viewportInput = {
25673
25682
  viewportId,
25674
- type: enums.ViewportType.STACK,
25683
+ type: isVolume ? enums.ViewportType.ORTHOGRAPHIC : enums.ViewportType.STACK,
25675
25684
  element,
25676
25685
  defaultOptions: {
25677
25686
  ...viewportOptions,
25678
25687
  suppressEvents: true,
25679
25688
  },
25680
25689
  };
25681
- renderingEngine.enableElement(stackViewportInput);
25690
+ renderingEngine.enableElement(viewportInput);
25682
25691
  viewport = renderingEngine.getViewport(viewportId);
25683
25692
  }
25684
25693
  return new Promise((resolve) => {
25685
25694
  let elementRendered = false;
25695
+ let { viewReference } = viewportOptions;
25686
25696
  const onImageRendered = (eventDetail) => {
25687
25697
  if (elementRendered) {
25688
25698
  return;
25689
25699
  }
25700
+ if (viewReference) {
25701
+ const useViewRef = viewReference;
25702
+ viewReference = null;
25703
+ viewport.setViewReference(useViewRef);
25704
+ viewport.render();
25705
+ return;
25706
+ }
25690
25707
  const context = canvas.getContext('2d');
25691
25708
  context.drawImage(temporaryCanvas, 0, 0, temporaryCanvas.width, temporaryCanvas.height, 0, 0, canvas.width, canvas.height);
25709
+ const origin = viewport.canvasToWorld([0, 0]);
25710
+ const topRight = viewport.canvasToWorld([
25711
+ temporaryCanvas.width / devicePixelRatio,
25712
+ 0,
25713
+ ]);
25714
+ const bottomLeft = viewport.canvasToWorld([
25715
+ 0,
25716
+ temporaryCanvas.height / devicePixelRatio,
25717
+ ]);
25718
+ const thicknessMm = 1;
25692
25719
  elementRendered = true;
25693
25720
  element.removeEventListener(enums.Events.IMAGE_RENDERED, onImageRendered);
25694
25721
  setTimeout(() => {
@@ -25698,10 +25725,20 @@ function renderToCanvasGPU(canvas, image, modality = undefined, renderingEngineI
25698
25725
  element.remove();
25699
25726
  });
25700
25727
  }, 0);
25701
- resolve(imageId);
25728
+ resolve({
25729
+ origin,
25730
+ bottomLeft,
25731
+ topRight,
25732
+ thicknessMm,
25733
+ });
25702
25734
  };
25703
25735
  element.addEventListener(enums.Events.IMAGE_RENDERED, onImageRendered);
25704
- viewport.renderImageObject(image);
25736
+ if (isVolume) {
25737
+ viewport.setVolumes([volume], false, true);
25738
+ }
25739
+ else {
25740
+ viewport.renderImageObject(imageOrVolume);
25741
+ }
25705
25742
  viewport.resetCamera();
25706
25743
  if (modality === 'PT' && !utilities_isPTPrescaledWithSUV(image)) {
25707
25744
  viewport.setProperties({
@@ -25725,7 +25762,12 @@ var drawImageSync = __webpack_require__(49892);
25725
25762
 
25726
25763
 
25727
25764
 
25728
- function renderToCanvasCPU(canvas, image, modality, _renderingEngineId, _viewportOptions) {
25765
+ function renderToCanvasCPU(canvas, imageOrVolume, modality, _renderingEngineId, _viewportOptions) {
25766
+ const volume = imageOrVolume;
25767
+ if (volume.volumeId) {
25768
+ throw new Error('Unsupported volume rendering for CPU');
25769
+ }
25770
+ const image = imageOrVolume;
25729
25771
  const viewport = (0,getDefaultViewport/* default */.A)(canvas, image, modality);
25730
25772
  const enabledElement = {
25731
25773
  canvas,
@@ -25737,7 +25779,7 @@ function renderToCanvasCPU(canvas, image, modality, _renderingEngineId, _viewpor
25737
25779
  const invalidated = true;
25738
25780
  return new Promise((resolve, reject) => {
25739
25781
  (0,drawImageSync/* default */.A)(enabledElement, invalidated);
25740
- resolve(image.imageId);
25782
+ resolve(null);
25741
25783
  });
25742
25784
  }
25743
25785
 
@@ -25749,28 +25791,36 @@ function renderToCanvasCPU(canvas, image, modality, _renderingEngineId, _viewpor
25749
25791
 
25750
25792
 
25751
25793
 
25794
+
25752
25795
  function loadImageToCanvas(options) {
25753
- const { canvas, imageId, requestType = enums.RequestType.Thumbnail, priority = -5, renderingEngineId = '_thumbnails', useCPURendering = false, thumbnail = false, imageAspect = false, physicalPixels = false, viewportOptions, } = options;
25754
- const devicePixelRatio = window.devicePixelRatio || 1;
25796
+ const { canvas, imageId, viewReference, requestType = enums.RequestType.Thumbnail, priority = -5, renderingEngineId = '_thumbnails', useCPURendering = false, thumbnail = false, imageAspect = false, viewportOptions: baseViewportOptions, } = options;
25797
+ const volumeId = viewReference?.volumeId;
25798
+ const isVolume = volumeId && !imageId;
25799
+ const viewportOptions = viewReference && baseViewportOptions
25800
+ ? { ...baseViewportOptions, viewReference }
25801
+ : baseViewportOptions;
25755
25802
  const renderFn = useCPURendering ? renderToCanvasCPU : renderToCanvasGPU;
25756
25803
  return new Promise((resolve, reject) => {
25757
- function successCallback(image, imageId) {
25804
+ function successCallback(imageOrVolume, imageId) {
25758
25805
  const { modality } = metaData.get('generalSeriesModule', imageId) || {};
25759
- image.isPreScaled = image.isPreScaled || image.preScale?.scaled;
25806
+ const image = !isVolume && imageOrVolume;
25807
+ const volume = isVolume && imageOrVolume;
25808
+ if (image) {
25809
+ image.isPreScaled = image.isPreScaled || image.preScale?.scaled;
25810
+ }
25760
25811
  if (thumbnail) {
25761
25812
  canvas.height = 256;
25762
25813
  canvas.width = 256;
25763
25814
  }
25764
- if (physicalPixels) {
25765
- canvas.width = canvas.offsetWidth * devicePixelRatio;
25766
- canvas.height = canvas.offsetHeight * devicePixelRatio;
25815
+ if (imageAspect && image) {
25816
+ canvas.width = image && (canvas.height * image.width) / image.height;
25767
25817
  }
25768
- if (imageAspect) {
25769
- canvas.width = (canvas.height * image.width) / image.height;
25818
+ canvas.style.width = `${canvas.width / devicePixelRatio}px`;
25819
+ canvas.style.height = `${canvas.height / devicePixelRatio}px`;
25820
+ if (volume && useCPURendering) {
25821
+ reject(new Error('CPU rendering of volume not supported'));
25770
25822
  }
25771
- renderFn(canvas, image, modality, renderingEngineId, viewportOptions).then(() => {
25772
- resolve(imageId);
25773
- });
25823
+ renderFn(canvas, imageOrVolume, modality, renderingEngineId, viewportOptions).then(resolve);
25774
25824
  }
25775
25825
  function errorCallback(error, imageId) {
25776
25826
  console.error(error, imageId);
@@ -25783,20 +25833,28 @@ function loadImageToCanvas(options) {
25783
25833
  errorCallback.call(this, error, imageId);
25784
25834
  });
25785
25835
  }
25786
- const { useNorm16Texture, preferSizeOverAccuracy } = (0,init/* getConfiguration */.D0)().rendering;
25787
- const useNativeDataType = useNorm16Texture || preferSizeOverAccuracy;
25836
+ const { useNorm16Texture } = (0,init/* getConfiguration */.D0)().rendering;
25788
25837
  const options = {
25789
25838
  targetBuffer: {
25790
- type: useNativeDataType ? undefined : 'Float32Array',
25839
+ type: useNorm16Texture ? undefined : 'Float32Array',
25791
25840
  },
25792
25841
  preScale: {
25793
25842
  enabled: true,
25794
25843
  },
25795
- useNativeDataType,
25796
25844
  useRGBA: !!useCPURendering,
25797
25845
  requestType,
25798
25846
  };
25799
- imageLoadPoolManager/* default */.A.addRequest(sendRequest.bind(null, imageId, null, options), requestType, { imageId }, priority);
25847
+ if (volumeId) {
25848
+ const volume = cache/* default */.Ay.getVolume(volumeId);
25849
+ if (!volume) {
25850
+ reject(new Error(`Volume id ${volumeId} not found in cache`));
25851
+ }
25852
+ const useImageId = volume.imageIds[0];
25853
+ successCallback(volume, useImageId);
25854
+ }
25855
+ else {
25856
+ imageLoadPoolManager/* default */.A.addRequest(sendRequest.bind(null, imageId, null, options), requestType, { imageId }, priority);
25857
+ }
25800
25858
  });
25801
25859
  }
25802
25860
 
@@ -26522,8 +26580,8 @@ function getScalingParameters(imageId) {
26522
26580
  const generalSeriesModule = (0,metaData.get)('generalSeriesModule', imageId) || {};
26523
26581
  const { modality } = generalSeriesModule;
26524
26582
  const scalingParameters = {
26525
- rescaleSlope: modalityLutModule.rescaleSlope,
26526
- rescaleIntercept: modalityLutModule.rescaleIntercept,
26583
+ rescaleSlope: modalityLutModule.rescaleSlope || 1,
26584
+ rescaleIntercept: modalityLutModule.rescaleIntercept ?? 0,
26527
26585
  modality,
26528
26586
  };
26529
26587
  const suvFactor = (0,metaData.get)('scalingModule', imageId) || {};
@@ -26636,11 +26694,15 @@ function sortImageIdsAndGetSpacing(imageIds, scanAxisNormal) {
26636
26694
  Math.abs(distanceBetweenFirstAndMiddleImages) /
26637
26695
  Math.floor(imageIds.length / 2);
26638
26696
  }
26639
- const { imagePositionPatient: origin, sliceThickness } = dist_esm.metaData.get('imagePlaneModule', sortedImageIds[0]);
26697
+ const { imagePositionPatient: origin, sliceThickness, spacingBetweenSlices, } = dist_esm.metaData.get('imagePlaneModule', sortedImageIds[0]);
26640
26698
  const { strictZSpacingForVolumeViewport } = (0,dist_esm.getConfiguration)().rendering;
26641
26699
  if (zSpacing === 0 && !strictZSpacingForVolumeViewport) {
26642
- if (sliceThickness) {
26643
- console.log('Could not calculate zSpacing. Using sliceThickness');
26700
+ if (sliceThickness && spacingBetweenSlices) {
26701
+ console.log('Could not calculate zSpacing. Using spacingBetweenSlices');
26702
+ zSpacing = spacingBetweenSlices;
26703
+ }
26704
+ else if (sliceThickness) {
26705
+ console.log('Could not calculate zSpacing and no spacingBetweenSlices. Using sliceThickness');
26644
26706
  zSpacing = sliceThickness;
26645
26707
  }
26646
26708
  else {
@@ -27198,9 +27260,11 @@ async function convertStackToVolumeViewport({ viewport, options, }) {
27198
27260
  },
27199
27261
  ], [viewportId]);
27200
27262
  const volumeViewportNewVolumeHandler = () => {
27201
- volumeViewport.setCamera({
27202
- ...prevCamera,
27203
- });
27263
+ if (!options.orientation) {
27264
+ volumeViewport.setCamera({
27265
+ ...prevCamera,
27266
+ });
27267
+ }
27204
27268
  volumeViewport.render();
27205
27269
  element.removeEventListener(enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, volumeViewportNewVolumeHandler);
27206
27270
  };
@@ -30794,7 +30858,7 @@ function _imageChangeEventListener(evt) {
30794
30858
  imageActor.getMapper().setInputData(imageData);
30795
30859
  },
30796
30860
  },
30797
- ], true, false);
30861
+ ]);
30798
30862
  (0,segmentation_triggerSegmentationRender/* default */.Ay)(toolGroup.id);
30799
30863
  return;
30800
30864
  }
@@ -40860,6 +40924,7 @@ class AngleTool extends _base__WEBPACK_IMPORTED_MODULE_2__/* .AnnotationTool */
40860
40924
  viewUp: [...viewUp],
40861
40925
  FrameOfReferenceUID,
40862
40926
  referencedImageId,
40927
+ ...viewport.getViewReference({ points: [worldPos] }),
40863
40928
  },
40864
40929
  data: {
40865
40930
  handles: {
@@ -41325,6 +41390,7 @@ class ArrowAnnotateTool extends _base__WEBPACK_IMPORTED_MODULE_2__/* .Annotation
41325
41390
  viewUp: [...viewUp],
41326
41391
  FrameOfReferenceUID,
41327
41392
  referencedImageId,
41393
+ ...viewport.getViewReference({ points: [worldPos] }),
41328
41394
  },
41329
41395
  data: {
41330
41396
  text: '',
@@ -41792,6 +41858,7 @@ class CircleROITool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .AnnotationTool
41792
41858
  viewUp: [...viewUp],
41793
41859
  FrameOfReferenceUID,
41794
41860
  referencedImageId,
41861
+ ...viewport.getViewReference({ points: [worldPos] }),
41795
41862
  },
41796
41863
  data: {
41797
41864
  label: '',
@@ -42400,6 +42467,7 @@ class CobbAngleTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .AnnotationTool
42400
42467
  viewUp: [...viewUp],
42401
42468
  FrameOfReferenceUID,
42402
42469
  referencedImageId,
42470
+ ...viewport.getViewReference({ points: [worldPos] }),
42403
42471
  },
42404
42472
  data: {
42405
42473
  handles: {
@@ -43266,6 +43334,7 @@ class EllipticalROITool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .Annotation
43266
43334
  viewUp: [...viewUp],
43267
43335
  FrameOfReferenceUID,
43268
43336
  referencedImageId,
43337
+ ...viewport.getViewReference({ points: [worldPos] }),
43269
43338
  },
43270
43339
  data: {
43271
43340
  label: '',
@@ -45675,6 +45744,7 @@ class RectangleROITool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .AnnotationT
45675
45744
  viewUp: [...viewUp],
45676
45745
  FrameOfReferenceUID,
45677
45746
  referencedImageId,
45747
+ ...viewport.getViewReference({ points: [worldPos] }),
45678
45748
  },
45679
45749
  data: {
45680
45750
  label: '',
@@ -766,7 +766,7 @@ async function promptSaveReport({
766
766
  const dataSources = extensionManager.getDataSources();
767
767
  const dataSource = dataSources[0];
768
768
  const measurements = measurementService.getMeasurements();
769
- const trackedMeasurements = measurements.filter(m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID));
769
+ const trackedMeasurements = measurements.filter(m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)).filter(m => m.referencedImageId != null);
770
770
  const SeriesDescription =
771
771
  // isUndefinedOrEmpty
772
772
  promptResult.value === undefined || promptResult.value === '' ? 'Research Derived Series' // default
@@ -2119,9 +2119,10 @@ function PanelMeasurementTableTracking({
2119
2119
  setDisplayMeasurements(measurements);
2120
2120
  }
2121
2121
  };
2122
- const displayMeasurementsWithoutFindings = displayMeasurements.filter(dm => dm.measurementType !== measurementService.VALUE_TYPES.POINT);
2123
- const additionalFindings = displayMeasurements.filter(dm => dm.measurementType === measurementService.VALUE_TYPES.POINT);
2124
- const disabled = additionalFindings.length === 0 && displayMeasurementsWithoutFindings.length === 0;
2122
+ const displayMeasurementsWithoutFindings = displayMeasurements.filter(dm => dm.measurementType !== measurementService.VALUE_TYPES.POINT && dm.referencedImageId);
2123
+ const additionalFindings = displayMeasurements.filter(dm => dm.measurementType === measurementService.VALUE_TYPES.POINT && dm.referencedImageId);
2124
+ const nonAcquisitionMeasurements = displayMeasurements.filter(dm => dm.referencedImageId == null);
2125
+ const disabled = additionalFindings.length === 0 && displayMeasurementsWithoutFindings.length === 0 && nonAcquisitionMeasurements.length === 0;
2125
2126
  return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
2126
2127
  className: "invisible-scrollbar overflow-y-auto overflow-x-hidden",
2127
2128
  ref: measurementsPanelRef,
@@ -2142,12 +2143,18 @@ function PanelMeasurementTableTracking({
2142
2143
  servicesManager: servicesManager,
2143
2144
  onClick: jumpToImage,
2144
2145
  onEdit: onMeasurementItemEditHandler
2146
+ }), nonAcquisitionMeasurements.length !== 0 && /*#__PURE__*/react.createElement(ui_src/* MeasurementTable */.V, {
2147
+ title: "Non-tracked",
2148
+ data: nonAcquisitionMeasurements,
2149
+ servicesManager: servicesManager,
2150
+ onClick: jumpToImage,
2151
+ onEdit: onMeasurementItemEditHandler
2145
2152
  })), !appConfig?.disableEditing && /*#__PURE__*/react.createElement("div", {
2146
2153
  className: "flex justify-center p-4"
2147
2154
  }, /*#__PURE__*/react.createElement(ui_src/* ActionButtons */.wr, {
2148
2155
  t: t,
2149
2156
  actions: [{
2150
- label: 'Export',
2157
+ label: 'Download CSV',
2151
2158
  onClick: exportReport
2152
2159
  }, {
2153
2160
  label: 'Create Report',
@@ -2195,7 +2202,8 @@ function _mapMeasurementToDisplay(measurement, types, displaySetService) {
2195
2202
  type,
2196
2203
  selected,
2197
2204
  findingSites,
2198
- finding
2205
+ finding,
2206
+ referencedImageId
2199
2207
  } = measurement;
2200
2208
  const firstSite = findingSites?.[0];
2201
2209
  const label = baseLabel || finding?.text || firstSite?.text || '(empty)';
@@ -2221,7 +2229,8 @@ function _mapMeasurementToDisplay(measurement, types, displaySetService) {
2221
2229
  baseDisplayText,
2222
2230
  isActive: selected,
2223
2231
  finding,
2224
- findingSites
2232
+ findingSites,
2233
+ referencedImageId
2225
2234
  };
2226
2235
  }
2227
2236
  /* harmony default export */ const panels_PanelMeasurementTableTracking = (PanelMeasurementTableTracking);