@ohif/app 3.9.0-beta.77 → 3.9.0-beta.78

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 (44) hide show
  1. package/dist/{1169.bundle.a3d3d310f1d8d7e335bf.js → 1169.bundle.d32f38ab5aa329346850.js} +46 -106
  2. package/dist/{1202.bundle.1468f0e71fea0c593081.js → 1202.bundle.55f140afb05e1ad5512c.js} +503 -153
  3. package/dist/{2568.css → 1540.css} +1 -0
  4. package/dist/{1994.bundle.39ea4d1a48d42cdca49b.js → 1994.bundle.083fb36bc0648f2dbda6.js} +3 -3
  5. package/dist/{9824.bundle.8e8afc799f0534014fa9.js → 2119.bundle.3446480f91f1200cd45c.js} +4 -4
  6. package/dist/{9824.css → 2119.css} +1 -0
  7. package/dist/{2650.bundle.1f7d90198b9e361dfb9c.js → 2650.bundle.feb3b241748314884ae4.js} +57 -35
  8. package/dist/{3117.bundle.c83d0f403d17104a7c4c.js → 3117.bundle.463d5fa4671a93939d36.js} +8 -7
  9. package/dist/{4210.bundle.f1af90765358215ca053.js → 4210.bundle.38eb5056ac41a0b04d21.js} +2 -2
  10. package/dist/{4842.bundle.11abbf3f8699b84a7537.js → 4842.bundle.0427b8aa1b52aa050ed2.js} +12 -8
  11. package/dist/{5888.bundle.f48daf22ce156ac4956a.js → 5888.bundle.ebca6329037cf353968f.js} +14 -7
  12. package/dist/{2417.bundle.4a0334c8c4047005979e.js → 5898.bundle.be696e0b355efc1c7f05.js} +1947 -1
  13. package/dist/{2281.bundle.b20397636c4b681f4463.js → 655.bundle.28f107410332c62993a3.js} +170 -66
  14. package/dist/{6591.bundle.092858f2e84426bc0010.js → 6591.bundle.92a28f98c3f45ac3b3f1.js} +15 -1
  15. package/dist/{7502.bundle.7f3a72a5571a00fda890.js → 7502.bundle.550aee57ecd221eab7c1.js} +4 -6
  16. package/dist/{3424.bundle.1b6101d721148c04242b.js → 79.bundle.b03daeeef3e6faf9dca3.js} +5 -47
  17. package/dist/{8993.bundle.256bb3c84d2564a5f3cf.js → 8993.bundle.23cd5f8560800a97d798.js} +39 -32
  18. package/dist/{2065.bundle.fc147f9fde903e0768f4.js → 8999.bundle.e23beb310b14ca9ded76.js} +13 -133
  19. package/dist/{9579.bundle.7212d7a737a71bb61502.js → 9579.bundle.f9c9be0c5ab6cddbde3d.js} +8 -7
  20. package/dist/{5516.bundle.f61b8aebe75f7bafd5b1.js → 962.bundle.04afab064299df16f869.js} +408 -179
  21. package/dist/app-config.js +1 -0
  22. package/dist/{app.bundle.e3ce3b1cf2fae5cedcd3.js → app.bundle.53faac5b01b67714fad2.js} +646 -349
  23. package/dist/index.html +1 -1
  24. package/dist/{polySeg.bundle.40b9a8c9006bb15691ee.js → polySeg.bundle.0a70e65fe89169ec7508.js} +1 -1
  25. package/dist/{suv-peak-worker.bundle.a70e70b9ef87c18b896c.js → suv-peak-worker.bundle.54d68bc1808ad3d77994.js} +1 -1
  26. package/dist/sw.js +1 -1
  27. package/package.json +18 -18
  28. package/dist/7604.bundle.42d3f08efb3a9eae4581.js +0 -1950
  29. package/dist/{1498.bundle.d8f5281952d09c57ef87.js → 1498.bundle.a2d05ac1f27d0c2d2c9f.js} +0 -0
  30. package/dist/{153.bundle.94f93195fab889e0add8.js → 153.bundle.3ba838ef3c08a266ae35.js} +0 -0
  31. package/dist/{2791.bundle.597dca661f5f08060ad3.js → 2791.bundle.cfa27e4347069ab301b7.js} +0 -0
  32. package/dist/{3497.bundle.a04a2444975bf50fddf8.js → 3497.bundle.512610422a2862584c55.js} +0 -0
  33. package/dist/{3962.bundle.db07d757866d3a3b20b3.js → 3962.bundle.31bfadcde7f5a2dd8932.js} +0 -0
  34. package/dist/{4353.bundle.c835b4ea70768a207c59.js → 4353.bundle.c13a0c72c607850ea3c0.js} +0 -0
  35. package/dist/{4978.bundle.c5d6cac06bcc9656c900.js → 4978.bundle.655344cfd52d9f0641e5.js} +0 -0
  36. package/dist/{5793.bundle.eed3fe9019c31999efff.js → 5793.bundle.d1b4e887564bbb98752d.js} +0 -0
  37. package/dist/{6904.bundle.27abf08c0f2e4fe5e06d.js → 6904.bundle.da0d83fcd48a48cfaac1.js} +0 -0
  38. package/dist/{7246.bundle.d3f1bb1a40801b133810.js → 7246.bundle.f1cbdd5ec9387bb6f8fe.js} +0 -0
  39. package/dist/{7360.bundle.b28c83aa3910eaa427ee.js → 7360.bundle.d0bdb43af1494bccc433.js} +0 -0
  40. package/dist/{7376.bundle.1173819ab2acd8610f1e.js → 7376.bundle.d6b445de2d468ab2e8b3.js} +0 -0
  41. package/dist/{3424.css → 79.css} +1 -1
  42. /package/dist/{7913.bundle.5702ee8798da273c0c5d.js → 7913.bundle.353baac2e2a5b4bb330d.js} +0 -0
  43. /package/dist/{818.bundle.b64fae7e982e16a82ca2.js → 818.bundle.b6027359846cc90e32ff.js} +0 -0
  44. /package/dist/{8944.bundle.3bf7ef09ea87195b9e23.js → 8944.bundle.29926bb653a467c7e7d8.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[5516],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[962],{
3
3
 
4
4
  /***/ 34:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
@@ -723,7 +723,7 @@ const useViewportActionCornersContext = () => (0,react__WEBPACK_IMPORTED_MODULE_
723
723
 
724
724
  /***/ }),
725
725
 
726
- /***/ 15516:
726
+ /***/ 962:
727
727
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
728
728
 
729
729
  // ESM COMPAT FLAG
@@ -738,7 +738,7 @@ __webpack_require__.d(__webpack_exports__, {
738
738
  findNearbyToolData: () => (/* reexport */ findNearbyToolData),
739
739
  getActiveViewportEnabledElement: () => (/* reexport */ getActiveViewportEnabledElement),
740
740
  getEnabledElement: () => (/* reexport */ state/* getEnabledElement */.K8),
741
- getSOPInstanceAttributes: () => (/* reexport */ getSOPInstanceAttributes/* default */.Z),
741
+ getSOPInstanceAttributes: () => (/* reexport */ getSOPInstanceAttributes),
742
742
  measurementMappingUtils: () => (/* reexport */ utils_namespaceObject),
743
743
  setEnabledElement: () => (/* reexport */ state/* setEnabledElement */.Yc),
744
744
  toolNames: () => (/* reexport */ toolNames)
@@ -751,7 +751,7 @@ __webpack_require__.d(utils_namespaceObject, {
751
751
  getDisplayUnit: () => (utils_getDisplayUnit),
752
752
  getFirstAnnotationSelected: () => (getFirstAnnotationSelected),
753
753
  getHandlesFromPoints: () => (getHandlesFromPoints),
754
- getSOPInstanceAttributes: () => (getSOPInstanceAttributes/* default */.Z),
754
+ getSOPInstanceAttributes: () => (getSOPInstanceAttributes),
755
755
  isAnnotationSelected: () => (isAnnotationSelected),
756
756
  setAnnotationSelected: () => (setAnnotationSelected)
757
757
  });
@@ -1144,8 +1144,8 @@ function onCompletedCalibrationLine(servicesManager, csToolsEvent) {
1144
1144
  });
1145
1145
  });
1146
1146
  }
1147
- // EXTERNAL MODULE: ../../core/src/utils/index.ts + 28 modules
1148
- var utils = __webpack_require__(42895);
1147
+ // EXTERNAL MODULE: ../../core/src/utils/index.ts + 30 modules
1148
+ var utils = __webpack_require__(61512);
1149
1149
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/tools/OverlayPlaneModuleProvider.ts
1150
1150
 
1151
1151
  const _cachedOverlayMetadata = new Map();
@@ -1507,8 +1507,46 @@ const toolNames = {
1507
1507
 
1508
1508
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/utils/measurementServiceMappings/constants/supportedTools.js
1509
1509
  /* harmony default export */ const supportedTools = (['Length', 'EllipticalROI', 'CircleROI', 'Bidirectional', 'ArrowAnnotate', 'Angle', 'CobbAngle', 'Probe', 'RectangleROI', 'PlanarFreehandROI', 'SplineROI', 'LivewireContour', 'Probe', 'UltrasoundDirectionalTool']);
1510
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/utils/measurementServiceMappings/utils/getSOPInstanceAttributes.js
1511
- var getSOPInstanceAttributes = __webpack_require__(90927);
1510
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/utils/measurementServiceMappings/utils/getSOPInstanceAttributes.js
1511
+
1512
+
1513
+ /**
1514
+ * It checks if the imageId is provided then it uses it to query
1515
+ * the metadata and get the SOPInstanceUID, SeriesInstanceUID and StudyInstanceUID.
1516
+ * If the imageId is not provided then undefined is returned.
1517
+ * @param {string} imageId The image id of the referenced image
1518
+ * @returns
1519
+ */
1520
+ function getSOPInstanceAttributes(imageId, displaySetService, annotation) {
1521
+ if (imageId) {
1522
+ return _getUIDFromImageID(imageId);
1523
+ }
1524
+ const {
1525
+ metadata
1526
+ } = annotation;
1527
+ const {
1528
+ volumeId
1529
+ } = metadata;
1530
+ const displaySet = displaySetService.getDisplaySetsBy(displaySet => volumeId.includes(displaySet.uid))[0];
1531
+ const {
1532
+ StudyInstanceUID,
1533
+ SeriesInstanceUID
1534
+ } = displaySet;
1535
+ return {
1536
+ SOPInstanceUID: undefined,
1537
+ SeriesInstanceUID,
1538
+ StudyInstanceUID
1539
+ };
1540
+ }
1541
+ function _getUIDFromImageID(imageId) {
1542
+ const instance = esm.metaData.get('instance', imageId);
1543
+ return {
1544
+ SOPInstanceUID: instance.SOPInstanceUID,
1545
+ SeriesInstanceUID: instance.SeriesInstanceUID,
1546
+ StudyInstanceUID: instance.StudyInstanceUID,
1547
+ frameNumber: instance.frameNumber || 1
1548
+ };
1549
+ }
1512
1550
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/utils/measurementServiceMappings/Length.ts
1513
1551
 
1514
1552
 
@@ -1548,7 +1586,7 @@ const Length = {
1548
1586
  SOPInstanceUID,
1549
1587
  SeriesInstanceUID,
1550
1588
  StudyInstanceUID
1551
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
1589
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
1552
1590
  let displaySet;
1553
1591
  if (SOPInstanceUID) {
1554
1592
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -1605,7 +1643,7 @@ function getMappedAnnotations(annotation, displaySetService) {
1605
1643
  SOPInstanceUID,
1606
1644
  SeriesInstanceUID,
1607
1645
  frameNumber
1608
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
1646
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
1609
1647
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
1610
1648
  const {
1611
1649
  SeriesNumber
@@ -1678,7 +1716,7 @@ function getDisplayText(mappedAnnotations, displaySet, customizationService) {
1678
1716
  frameNumber,
1679
1717
  unit
1680
1718
  } = mappedAnnotations[0];
1681
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
1719
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
1682
1720
  let InstanceNumber;
1683
1721
  if (instance) {
1684
1722
  InstanceNumber = instance.InstanceNumber;
@@ -1785,7 +1823,7 @@ const Bidirectional = {
1785
1823
  SOPInstanceUID,
1786
1824
  SeriesInstanceUID,
1787
1825
  StudyInstanceUID
1788
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
1826
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
1789
1827
  let displaySet;
1790
1828
  if (SOPInstanceUID) {
1791
1829
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -1843,7 +1881,7 @@ function Bidirectional_getMappedAnnotations(annotation, displaySetService) {
1843
1881
  SOPInstanceUID,
1844
1882
  SeriesInstanceUID,
1845
1883
  frameNumber
1846
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
1884
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
1847
1885
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
1848
1886
  const {
1849
1887
  SeriesNumber
@@ -1920,7 +1958,7 @@ function Bidirectional_getDisplayText(mappedAnnotations, displaySet, customizati
1920
1958
  } = mappedAnnotations[0];
1921
1959
  const roundedLength = src.utils.roundNumber(length, 2);
1922
1960
  const roundedWidth = src.utils.roundNumber(width, 2);
1923
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
1961
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
1924
1962
  let InstanceNumber;
1925
1963
  if (instance) {
1926
1964
  InstanceNumber = instance.InstanceNumber;
@@ -1978,7 +2016,7 @@ const EllipticalROI = {
1978
2016
  SOPInstanceUID,
1979
2017
  SeriesInstanceUID,
1980
2018
  StudyInstanceUID
1981
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2019
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
1982
2020
  let displaySet;
1983
2021
  if (SOPInstanceUID) {
1984
2022
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -2035,7 +2073,7 @@ function EllipticalROI_getMappedAnnotations(annotation, displaySetService) {
2035
2073
  SOPInstanceUID,
2036
2074
  SeriesInstanceUID,
2037
2075
  frameNumber
2038
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2076
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2039
2077
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
2040
2078
  const {
2041
2079
  SeriesNumber
@@ -2122,7 +2160,7 @@ function EllipticalROI_getDisplayText(mappedAnnotations, displaySet, customizati
2122
2160
  frameNumber,
2123
2161
  areaUnit
2124
2162
  } = mappedAnnotations[0];
2125
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
2163
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
2126
2164
  let InstanceNumber;
2127
2165
  if (instance) {
2128
2166
  InstanceNumber = instance.InstanceNumber;
@@ -2183,7 +2221,7 @@ const CircleROI = {
2183
2221
  SOPInstanceUID,
2184
2222
  SeriesInstanceUID,
2185
2223
  StudyInstanceUID
2186
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2224
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2187
2225
  let displaySet;
2188
2226
  if (SOPInstanceUID) {
2189
2227
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -2240,7 +2278,7 @@ function CircleROI_getMappedAnnotations(annotation, displaySetService) {
2240
2278
  SOPInstanceUID,
2241
2279
  SeriesInstanceUID,
2242
2280
  frameNumber
2243
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2281
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2244
2282
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
2245
2283
  const {
2246
2284
  SeriesNumber
@@ -2327,7 +2365,7 @@ function CircleROI_getDisplayText(mappedAnnotations, displaySet, customizationSe
2327
2365
  frameNumber,
2328
2366
  areaUnit
2329
2367
  } = mappedAnnotations[0];
2330
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
2368
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
2331
2369
  let InstanceNumber;
2332
2370
  if (instance) {
2333
2371
  InstanceNumber = instance.InstanceNumber;
@@ -2393,7 +2431,7 @@ const ArrowAnnotate_Length = {
2393
2431
  SOPInstanceUID,
2394
2432
  SeriesInstanceUID,
2395
2433
  StudyInstanceUID
2396
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2434
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2397
2435
  let displaySet;
2398
2436
  if (SOPInstanceUID) {
2399
2437
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -2445,7 +2483,7 @@ function ArrowAnnotate_getMappedAnnotations(annotation, displaySetService) {
2445
2483
  SOPInstanceUID,
2446
2484
  SeriesInstanceUID,
2447
2485
  frameNumber
2448
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2486
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2449
2487
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
2450
2488
  const {
2451
2489
  SeriesNumber
@@ -2471,7 +2509,7 @@ function ArrowAnnotate_getDisplayText(mappedAnnotations, displaySet, customizati
2471
2509
  SOPInstanceUID,
2472
2510
  frameNumber
2473
2511
  } = mappedAnnotations[0];
2474
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
2512
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
2475
2513
  let InstanceNumber;
2476
2514
  if (instance) {
2477
2515
  InstanceNumber = instance.InstanceNumber;
@@ -2522,7 +2560,7 @@ const CobbAngle = {
2522
2560
  SOPInstanceUID,
2523
2561
  SeriesInstanceUID,
2524
2562
  StudyInstanceUID
2525
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2563
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2526
2564
  let displaySet;
2527
2565
  if (SOPInstanceUID) {
2528
2566
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -2579,7 +2617,7 @@ function CobbAngle_getMappedAnnotations(annotation, displaySetService) {
2579
2617
  SOPInstanceUID,
2580
2618
  SeriesInstanceUID,
2581
2619
  frameNumber
2582
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2620
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2583
2621
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
2584
2622
  const {
2585
2623
  SeriesNumber
@@ -2650,7 +2688,7 @@ function CobbAngle_getDisplayText(mappedAnnotations, displaySet, customizationSe
2650
2688
  SOPInstanceUID,
2651
2689
  frameNumber
2652
2690
  } = mappedAnnotations[0];
2653
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
2691
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
2654
2692
  let InstanceNumber;
2655
2693
  if (instance) {
2656
2694
  InstanceNumber = instance.InstanceNumber;
@@ -2705,7 +2743,7 @@ const Angle = {
2705
2743
  SOPInstanceUID,
2706
2744
  SeriesInstanceUID,
2707
2745
  StudyInstanceUID
2708
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2746
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2709
2747
  let displaySet;
2710
2748
  if (SOPInstanceUID) {
2711
2749
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -2762,7 +2800,7 @@ function Angle_getMappedAnnotations(annotation, displaySetService) {
2762
2800
  SOPInstanceUID,
2763
2801
  SeriesInstanceUID,
2764
2802
  frameNumber
2765
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2803
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2766
2804
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
2767
2805
  const {
2768
2806
  SeriesNumber
@@ -2833,7 +2871,7 @@ function Angle_getDisplayText(mappedAnnotations, displaySet, customizationServic
2833
2871
  SOPInstanceUID,
2834
2872
  frameNumber
2835
2873
  } = mappedAnnotations[0];
2836
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
2874
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
2837
2875
  let InstanceNumber;
2838
2876
  if (instance) {
2839
2877
  InstanceNumber = instance.InstanceNumber;
@@ -2894,7 +2932,7 @@ const PlanarFreehandROI = {
2894
2932
  SeriesInstanceUID,
2895
2933
  frameNumber,
2896
2934
  StudyInstanceUID
2897
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
2935
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
2898
2936
  let displaySet;
2899
2937
  if (SOPInstanceUID) {
2900
2938
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -3000,9 +3038,9 @@ function PlanarFreehandROI_getDisplayText(annotation, displaySet, customizationS
3000
3038
  const {
3001
3039
  SOPInstanceUID,
3002
3040
  frameNumber
3003
- } = (0,getSOPInstanceAttributes/* default */.Z)(metadata.referencedImageId, displaySetService, annotation);
3041
+ } = getSOPInstanceAttributes(metadata.referencedImageId, displaySetService, annotation);
3004
3042
  const displayTextArray = [];
3005
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
3043
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
3006
3044
  let InstanceNumber;
3007
3045
  if (instance) {
3008
3046
  InstanceNumber = instance.InstanceNumber;
@@ -3084,7 +3122,7 @@ const RectangleROI = {
3084
3122
  SOPInstanceUID,
3085
3123
  SeriesInstanceUID,
3086
3124
  StudyInstanceUID
3087
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
3125
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
3088
3126
  let displaySet;
3089
3127
  if (SOPInstanceUID) {
3090
3128
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -3141,7 +3179,7 @@ function RectangleROI_getMappedAnnotations(annotation, displaySetService) {
3141
3179
  SOPInstanceUID,
3142
3180
  SeriesInstanceUID,
3143
3181
  frameNumber
3144
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
3182
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
3145
3183
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
3146
3184
  const {
3147
3185
  SeriesNumber
@@ -3229,7 +3267,7 @@ function RectangleROI_getDisplayText(mappedAnnotations, displaySet, customizatio
3229
3267
  frameNumber,
3230
3268
  areaUnit
3231
3269
  } = mappedAnnotations[0];
3232
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
3270
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
3233
3271
  let InstanceNumber;
3234
3272
  if (instance) {
3235
3273
  InstanceNumber = instance.InstanceNumber;
@@ -3303,7 +3341,7 @@ const SplineROI = {
3303
3341
  SeriesInstanceUID,
3304
3342
  frameNumber,
3305
3343
  StudyInstanceUID
3306
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId);
3344
+ } = getSOPInstanceAttributes(referencedImageId);
3307
3345
  let displaySet;
3308
3346
  if (SOPInstanceUID) {
3309
3347
  displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -3413,9 +3451,9 @@ function SplineROI_getDisplayText(annotation, displaySet, customizationService)
3413
3451
  const {
3414
3452
  SOPInstanceUID,
3415
3453
  frameNumber
3416
- } = (0,getSOPInstanceAttributes/* default */.Z)(metadata.referencedImageId);
3454
+ } = getSOPInstanceAttributes(metadata.referencedImageId);
3417
3455
  const displayTextArray = [];
3418
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
3456
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
3419
3457
  let InstanceNumber;
3420
3458
  if (instance) {
3421
3459
  InstanceNumber = instance.InstanceNumber;
@@ -3506,7 +3544,7 @@ const LivewireContour = {
3506
3544
  SeriesInstanceUID,
3507
3545
  frameNumber,
3508
3546
  StudyInstanceUID
3509
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId);
3547
+ } = getSOPInstanceAttributes(referencedImageId);
3510
3548
  let displaySet;
3511
3549
  if (SOPInstanceUID) {
3512
3550
  displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -3600,9 +3638,9 @@ function LivewireContour_getDisplayText(annotation, displaySet, customizationSer
3600
3638
  const {
3601
3639
  SOPInstanceUID,
3602
3640
  frameNumber
3603
- } = (0,getSOPInstanceAttributes/* default */.Z)(metadata.referencedImageId);
3641
+ } = getSOPInstanceAttributes(metadata.referencedImageId);
3604
3642
  const displayText = [];
3605
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
3643
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
3606
3644
  let InstanceNumber;
3607
3645
  if (instance) {
3608
3646
  InstanceNumber = instance.InstanceNumber;
@@ -3666,7 +3704,7 @@ const Probe = {
3666
3704
  SOPInstanceUID,
3667
3705
  SeriesInstanceUID,
3668
3706
  StudyInstanceUID
3669
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
3707
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
3670
3708
  let displaySet;
3671
3709
  if (SOPInstanceUID) {
3672
3710
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -3721,7 +3759,7 @@ function Probe_getMappedAnnotations(annotation, displaySetService) {
3721
3759
  SOPInstanceUID,
3722
3760
  SeriesInstanceUID,
3723
3761
  frameNumber
3724
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId, displaySetService, annotation);
3762
+ } = getSOPInstanceAttributes(referencedImageId, displaySetService, annotation);
3725
3763
  const displaySet = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID)[0];
3726
3764
  const {
3727
3765
  SeriesNumber
@@ -3787,7 +3825,7 @@ function Probe_getDisplayText(mappedAnnotations, displaySet, customizationServic
3787
3825
  SOPInstanceUID,
3788
3826
  frameNumber
3789
3827
  } = mappedAnnotations[0];
3790
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
3828
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
3791
3829
  let InstanceNumber;
3792
3830
  if (instance) {
3793
3831
  InstanceNumber = instance.InstanceNumber;
@@ -3841,7 +3879,7 @@ const UltrasoundDirectional = {
3841
3879
  SOPInstanceUID,
3842
3880
  SeriesInstanceUID,
3843
3881
  StudyInstanceUID
3844
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId);
3882
+ } = getSOPInstanceAttributes(referencedImageId);
3845
3883
  let displaySet;
3846
3884
  if (SOPInstanceUID) {
3847
3885
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -3898,7 +3936,7 @@ function UltrasoundDirectional_getMappedAnnotations(annotation, DisplaySetServic
3898
3936
  SOPInstanceUID,
3899
3937
  SeriesInstanceUID,
3900
3938
  frameNumber
3901
- } = (0,getSOPInstanceAttributes/* default */.Z)(referencedImageId);
3939
+ } = getSOPInstanceAttributes(referencedImageId);
3902
3940
  const displaySet = DisplaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID, frameNumber);
3903
3941
  const {
3904
3942
  SeriesNumber
@@ -3983,7 +4021,7 @@ function UltrasoundDirectional_getDisplayText(mappedAnnotations, displaySet, cus
3983
4021
  SOPInstanceUID,
3984
4022
  frameNumber
3985
4023
  } = mappedAnnotations[0];
3986
- const instance = displaySet.images.find(image => image.SOPInstanceUID === SOPInstanceUID);
4024
+ const instance = displaySet.instances.find(image => image.SOPInstanceUID === SOPInstanceUID);
3987
4025
  let InstanceNumber;
3988
4026
  if (instance) {
3989
4027
  InstanceNumber = instance.InstanceNumber;
@@ -4438,7 +4476,7 @@ const connectMeasurementServiceToTools = (measurementService, cornerstoneViewpor
4438
4476
  let frameNumber = 1;
4439
4477
  if (measurement?.metadata?.referencedImageId) {
4440
4478
  imageId = measurement.metadata.referencedImageId;
4441
- frameNumber = (0,getSOPInstanceAttributes/* default */.Z)(measurement.metadata.referencedImageId).frameNumber;
4479
+ frameNumber = getSOPInstanceAttributes(measurement.metadata.referencedImageId).frameNumber;
4442
4480
  } else {
4443
4481
  imageId = dataSource.getImageIdsForInstance({
4444
4482
  instance
@@ -12648,18 +12686,26 @@ const STACK = 'stack';
12648
12686
  const VOLUME = 'volume';
12649
12687
  const ORTHOGRAPHIC = 'orthographic';
12650
12688
  const VOLUME_3D = 'volume3d';
12651
- function getCornerstoneViewportType(viewportType) {
12652
- const lowerViewportType = viewportType.toLowerCase();
12689
+ const VIDEO = 'video';
12690
+ const WHOLESLIDE = 'wholeslide';
12691
+ function getCornerstoneViewportType(viewportType, displaySets) {
12692
+ const lowerViewportType = displaySets?.[0]?.viewportType?.toLowerCase() || viewportType.toLowerCase();
12653
12693
  if (lowerViewportType === STACK) {
12654
12694
  return esm.Enums.ViewportType.STACK;
12655
12695
  }
12696
+ if (lowerViewportType === VIDEO) {
12697
+ return esm.Enums.ViewportType.VIDEO;
12698
+ }
12699
+ if (lowerViewportType === WHOLESLIDE) {
12700
+ return esm.Enums.ViewportType.WholeSlide;
12701
+ }
12656
12702
  if (lowerViewportType === VOLUME || lowerViewportType === ORTHOGRAPHIC) {
12657
12703
  return esm.Enums.ViewportType.ORTHOGRAPHIC;
12658
12704
  }
12659
12705
  if (lowerViewportType === VOLUME_3D) {
12660
12706
  return esm.Enums.ViewportType.VOLUME_3D;
12661
12707
  }
12662
- throw new Error(`Invalid viewport type: ${viewportType}. Valid types are: stack, volume`);
12708
+ throw new Error(`Invalid viewport type: ${viewportType}. Valid types are: stack, volume, video, wholeslide`);
12663
12709
  }
12664
12710
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/services/CornerstoneCacheService/CornerstoneCacheService.ts
12665
12711
  var _CornerstoneCacheService;
@@ -12696,13 +12742,15 @@ class CornerstoneCacheService {
12696
12742
  // update viewportOptions to reflect the new viewport type
12697
12743
  viewportOptions.viewportType = viewportType;
12698
12744
  }
12699
- const cs3DViewportType = getCornerstoneViewportType(viewportType);
12745
+ const cs3DViewportType = getCornerstoneViewportType(viewportType, displaySets);
12700
12746
  let viewportData;
12701
- if (cs3DViewportType === esm.Enums.ViewportType.STACK) {
12702
- viewportData = await this._getStackViewportData(dataSource, displaySets, initialImageIndex, cs3DViewportType);
12703
- }
12704
12747
  if (cs3DViewportType === esm.Enums.ViewportType.ORTHOGRAPHIC || cs3DViewportType === esm.Enums.ViewportType.VOLUME_3D) {
12705
12748
  viewportData = await this._getVolumeViewportData(dataSource, displaySets, cs3DViewportType);
12749
+ } else if (cs3DViewportType === esm.Enums.ViewportType.STACK) {
12750
+ // Everything else looks like a stack
12751
+ viewportData = await this._getStackViewportData(dataSource, displaySets, initialImageIndex, cs3DViewportType);
12752
+ } else {
12753
+ viewportData = await this._getOtherViewportData(dataSource, displaySets, initialImageIndex, cs3DViewportType);
12706
12754
  }
12707
12755
  viewportData.viewportType = cs3DViewportType;
12708
12756
  return viewportData;
@@ -12755,6 +12803,22 @@ class CornerstoneCacheService {
12755
12803
  const newViewportData = await this._getVolumeViewportData(dataSource, displaySets, viewportData.viewportType);
12756
12804
  return newViewportData;
12757
12805
  }
12806
+ async _getOtherViewportData(dataSource, displaySets, _initialImageIndex, viewportType) {
12807
+ // TODO - handle overlays and secondary display sets, but for now assume
12808
+ // the 1st display set is the one of interest
12809
+ const [displaySet] = displaySets;
12810
+ if (!displaySet.imageIds) {
12811
+ displaySet.imagesIds = this._getCornerstoneStackImageIds(displaySet, dataSource);
12812
+ }
12813
+ const {
12814
+ imageIds: data,
12815
+ viewportType: dsViewportType
12816
+ } = displaySet;
12817
+ return {
12818
+ viewportType: dsViewportType || viewportType,
12819
+ data: displaySets
12820
+ };
12821
+ }
12758
12822
  async _getStackViewportData(dataSource, displaySets, initialImageIndex, viewportType) {
12759
12823
  const overlayDisplaySets = displaySets.filter(ds => ds.isOverlayDisplaySet);
12760
12824
  const nonOverlayDisplaySets = displaySets.filter(ds => !ds.isOverlayDisplaySet);
@@ -12993,6 +13057,7 @@ class ViewportInfo {
12993
13057
  this.displaySetOptions = void 0;
12994
13058
  this.viewportData = void 0;
12995
13059
  this.renderingEngineId = void 0;
13060
+ this.viewReference = void 0;
12996
13061
  this.destroy = () => {
12997
13062
  this.element = null;
12998
13063
  this.viewportData = null;
@@ -13054,6 +13119,9 @@ class ViewportInfo {
13054
13119
  getViewportId() {
13055
13120
  return this.viewportId;
13056
13121
  }
13122
+ getViewReference() {
13123
+ return this.viewportOptions?.viewReference;
13124
+ }
13057
13125
  setPublicDisplaySetOptions(publicDisplaySetOptions) {
13058
13126
  // map the displaySetOptions and check if they are undefined then set them to default values
13059
13127
  const displaySetOptions = this.mapDisplaySetOptions(publicDisplaySetOptions);
@@ -13074,23 +13142,23 @@ class ViewportInfo {
13074
13142
  viewportData = viewportData;
13075
13143
  return viewportData.data.displaySetInstanceUID === displaySetInstanceUID;
13076
13144
  }
13077
- setPublicViewportOptions(viewportOptionsEntry) {
13078
- let viewportType = viewportOptionsEntry.viewportType;
13145
+
13146
+ /**
13147
+ *
13148
+ * @param viewportOptionsEntry - the base values for the options
13149
+ * @param viewportTypeDisplaySet - allows overriding the viewport type
13150
+ */
13151
+ setPublicViewportOptions(viewportOptionsEntry, viewportTypeDisplaySet) {
13152
+ const ohifViewportType = viewportTypeDisplaySet || viewportOptionsEntry.viewportType || Viewport_STACK;
13079
13153
  const {
13080
- toolGroupId = DEFAULT_TOOLGROUP_ID,
13081
13154
  presentationIds
13082
13155
  } = viewportOptionsEntry;
13083
- let orientation;
13084
- if (!viewportType) {
13085
- viewportType = getCornerstoneViewportType(Viewport_STACK);
13086
- } else {
13087
- viewportType = getCornerstoneViewportType(viewportOptionsEntry.viewportType);
13088
- }
13089
-
13090
- // map SAGITTAL, AXIAL, CORONAL orientation to be used by cornerstone
13091
- if (viewportOptionsEntry.viewportType?.toLowerCase() !== Viewport_STACK) {
13092
- orientation = getCornerstoneOrientation(viewportOptionsEntry.orientation);
13093
- }
13156
+ let {
13157
+ toolGroupId = DEFAULT_TOOLGROUP_ID
13158
+ } = viewportOptionsEntry;
13159
+ // Just assign the orientation for any viewport type and let the viewport deal with it
13160
+ const orientation = getCornerstoneOrientation(viewportOptionsEntry.orientation);
13161
+ const viewportType = getCornerstoneViewportType(ohifViewportType);
13094
13162
  if (!toolGroupId) {
13095
13163
  toolGroupId = DEFAULT_TOOLGROUP_ID;
13096
13164
  }
@@ -13220,11 +13288,18 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13220
13288
  this.viewportResizeTimer = null;
13221
13289
  this.gridResizeDelay = 50;
13222
13290
  this.gridResizeTimeOut = null;
13291
+ this.hangingProtocolService = void 0;
13292
+ this.viewportsInfo = void 0;
13293
+ this.sceneVolumeInputs = void 0;
13294
+ this.viewportDivElements = void 0;
13295
+ this.ViewportPropertiesMap = void 0;
13296
+ this.volumeUIDs = void 0;
13297
+ this.displaySetsNeedRerendering = void 0;
13298
+ this.viewportDisplaySets = void 0;
13223
13299
  this.renderingEngine = null;
13224
13300
  this.viewportGridResizeObserver = null;
13225
13301
  this.servicesManager = servicesManager;
13226
13302
  }
13227
-
13228
13303
  /**
13229
13304
  * Adds the HTML element to the viewportService
13230
13305
  * @param {*} viewportId
@@ -13321,13 +13396,11 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13321
13396
  *
13322
13397
  * @param viewportId - The ID of the viewport.
13323
13398
  * @param presentations - The presentations to apply to the viewport.
13399
+ * @param viewportInfo - Contains a view reference for immediate application
13324
13400
  */
13325
- setPresentations(viewportId, presentations) {
13401
+ setPresentations(viewportId, presentations, viewportInfo) {
13326
13402
  const viewport = this.getCornerstoneViewport(viewportId);
13327
- if (!viewport) {
13328
- return;
13329
- }
13330
- if (!presentations) {
13403
+ if (!viewport || !presentations) {
13331
13404
  return;
13332
13405
  }
13333
13406
  const {
@@ -13350,23 +13423,12 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13350
13423
  viewport.setProperties(presentation);
13351
13424
  }
13352
13425
  }
13353
- if (positionPresentation) {
13354
- const {
13355
- viewPlaneNormal,
13356
- viewUp,
13357
- zoom,
13358
- pan
13359
- } = positionPresentation.presentation;
13360
- viewport.setCamera({
13361
- viewPlaneNormal,
13362
- viewUp
13363
- });
13364
- if (zoom !== undefined) {
13365
- viewport.setZoom(zoom);
13366
- }
13367
- if (pan !== undefined) {
13368
- viewport.setPan(pan);
13369
- }
13426
+ const viewRef = viewportInfo?.getViewReference() || positionPresentation?.viewReference;
13427
+ if (viewRef) {
13428
+ viewport.setViewReference(viewRef);
13429
+ }
13430
+ if (positionPresentation?.position) {
13431
+ viewport.setViewPresentation(positionPresentation.position);
13370
13432
  }
13371
13433
  }
13372
13434
 
@@ -13392,23 +13454,14 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13392
13454
  if (!csViewport) {
13393
13455
  return;
13394
13456
  }
13395
- const {
13396
- viewPlaneNormal,
13397
- viewUp
13398
- } = csViewport.getCamera();
13399
- const initialImageIndex = csViewport.getCurrentImageIdIndex() || 0;
13400
- const zoom = csViewport.getZoom();
13401
- const pan = csViewport.getPan();
13402
13457
  return {
13403
13458
  id: positionPresentationId,
13404
13459
  viewportType: viewportInfo.getViewportType(),
13405
- presentation: {
13406
- initialImageIndex,
13407
- viewUp,
13408
- viewPlaneNormal,
13409
- zoom,
13410
- pan
13411
- }
13460
+ viewReference: csViewport.getViewReference(),
13461
+ position: csViewport.getViewPresentation({
13462
+ pan: true,
13463
+ zoom: true
13464
+ })
13412
13465
  };
13413
13466
  }
13414
13467
 
@@ -13566,7 +13619,11 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13566
13619
  // override the viewportOptions and displaySetOptions with the public ones
13567
13620
  // since those are the newly set ones, we set them here so that it handles defaults
13568
13621
  const displaySetOptions = viewportInfo.setPublicDisplaySetOptions(publicDisplaySetOptions);
13569
- const viewportOptions = viewportInfo.setPublicViewportOptions(publicViewportOptions);
13622
+ // Specify an over-ride for the viewport type, even though it is in the public
13623
+ // viewport options, because the one in the public viewport options is a suggestion
13624
+ // for initial view, whereas the one in viewportData is a requirement based on the
13625
+ // type of data being displayed.
13626
+ const viewportOptions = viewportInfo.setPublicViewportOptions(publicViewportOptions, viewportData.viewportType);
13570
13627
  const element = viewportInfo.getElement();
13571
13628
  const type = viewportInfo.getViewportType();
13572
13629
  const background = viewportInfo.getBackground();
@@ -13643,26 +13700,81 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13643
13700
 
13644
13701
  /**
13645
13702
  * Looks through the viewports to see if the specified measurement can be
13646
- * displayed in one of the viewports.
13703
+ * displayed in one of the viewports. This function tries to get a "best fit"
13704
+ * viewport to display the image in where it matches, in order:
13705
+ * * Active viewport that can be navigated to the given image without orientation change
13706
+ * * Other viewport that can be navigated to the given image without orientation change
13707
+ * * Active viewport that can change orientation to display the image
13708
+ * * Other viewport that can change orientation to display the image
13647
13709
  *
13648
- * @param measurement
13649
- * The measurement that is desired to view.
13710
+ * It returns `null` otherwise, indicating that a viewport needs display set/type
13711
+ * changes in order to display the image.
13712
+ *
13713
+ * Notes:
13714
+ * * If the display set is displayed in multiple viewports all needing orientation change,
13715
+ * then the active one or first one listed will be modified. This can create unexpected
13716
+ * behaviour for MPR views.
13717
+ * * If the image is contained in multiple display sets, then the first one
13718
+ * found will be navigated (active first, followed by first found)
13719
+ *
13720
+ * @param measurement - The measurement that is desired to view.
13650
13721
  * @param activeViewportId - the index that was active at the time the jump
13651
13722
  * was initiated.
13652
13723
  * @return the viewportId that the measurement should be displayed in.
13653
13724
  */
13654
- getViewportIdToJump(activeViewportId, displaySetInstanceUID, cameraProps) {
13655
- const viewportInfo = this.getViewportInfo(activeViewportId);
13656
- if (viewportInfo.getViewportType() === esm.Enums.ViewportType.VOLUME_3D) {
13657
- return null;
13725
+ getViewportIdToJump(activeViewportId, metadata) {
13726
+ // First check if the active viewport can just be navigated to show the given item
13727
+ const activeViewport = this.getCornerstoneViewport(activeViewportId);
13728
+ if (activeViewport.isReferenceViewable(metadata, {
13729
+ withNavigation: true
13730
+ })) {
13731
+ return activeViewportId;
13658
13732
  }
13659
- const {
13660
- referencedImageId
13661
- } = cameraProps;
13662
- if (viewportInfo?.contains(displaySetInstanceUID, referencedImageId)) {
13733
+
13734
+ // Next, see if any viewport could be navigated to show the given item,
13735
+ // without considering orientation changes.
13736
+ for (const id of this.viewportsById.keys()) {
13737
+ const viewport = this.getCornerstoneViewport(id);
13738
+ if (viewport?.isReferenceViewable(metadata, {
13739
+ withNavigation: true
13740
+ })) {
13741
+ return id;
13742
+ }
13743
+ }
13744
+
13745
+ // No viewport is in the right display set/orientation to show this, so see if
13746
+ // the active viewport could change orientations to show this
13747
+ if (activeViewport.isReferenceViewable(metadata, {
13748
+ withNavigation: true,
13749
+ withOrientation: true
13750
+ })) {
13663
13751
  return activeViewportId;
13664
13752
  }
13665
- return [...this.viewportsById.values()].find(viewportInfo => viewportInfo.contains(displaySetInstanceUID, referencedImageId))?.viewportId ?? null;
13753
+
13754
+ // See if any viewport could show this with an orientation change
13755
+ for (const id of this.viewportsById.keys()) {
13756
+ const viewport = this.getCornerstoneViewport(id);
13757
+ if (viewport?.isReferenceViewable(metadata, {
13758
+ withNavigation: true,
13759
+ withOrientation: true
13760
+ })) {
13761
+ return id;
13762
+ }
13763
+ }
13764
+
13765
+ // No luck, need to update the viewport itself
13766
+ return null;
13767
+ }
13768
+
13769
+ /**
13770
+ * Sets the image data for the given viewport.
13771
+ */
13772
+ async _setOtherViewport(viewport, viewportData, viewportInfo, _presentations = {}) {
13773
+ const [displaySet] = viewportData.data;
13774
+ return viewport.setDataIds(displaySet.imageIds, {
13775
+ groupId: displaySet.displaySetInstanceUID,
13776
+ viewReference: viewportInfo.getViewReference()
13777
+ });
13666
13778
  }
13667
13779
  async _setStackViewport(viewport, viewportData, viewportInfo, presentations = {}) {
13668
13780
  const displaySetOptions = viewportInfo.getDisplaySetOptions();
@@ -13676,6 +13788,10 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13676
13788
  initialImageIndex,
13677
13789
  imageIds
13678
13790
  } = viewportData.data[0];
13791
+
13792
+ // Use the slice index from any provided view reference, as the view reference
13793
+ // is being used to navigate to the initial view position for measurement
13794
+ // navigation and other navigation forcing specific views.
13679
13795
  let initialImageIndexToUse = presentations?.positionPresentation?.initialImageIndex ?? initialImageIndex;
13680
13796
  if (initialImageIndexToUse === undefined || initialImageIndexToUse === null) {
13681
13797
  initialImageIndexToUse = this._getInitialImageIndexForViewport(viewportInfo, imageIds) || 0;
@@ -13704,19 +13820,15 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13704
13820
  upper
13705
13821
  };
13706
13822
  }
13707
- if (voiInverted !== undefined) {
13708
- properties.invert = voiInverted;
13709
- }
13710
- if (colormap !== undefined) {
13711
- properties.colormap = colormap;
13712
- }
13823
+ properties.invert = voiInverted ?? properties.invert;
13824
+ properties.colormap = colormap ?? properties.colormap;
13713
13825
  }
13714
13826
  this._handleOverlays(viewport);
13715
13827
  return viewport.setStack(imageIds, initialImageIndexToUse).then(() => {
13716
13828
  viewport.setProperties({
13717
13829
  ...properties
13718
13830
  });
13719
- this.setPresentations(viewport.id, presentations);
13831
+ this.setPresentations(viewport.id, presentations, viewportInfo);
13720
13832
  if (displayArea) {
13721
13833
  viewport.setDisplayArea(displayArea);
13722
13834
  }
@@ -13854,7 +13966,6 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13854
13966
  const displaySetUIDs = viewportGridService.getDisplaySetsUIDsForViewport(viewport.id);
13855
13967
  const displaySet = displaySetService.getDisplaySetByUID(displaySetUIDs[0]);
13856
13968
  const displaySetModality = displaySet?.Modality;
13857
-
13858
13969
  // Todo: use presentations states
13859
13970
  const volumesProperties = volumeInputArray.map((volumeInput, index) => {
13860
13971
  const {
@@ -13899,7 +14010,7 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
13899
14010
  }) => {
13900
14011
  viewport.setProperties(properties, volumeId);
13901
14012
  });
13902
- this.setPresentations(viewport.id, presentations);
14013
+ this.setPresentations(viewport.id, presentations, viewportInfo);
13903
14014
  this._handleOverlays(viewport);
13904
14015
  const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id);
13905
14016
  dist_esm.utilities.segmentation.triggerSegmentationRender(toolGroup.id);
@@ -14035,7 +14146,7 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
14035
14146
  if ([esm.VolumeViewport, esm.VolumeViewport3D].some(type => viewport instanceof type)) {
14036
14147
  return this._setVolumeViewport(viewport, viewportData, viewportInfo, presentations);
14037
14148
  }
14038
- throw new Error('Unknown viewport type');
14149
+ return this._setOtherViewport(viewport, viewportData, viewportInfo, presentations);
14039
14150
  }
14040
14151
 
14041
14152
  /**
@@ -15064,6 +15175,171 @@ const createFrameViewSynchronizer = synchronizerName => {
15064
15175
  return synchronizer;
15065
15176
  };
15066
15177
 
15178
+ // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
15179
+ var dcmjs_es = __webpack_require__(67540);
15180
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 95 modules
15181
+ var default_src = __webpack_require__(10655);
15182
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/getSopClassHandlerModule.js
15183
+
15184
+
15185
+
15186
+
15187
+ const {
15188
+ MetadataModules
15189
+ } = esm.Enums;
15190
+ const {
15191
+ utils: getSopClassHandlerModule_utils
15192
+ } = src["default"];
15193
+ const {
15194
+ denaturalizeDataset
15195
+ } = dcmjs_es["default"].data.DicomMetaDictionary;
15196
+ const {
15197
+ transferDenaturalizedDataset,
15198
+ fixMultiValueKeys
15199
+ } = default_src.dicomWebUtils;
15200
+ const SOP_CLASS_UIDS = {
15201
+ VL_WHOLE_SLIDE_MICROSCOPY_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.6'
15202
+ };
15203
+ const SOPClassHandlerId = '@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler';
15204
+ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
15205
+ // If the series has no instances, stop here
15206
+ if (!instances || !instances.length) {
15207
+ throw new Error('No instances were provided');
15208
+ }
15209
+ const instance = instances[0];
15210
+ let singleFrameInstance = instance;
15211
+ let currentFrames = +singleFrameInstance.NumberOfFrames || 1;
15212
+ for (const instanceI of instances) {
15213
+ const framesI = +instanceI.NumberOfFrames || 1;
15214
+ if (framesI < currentFrames) {
15215
+ singleFrameInstance = instanceI;
15216
+ currentFrames = framesI;
15217
+ }
15218
+ }
15219
+ let imageIdForThumbnail = null;
15220
+ const dataSource = extensionManager.getActiveDataSource()[0];
15221
+ if (singleFrameInstance) {
15222
+ if (currentFrames == 1) {
15223
+ // Not all DICOM server implementations support thumbnail service,
15224
+ // So if we have a single-frame image, we will prefer it.
15225
+ imageIdForThumbnail = singleFrameInstance.imageId;
15226
+ }
15227
+ if (!imageIdForThumbnail) {
15228
+ // use the thumbnail service provided by DICOM server
15229
+ imageIdForThumbnail = dataSource.getImageIdsForInstance({
15230
+ instance: singleFrameInstance,
15231
+ thumbnail: true
15232
+ });
15233
+ }
15234
+ }
15235
+ const {
15236
+ FrameOfReferenceUID,
15237
+ SeriesDescription,
15238
+ ContentDate,
15239
+ ContentTime,
15240
+ SeriesNumber,
15241
+ StudyInstanceUID,
15242
+ SeriesInstanceUID,
15243
+ SOPInstanceUID,
15244
+ SOPClassUID
15245
+ } = instance;
15246
+ instances = instances.map(inst => {
15247
+ // NOTE: According to DICOM standard a series should have a FrameOfReferenceUID
15248
+ // When the Microscopy file was built by certain tool from multiple image files,
15249
+ // each instance's FrameOfReferenceUID is sometimes different.
15250
+ // Even though this means the file was not well formatted DICOM VL Whole Slide Microscopy Image,
15251
+ // the case is so often, so let's override this value manually here.
15252
+ //
15253
+ // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.4.html#sect_C.7.4.1.1.1
15254
+
15255
+ inst.FrameOfReferenceUID = instance.FrameOfReferenceUID;
15256
+ return inst;
15257
+ });
15258
+ const othersFrameOfReferenceUID = instances.filter(v => v).map(inst => inst.FrameOfReferenceUID).filter((value, index, array) => array.indexOf(value) === index);
15259
+ if (othersFrameOfReferenceUID.length > 1) {
15260
+ console.warn('Expected FrameOfReferenceUID of difference instances within a series to be the same, found multiple different values', othersFrameOfReferenceUID);
15261
+ }
15262
+ const displaySet = {
15263
+ plugin: 'microscopy',
15264
+ Modality: 'SM',
15265
+ viewportType: esm.Enums.ViewportType.WholeSlide,
15266
+ altImageText: 'Microscopy',
15267
+ displaySetInstanceUID: getSopClassHandlerModule_utils.guid(),
15268
+ SOPInstanceUID,
15269
+ SeriesInstanceUID,
15270
+ StudyInstanceUID,
15271
+ FrameOfReferenceUID,
15272
+ SOPClassHandlerId,
15273
+ SOPClassUID,
15274
+ SeriesDescription: SeriesDescription || 'Microscopy Data',
15275
+ // Map ContentDate/Time to SeriesTime for series list sorting.
15276
+ SeriesDate: ContentDate,
15277
+ SeriesTime: ContentTime,
15278
+ SeriesNumber,
15279
+ firstInstance: singleFrameInstance,
15280
+ // top level instance in the image Pyramid
15281
+ instance,
15282
+ numImageFrames: 0,
15283
+ numInstances: 1,
15284
+ imageIdForThumbnail,
15285
+ // thumbnail image
15286
+ others: instances,
15287
+ // all other level instances in the image Pyramid
15288
+ instances,
15289
+ othersFrameOfReferenceUID,
15290
+ imageIds: instances.map(instance => instance.imageId)
15291
+ };
15292
+ // The microscopy viewer directly accesses the metadata already loaded, and
15293
+ // uses the DICOMweb client library directly for loading, so it has to be
15294
+ // provided here.
15295
+ const dicomWebClient = dataSource.retrieve.getWadoDicomWebClient?.();
15296
+ const instanceMap = new Map();
15297
+ instances.forEach(instance => instanceMap.set(instance.imageId, instance));
15298
+ if (dicomWebClient) {
15299
+ const webClient = Object.create(dicomWebClient);
15300
+ // This replaces just the dicom web metadata call with one which retrieves
15301
+ // internally.
15302
+ webClient.getDICOMwebMetadata = getDICOMwebMetadata.bind(webClient, instanceMap);
15303
+ esm.utilities.genericMetadataProvider.addRaw(displaySet.imageIds[0], {
15304
+ type: MetadataModules.WADO_WEB_CLIENT,
15305
+ metadata: webClient
15306
+ });
15307
+ } else {
15308
+ // Might have some other way of getting the data in the future or internally?
15309
+ // throw new Error('Unable to provide a DICOMWeb client library, microscopy will fail to view');
15310
+ }
15311
+ return [displaySet];
15312
+ }
15313
+
15314
+ /**
15315
+ * This method provides access to the internal DICOMweb metadata, used to avoid
15316
+ * refetching the DICOMweb data. It gets assigned as a member function to the
15317
+ * dicom web client.
15318
+ */
15319
+ function getDICOMwebMetadata(instanceMap, imageId) {
15320
+ const instance = instanceMap.get(imageId);
15321
+ if (!instance) {
15322
+ console.warn('Metadata not already found for', imageId, 'in', instanceMap);
15323
+ return this.super.getDICOMwebMetadata(imageId);
15324
+ }
15325
+ return transferDenaturalizedDataset(denaturalizeDataset(fixMultiValueKeys(instanceMap.get(imageId))));
15326
+ }
15327
+ function getDicomMicroscopySopClassHandler({
15328
+ servicesManager,
15329
+ extensionManager
15330
+ }) {
15331
+ const getDisplaySetsFromSeries = instances => {
15332
+ return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);
15333
+ };
15334
+ return {
15335
+ name: 'DicomMicroscopySopClassHandler',
15336
+ sopClassUids: [SOP_CLASS_UIDS.VL_WHOLE_SLIDE_MICROSCOPY_IMAGE_STORAGE],
15337
+ getDisplaySetsFromSeries
15338
+ };
15339
+ }
15340
+ function getSopClassHandlerModule(params) {
15341
+ return [getDicomMicroscopySopClassHandler(params)];
15342
+ }
15067
15343
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/index.tsx
15068
15344
  function src_extends() { return src_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, src_extends.apply(null, arguments); }
15069
15345
 
@@ -15096,6 +15372,7 @@ function src_extends() { return src_extends = Object.assign ? Object.assign.bind
15096
15372
 
15097
15373
 
15098
15374
 
15375
+
15099
15376
 
15100
15377
 
15101
15378
  const {
@@ -15266,7 +15543,8 @@ const cornerstoneExtension = {
15266
15543
  getDynamicVolumeInfo
15267
15544
  }
15268
15545
  }];
15269
- }
15546
+ },
15547
+ getSopClassHandlerModule: getSopClassHandlerModule
15270
15548
  };
15271
15549
 
15272
15550
  /* harmony default export */ const cornerstone_src = (cornerstoneExtension);
@@ -15379,55 +15657,6 @@ const reset = () => {
15379
15657
  };
15380
15658
 
15381
15659
 
15382
- /***/ }),
15383
-
15384
- /***/ 90927:
15385
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15386
-
15387
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15388
- /* harmony export */ Z: () => (/* binding */ getSOPInstanceAttributes)
15389
- /* harmony export */ });
15390
- /* harmony import */ var _cornerstonejs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12651);
15391
-
15392
-
15393
- /**
15394
- * It checks if the imageId is provided then it uses it to query
15395
- * the metadata and get the SOPInstanceUID, SeriesInstanceUID and StudyInstanceUID.
15396
- * If the imageId is not provided then undefined is returned.
15397
- * @param {string} imageId The image id of the referenced image
15398
- * @returns
15399
- */
15400
- function getSOPInstanceAttributes(imageId, displaySetService, annotation) {
15401
- if (imageId) {
15402
- return _getUIDFromImageID(imageId);
15403
- }
15404
- const {
15405
- metadata
15406
- } = annotation;
15407
- const {
15408
- volumeId
15409
- } = metadata;
15410
- const displaySet = displaySetService.getDisplaySetsBy(displaySet => volumeId.includes(displaySet.uid))[0];
15411
- const {
15412
- StudyInstanceUID,
15413
- SeriesInstanceUID
15414
- } = displaySet;
15415
- return {
15416
- SOPInstanceUID: undefined,
15417
- SeriesInstanceUID,
15418
- StudyInstanceUID
15419
- };
15420
- }
15421
- function _getUIDFromImageID(imageId) {
15422
- const instance = _cornerstonejs_core__WEBPACK_IMPORTED_MODULE_0__.metaData.get('instance', imageId);
15423
- return {
15424
- SOPInstanceUID: instance.SOPInstanceUID,
15425
- SeriesInstanceUID: instance.SeriesInstanceUID,
15426
- StudyInstanceUID: instance.StudyInstanceUID,
15427
- frameNumber: instance.frameNumber || 1
15428
- };
15429
- }
15430
-
15431
15660
  /***/ })
15432
15661
 
15433
15662
  }]);