@ohif/app 3.13.0-beta.121 → 3.13.0-beta.123

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 (48) hide show
  1. package/dist/{1206.bundle.e04ca1efe6f987ba.js → 1206.bundle.8ca95ea92d278d25.js} +1 -1
  2. package/dist/{1602.bundle.4b753c5f05c22071.js → 1602.bundle.adc9c42f3f0cee10.js} +4 -4
  3. package/dist/{2493.bundle.f3b6a64d158365da.js → 2493.bundle.d16ea70ddcc1fb6b.js} +68 -12
  4. package/dist/{7231.bundle.1063d727ad99108a.js → 2623.bundle.983a376f7b7e86a5.js} +142 -33
  5. package/dist/{3330.bundle.b1297ef8c94e5440.js → 3330.bundle.1b8bc8f7c4071336.js} +46 -2
  6. package/dist/{3500.bundle.ba1a8fe6005447be.js → 3500.bundle.642aa0112968cf71.js} +1 -1
  7. package/dist/{3568.bundle.45dc681ef6890166.js → 3568.bundle.9aa4b4b27294ff6d.js} +41 -10
  8. package/dist/{3760.bundle.cfe49d20e6a29953.js → 3760.bundle.5e5d19b9f8d56cae.js} +4 -4
  9. package/dist/{5189.bundle.ea191ea99047fd6f.js → 5189.bundle.fc73612f2e198892.js} +2 -2
  10. package/dist/{5448.bundle.5686ebb99c379f64.js → 5448.bundle.316b091e38440aef.js} +1 -1
  11. package/dist/{5910.bundle.0f19608f3e76859b.js → 5910.bundle.d9cbcbb62ddd6638.js} +2 -2
  12. package/dist/{6495.bundle.a6764fdb8c0c252f.js → 6495.bundle.5ad5a10d2c9dcba1.js} +48 -3
  13. package/dist/{7248.bundle.5adba26c3591ab03.js → 7248.bundle.1b52f19fbd2bbc40.js} +28 -10
  14. package/dist/{7499.bundle.1b824fb1c3d9938b.js → 7499.bundle.e958878c66174ab0.js} +74 -29
  15. package/dist/{781.bundle.8317fbb14b5fc160.js → 781.bundle.f6fa3ab2b8ec22a5.js} +106 -47
  16. package/dist/{8423.bundle.884545a446ec1b71.js → 8423.bundle.d9be5db38ca5b9cd.js} +2 -2
  17. package/dist/{5642.bundle.98e17a4413db6ef1.js → 8478.bundle.163d258bf75a0aed.js} +32847 -7919
  18. package/dist/{8668.bundle.0e47f7231aa07da2.js → 8668.bundle.e254939790f776e2.js} +44 -0
  19. package/dist/{8832.bundle.7e4d2e03edaf6125.js → 8832.bundle.62e66fad140b5182.js} +3 -3
  20. package/dist/{2343.bundle.6bb1c41a0c23c387.js → 89.bundle.fe29d1712fd47341.js} +16340 -1013
  21. package/dist/{899.bundle.50c16f860acbc848.js → 899.bundle.b012ed530e343897.js} +2 -2
  22. package/dist/{9068.bundle.95f1e638ef694ea9.js → 9068.bundle.13173c70d4f33cf0.js} +2 -2
  23. package/dist/{9415.bundle.8ae772df11b43623.js → 9415.bundle.3044caa6fbf3e331.js} +2 -2
  24. package/dist/app-config.js +16 -0
  25. package/dist/{app.bundle.19807b66b97eef1c.js → app.bundle.ce26bd25f1b2d6eb.js} +297 -44
  26. package/dist/{compute.bundle.9cc3697d07fbb082.js → compute.bundle.690de60973ccebc4.js} +1 -1
  27. package/dist/index.html +1 -1
  28. package/dist/{polySeg.bundle.a526954fc2fed311.js → polySeg.bundle.369c7996934b22e3.js} +1 -1
  29. package/dist/sw.js +1 -1
  30. package/package.json +6 -6
  31. package/dist/8432.bundle.7d5ebe1ed1610bc3.js +0 -24931
  32. package/dist/8595.css +0 -2
  33. package/dist/9402.bundle.e566ac372cd263ab.js +0 -13041
  34. /package/dist/{100.bundle.18576d13e84cf65d.js → 100.bundle.a747be7c54b03050.js} +0 -0
  35. /package/dist/{1180.bundle.71384bae9915f7ef.js → 1180.bundle.12decb70e347ab18.js} +0 -0
  36. /package/dist/{1483.bundle.0856e89556f39a44.js → 1483.bundle.5d7cb3b2c8339993.js} +0 -0
  37. /package/dist/{7231.css → 2623.css} +0 -0
  38. /package/dist/{2779.bundle.c9e19f9d340f49dd.js → 2779.bundle.50f6254deda46e49.js} +0 -0
  39. /package/dist/{4556.bundle.c21eb013145d11cb.js → 4556.bundle.1ea04fd48fc5d2ca.js} +0 -0
  40. /package/dist/{4683.bundle.00b9ec64ffdac536.js → 4683.bundle.b560312b5eebd925.js} +0 -0
  41. /package/dist/{5696.bundle.1166a7d20afd2ec1.js → 5696.bundle.78c7e21c71846f7b.js} +0 -0
  42. /package/dist/{6749.bundle.46d07e206a29a04c.js → 6749.bundle.87258a158729e73d.js} +0 -0
  43. /package/dist/{8492.bundle.b2d1f0d9d97eeb99.js → 8492.bundle.1dbc1691c7db0e87.js} +0 -0
  44. /package/dist/{9116.bundle.b5fe63fa3d55bd70.js → 9116.bundle.3173fbc0a9246402.js} +0 -0
  45. /package/dist/{9290.bundle.e11c9ec528de238f.js → 9290.bundle.e84eec85a00eb7a1.js} +0 -0
  46. /package/dist/{9383.bundle.ec44c452ccc23e93.js → 9383.bundle.885123e100c1b477.js} +0 -0
  47. /package/dist/{9437.bundle.e32fbfe63bfc0e72.js → 9437.bundle.dabd58171e5f91e9.js} +0 -0
  48. /package/dist/{9560.bundle.517f0ef7ee3a20bf.js → 9560.bundle.4c9bc48e09c0bae1.js} +0 -0
@@ -3174,6 +3174,8 @@ async function addVolumesAsIndependentComponents({ viewport, volumeInputs, segme
3174
3174
  }
3175
3175
  viewport.removeActors([uid]);
3176
3176
  const oldMapper = actor.getMapper();
3177
+ const sharedImageData = oldMapper.getInputData();
3178
+ const originalScalars = sharedImageData.getPointData().getScalars() ?? null;
3177
3179
  const mapper = (0,esm.convertMapperToNotSharedMapper)(oldMapper);
3178
3180
  actor.setMapper(mapper);
3179
3181
  mapper.setBlendMode(esm.Enums.BlendModes.LABELMAP_EDGE_PROJECTION_BLEND);
@@ -3190,9 +3192,16 @@ async function addVolumesAsIndependentComponents({ viewport, volumeInputs, segme
3190
3192
  .getProperty()
3191
3193
  .getIndependentComponents();
3192
3194
  actor.getProperty().setIndependentComponents(true);
3195
+ const oldUseLabelOutline = actor.getProperty().getUseLabelOutline();
3196
+ const oldLabelOutlineOpacity = actor.getProperty().getLabelOutlineOpacity();
3197
+ const oldLabelOutlineThickness = actor
3198
+ .getProperty()
3199
+ .getLabelOutlineThickness();
3200
+ const representationUID = volumeInputArray[0].representationUID ??
3201
+ `${segmentationId}-${enums.SegmentationRepresentations.Labelmap}`;
3193
3202
  viewport.addActor({
3194
3203
  ...defaultActor,
3195
- representationUID: `${segmentationId}-${enums.SegmentationRepresentations.Labelmap}`,
3204
+ representationUID,
3196
3205
  });
3197
3206
  internalCache.set(uid, {
3198
3207
  added: true,
@@ -3204,7 +3213,7 @@ async function addVolumesAsIndependentComponents({ viewport, volumeInputs, segme
3204
3213
  preLoad: load,
3205
3214
  });
3206
3215
  function onSegmentationDataModified(evt) {
3207
- const { segmentationId } = evt.detail;
3216
+ const { segmentationId, modifiedSlicesToUse } = evt.detail;
3208
3217
  const { representationData } = (0,getSegmentation/* .getSegmentation */.T)(segmentationId);
3209
3218
  const { volumeId: segVolumeId } = representationData.Labelmap;
3210
3219
  if (segVolumeId !== segImageVolume.volumeId) {
@@ -3214,19 +3223,30 @@ async function addVolumesAsIndependentComponents({ viewport, volumeInputs, segme
3214
3223
  const segVoxelManager = segmentationVolume.voxelManager;
3215
3224
  const imageData = mapper.getInputData();
3216
3225
  const array = imageData.getPointData().getArray(0);
3217
- const baseData = array.getData();
3226
+ const combinedData = array.getData();
3218
3227
  const newComp = 2;
3219
3228
  const dims = segImageData.getDimensions();
3220
- const slices = Array.from({ length: dims[2] }, (_, i) => i);
3229
+ const sliceSize = dims[0] * dims[1];
3230
+ const slices = modifiedSlicesToUse?.length
3231
+ ? modifiedSlicesToUse
3232
+ : Array.from({ length: dims[2] }, (_, i) => i);
3221
3233
  for (const z of slices) {
3222
- for (let y = 0; y < dims[1]; ++y) {
3223
- for (let x = 0; x < dims[0]; ++x) {
3224
- const iTuple = x + dims[0] * (y + dims[1] * z);
3225
- baseData[iTuple * newComp + 1] = segVoxelManager.getAtIndex(iTuple);
3234
+ const sliceStart = z * sliceSize;
3235
+ const sliceImage = esm.cache.getImage(segmentationVolume.imageIds?.[z]);
3236
+ const sliceData = sliceImage?.voxelManager?.getScalarData?.();
3237
+ if (sliceData?.length === sliceSize) {
3238
+ for (let i = 0; i < sliceSize; ++i) {
3239
+ combinedData[(sliceStart + i) * newComp + 1] = sliceData[i];
3240
+ }
3241
+ }
3242
+ else {
3243
+ for (let i = 0; i < sliceSize; ++i) {
3244
+ const iTuple = sliceStart + i;
3245
+ combinedData[iTuple * newComp + 1] = segVoxelManager.getAtIndex(iTuple);
3226
3246
  }
3227
3247
  }
3228
3248
  }
3229
- array.setData(baseData);
3249
+ array.setData(combinedData);
3230
3250
  imageData.modified();
3231
3251
  viewport.render();
3232
3252
  }
@@ -3235,7 +3255,7 @@ async function addVolumesAsIndependentComponents({ viewport, volumeInputs, segme
3235
3255
  if (evt.detail.viewportId !== viewport.id) {
3236
3256
  return;
3237
3257
  }
3238
- esm.eventTarget.removeEventListener(enums.Events.SEGMENTATION_DATA_MODIFIED, onSegmentationDataModified);
3258
+ esm.eventTarget.removeEventListenerDebounced(enums.Events.SEGMENTATION_DATA_MODIFIED, onSegmentationDataModified);
3239
3259
  esm.eventTarget.removeEventListener(enums.Events.SEGMENTATION_REPRESENTATION_REMOVED, onSegmentationRepresentationRemoved);
3240
3260
  const actorEntry = viewport.getActor(uid);
3241
3261
  if (actorEntry) {
@@ -3246,11 +3266,22 @@ async function addVolumesAsIndependentComponents({ viewport, volumeInputs, segme
3246
3266
  return;
3247
3267
  }
3248
3268
  actor.setMapper(oldMapper);
3269
+ const pointData = sharedImageData.getPointData();
3270
+ if (originalScalars) {
3271
+ pointData.setScalars(originalScalars);
3272
+ }
3273
+ else {
3274
+ pointData.removeArray('Pixels');
3275
+ }
3276
+ sharedImageData.modified();
3249
3277
  actor.getProperty().setColorMixPreset(oldColorMixPreset);
3250
3278
  actor
3251
3279
  .getProperty()
3252
3280
  .setForceNearestInterpolation(1, oldForceNearestInterpolation);
3253
3281
  actor.getProperty().setIndependentComponents(oldIndependentComponents);
3282
+ actor.getProperty().setUseLabelOutline(oldUseLabelOutline);
3283
+ actor.getProperty().setLabelOutlineOpacity(oldLabelOutlineOpacity);
3284
+ actor.getProperty().setLabelOutlineThickness(oldLabelOutlineThickness);
3254
3285
  viewport.addActor({
3255
3286
  ...defaultActor,
3256
3287
  });
@@ -1267,8 +1267,8 @@ function getImageSrcFromImageId(cornerstone, imageId) {
1267
1267
  });
1268
1268
  }
1269
1269
  /* export default */ const PanelStudyBrowserTracking_getImageSrcFromImageId = (getImageSrcFromImageId);
1270
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 147 modules
1271
- var default_src = __webpack_require__(7825);
1270
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 148 modules
1271
+ var default_src = __webpack_require__(50904);
1272
1272
  ;// CONCATENATED MODULE: ../../../extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/index.tsx
1273
1273
 
1274
1274
  //
@@ -1329,8 +1329,8 @@ function _createGetImageSrcFromImageIdFn(extensionManager) {
1329
1329
  }
1330
1330
  }
1331
1331
  /* export default */ const panels_PanelStudyBrowserTracking = (WrappedPanelStudyBrowserTracking);
1332
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 200 modules
1333
- var cornerstone_src = __webpack_require__(86714);
1332
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 211 modules
1333
+ var cornerstone_src = __webpack_require__(75609);
1334
1334
  ;// CONCATENATED MODULE: ../../../extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx
1335
1335
  function _extends() { return _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; }, _extends.apply(null, arguments); }
1336
1336
 
@@ -11,8 +11,8 @@ __webpack_require__.d(__webpack_exports__, {
11
11
 
12
12
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
13
13
  var react = __webpack_require__(86326);
14
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 147 modules
15
- var src = __webpack_require__(7825);
14
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 148 modules
15
+ var src = __webpack_require__(50904);
16
16
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.css
17
17
  // extracted by css-extract-rspack-plugin
18
18
 
@@ -9,7 +9,7 @@ __webpack_require__.d(__webpack_exports__, {
9
9
  /* import */ var prop_types__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(prop_types__rspack_import_0);
10
10
  /* import */ var react__rspack_import_1 = __webpack_require__(86326);
11
11
  /* import */ var _ohif_ui_next__rspack_import_2 = __webpack_require__(39987);
12
- /* import */ var _ohif_extension_cornerstone__rspack_import_3 = __webpack_require__(86714);
12
+ /* import */ var _ohif_extension_cornerstone__rspack_import_3 = __webpack_require__(75609);
13
13
  function _extends() { return _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; }, _extends.apply(null, arguments); }
14
14
 
15
15
 
@@ -16,8 +16,8 @@ var prop_types = __webpack_require__(97598);
16
16
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
17
17
  // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3682 modules
18
18
  var src = __webpack_require__(39987);
19
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 200 modules
20
- var cornerstone_src = __webpack_require__(86714);
19
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 211 modules
20
+ var cornerstone_src = __webpack_require__(75609);
21
21
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
22
22
 
23
23
  function promptHydrateRT({
@@ -4333,7 +4333,7 @@ const onSegmentationDataModified = function (evt) {
4333
4333
  if (representationData.Labelmap) {
4334
4334
  (0,_labelmap_onLabelmapSegmentationDataModified_js__rspack_import_1/* ["default"] */.A)(evt);
4335
4335
  }
4336
- (0,_stateManagement_segmentation_SegmentationRenderingEngine_js__rspack_import_0/* .triggerSegmentationRenderBySegmentationId */.fy)(segmentationId);
4336
+ (0,_stateManagement_segmentation_SegmentationRenderingEngine_js__rspack_import_0/* .triggerSegmentationRenderForModified */.X8)(segmentationId);
4337
4337
  };
4338
4338
  /* export default */ const __rspack_default_export = (onSegmentationDataModified);
4339
4339
 
@@ -5060,7 +5060,7 @@ __webpack_require__.d(__webpack_exports__, {
5060
5060
  store: () => (/* reexport module object */ _store_index_js__rspack_import_1),
5061
5061
  synchronizers: () => (/* reexport module object */ _synchronizers_index_js__rspack_import_5),
5062
5062
  utilities: () => (/* reexport module object */ _utilities_index_js__rspack_import_7),
5063
- version: () => (/* reexport safe */ (/* inlined export _version_js__rspack_import_4 */"5.4.13"))
5063
+ version: () => (/* reexport safe */ (/* inlined export _version_js__rspack_import_4 */"5.4.17"))
5064
5064
  });
5065
5065
  /* import */ var _init_js__rspack_import_0 = __webpack_require__(70210);
5066
5066
  /* import */ var _store_index_js__rspack_import_1 = __webpack_require__(37872);
@@ -6291,6 +6291,7 @@ __webpack_require__.d(__webpack_exports__, {
6291
6291
  },
6292
6292
  88330(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
6293
6293
  __webpack_require__.d(__webpack_exports__, {
6294
+ X8: () => (triggerSegmentationRenderForModified),
6294
6295
  fy: () => (triggerSegmentationRenderBySegmentationId),
6295
6296
  h6: () => (triggerSegmentationRender)
6296
6297
  });
@@ -6475,6 +6476,50 @@ function triggerSegmentationRender(viewportId) {
6475
6476
  function triggerSegmentationRenderBySegmentationId(segmentationId) {
6476
6477
  segmentationRenderingEngine.renderSegmentation(segmentationId);
6477
6478
  }
6479
+ const DEFERRED_SEGMENTATION_RENDER_DELAY_MS = 240;
6480
+ const deferredSegmentationRenderTimers = new Map();
6481
+ function isProjectionHeavySegmentationViewport(viewport) {
6482
+ const blendMode = viewport.getBlendMode?.();
6483
+ if (blendMode === _cornerstonejs_core__rspack_import_0.Enums.BlendModes.LABELMAP_EDGE_PROJECTION_BLEND) {
6484
+ return true;
6485
+ }
6486
+ const planarViewport = viewport;
6487
+ if (typeof planarViewport.getDisplaySetPresentation !== 'function') {
6488
+ return false;
6489
+ }
6490
+ const dataIds = [];
6491
+ const sourceDataId = planarViewport.getSourceDataId?.();
6492
+ if (sourceDataId) {
6493
+ dataIds.push(sourceDataId);
6494
+ }
6495
+ planarViewport.getActors?.().forEach((actorEntry) => {
6496
+ if (actorEntry.representationUID) {
6497
+ dataIds.push(String(actorEntry.representationUID));
6498
+ }
6499
+ });
6500
+ return dataIds.some((dataId) => (planarViewport.getDisplaySetPresentation(dataId)?.slabThickness ?? 0) > 0);
6501
+ }
6502
+ function triggerSegmentationRenderForModified(segmentationId) {
6503
+ const viewportIds = segmentationRenderingEngine._getViewportIdsForSegmentation(segmentationId);
6504
+ viewportIds.forEach((viewportId) => {
6505
+ const { viewport } = (0,_cornerstonejs_core__rspack_import_0.getEnabledElementByViewportId)(viewportId) || {};
6506
+ if (!viewport) {
6507
+ return;
6508
+ }
6509
+ if (!isProjectionHeavySegmentationViewport(viewport)) {
6510
+ segmentationRenderingEngine.renderSegmentationsForViewport(viewportId);
6511
+ return;
6512
+ }
6513
+ const existingTimer = deferredSegmentationRenderTimers.get(viewportId);
6514
+ if (existingTimer !== undefined) {
6515
+ clearTimeout(existingTimer);
6516
+ }
6517
+ deferredSegmentationRenderTimers.set(viewportId, setTimeout(() => {
6518
+ deferredSegmentationRenderTimers.delete(viewportId);
6519
+ segmentationRenderingEngine.renderSegmentationsForViewport(viewportId);
6520
+ }, DEFERRED_SEGMENTATION_RENDER_DELAY_MS));
6521
+ });
6522
+ }
6478
6523
  const segmentationRenderingEngine = new SegmentationRenderingEngine();
6479
6524
 
6480
6525
 
@@ -45750,7 +45795,7 @@ __webpack_require__.d(__webpack_exports__, {
45750
45795
 
45751
45796
  },
45752
45797
  80274() {
45753
- const version = '5.4.13';
45798
+ const version = '5.4.17';
45754
45799
 
45755
45800
 
45756
45801
  },
@@ -65,8 +65,8 @@ var react = __webpack_require__(86326);
65
65
  var src = __webpack_require__(50679);
66
66
  // EXTERNAL MODULE: ../../i18n/src/index.js + 300 modules
67
67
  var i18n_src = __webpack_require__(90119);
68
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 200 modules
69
- var cornerstone_src = __webpack_require__(86714);
68
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 211 modules
69
+ var cornerstone_src = __webpack_require__(75609);
70
70
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/esm/index.js + 83 modules
71
71
  var esm = __webpack_require__(86186);
72
72
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js
@@ -1452,12 +1452,14 @@ function hydrateStructuredReport({
1452
1452
  // For 3d annotations there are no image IDs,
1453
1453
  // so we need to find the display sets by frame of reference to get the SeriesInstanceUIDs
1454
1454
  const frameOfReferenceUIDs = getFrameOfReferenceUIDs(hydratableMeasurementsInSR, sopInstanceUIDToImageId);
1455
+ const displaySetsByFrameOfReferenceUID = new Map();
1455
1456
  for (const FrameOfReferenceUID of frameOfReferenceUIDs) {
1456
1457
  const displaySetsFOR = displaySetService.getDisplaySetsBy(ds => ds.FrameOfReferenceUID === FrameOfReferenceUID && !ds.isDerivedDisplaySet);
1457
- const ds = chooseDisplaySet(displaySetsFOR, FrameOfReferenceUID);
1458
+ const ds = getReferencedDisplaySet(displaySet, displaySetsFOR, FrameOfReferenceUID, displaySetService);
1458
1459
  if (!ds) {
1459
1460
  continue;
1460
1461
  }
1462
+ displaySetsByFrameOfReferenceUID.set(FrameOfReferenceUID, ds);
1461
1463
  if (!SeriesInstanceUIDs.includes(ds.SeriesInstanceUID)) {
1462
1464
  SeriesInstanceUIDs.push(ds.SeriesInstanceUID);
1463
1465
  }
@@ -1480,7 +1482,7 @@ function hydrateStructuredReport({
1480
1482
  const frameNumber = toolData.annotation.data && toolData.annotation.data.frameNumber || 1;
1481
1483
  const imageId = sopInstanceUIDToImageId[`${toolData.sopInstanceUid}:${frameNumber}`];
1482
1484
  if (!imageId) {
1483
- return getReferenceData3D(toolData, servicesManager);
1485
+ return getReferenceData3D(toolData, servicesManager, displaySetsByFrameOfReferenceUID);
1484
1486
  }
1485
1487
  const instance = core_dist_esm.metaData.get('instance', imageId);
1486
1488
  const {
@@ -1602,21 +1604,37 @@ function chooseDisplaySet(displaySets, reference) {
1602
1604
  console.warn('No display set found for', reference);
1603
1605
  return;
1604
1606
  }
1605
- if (displaySets.length === 1) {
1606
- return displaySets[0];
1607
+ const sortedDisplaySets = src/* ["default"].utils.sortDisplaySetsCopy */.Ay.utils.sortDisplaySetsCopy(displaySets);
1608
+ if (sortedDisplaySets.length === 1) {
1609
+ return sortedDisplaySets[0];
1607
1610
  }
1608
- const volumeDs = displaySets.find(ds => ds.isReconstructable);
1611
+ const volumeDs = sortedDisplaySets.find(ds => ds.isReconstructable);
1609
1612
  if (volumeDs) {
1610
1613
  return volumeDs;
1611
1614
  }
1612
- return displaySets[0];
1615
+ return sortedDisplaySets[0];
1616
+ }
1617
+
1618
+ /**
1619
+ * SCOORD3D only identifies a frame of reference, so many series can be valid
1620
+ * candidates. The SR loader has already selected and recorded a stable display
1621
+ * set for each measurement. Reuse that selection during hydration so the
1622
+ * viewport series and annotation volume cannot depend on display-set load order.
1623
+ */
1624
+ function getReferencedDisplaySet(srDisplaySet, displaySets, FrameOfReferenceUID, displaySetService) {
1625
+ const referencedDisplaySetInstanceUID = srDisplaySet.measurements?.find(measurement => measurement.coords?.some(coord => coord.ValueType === 'SCOORD3D' && coord.ReferencedFrameOfReferenceSequence === FrameOfReferenceUID))?.displaySetInstanceUID;
1626
+ const referencedDisplaySet = referencedDisplaySetInstanceUID ? displaySetService.getDisplaySetByUID(referencedDisplaySetInstanceUID) : undefined;
1627
+ if (referencedDisplaySet?.FrameOfReferenceUID === FrameOfReferenceUID && !referencedDisplaySet.isDerivedDisplaySet) {
1628
+ return referencedDisplaySet;
1629
+ }
1630
+ return chooseDisplaySet(displaySets, FrameOfReferenceUID);
1613
1631
  }
1614
1632
 
1615
1633
  /**
1616
1634
  * Gets the additional reference data appropriate for a 3d reference.
1617
1635
  * This will choose a volume id, frame of reference and a plane restriction.
1618
1636
  */
1619
- function getReferenceData3D(toolData, servicesManager) {
1637
+ function getReferenceData3D(toolData, servicesManager, displaySetsByFrameOfReferenceUID = new Map()) {
1620
1638
  const {
1621
1639
  FrameOfReferenceUID
1622
1640
  } = toolData.annotation.metadata;
@@ -1632,7 +1650,7 @@ function getReferenceData3D(toolData, servicesManager) {
1632
1650
  FrameOfReferenceUID
1633
1651
  };
1634
1652
  }
1635
- const ds = chooseDisplaySet(displaySetsFOR, toolData.annotation);
1653
+ const ds = displaySetsByFrameOfReferenceUID.get(FrameOfReferenceUID) || chooseDisplaySet(displaySetsFOR, toolData.annotation);
1636
1654
  const cameraView = chooseCameraView(ds, points);
1637
1655
  const viewReference = {
1638
1656
  ...cameraView,
@@ -14,6 +14,8 @@ var package_namespaceObject = JSON.parse('{"UU":"@ohif/extension-tmtv"}')
14
14
 
15
15
  const id_id = package_namespaceObject.UU;
16
16
 
17
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 211 modules
18
+ var src = __webpack_require__(75609);
17
19
  ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/utils/hpViewports.ts
18
20
  // Common sync group configurations
19
21
  const cameraPositionSync = id => ({
@@ -248,6 +250,13 @@ const fusionAXIAL = {
248
250
  options: {
249
251
  colormap: {
250
252
  name: 'hsv',
253
+ // Legacy fusion PT opacity ramp (unchanged): low PT values stay mostly
254
+ // transparent so the CT shows through. Do NOT flatten this to a scalar —
255
+ // the legacy viewport renders this ramp and depends on it. The native
256
+ // ("next") viewport would apply the ramp literally (keeping the
257
+ // background transparent and preventing the 100% opacity slider from
258
+ // fully covering the CT), so the next path replaces this ramp with a
259
+ // flat scalar in getHangingProtocolModule instead of changing it here.
251
260
  opacity: [{
252
261
  value: 0,
253
262
  opacity: 0
@@ -306,6 +315,13 @@ const fusionSAGITTAL = {
306
315
  options: {
307
316
  colormap: {
308
317
  name: 'hsv',
318
+ // Legacy fusion PT opacity ramp (unchanged): low PT values stay mostly
319
+ // transparent so the CT shows through. Do NOT flatten this to a scalar —
320
+ // the legacy viewport renders this ramp and depends on it. The native
321
+ // ("next") viewport would apply the ramp literally (keeping the
322
+ // background transparent and preventing the 100% opacity slider from
323
+ // fully covering the CT), so the next path replaces this ramp with a
324
+ // flat scalar in getHangingProtocolModule instead of changing it here.
309
325
  opacity: [{
310
326
  value: 0,
311
327
  opacity: 0
@@ -364,6 +380,13 @@ const fusionCORONAL = {
364
380
  options: {
365
381
  colormap: {
366
382
  name: 'hsv',
383
+ // Legacy fusion PT opacity ramp (unchanged): low PT values stay mostly
384
+ // transparent so the CT shows through. Do NOT flatten this to a scalar —
385
+ // the legacy viewport renders this ramp and depends on it. The native
386
+ // ("next") viewport would apply the ramp literally (keeping the
387
+ // background transparent and preventing the 100% opacity slider from
388
+ // fully covering the CT), so the next path replaces this ramp with a
389
+ // flat scalar in getHangingProtocolModule instead of changing it here.
367
390
  opacity: [{
368
391
  value: 0,
369
392
  opacity: 0
@@ -431,6 +454,7 @@ const mipSAGITTAL = {
431
454
  ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/getHangingProtocolModule.ts
432
455
 
433
456
 
457
+
434
458
  /**
435
459
  * represents a 3x4 viewport layout configuration. The layout displays CT axial, sagittal, and coronal
436
460
  * images in the first row, PT axial, sagittal, and coronal images in the second row, and fusion axial,
@@ -707,6 +731,19 @@ const ptCT = {
707
731
  numberOfPriorsReferenced: -1
708
732
  };
709
733
  function getHangingProtocolModule() {
734
+ // Replace the fusion PT opacity ramp with a flat scalar for the native ("next")
735
+ // path only, leaving the legacy ramp in hpViewports untouched. Done here (not at
736
+ // module load) because the useNextViewports flag is set during cornerstone
737
+ // preRegistration, which runs before this module is gathered.
738
+ if ((0,src/* .isNextViewportsEnabled */.qW)()) {
739
+ [fusionAXIAL, fusionSAGITTAL, fusionCORONAL].forEach(viewport => {
740
+ const ptDisplaySet = viewport.displaySets?.find(ds => ds.id === 'ptDisplaySet');
741
+ const colormap = ptDisplaySet?.options?.colormap;
742
+ if (colormap) {
743
+ colormap.opacity = src/* .NEXT_FUSION_PT_OPACITY */.yM;
744
+ }
745
+ });
746
+ }
710
747
  return [{
711
748
  name: ptCT.id,
712
749
  protocol: ptCT
@@ -719,7 +756,7 @@ var react = __webpack_require__(86326);
719
756
  var prop_types = __webpack_require__(97598);
720
757
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
721
758
  // EXTERNAL MODULE: ../../core/src/index.ts + 75 modules
722
- var src = __webpack_require__(50679);
759
+ var core_src = __webpack_require__(50679);
723
760
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 29 modules
724
761
  var es = __webpack_require__(75258);
725
762
  // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3682 modules
@@ -787,7 +824,7 @@ function PanelPetSUV() {
787
824
  const {
788
825
  commandsManager,
789
826
  servicesManager
790
- } = (0,src/* .useSystem */.Jg)();
827
+ } = (0,core_src/* .useSystem */.Jg)();
791
828
  const {
792
829
  t
793
830
  } = (0,es/* .useTranslation */.Bd)('PanelSUV');
@@ -878,7 +915,7 @@ function PanelPetSUV() {
878
915
  }
879
916
 
880
917
  // metadata should be dcmjs naturalized
881
- src/* .DicomMetadataStore.updateMetadataForSeries */.H8.updateMetadataForSeries(ptDisplaySet.StudyInstanceUID, ptDisplaySet.SeriesInstanceUID, metadata);
918
+ core_src/* .DicomMetadataStore.updateMetadataForSeries */.H8.updateMetadataForSeries(ptDisplaySet.StudyInstanceUID, ptDisplaySet.SeriesInstanceUID, metadata);
882
919
 
883
920
  // update the displaySets
884
921
  displaySetService.setDisplaySetMetadataInvalidated(ptDisplaySet.displaySetInstanceUID);
@@ -971,8 +1008,6 @@ PanelPetSUV.propTypes = {
971
1008
  }).isRequired
972
1009
  }).isRequired
973
1010
  };
974
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 200 modules
975
- var cornerstone_src = __webpack_require__(86714);
976
1011
  ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/utils/handleROIThresholding.ts
977
1012
  const handleROIThresholding_handleROIThresholding = async ({
978
1013
  commandsManager,
@@ -994,8 +1029,8 @@ const handleROIThresholding_handleROIThresholding = async ({
994
1029
  segmentationService.addOrUpdateSegmentation(segmentation);
995
1030
  });
996
1031
  };
997
- // EXTERNAL MODULE: ../../core/src/utils/index.ts + 33 modules
998
- var utils = __webpack_require__(90492);
1032
+ // EXTERNAL MODULE: ../../core/src/utils/index.ts + 34 modules
1033
+ var utils = __webpack_require__(81381);
999
1034
  ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/Panels/PanelROIThresholdSegmentation/PanelROIThresholdExport.tsx
1000
1035
 
1001
1036
 
@@ -1007,13 +1042,13 @@ function PanelRoiThresholdSegmentation() {
1007
1042
  const {
1008
1043
  commandsManager,
1009
1044
  servicesManager
1010
- } = (0,src/* .useSystem */.Jg)();
1045
+ } = (0,core_src/* .useSystem */.Jg)();
1011
1046
  const {
1012
1047
  segmentationService
1013
1048
  } = servicesManager.services;
1014
1049
  const {
1015
1050
  segmentationsWithRepresentations: segmentationsInfo
1016
- } = (0,cornerstone_src/* .useActiveViewportSegmentationRepresentations */.c3)();
1051
+ } = (0,src/* .useActiveViewportSegmentationRepresentations */.c3)();
1017
1052
  const segmentationIds = segmentationsInfo?.map(info => info.segmentation.segmentationId) || [];
1018
1053
  const segmentations = segmentationsInfo?.map(info => info.segmentation) || [];
1019
1054
  (0,react.useEffect)(() => {
@@ -1091,8 +1126,8 @@ function PanelRoiThresholdSegmentation() {
1091
1126
 
1092
1127
 
1093
1128
 
1094
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 147 modules
1095
- var default_src = __webpack_require__(7825);
1129
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 148 modules
1130
+ var default_src = __webpack_require__(50904);
1096
1131
  ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/Panels/PanelTMTV.tsx
1097
1132
 
1098
1133
 
@@ -1100,7 +1135,7 @@ var default_src = __webpack_require__(7825);
1100
1135
  function PanelTMTV({
1101
1136
  configuration
1102
1137
  }) {
1103
- return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(cornerstone_src/* .PanelSegmentation */.rE, {
1138
+ return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(src/* .PanelSegmentation */.rE, {
1104
1139
  configuration: configuration
1105
1140
  }, /*#__PURE__*/react.createElement(PanelRoiThresholdSegmentation, null)));
1106
1141
  }
@@ -1209,7 +1244,7 @@ const RectangleROIStartEndThreshold_RectangleROIStartEndThreshold = {
1209
1244
  SOPInstanceUID,
1210
1245
  SeriesInstanceUID,
1211
1246
  StudyInstanceUID
1212
- } = (0,cornerstone_src/* .getSOPInstanceAttributes */.J4)(referencedImageId, cornerstoneViewportService, viewportId);
1247
+ } = (0,src/* .getSOPInstanceAttributes */.J4)(referencedImageId, cornerstoneViewportService, viewportId);
1213
1248
  let displaySet;
1214
1249
  if (SOPInstanceUID) {
1215
1250
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -1271,7 +1306,7 @@ const CircleROIStartEndThreshold_CircleROIStartEndThreshold = {
1271
1306
  SOPInstanceUID,
1272
1307
  SeriesInstanceUID,
1273
1308
  StudyInstanceUID
1274
- } = (0,cornerstone_src/* .getSOPInstanceAttributes */.J4)(referencedImageId, cornerstoneViewportService, viewportId);
1309
+ } = (0,src/* .getSOPInstanceAttributes */.J4)(referencedImageId, cornerstoneViewportService, viewportId);
1275
1310
  let displaySet;
1276
1311
  if (SOPInstanceUID) {
1277
1312
  displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
@@ -1329,7 +1364,7 @@ const measurementServiceMappingsFactory = (measurementService, displaySetService
1329
1364
  const {
1330
1365
  CORNERSTONE_3D_TOOLS_SOURCE_NAME,
1331
1366
  CORNERSTONE_3D_TOOLS_SOURCE_VERSION
1332
- } = cornerstone_src/* .Enums */.fX;
1367
+ } = src/* .Enums */.fX;
1333
1368
 
1334
1369
  /**
1335
1370
  *
@@ -1432,7 +1467,7 @@ function _getStrategyFn(statistic) {
1432
1467
 
1433
1468
  const {
1434
1469
  downloadCsv
1435
- } = src/* .utils */.Wp;
1470
+ } = core_src/* .utils */.Wp;
1436
1471
  function createAndDownloadTMTVReport(segReport, additionalReportRows, options = {}) {
1437
1472
  const firstReport = segReport[Object.keys(segReport)[0]];
1438
1473
  const columns = Object.keys(firstReport);
@@ -1478,9 +1513,9 @@ var adapters_dist_esm = __webpack_require__(86186);
1478
1513
  const {
1479
1514
  datasetToBlob
1480
1515
  } = dcmjs_es/* ["default"].data */.Ay.data;
1481
- const metadataProvider = src/* .classes.MetadataProvider */.Ly.MetadataProvider;
1516
+ const metadataProvider = core_src/* .classes.MetadataProvider */.Ly.MetadataProvider;
1482
1517
  function dicomRTAnnotationExport(annotations) {
1483
- const dataset = adapters_dist_esm/* .adaptersRT.Cornerstone3D.RTSS.generateRTSSFromAnnotations */.f_.Cornerstone3D.RTSS.generateRTSSFromAnnotations(annotations, metadataProvider, src/* .DicomMetadataStore */.H8);
1518
+ const dataset = adapters_dist_esm/* .adaptersRT.Cornerstone3D.RTSS.generateRTSSFromAnnotations */.f_.Cornerstone3D.RTSS.generateRTSSFromAnnotations(annotations, metadataProvider, core_src/* .DicomMetadataStore */.H8);
1484
1519
  const reportBlob = datasetToBlob(dataset);
1485
1520
 
1486
1521
  //Create a URL for the binary.
@@ -1501,13 +1536,14 @@ function dicomRTAnnotationExport(annotations) {
1501
1536
 
1502
1537
 
1503
1538
 
1539
+
1504
1540
  const {
1505
1541
  SegmentationRepresentations
1506
1542
  } = esm.Enums;
1507
1543
  const {
1508
1544
  formatPN
1509
- } = src/* .utils */.Wp;
1510
- const commandsModule_metadataProvider = src/* .classes.MetadataProvider */.Ly.MetadataProvider;
1545
+ } = core_src/* .utils */.Wp;
1546
+ const commandsModule_metadataProvider = core_src/* .classes.MetadataProvider */.Ly.MetadataProvider;
1511
1547
  const ROI_THRESHOLD_MANUAL_TOOL_IDS = ['RectangleROIStartEndThreshold', 'RectangleROIThreshold', 'CircleROIStartEndThreshold'];
1512
1548
  const commandsModule = ({
1513
1549
  servicesManager,
@@ -1756,9 +1792,15 @@ const commandsModule = ({
1756
1792
  const {
1757
1793
  viewport
1758
1794
  } = _getActiveViewportsEnabledElement();
1759
- const {
1760
- focalPoint
1761
- } = viewport.getCamera();
1795
+ // Native ("next") viewports have no getCamera; the slice-center focal point
1796
+ // comes from the view reference. Bridged so both lanes work.
1797
+ const focalPoint = (0,src/* .getViewportFocalPoint */.sH)(viewport);
1798
+
1799
+ // Native viewports may not resolve a focal point; writing undefined into the
1800
+ // annotation would invalidate its ROI-threshold coordinates.
1801
+ if (!focalPoint) {
1802
+ return;
1803
+ }
1762
1804
  const selectedAnnotationUIDs = _getAnnotationsSelectedByToolNames(ROI_THRESHOLD_MANUAL_TOOL_IDS);
1763
1805
  const annotationUID = selectedAnnotationUIDs[0];
1764
1806
  const annotation = esm.annotation.state.getAnnotation(annotationUID);
@@ -1778,8 +1820,11 @@ const commandsModule = ({
1778
1820
  const annotationUID = selectedAnnotationUIDs[0];
1779
1821
  const annotation = esm.annotation.state.getAnnotation(annotationUID);
1780
1822
 
1781
- // get the current focal point
1782
- const focalPointToEnd = viewport.getCamera().focalPoint;
1823
+ // get the current focal point (bridged: native viewports use the view reference)
1824
+ const focalPointToEnd = (0,src/* .getViewportFocalPoint */.sH)(viewport);
1825
+ if (!focalPointToEnd) {
1826
+ return;
1827
+ }
1783
1828
  annotation.data.endCoordinate = focalPointToEnd;
1784
1829
 
1785
1830
  // IMPORTANT: invalidate the toolData for the cached stat to get updated
@@ -1853,7 +1898,7 @@ const commandsModule = ({
1853
1898
  continue;
1854
1899
  }
1855
1900
  const firstImageId = referencedVolume.imageIds[0];
1856
- const instance = src/* ["default"].classes.MetadataProvider.get */.Ay.classes.MetadataProvider.get('instance', firstImageId);
1901
+ const instance = core_src/* ["default"].classes.MetadataProvider.get */.Ay.classes.MetadataProvider.get('instance', firstImageId);
1857
1902
  if (!instance) {
1858
1903
  report[id] = segReport;
1859
1904
  continue;
@@ -2163,8 +2208,8 @@ function reducer(state, action) {
2163
2208
  function RectangleROIOptions() {
2164
2209
  const {
2165
2210
  commandsManager
2166
- } = (0,src/* .useSystem */.Jg)();
2167
- const segmentations = (0,cornerstone_src/* .useSegmentations */.jo)();
2211
+ } = (0,core_src/* .useSystem */.Jg)();
2212
+ const segmentations = (0,src/* .useSegmentations */.jo)();
2168
2213
  const activeSegmentation = segmentations[0];
2169
2214
  const {
2170
2215
  t
@@ -2235,7 +2280,7 @@ const toolGroupIds = {
2235
2280
 
2236
2281
  const {
2237
2282
  TOOLBAR_SECTIONS
2238
- } = src/* .ToolbarService */.hx;
2283
+ } = core_src/* .ToolbarService */.hx;
2239
2284
  const MIN_SEGMENTATION_DRAWING_RADIUS = 0.5;
2240
2285
  const MAX_SEGMENTATION_DRAWING_RADIUS = 99.5;
2241
2286
  const setToolActiveToolbar = {