@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.
- package/dist/{1483.bundle.e208a19dd0ff9a11.js → 1483.bundle.5e93c978bd32d7de.js} +1 -1
- package/dist/{2343.bundle.e50c08b2df863e1a.js → 2343.bundle.3445fda02a002697.js} +12 -8
- package/dist/{2036.bundle.1b6c0d890aa6bf4e.js → 2493.bundle.f3b6a64d158365da.js} +113 -35
- package/dist/{3215.bundle.1fca83719c1b786b.js → 3330.bundle.b1297ef8c94e5440.js} +796 -180
- package/dist/{2690.bundle.f5dc28ac498de122.js → 3568.bundle.45dc681ef6890166.js} +2112 -76
- package/dist/{6495.bundle.84b83aa091c338cd.js → 6495.bundle.a6764fdb8c0c252f.js} +846 -219
- package/dist/{8668.bundle.93c88419e37dc076.js → 8668.bundle.0e47f7231aa07da2.js} +227 -3
- package/dist/{9402.bundle.0dd1b538f0708077.js → 9402.bundle.928437e2e48c12dd.js} +2 -2
- package/dist/{9560.bundle.bb39f946ea79cf0e.js → 9560.bundle.517f0ef7ee3a20bf.js} +159 -196
- package/dist/{app.bundle.bdeb02edea129b2c.js → app.bundle.81a823d1149be346.js} +99 -25
- package/dist/{compute.bundle.77e80c1775429bd6.js → compute.bundle.9cc3697d07fbb082.js} +3 -3
- package/dist/index.html +1 -1
- package/dist/{polySeg.bundle.5e350e0723aa59b6.js → polySeg.bundle.a526954fc2fed311.js} +3 -3
- package/dist/sw.js +1 -1
- package/package.json +6 -6
- /package/dist/{100.bundle.bd6735a86c215595.js → 100.bundle.84a35e9d087b403c.js} +0 -0
- /package/dist/{1180.bundle.4c5146471b4d3497.js → 1180.bundle.7f790d9fd6fb031c.js} +0 -0
- /package/dist/{1602.bundle.163e3da3a27b860c.js → 1602.bundle.254a392a6b5d2b85.js} +0 -0
- /package/dist/{2779.bundle.664d9d0a704f7b94.js → 2779.bundle.c879d6af5dc0c274.js} +0 -0
- /package/dist/{3500.bundle.18412afd9ee5d6a7.js → 3500.bundle.d4aaab15c4461cc4.js} +0 -0
- /package/dist/{3760.bundle.f69046888fc2b881.js → 3760.bundle.c95abd6ab662bd3b.js} +0 -0
- /package/dist/{4556.bundle.128d2abaea69dce3.js → 4556.bundle.c3ac23e680d677b2.js} +0 -0
- /package/dist/{4683.bundle.b02523a9d66f4d19.js → 4683.bundle.ed3f14fcb89fbad1.js} +0 -0
- /package/dist/{5189.bundle.2a0f740738759e32.js → 5189.bundle.ea191ea99047fd6f.js} +0 -0
- /package/dist/{5642.bundle.1622d255af1102d8.js → 5642.bundle.98e17a4413db6ef1.js} +0 -0
- /package/dist/{5696.bundle.2f47cb5ab5a7f983.js → 5696.bundle.e77041f7e2b08236.js} +0 -0
- /package/dist/{6749.bundle.9f0550714a4d5f8b.js → 6749.bundle.9dcda33e49485da4.js} +0 -0
- /package/dist/{7231.bundle.46f843b74a964f89.js → 7231.bundle.1063d727ad99108a.js} +0 -0
- /package/dist/{7248.bundle.bffd4e60f806e25d.js → 7248.bundle.ab6f276adad059da.js} +0 -0
- /package/dist/{7499.bundle.bb240e8754167cb2.js → 7499.bundle.832916b9b820c33f.js} +0 -0
- /package/dist/{781.bundle.f7411dabe0628911.js → 781.bundle.f06b6ab92ef4d695.js} +0 -0
- /package/dist/{8423.bundle.071901427fd3cd9e.js → 8423.bundle.ebf8d7d638d9616b.js} +0 -0
- /package/dist/{8492.bundle.9c17dcbab24b07c3.js → 8492.bundle.1ceeb18471c1c06b.js} +0 -0
- /package/dist/{8832.bundle.e413f00216682f40.js → 8832.bundle.1eb46bfa451c792f.js} +0 -0
- /package/dist/{9116.bundle.1cb5c393e3a152cd.js → 9116.bundle.1d0c6c18a4db51cc.js} +0 -0
- /package/dist/{9290.bundle.77a274271ce884a3.js → 9290.bundle.82e8dfc0f73c41bb.js} +0 -0
- /package/dist/{9383.bundle.9b1d03c71cc52f4f.js → 9383.bundle.ec44c452ccc23e93.js} +0 -0
- /package/dist/{9415.bundle.d3532cc872787744.js → 9415.bundle.69d74a2b03d5d6e4.js} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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";
|