@ohif/app 3.13.0-beta.119 → 3.13.0-beta.120

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 (39) hide show
  1. package/dist/{1483.bundle.e208a19dd0ff9a11.js → 1483.bundle.5e93c978bd32d7de.js} +1 -1
  2. package/dist/{2343.bundle.e50c08b2df863e1a.js → 2343.bundle.3445fda02a002697.js} +12 -8
  3. package/dist/{2036.bundle.1b6c0d890aa6bf4e.js → 2493.bundle.f3b6a64d158365da.js} +113 -35
  4. package/dist/{3215.bundle.1fca83719c1b786b.js → 3330.bundle.b1297ef8c94e5440.js} +796 -180
  5. package/dist/{2690.bundle.f5dc28ac498de122.js → 3568.bundle.45dc681ef6890166.js} +2112 -76
  6. package/dist/{6495.bundle.84b83aa091c338cd.js → 6495.bundle.a6764fdb8c0c252f.js} +846 -219
  7. package/dist/{8668.bundle.93c88419e37dc076.js → 8668.bundle.0e47f7231aa07da2.js} +227 -3
  8. package/dist/{9402.bundle.0dd1b538f0708077.js → 9402.bundle.928437e2e48c12dd.js} +2 -2
  9. package/dist/{9560.bundle.bb39f946ea79cf0e.js → 9560.bundle.517f0ef7ee3a20bf.js} +159 -196
  10. package/dist/{app.bundle.bdeb02edea129b2c.js → app.bundle.81a823d1149be346.js} +99 -25
  11. package/dist/{compute.bundle.77e80c1775429bd6.js → compute.bundle.9cc3697d07fbb082.js} +3 -3
  12. package/dist/index.html +1 -1
  13. package/dist/{polySeg.bundle.5e350e0723aa59b6.js → polySeg.bundle.a526954fc2fed311.js} +3 -3
  14. package/dist/sw.js +1 -1
  15. package/package.json +6 -6
  16. /package/dist/{100.bundle.bd6735a86c215595.js → 100.bundle.84a35e9d087b403c.js} +0 -0
  17. /package/dist/{1180.bundle.4c5146471b4d3497.js → 1180.bundle.7f790d9fd6fb031c.js} +0 -0
  18. /package/dist/{1602.bundle.163e3da3a27b860c.js → 1602.bundle.254a392a6b5d2b85.js} +0 -0
  19. /package/dist/{2779.bundle.664d9d0a704f7b94.js → 2779.bundle.c879d6af5dc0c274.js} +0 -0
  20. /package/dist/{3500.bundle.18412afd9ee5d6a7.js → 3500.bundle.d4aaab15c4461cc4.js} +0 -0
  21. /package/dist/{3760.bundle.f69046888fc2b881.js → 3760.bundle.c95abd6ab662bd3b.js} +0 -0
  22. /package/dist/{4556.bundle.128d2abaea69dce3.js → 4556.bundle.c3ac23e680d677b2.js} +0 -0
  23. /package/dist/{4683.bundle.b02523a9d66f4d19.js → 4683.bundle.ed3f14fcb89fbad1.js} +0 -0
  24. /package/dist/{5189.bundle.2a0f740738759e32.js → 5189.bundle.ea191ea99047fd6f.js} +0 -0
  25. /package/dist/{5642.bundle.1622d255af1102d8.js → 5642.bundle.98e17a4413db6ef1.js} +0 -0
  26. /package/dist/{5696.bundle.2f47cb5ab5a7f983.js → 5696.bundle.e77041f7e2b08236.js} +0 -0
  27. /package/dist/{6749.bundle.9f0550714a4d5f8b.js → 6749.bundle.9dcda33e49485da4.js} +0 -0
  28. /package/dist/{7231.bundle.46f843b74a964f89.js → 7231.bundle.1063d727ad99108a.js} +0 -0
  29. /package/dist/{7248.bundle.bffd4e60f806e25d.js → 7248.bundle.ab6f276adad059da.js} +0 -0
  30. /package/dist/{7499.bundle.bb240e8754167cb2.js → 7499.bundle.832916b9b820c33f.js} +0 -0
  31. /package/dist/{781.bundle.f7411dabe0628911.js → 781.bundle.f06b6ab92ef4d695.js} +0 -0
  32. /package/dist/{8423.bundle.071901427fd3cd9e.js → 8423.bundle.ebf8d7d638d9616b.js} +0 -0
  33. /package/dist/{8492.bundle.9c17dcbab24b07c3.js → 8492.bundle.1ceeb18471c1c06b.js} +0 -0
  34. /package/dist/{8832.bundle.e413f00216682f40.js → 8832.bundle.1eb46bfa451c792f.js} +0 -0
  35. /package/dist/{9116.bundle.1cb5c393e3a152cd.js → 9116.bundle.1d0c6c18a4db51cc.js} +0 -0
  36. /package/dist/{9290.bundle.77a274271ce884a3.js → 9290.bundle.82e8dfc0f73c41bb.js} +0 -0
  37. /package/dist/{9383.bundle.9b1d03c71cc52f4f.js → 9383.bundle.ec44c452ccc23e93.js} +0 -0
  38. /package/dist/{9415.bundle.d3532cc872787744.js → 9415.bundle.69d74a2b03d5d6e4.js} +0 -0
  39. /package/dist/{9437.bundle.a18085ed31658c82.js → 9437.bundle.ca5db89624e35827.js} +0 -0
@@ -1596,10 +1596,11 @@ function beginLabelmapEditTransaction(segmentation, options) {
1596
1596
  isInObject: options.isInObject,
1597
1597
  isInObjectBoundsIJK: options.isInObjectBoundsIJK,
1598
1598
  });
1599
+ let moveStep;
1599
1600
  if (shouldMoveSegment) {
1600
1601
  const moveSegmentToPrivateLabelmap = options.moveSegmentToPrivateLabelmap ??
1601
1602
  _privateLabelmap_js__rspack_import_3/* .moveSegmentToPrivateLabelmap */.J;
1602
- const privateLayer = moveSegmentToPrivateLabelmap(segmentation, segmentIndex);
1603
+ const privateLayer = moveSegmentToPrivateLabelmap(segmentation, segmentIndex, { moveStepCallback: (step) => (moveStep = step) });
1603
1604
  const privateBinding = (0,_labelmapSegmentBindings_js__rspack_import_2/* .getSegmentBinding */.hM)(segmentation, segmentIndex);
1604
1605
  if (privateLayer && privateBinding) {
1605
1606
  activeLayer = privateLayer;
@@ -1624,6 +1625,7 @@ function beginLabelmapEditTransaction(segmentation, options) {
1624
1625
  protectedSegmentIndices,
1625
1626
  crossLayerEraseBindings: collectCrossLayerEraseBindings(segmentation, labelmapId, overwriteSegmentIndices),
1626
1627
  movedSegment,
1628
+ moveStep,
1627
1629
  };
1628
1630
  }
1629
1631
  function getViewportImageIds(viewport) {
@@ -1682,6 +1684,7 @@ function eraseVolumeLayer(layer, binding, options, modifiedSlices) {
1682
1684
  if (!volume) {
1683
1685
  return;
1684
1686
  }
1687
+ const erasedIndices = [];
1685
1688
  volume.voxelManager.forEach(({ value, index, pointIJK }) => {
1686
1689
  if (value !== binding.labelValue) {
1687
1690
  return;
@@ -1691,10 +1694,18 @@ function eraseVolumeLayer(layer, binding, options, modifiedSlices) {
1691
1694
  return;
1692
1695
  }
1693
1696
  volume.voxelManager.setAtIndex(index, 0);
1697
+ erasedIndices.push(index);
1694
1698
  }, {
1695
1699
  imageData: volume.imageData,
1696
1700
  boundsIJK: options.isInObjectBoundsIJK,
1697
1701
  });
1702
+ if (erasedIndices.length) {
1703
+ options.crossLayerEraseCallback?.({
1704
+ voxelManager: volume.voxelManager,
1705
+ labelValue: binding.labelValue,
1706
+ indices: erasedIndices,
1707
+ });
1708
+ }
1698
1709
  volume.voxelManager
1699
1710
  ?.getArrayOfModifiedSlices?.()
1700
1711
  ?.forEach((sliceIndex) => modifiedSlices.add(sliceIndex));
@@ -1709,6 +1720,7 @@ function eraseStackLayer(layer, binding, options, modifiedSlices) {
1709
1720
  if (!image || !voxelManager) {
1710
1721
  return;
1711
1722
  }
1723
+ const erasedIndices = [];
1712
1724
  voxelManager.forEach(({ value, index, pointIJK }) => {
1713
1725
  if (value !== binding.labelValue) {
1714
1726
  return;
@@ -1718,10 +1730,18 @@ function eraseStackLayer(layer, binding, options, modifiedSlices) {
1718
1730
  return;
1719
1731
  }
1720
1732
  voxelManager.setAtIndex(index, 0);
1733
+ erasedIndices.push(index);
1721
1734
  }, {
1722
1735
  imageData: options.referenceImageData,
1723
1736
  boundsIJK: options.isInObjectBoundsIJK,
1724
1737
  });
1738
+ if (erasedIndices.length) {
1739
+ options.crossLayerEraseCallback?.({
1740
+ voxelManager,
1741
+ labelValue: binding.labelValue,
1742
+ indices: erasedIndices,
1743
+ });
1744
+ }
1725
1745
  const currentSlice = stackViewport.getCurrentImageIdIndex?.();
1726
1746
  if (typeof currentSlice === 'number') {
1727
1747
  modifiedSlices.add(currentSlice);
@@ -1822,15 +1842,18 @@ class LabelmapImageReferenceResolver {
1822
1842
  this.stackLabelmapImageIdReferenceMap = new Map();
1823
1843
  this.labelmapImageIdReferenceMap = new Map();
1824
1844
  this.keysBySegmentationId = new Map();
1845
+ this.completedScanResultsBySegmentationId = new Map();
1825
1846
  this.getSegmentation = getSegmentation;
1826
1847
  }
1827
1848
  reset() {
1828
1849
  this.stackLabelmapImageIdReferenceMap.clear();
1829
1850
  this.labelmapImageIdReferenceMap.clear();
1830
1851
  this.keysBySegmentationId.clear();
1852
+ this.completedScanResultsBySegmentationId.clear();
1831
1853
  }
1832
1854
  removeSegmentation(segmentationId) {
1833
1855
  this.stackLabelmapImageIdReferenceMap.delete(segmentationId);
1856
+ this.completedScanResultsBySegmentationId.delete(segmentationId);
1834
1857
  const keys = this.keysBySegmentationId.get(segmentationId);
1835
1858
  if (keys) {
1836
1859
  for (const key of keys) {
@@ -1904,7 +1927,43 @@ class LabelmapImageReferenceResolver {
1904
1927
  if (!enabledElement || !labelmapImageIds?.length) {
1905
1928
  return;
1906
1929
  }
1907
- return this.updateLabelmapSegmentationReferences(segmentationId, enabledElement.viewport, labelmapImageIds);
1930
+ const viewport = enabledElement.viewport;
1931
+ const scanKey = this.generateScanKey('current', viewport, labelmapImageIds);
1932
+ if (scanKey && this.hasCompletedScan(segmentationId, scanKey)) {
1933
+ return this.getCompletedScanResult(segmentationId, scanKey);
1934
+ }
1935
+ const result = this.updateLabelmapSegmentationReferences(segmentationId, viewport, labelmapImageIds);
1936
+ if (scanKey) {
1937
+ this.markCompletedScan(segmentationId, scanKey, result);
1938
+ }
1939
+ return result;
1940
+ }
1941
+ generateScanKey(kind, viewport, labelmapImageIds) {
1942
+ const referenceImageId = typeof viewport.getCurrentImageId === 'function'
1943
+ ? viewport.getCurrentImageId()
1944
+ : undefined;
1945
+ if (!referenceImageId) {
1946
+ return;
1947
+ }
1948
+ return `${kind}|${viewport.id}|${referenceImageId}|${labelmapImageIds.length}|${labelmapImageIds[0]}|${labelmapImageIds[labelmapImageIds.length - 1]}`;
1949
+ }
1950
+ hasCompletedScan(segmentationId, scanKey) {
1951
+ return !!this.completedScanResultsBySegmentationId
1952
+ .get(segmentationId)
1953
+ ?.has(scanKey);
1954
+ }
1955
+ getCompletedScanResult(segmentationId, scanKey) {
1956
+ return this.completedScanResultsBySegmentationId
1957
+ .get(segmentationId)
1958
+ ?.get(scanKey);
1959
+ }
1960
+ markCompletedScan(segmentationId, scanKey, result) {
1961
+ let results = this.completedScanResultsBySegmentationId.get(segmentationId);
1962
+ if (!results) {
1963
+ results = new Map();
1964
+ this.completedScanResultsBySegmentationId.set(segmentationId, results);
1965
+ }
1966
+ results.set(scanKey, result);
1908
1967
  }
1909
1968
  getCurrentLabelmapImageIdsForViewport(viewportId, segmentationId) {
1910
1969
  const enabledElement = (0,_cornerstonejs_core__rspack_import_0.getEnabledElementByViewportId)(viewportId);
@@ -2045,6 +2104,13 @@ class LabelmapImageReferenceResolver {
2045
2104
  return;
2046
2105
  }
2047
2106
  const stackViewport = enabledElement.viewport;
2107
+ const scanKey = this.generateScanKey('all', stackViewport, labelmapImageIds);
2108
+ if (scanKey && this.hasCompletedScan(segmentationId, scanKey)) {
2109
+ return;
2110
+ }
2111
+ if (scanKey) {
2112
+ this.markCompletedScan(segmentationId, scanKey);
2113
+ }
2048
2114
  this.updateLabelmapSegmentationReferences(segmentationId, stackViewport, labelmapImageIds, (stackViewport, segmentationId, labelmapImageIds) => {
2049
2115
  const imageIds = stackViewport.getImageIds();
2050
2116
  imageIds.forEach((referenceImageId, index) => {
@@ -2284,7 +2350,7 @@ function createPrivateLabelmap(segmentation, sourceLabelmap) {
2284
2350
  }
2285
2351
  return createPrivateStackLabelmap(segmentation, sourceLabelmap);
2286
2352
  }
2287
- function moveSegmentToPrivateLabelmap(segmentation, segmentIndex) {
2353
+ function moveSegmentToPrivateLabelmap(segmentation, segmentIndex, options = {}) {
2288
2354
  const binding = (0,_labelmapSegmentBindings_js__rspack_import_2/* .getSegmentBinding */.hM)(segmentation, segmentIndex);
2289
2355
  if (!binding) {
2290
2356
  return;
@@ -2298,16 +2364,26 @@ function moveSegmentToPrivateLabelmap(segmentation, segmentIndex) {
2298
2364
  }
2299
2365
  const privateLabelmap = createPrivateLabelmap(segmentation, sourceLabelmap);
2300
2366
  (0,_labelmapLayerStore_js__rspack_import_1/* .registerLabelmap */.AD)(segmentation, privateLabelmap);
2367
+ const movedVoxels = [];
2301
2368
  if (sourceLabelmap.volumeId && privateLabelmap.volumeId) {
2302
2369
  const sourceVolume = _cornerstonejs_core__rspack_import_0.cache.getVolume(sourceLabelmap.volumeId);
2303
2370
  const targetVolume = _cornerstonejs_core__rspack_import_0.cache.getVolume(privateLabelmap.volumeId);
2371
+ const indices = [];
2304
2372
  sourceVolume.voxelManager.forEach(({ value, index }) => {
2305
2373
  if (value !== binding.labelValue) {
2306
2374
  return;
2307
2375
  }
2308
2376
  targetVolume.voxelManager.setAtIndex(index, 1);
2309
2377
  sourceVolume.voxelManager.setAtIndex(index, 0);
2378
+ indices.push(index);
2310
2379
  });
2380
+ if (indices.length) {
2381
+ movedVoxels.push({
2382
+ source: sourceVolume.voxelManager,
2383
+ target: targetVolume.voxelManager,
2384
+ indices,
2385
+ });
2386
+ }
2311
2387
  }
2312
2388
  else {
2313
2389
  const sourceImageIds = sourceLabelmap.imageIds ?? [];
@@ -2318,20 +2394,55 @@ function moveSegmentToPrivateLabelmap(segmentation, segmentIndex) {
2318
2394
  if (!sourceImage || !targetImage) {
2319
2395
  return;
2320
2396
  }
2397
+ const indices = [];
2321
2398
  sourceImage.voxelManager.forEach(({ value, index }) => {
2322
2399
  if (value !== binding.labelValue) {
2323
2400
  return;
2324
2401
  }
2325
2402
  targetImage.voxelManager.setAtIndex(index, 1);
2326
2403
  sourceImage.voxelManager.setAtIndex(index, 0);
2404
+ indices.push(index);
2327
2405
  });
2406
+ if (indices.length) {
2407
+ movedVoxels.push({
2408
+ source: sourceImage.voxelManager,
2409
+ target: targetImage.voxelManager,
2410
+ indices,
2411
+ });
2412
+ }
2328
2413
  });
2329
2414
  }
2330
- (0,_labelmapSegmentBindings_js__rspack_import_2/* .setSegmentBinding */.Zs)(segmentation, segmentIndex, {
2415
+ const previousBinding = { ...binding };
2416
+ const newBinding = {
2331
2417
  labelmapId: privateLabelmap.labelmapId,
2332
2418
  labelValue: 1,
2333
- });
2419
+ };
2420
+ (0,_labelmapSegmentBindings_js__rspack_import_2/* .setSegmentBinding */.Zs)(segmentation, segmentIndex, { ...newBinding });
2334
2421
  (0,_labelmapLegacyAdapter_js__rspack_import_3/* .syncLegacyLabelmapData */.x)(segmentation);
2422
+ options.moveStepCallback?.({
2423
+ undo: () => {
2424
+ for (const { source, target, indices } of movedVoxels) {
2425
+ for (const index of indices) {
2426
+ target.setAtIndex(index, 0);
2427
+ source.setAtIndex(index, previousBinding.labelValue);
2428
+ }
2429
+ }
2430
+ (0,_labelmapSegmentBindings_js__rspack_import_2/* .setSegmentBinding */.Zs)(segmentation, segmentIndex, { ...previousBinding });
2431
+ (0,_labelmapLayerStore_js__rspack_import_1/* .removeLabelmap */.$n)(segmentation, privateLabelmap.labelmapId);
2432
+ (0,_labelmapLegacyAdapter_js__rspack_import_3/* .syncLegacyLabelmapData */.x)(segmentation);
2433
+ },
2434
+ redo: () => {
2435
+ (0,_labelmapLayerStore_js__rspack_import_1/* .registerLabelmap */.AD)(segmentation, privateLabelmap);
2436
+ for (const { source, target, indices } of movedVoxels) {
2437
+ for (const index of indices) {
2438
+ source.setAtIndex(index, 0);
2439
+ target.setAtIndex(index, 1);
2440
+ }
2441
+ }
2442
+ (0,_labelmapSegmentBindings_js__rspack_import_2/* .setSegmentBinding */.Zs)(segmentation, segmentIndex, { ...newBinding });
2443
+ (0,_labelmapLegacyAdapter_js__rspack_import_3/* .syncLegacyLabelmapData */.x)(segmentation);
2444
+ },
2445
+ });
2335
2446
  return privateLabelmap;
2336
2447
  }
2337
2448
 
@@ -4323,6 +4434,8 @@ var compositions = __webpack_require__(30207);
4323
4434
  var getStrategyData = __webpack_require__(66340);
4324
4435
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/enums/index.js + 3 modules
4325
4436
  var enums = __webpack_require__(53870);
4437
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/utilities/segmentation/createLabelmapMemo.js
4438
+ var createLabelmapMemo = __webpack_require__(1732);
4326
4439
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/stateManagement/segmentation/getSegmentation.js
4327
4440
  var segmentation_getSegmentation = __webpack_require__(99212);
4328
4441
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.js
@@ -4330,6 +4443,7 @@ var labelmapSegmentationState = __webpack_require__(89615);
4330
4443
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.js
4331
4444
 
4332
4445
 
4446
+
4333
4447
  function collectCrossLayerEraseBindingsForOperation(operationData) {
4334
4448
  const { segmentationId, labelmapId, overwriteSegmentIndices } = operationData;
4335
4449
  const segmentation = getSegmentation(segmentationId);
@@ -4342,12 +4456,31 @@ function eraseCrossLayerOverwrites(operationData) {
4342
4456
  if (!segmentation) {
4343
4457
  return [];
4344
4458
  }
4459
+ const { memo } = operationData;
4345
4460
  return (0,labelmapSegmentationState/* .eraseLabelmapEditTransactionOverwrites */.Ry)(segmentation, operationData.labelmapEditTransaction, {
4346
4461
  viewport: operationData.viewport,
4347
4462
  referenceImageData: operationData.segmentationImageData,
4348
4463
  isInObject: operationData.isInObject,
4349
4464
  isInObjectBoundsIJK: operationData.isInObjectBoundsIJK,
4350
4465
  imageId: operationData.imageId,
4466
+ crossLayerEraseCallback: memo
4467
+ ? ({ voxelManager, labelValue, indices }) => {
4468
+ (memo.postSteps ||= []).push({
4469
+ undo: () => {
4470
+ for (const index of indices) {
4471
+ voxelManager.setAtIndex(index, labelValue);
4472
+ }
4473
+ (0,triggerSegmentationEvents.triggerSegmentationDataModified)(operationData.segmentationId);
4474
+ },
4475
+ redo: () => {
4476
+ for (const index of indices) {
4477
+ voxelManager.setAtIndex(index, 0);
4478
+ }
4479
+ (0,triggerSegmentationEvents.triggerSegmentationDataModified)(operationData.segmentationId);
4480
+ },
4481
+ });
4482
+ }
4483
+ : undefined,
4351
4484
  });
4352
4485
  }
4353
4486
 
@@ -4441,6 +4574,7 @@ var shouldUseLazyLabelmapEditing = __webpack_require__(46787);
4441
4574
 
4442
4575
 
4443
4576
 
4577
+
4444
4578
  class BrushStrategy {
4445
4579
  constructor(name, ...initializers) {
4446
4580
  this._initialize = [];
@@ -4460,7 +4594,27 @@ class BrushStrategy {
4460
4594
  }
4461
4595
  if (initializedData.memo?.segmentationVoxelManager !==
4462
4596
  initializedData.segmentationVoxelManager) {
4597
+ const previousMemo = initializedData.memo;
4463
4598
  initializedData.memo = initializedData.createMemo(initializedData.segmentationId, initializedData.segmentationVoxelManager);
4599
+ if (previousMemo &&
4600
+ previousMemo !== initializedData.memo &&
4601
+ previousMemo.commitMemo?.()) {
4602
+ (initializedData.memo.priorSteps ||= []).push((0,createLabelmapMemo.memoAsStep)(previousMemo));
4603
+ }
4604
+ }
4605
+ const moveStep = initializedData.labelmapEditTransaction?.moveStep;
4606
+ if (moveStep && initializedData.memo) {
4607
+ const { segmentationId } = initializedData;
4608
+ (initializedData.memo.priorSteps ||= []).push({
4609
+ undo: () => {
4610
+ moveStep.undo();
4611
+ (0,triggerSegmentationEvents.triggerSegmentationDataModified)(segmentationId);
4612
+ },
4613
+ redo: () => {
4614
+ moveStep.redo();
4615
+ (0,triggerSegmentationEvents.triggerSegmentationDataModified)(segmentationId);
4616
+ },
4617
+ });
4464
4618
  }
4465
4619
  if (initializedData.segmentationVoxelManager !==
4466
4620
  originalSegmentationVoxelManager ||
@@ -7624,197 +7778,6 @@ function getSphereStats(testMax, radiusIJK, segData, imageVoxels, spacing) {
7624
7778
  /* export default */ const __rspack_default_export = (getStatistics);
7625
7779
 
7626
7780
 
7627
- },
7628
- 29827(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
7629
- "use strict";
7630
- __webpack_require__.d(__webpack_exports__, {
7631
- A: () => (IslandRemoval)
7632
- });
7633
- /* import */ var _cornerstonejs_core__rspack_import_0 = __webpack_require__(88479);
7634
- /* import */ var _normalizeViewportPlane_js__rspack_import_1 = __webpack_require__(95972);
7635
-
7636
-
7637
- const { RLEVoxelMap, VoxelManager } = _cornerstonejs_core__rspack_import_0.utilities;
7638
- const MAX_IMAGE_SIZE = 65535;
7639
- var SegmentationEnum;
7640
- (function (SegmentationEnum) {
7641
- SegmentationEnum[SegmentationEnum["SEGMENT"] = -1] = "SEGMENT";
7642
- SegmentationEnum[SegmentationEnum["ISLAND"] = -2] = "ISLAND";
7643
- SegmentationEnum[SegmentationEnum["INTERIOR"] = -3] = "INTERIOR";
7644
- SegmentationEnum[SegmentationEnum["EXTERIOR"] = -4] = "EXTERIOR";
7645
- SegmentationEnum[SegmentationEnum["INTERIOR_SMALL"] = -5] = "INTERIOR_SMALL";
7646
- SegmentationEnum[SegmentationEnum["INTERIOR_TEST"] = -6] = "INTERIOR_TEST";
7647
- })(SegmentationEnum || (SegmentationEnum = {}));
7648
- class IslandRemoval {
7649
- constructor(options) {
7650
- this.fillInternalEdge = false;
7651
- this.maxInternalRemove = 128;
7652
- this.maxInternalRemove =
7653
- options?.maxInternalRemove ?? this.maxInternalRemove;
7654
- this.fillInternalEdge = options?.fillInternalEdge ?? this.fillInternalEdge;
7655
- }
7656
- initialize(viewport, segmentationVoxels, options) {
7657
- const hasSource = !!segmentationVoxels.sourceVoxelManager;
7658
- const segmentationVoxelManager = hasSource
7659
- ? segmentationVoxels.sourceVoxelManager
7660
- : segmentationVoxels;
7661
- const previewVoxelManager = hasSource
7662
- ? segmentationVoxels
7663
- : VoxelManager.createRLEHistoryVoxelManager(segmentationVoxelManager);
7664
- const { segmentIndex = 1, previewSegmentIndex = 1 } = options;
7665
- const clickedPoints = options.points || segmentationVoxelManager.getPoints();
7666
- if (!clickedPoints?.length) {
7667
- return;
7668
- }
7669
- const boundsIJK = segmentationVoxelManager
7670
- .getBoundsIJK()
7671
- .map((bound, i) => [
7672
- Math.min(bound[0], ...clickedPoints.map((point) => point[i])),
7673
- Math.max(bound[1], ...clickedPoints.map((point) => point[i])),
7674
- ]);
7675
- if (boundsIJK.find((it) => it[0] < 0 || it[1] > MAX_IMAGE_SIZE)) {
7676
- return;
7677
- }
7678
- const { toIJK, fromIJK, boundsIJKPrime, error } = (0,_normalizeViewportPlane_js__rspack_import_1/* ["default"] */.A)(viewport, boundsIJK);
7679
- if (error) {
7680
- console.warn('Not performing island removal for planes not orthogonal to acquisition plane', error);
7681
- return;
7682
- }
7683
- const [width, height, depth] = fromIJK(segmentationVoxelManager.dimensions);
7684
- const segmentSet = new RLEVoxelMap(width, height, depth);
7685
- const getter = (i, j, k) => {
7686
- const index = segmentationVoxelManager.toIndex(toIJK([i, j, k]));
7687
- const oldVal = segmentationVoxelManager.getAtIndex(index);
7688
- if (oldVal === previewSegmentIndex || oldVal === segmentIndex) {
7689
- return SegmentationEnum.SEGMENT;
7690
- }
7691
- };
7692
- segmentSet.fillFrom(getter, boundsIJKPrime);
7693
- segmentSet.normalizer = { toIJK, fromIJK, boundsIJKPrime };
7694
- this.segmentSet = segmentSet;
7695
- this.previewVoxelManager = previewVoxelManager;
7696
- this.segmentIndex = segmentIndex;
7697
- this.previewSegmentIndex = previewSegmentIndex ?? segmentIndex;
7698
- this.selectedPoints = clickedPoints;
7699
- return true;
7700
- }
7701
- floodFillSegmentIsland() {
7702
- const { selectedPoints: clickedPoints, segmentSet } = this;
7703
- let floodedCount = 0;
7704
- const { fromIJK } = segmentSet.normalizer;
7705
- clickedPoints.forEach((clickedPoint) => {
7706
- const ijkPrime = fromIJK(clickedPoint);
7707
- const index = segmentSet.toIndex(ijkPrime);
7708
- const [iPrime, jPrime, kPrime] = ijkPrime;
7709
- if (segmentSet.get(index) === SegmentationEnum.SEGMENT) {
7710
- floodedCount += segmentSet.floodFill(iPrime, jPrime, kPrime, SegmentationEnum.ISLAND);
7711
- }
7712
- });
7713
- return floodedCount;
7714
- }
7715
- removeExternalIslands() {
7716
- const { previewVoxelManager, segmentSet } = this;
7717
- const { toIJK } = segmentSet.normalizer;
7718
- const callback = (index, rle) => {
7719
- const [, jPrime, kPrime] = segmentSet.toIJK(index);
7720
- if (rle.value !== SegmentationEnum.ISLAND) {
7721
- for (let iPrime = rle.start; iPrime < rle.end; iPrime++) {
7722
- const clearPoint = toIJK([iPrime, jPrime, kPrime]);
7723
- const v = previewVoxelManager.getAtIJKPoint(clearPoint);
7724
- previewVoxelManager.setAtIJKPoint(clearPoint, v === undefined ? 0 : null);
7725
- }
7726
- }
7727
- };
7728
- segmentSet.forEach(callback, { rowModified: true });
7729
- }
7730
- removeInternalIslands() {
7731
- const { segmentSet, previewVoxelManager, previewSegmentIndex } = this;
7732
- const { height, normalizer, width } = segmentSet;
7733
- const { toIJK } = normalizer;
7734
- segmentSet.forEachRow((baseIndex, row) => {
7735
- let lastRle;
7736
- for (const rle of [...row]) {
7737
- if (rle.value !== SegmentationEnum.ISLAND) {
7738
- continue;
7739
- }
7740
- if (!lastRle) {
7741
- if (this.fillInternalEdge && rle.start > 0) {
7742
- for (let iPrime = 0; iPrime < rle.start; iPrime++) {
7743
- segmentSet.set(baseIndex + iPrime, SegmentationEnum.INTERIOR);
7744
- }
7745
- }
7746
- lastRle = rle;
7747
- continue;
7748
- }
7749
- for (let iPrime = lastRle.end; iPrime < rle.start; iPrime++) {
7750
- segmentSet.set(baseIndex + iPrime, SegmentationEnum.INTERIOR);
7751
- }
7752
- lastRle = rle;
7753
- }
7754
- if (this.fillInternalEdge && lastRle?.end < width) {
7755
- for (let iPrime = lastRle.end; iPrime < width; iPrime++) {
7756
- segmentSet.set(baseIndex + iPrime, SegmentationEnum.INTERIOR);
7757
- }
7758
- }
7759
- });
7760
- segmentSet.forEach((baseIndex, rle) => {
7761
- if (rle.value !== SegmentationEnum.INTERIOR) {
7762
- return;
7763
- }
7764
- const [, jPrime, kPrime] = segmentSet.toIJK(baseIndex);
7765
- const rowPrev = jPrime > 0 ? segmentSet.getRun(jPrime - 1, kPrime) : null;
7766
- const rowNext = jPrime + 1 < height ? segmentSet.getRun(jPrime + 1, kPrime) : null;
7767
- const isLast = jPrime === height - 1;
7768
- const isFirst = jPrime === 0;
7769
- const prevCovers = IslandRemoval.covers(rle, rowPrev) ||
7770
- (isFirst && this.fillInternalEdge);
7771
- const nextCovers = IslandRemoval.covers(rle, rowNext) || (isLast && this.fillInternalEdge);
7772
- if (rle.end - rle.start > 2 && (!prevCovers || !nextCovers)) {
7773
- segmentSet.floodFill(rle.start, jPrime, kPrime, SegmentationEnum.EXTERIOR, { singlePlane: true });
7774
- }
7775
- });
7776
- segmentSet.forEach((baseIndex, rle) => {
7777
- if (rle.value !== SegmentationEnum.INTERIOR) {
7778
- return;
7779
- }
7780
- const [, jPrime, kPrime] = segmentSet.toIJK(baseIndex);
7781
- const size = segmentSet.floodFill(rle.start, jPrime, kPrime, SegmentationEnum.INTERIOR_TEST);
7782
- const isBig = size > this.maxInternalRemove;
7783
- const newType = isBig
7784
- ? SegmentationEnum.EXTERIOR
7785
- : SegmentationEnum.INTERIOR_SMALL;
7786
- segmentSet.floodFill(rle.start, jPrime, kPrime, newType);
7787
- });
7788
- segmentSet.forEach((baseIndex, rle) => {
7789
- if (rle.value !== SegmentationEnum.INTERIOR_SMALL) {
7790
- return;
7791
- }
7792
- for (let iPrime = rle.start; iPrime < rle.end; iPrime++) {
7793
- const clearPoint = toIJK(segmentSet.toIJK(baseIndex + iPrime));
7794
- previewVoxelManager.setAtIJKPoint(clearPoint, previewSegmentIndex);
7795
- }
7796
- });
7797
- return previewVoxelManager.getArrayOfModifiedSlices();
7798
- }
7799
- static covers(rle, row) {
7800
- if (!row) {
7801
- return false;
7802
- }
7803
- let { start } = rle;
7804
- const { end } = rle;
7805
- for (const rowRle of row) {
7806
- if (start >= rowRle.start && start < rowRle.end) {
7807
- start = rowRle.end;
7808
- if (start >= end) {
7809
- return true;
7810
- }
7811
- }
7812
- }
7813
- return false;
7814
- }
7815
- }
7816
-
7817
-
7818
7781
  },
7819
7782
  72788(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
7820
7783
  "use strict";