@ohif/app 3.7.0-beta.43 → 3.7.0-beta.46
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/{150.bundle.94cbce497cafacd4a7d7.js → 150.bundle.2fa62b4d658df1500a7a.js} +71 -3
- package/dist/{181.bundle.817ca1ba6479fca5fd15.js → 181.bundle.f5476625f4ca901a1b91.js} +13 -34
- package/dist/{236.bundle.3c5f844ce9de4ec0777d.js → 236.bundle.c0a68163699ecfe3169a.js} +25 -11
- package/dist/{250.bundle.ee4bcf159c4d610acc3e.js → 250.bundle.1c1cb3520a9285138cfa.js} +18 -6
- package/dist/{30.bundle.8fb93818b3a58f29f7e3.js → 30.bundle.c0b2fa8984080ebcfbbc.js} +3 -1
- package/dist/{378.bundle.c908a6194c50544b45db.js → 378.bundle.61261ee41e0ea0955440.js} +8 -6
- package/dist/{869.bundle.c9c018e6757410919ed8.js → 451.bundle.a08889b823fb10803bd8.js} +38 -68
- package/dist/{810.bundle.b3e2cf57e00d35a12f30.js → 471.bundle.3238a0647d80970085f7.js} +36 -65
- package/dist/{506.bundle.44629077a406500707ea.js → 506.bundle.b23fa19d91dd23ab44be.js} +73 -4
- package/dist/{663.bundle.2dcb8a60d59464f4e563.js → 663.bundle.f5db124e3e922e61e76b.js} +27 -9
- package/dist/{678.bundle.13062f7926c30056aee1.js → 678.bundle.c07616be5e27371d875c.js} +103 -21
- package/dist/{821.bundle.d4120df6baeed120be9e.js → 821.bundle.d175d0a8f3f0148a1993.js} +79 -29
- package/dist/{app.bundle.2905ffdd301e3c34286e.js → app.bundle.7e5633a7d73fc76a884d.js} +255 -95
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/package.json +18 -18
- /package/dist/{12.bundle.f46296f27a36e6b95f76.js → 12.bundle.cff58bede0136dc8d013.js} +0 -0
- /package/dist/{128.bundle.963d34d21c01231fc804.js → 128.bundle.620a2fdce44958dbb9fb.js} +0 -0
- /package/dist/{281.bundle.ac92bd142441f317f308.js → 281.bundle.be238c748373d907dffe.js} +0 -0
- /package/dist/{348.bundle.323f57efcc2239950451.js → 348.bundle.dcebcb7b75ff9fcc1d5b.js} +0 -0
- /package/dist/{359.bundle.3ae0f07b1c428eeb00a8.js → 359.bundle.3cdac00ab9649a10741b.js} +0 -0
- /package/dist/{410.bundle.b3cbeff9c619149a2234.js → 410.bundle.fe0269b702be9c375abb.js} +0 -0
- /package/dist/{782.bundle.c511611d980f9aa6563b.js → 782.bundle.f2a1076331c6a6816314.js} +0 -0
- /package/dist/{814.bundle.8391ddacf39d7c699c5f.js → 814.bundle.69e55909aa8b5a776fe4.js} +0 -0
|
@@ -9,7 +9,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
9
9
|
|
|
10
10
|
// EXPORTS
|
|
11
11
|
__webpack_require__.d(__webpack_exports__, {
|
|
12
|
-
"default": () => (/* binding */ cornerstone_dicom_seg_src)
|
|
12
|
+
"default": () => (/* binding */ cornerstone_dicom_seg_src),
|
|
13
|
+
hydrateSEGDisplaySet: () => (/* reexport */ _hydrateSEG/* default */.Z)
|
|
13
14
|
});
|
|
14
15
|
|
|
15
16
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/package.json
|
|
@@ -571,6 +572,8 @@ function getHangingProtocolModule() {
|
|
|
571
572
|
}
|
|
572
573
|
/* harmony default export */ const src_getHangingProtocolModule = (getHangingProtocolModule);
|
|
573
574
|
|
|
575
|
+
// EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts
|
|
576
|
+
var _hydrateSEG = __webpack_require__(28417);
|
|
574
577
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/index.tsx
|
|
575
578
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
576
579
|
|
|
@@ -578,8 +581,9 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
|
|
|
578
581
|
|
|
579
582
|
|
|
580
583
|
|
|
584
|
+
|
|
581
585
|
const Component = /*#__PURE__*/react.lazy(() => {
|
|
582
|
-
return __webpack_require__.e(/* import() */
|
|
586
|
+
return __webpack_require__.e(/* import() */ 451).then(__webpack_require__.bind(__webpack_require__, 4451));
|
|
583
587
|
});
|
|
584
588
|
const OHIFCornerstoneSEGViewport = props => {
|
|
585
589
|
return /*#__PURE__*/react.createElement(react.Suspense, {
|
|
@@ -631,7 +635,8 @@ const extension = {
|
|
|
631
635
|
const ExtendedOHIFCornerstoneSEGViewport = props => {
|
|
632
636
|
return /*#__PURE__*/react.createElement(OHIFCornerstoneSEGViewport, _extends({
|
|
633
637
|
servicesManager: servicesManager,
|
|
634
|
-
extensionManager: extensionManager
|
|
638
|
+
extensionManager: extensionManager,
|
|
639
|
+
commandsManager: commandsManager
|
|
635
640
|
}, props));
|
|
636
641
|
};
|
|
637
642
|
return [{
|
|
@@ -650,6 +655,69 @@ const extension = {
|
|
|
650
655
|
};
|
|
651
656
|
/* harmony default export */ const cornerstone_dicom_seg_src = (extension);
|
|
652
657
|
|
|
658
|
+
|
|
659
|
+
/***/ }),
|
|
660
|
+
|
|
661
|
+
/***/ 28417:
|
|
662
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
663
|
+
|
|
664
|
+
"use strict";
|
|
665
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
666
|
+
/* harmony export */ Z: () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
667
|
+
/* harmony export */ });
|
|
668
|
+
async function _hydrateSEGDisplaySet(_ref) {
|
|
669
|
+
let {
|
|
670
|
+
segDisplaySet,
|
|
671
|
+
viewportIndex,
|
|
672
|
+
servicesManager
|
|
673
|
+
} = _ref;
|
|
674
|
+
const {
|
|
675
|
+
segmentationService,
|
|
676
|
+
hangingProtocolService,
|
|
677
|
+
viewportGridService
|
|
678
|
+
} = servicesManager.services;
|
|
679
|
+
const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID;
|
|
680
|
+
let segmentationId = null;
|
|
681
|
+
|
|
682
|
+
// We need the hydration to notify panels about the new segmentation added
|
|
683
|
+
const suppressEvents = false;
|
|
684
|
+
segmentationId = await segmentationService.createSegmentationForSEGDisplaySet(segDisplaySet, segmentationId, suppressEvents);
|
|
685
|
+
segmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID);
|
|
686
|
+
const {
|
|
687
|
+
viewports
|
|
688
|
+
} = viewportGridService.getState();
|
|
689
|
+
const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
|
|
690
|
+
|
|
691
|
+
// Todo: fix this after we have a better way for stack viewport segmentations
|
|
692
|
+
|
|
693
|
+
// check every viewport in the viewports to see if the displaySetInstanceUID
|
|
694
|
+
// is being displayed, if so we need to update the viewport to use volume viewport
|
|
695
|
+
// (if already is not using it) since Cornerstone3D currently only supports
|
|
696
|
+
// volume viewport for segmentation
|
|
697
|
+
viewports.forEach((viewport, index) => {
|
|
698
|
+
if (index === viewportIndex) {
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, segDisplaySet.displaySetInstanceUID);
|
|
702
|
+
if (shouldDisplaySeg) {
|
|
703
|
+
updatedViewports.push({
|
|
704
|
+
viewportIndex: index,
|
|
705
|
+
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
|
|
706
|
+
viewportOptions: {
|
|
707
|
+
initialImageOptions: {
|
|
708
|
+
preset: 'middle'
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
// Do the entire update at once
|
|
716
|
+
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
|
717
|
+
return true;
|
|
718
|
+
}
|
|
719
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_hydrateSEGDisplaySet);
|
|
720
|
+
|
|
653
721
|
/***/ }),
|
|
654
722
|
|
|
655
723
|
/***/ 78753:
|
|
@@ -1132,6 +1132,7 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1132
1132
|
viewportOptions,
|
|
1133
1133
|
displaySetOptions,
|
|
1134
1134
|
servicesManager,
|
|
1135
|
+
commandsManager,
|
|
1135
1136
|
onElementEnabled,
|
|
1136
1137
|
onElementDisabled,
|
|
1137
1138
|
isJumpToMeasurementDisabled,
|
|
@@ -1168,35 +1169,6 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1168
1169
|
setImageScrollBarHeight();
|
|
1169
1170
|
}
|
|
1170
1171
|
}, [elementRef]);
|
|
1171
|
-
const storePresentation = () => {
|
|
1172
|
-
const currentPresentation = cornerstoneViewportService.getPresentation(viewportIndex);
|
|
1173
|
-
if (!currentPresentation || !currentPresentation.presentationIds) return;
|
|
1174
|
-
const {
|
|
1175
|
-
lutPresentationStore,
|
|
1176
|
-
positionPresentationStore
|
|
1177
|
-
} = stateSyncService.getState();
|
|
1178
|
-
const {
|
|
1179
|
-
presentationIds
|
|
1180
|
-
} = currentPresentation;
|
|
1181
|
-
const {
|
|
1182
|
-
lutPresentationId,
|
|
1183
|
-
positionPresentationId
|
|
1184
|
-
} = presentationIds || {};
|
|
1185
|
-
const storeState = {};
|
|
1186
|
-
if (lutPresentationId) {
|
|
1187
|
-
storeState.lutPresentationStore = {
|
|
1188
|
-
...lutPresentationStore,
|
|
1189
|
-
[lutPresentationId]: currentPresentation
|
|
1190
|
-
};
|
|
1191
|
-
}
|
|
1192
|
-
if (positionPresentationId) {
|
|
1193
|
-
storeState.positionPresentationStore = {
|
|
1194
|
-
...positionPresentationStore,
|
|
1195
|
-
[positionPresentationId]: currentPresentation
|
|
1196
|
-
};
|
|
1197
|
-
}
|
|
1198
|
-
stateSyncService.store(storeState);
|
|
1199
|
-
};
|
|
1200
1172
|
const cleanUpServices = (0,react.useCallback)(() => {
|
|
1201
1173
|
const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(viewportIndex);
|
|
1202
1174
|
if (!viewportInfo) {
|
|
@@ -1237,7 +1209,9 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1237
1209
|
dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.ELEMENT_ENABLED, elementEnabledHandler);
|
|
1238
1210
|
setImageScrollBarHeight();
|
|
1239
1211
|
return () => {
|
|
1240
|
-
storePresentation
|
|
1212
|
+
commandsManager.runCommand('storePresentation', {
|
|
1213
|
+
viewportIndex
|
|
1214
|
+
});
|
|
1241
1215
|
cleanUpServices();
|
|
1242
1216
|
const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(viewportIndex);
|
|
1243
1217
|
cornerstoneViewportService.disableElement(viewportIndex);
|
|
@@ -1329,7 +1303,6 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1329
1303
|
unsubscribeFromJumpToMeasurementEvents();
|
|
1330
1304
|
};
|
|
1331
1305
|
}, [displaySets, elementRef, viewportIndex]);
|
|
1332
|
-
console.debug('OHIFCornerstoneViewport rendering');
|
|
1333
1306
|
return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
|
|
1334
1307
|
className: "viewport-wrapper"
|
|
1335
1308
|
}, /*#__PURE__*/react.createElement(index_esm/* default */.ZP, {
|
|
@@ -1379,7 +1352,9 @@ function _subscribeToJumpToMeasurementEvents(measurementService, displaySetServi
|
|
|
1379
1352
|
measurement,
|
|
1380
1353
|
isConsumed
|
|
1381
1354
|
} = props;
|
|
1382
|
-
if (!measurement || isConsumed)
|
|
1355
|
+
if (!measurement || isConsumed) {
|
|
1356
|
+
return;
|
|
1357
|
+
}
|
|
1383
1358
|
if (cacheJumpToMeasurementEvent.cornerstoneViewport === undefined) {
|
|
1384
1359
|
// Decide on which viewport should handle this
|
|
1385
1360
|
cacheJumpToMeasurementEvent.cornerstoneViewport = cornerstoneViewportService.getViewportIndexToJump(jumpIndex, measurement.displaySetInstanceUID, {
|
|
@@ -1396,13 +1371,17 @@ function _subscribeToJumpToMeasurementEvents(measurementService, displaySetServi
|
|
|
1396
1371
|
|
|
1397
1372
|
// Check if there is a queued jumpToMeasurement event
|
|
1398
1373
|
function _checkForCachedJumpToMeasurementEvents(measurementService, displaySetService, elementRef, viewportIndex, displaySets, viewportGridService, cornerstoneViewportService) {
|
|
1399
|
-
if (!cacheJumpToMeasurementEvent)
|
|
1374
|
+
if (!cacheJumpToMeasurementEvent) {
|
|
1375
|
+
return;
|
|
1376
|
+
}
|
|
1400
1377
|
if (cacheJumpToMeasurementEvent.isConsumed) {
|
|
1401
1378
|
cacheJumpToMeasurementEvent = null;
|
|
1402
1379
|
return;
|
|
1403
1380
|
}
|
|
1404
1381
|
const displaysUIDs = displaySets.map(displaySet => displaySet.displaySetInstanceUID);
|
|
1405
|
-
if (!displaysUIDs?.length)
|
|
1382
|
+
if (!displaysUIDs?.length) {
|
|
1383
|
+
return;
|
|
1384
|
+
}
|
|
1406
1385
|
|
|
1407
1386
|
// Jump to measurement if the measurement exists
|
|
1408
1387
|
const {
|
|
@@ -61,7 +61,9 @@ function coordinateFormatScoord3d2Geometry(coordinates, pyramid) {
|
|
|
61
61
|
return coordinates;
|
|
62
62
|
}
|
|
63
63
|
function _getPixelSpacing(metadata) {
|
|
64
|
-
if (metadata.PixelSpacing)
|
|
64
|
+
if (metadata.PixelSpacing) {
|
|
65
|
+
return metadata.PixelSpacing;
|
|
66
|
+
}
|
|
65
67
|
const functionalGroup = metadata.SharedFunctionalGroupsSequence[0];
|
|
66
68
|
const pixelMeasures = functionalGroup.PixelMeasuresSequence[0];
|
|
67
69
|
return pixelMeasures.PixelSpacing;
|
|
@@ -811,7 +813,7 @@ class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
|
811
813
|
clear() {
|
|
812
814
|
this.managedViewers.forEach(managedViewer => managedViewer.destroy());
|
|
813
815
|
this.managedViewers.clear();
|
|
814
|
-
for (
|
|
816
|
+
for (const key in this.annotations) {
|
|
815
817
|
delete this.annotations[key];
|
|
816
818
|
}
|
|
817
819
|
this.roiUids.clear();
|
|
@@ -879,7 +881,9 @@ class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
|
879
881
|
managedViewer
|
|
880
882
|
} = data;
|
|
881
883
|
const roiAnnotation = this.getAnnotation(roiGraphic.uid);
|
|
882
|
-
if (!roiAnnotation)
|
|
884
|
+
if (!roiAnnotation) {
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
883
887
|
roiAnnotation.setRoiGraphic(roiGraphic);
|
|
884
888
|
roiAnnotation.setViewState(managedViewer.getViewState());
|
|
885
889
|
}
|
|
@@ -933,7 +937,9 @@ class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
|
933
937
|
} = data;
|
|
934
938
|
const selectedAnnotation = this.getAnnotation(roiGraphic.uid);
|
|
935
939
|
if (selectedAnnotation && selectedAnnotation !== this.getSelectedAnnotation()) {
|
|
936
|
-
if (this.selectedAnnotation)
|
|
940
|
+
if (this.selectedAnnotation) {
|
|
941
|
+
this.clearSelection();
|
|
942
|
+
}
|
|
937
943
|
this.selectedAnnotation = selectedAnnotation;
|
|
938
944
|
this._broadcastEvent(MicroscopyService_EVENTS.ANNOTATION_SELECTED, selectedAnnotation);
|
|
939
945
|
}
|
|
@@ -1188,7 +1194,9 @@ class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
|
1188
1194
|
* @param {RoiAnnotation} roiAnnotation The instance to be selected
|
|
1189
1195
|
*/
|
|
1190
1196
|
selectAnnotation(roiAnnotation) {
|
|
1191
|
-
if (this.selectedAnnotation)
|
|
1197
|
+
if (this.selectedAnnotation) {
|
|
1198
|
+
this.clearSelection();
|
|
1199
|
+
}
|
|
1192
1200
|
this.selectedAnnotation = roiAnnotation;
|
|
1193
1201
|
this._broadcastEvent(MicroscopyService_EVENTS.ANNOTATION_SELECTED, roiAnnotation);
|
|
1194
1202
|
this.setROIStyle(roiAnnotation.uid, utils_styles.active);
|
|
@@ -1544,7 +1552,9 @@ function constructSR(metadata, _ref, annotations) {
|
|
|
1544
1552
|
console.debug('[SR] storing measurements...', measurements);
|
|
1545
1553
|
console.debug('[SR] storing evaluations...', evaluations);
|
|
1546
1554
|
console.debug('[SR] storing presentation state...', presentationState);
|
|
1547
|
-
if (presentationState)
|
|
1555
|
+
if (presentationState) {
|
|
1556
|
+
presentationState.marker = marker;
|
|
1557
|
+
}
|
|
1548
1558
|
|
|
1549
1559
|
/** Avoid incompatibility with dcmjs */
|
|
1550
1560
|
measurements = measurements.map(measurement => {
|
|
@@ -1654,10 +1664,10 @@ function constructSR(metadata, _ref, annotations) {
|
|
|
1654
1664
|
* @param filename
|
|
1655
1665
|
*/
|
|
1656
1666
|
function saveByteArray(buffer, filename) {
|
|
1657
|
-
|
|
1667
|
+
const blob = new Blob([buffer], {
|
|
1658
1668
|
type: 'application/dicom'
|
|
1659
1669
|
});
|
|
1660
|
-
|
|
1670
|
+
const link = document.createElement('a');
|
|
1661
1671
|
link.href = window.URL.createObjectURL(blob);
|
|
1662
1672
|
link.download = filename;
|
|
1663
1673
|
link.click();
|
|
@@ -2057,7 +2067,9 @@ function getCommandsModule(_ref) {
|
|
|
2057
2067
|
} = _ref2;
|
|
2058
2068
|
if (uid) {
|
|
2059
2069
|
const roiAnnotation = microscopyService.getAnnotation(uid);
|
|
2060
|
-
if (roiAnnotation)
|
|
2070
|
+
if (roiAnnotation) {
|
|
2071
|
+
microscopyService.removeAnnotation(roiAnnotation);
|
|
2072
|
+
}
|
|
2061
2073
|
}
|
|
2062
2074
|
},
|
|
2063
2075
|
setLabel: _ref3 => {
|
|
@@ -2096,7 +2108,7 @@ function getCommandsModule(_ref) {
|
|
|
2096
2108
|
}];
|
|
2097
2109
|
if (['line', 'box', 'circle', 'point', 'polygon', 'freehandpolygon', 'freehandline'].indexOf(toolName) >= 0) {
|
|
2098
2110
|
// TODO: read from configuration
|
|
2099
|
-
|
|
2111
|
+
const options = {
|
|
2100
2112
|
geometryType: toolName,
|
|
2101
2113
|
vertexEnabled: true,
|
|
2102
2114
|
styleOptions: utils_styles["default"],
|
|
@@ -2147,7 +2159,9 @@ function getCommandsModule(_ref) {
|
|
|
2147
2159
|
const overlays = document.getElementsByClassName('microscopy-viewport-overlay');
|
|
2148
2160
|
let onoff = false; // true if this will toggle on
|
|
2149
2161
|
for (let i = 0; i < overlays.length; i++) {
|
|
2150
|
-
if (i === 0)
|
|
2162
|
+
if (i === 0) {
|
|
2163
|
+
onoff = overlays.item(0).classList.contains('hidden');
|
|
2164
|
+
}
|
|
2151
2165
|
overlays.item(i).classList.toggle('hidden');
|
|
2152
2166
|
}
|
|
2153
2167
|
|
|
@@ -36,11 +36,17 @@ const listComponentGenerator = props => {
|
|
|
36
36
|
list,
|
|
37
37
|
itemGenerator
|
|
38
38
|
} = props;
|
|
39
|
-
if (!list)
|
|
39
|
+
if (!list) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
40
42
|
return list.map(item => {
|
|
41
|
-
if (!item)
|
|
43
|
+
if (!item) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
42
46
|
const generator = item.generator || itemGenerator;
|
|
43
|
-
if (!generator)
|
|
47
|
+
if (!generator) {
|
|
48
|
+
throw new Error(`No generator for ${item}`);
|
|
49
|
+
}
|
|
44
50
|
return generator({
|
|
45
51
|
...props,
|
|
46
52
|
item
|
|
@@ -230,8 +236,12 @@ const itemGenerator = props => {
|
|
|
230
236
|
props.formatTime = formatDICOMTime;
|
|
231
237
|
props.formatPN = formatPN;
|
|
232
238
|
props.formatNumberPrecision = formatNumberPrecision;
|
|
233
|
-
if (condition && !condition(props))
|
|
234
|
-
|
|
239
|
+
if (condition && !condition(props)) {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
if (!contents && !valueFunc) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
235
245
|
const value = valueFunc && valueFunc(props);
|
|
236
246
|
const contentsValue = contents && contents(props) || [{
|
|
237
247
|
className: 'mr-1',
|
|
@@ -430,7 +440,9 @@ class DicomMicroscopyViewport extends react.Component {
|
|
|
430
440
|
} = this.props.servicesManager.services;
|
|
431
441
|
this.microscopyService = microscopyService;
|
|
432
442
|
this.debouncedResize = lodash_debounce_default()(() => {
|
|
433
|
-
if (this.viewer)
|
|
443
|
+
if (this.viewer) {
|
|
444
|
+
this.viewer.resize();
|
|
445
|
+
}
|
|
434
446
|
}, 100);
|
|
435
447
|
}
|
|
436
448
|
/**
|
|
@@ -2211,7 +2211,9 @@ function _mapMeasurementToDisplay(measurement, types, displaySetService) {
|
|
|
2211
2211
|
if (findingSites) {
|
|
2212
2212
|
const siteText = [];
|
|
2213
2213
|
findingSites.forEach(site => {
|
|
2214
|
-
if (site?.text !== label)
|
|
2214
|
+
if (site?.text !== label) {
|
|
2215
|
+
siteText.push(site.text);
|
|
2216
|
+
}
|
|
2215
2217
|
});
|
|
2216
2218
|
displayText = [...siteText, ...displayText];
|
|
2217
2219
|
}
|
|
@@ -103,7 +103,9 @@ const codeMenuItem = {
|
|
|
103
103
|
const {
|
|
104
104
|
code: codeRef
|
|
105
105
|
} = this;
|
|
106
|
-
if (!codeRef)
|
|
106
|
+
if (!codeRef) {
|
|
107
|
+
throw new Error(`item ${this} has no code ref`);
|
|
108
|
+
}
|
|
107
109
|
const codingValues = customizationService.get('codingValues');
|
|
108
110
|
const code = codingValues[codeRef];
|
|
109
111
|
return {
|
|
@@ -239,7 +241,7 @@ function getCustomizationModule() {
|
|
|
239
241
|
* From 'this', it uses:
|
|
240
242
|
* `sameAttribute` as the attribute name to look for
|
|
241
243
|
* `sameDisplaySetId` as the display set id to look for
|
|
242
|
-
* From `options`, it looks for
|
|
244
|
+
* From `options`, it looks for
|
|
243
245
|
*/
|
|
244
246
|
/* harmony default export */ function sameAs(displaySet, options) {
|
|
245
247
|
const {
|
|
@@ -247,11 +249,11 @@ function getCustomizationModule() {
|
|
|
247
249
|
sameDisplaySetId
|
|
248
250
|
} = this;
|
|
249
251
|
if (!sameAttribute) {
|
|
250
|
-
console.log(
|
|
252
|
+
console.log('sameAttribute not defined in', this);
|
|
251
253
|
return `sameAttribute not defined in ${this.id}`;
|
|
252
254
|
}
|
|
253
255
|
if (!sameDisplaySetId) {
|
|
254
|
-
console.log(
|
|
256
|
+
console.log('sameDisplaySetId not defined in', this);
|
|
255
257
|
return `sameDisplaySetId not defined in ${this.id}`;
|
|
256
258
|
}
|
|
257
259
|
const {
|
|
@@ -260,7 +262,7 @@ function getCustomizationModule() {
|
|
|
260
262
|
} = options;
|
|
261
263
|
const match = displaySetMatchDetails.get(sameDisplaySetId);
|
|
262
264
|
if (!match) {
|
|
263
|
-
console.log(
|
|
265
|
+
console.log('No match for display set', sameDisplaySetId);
|
|
264
266
|
return false;
|
|
265
267
|
}
|
|
266
268
|
const {
|
|
@@ -268,7 +270,7 @@ function getCustomizationModule() {
|
|
|
268
270
|
} = match;
|
|
269
271
|
const altDisplaySet = displaySets.find(it => it.displaySetInstanceUID == displaySetInstanceUID);
|
|
270
272
|
if (!altDisplaySet) {
|
|
271
|
-
console.log(
|
|
273
|
+
console.log('No display set found with', displaySetInstanceUID, 'in', displaySets);
|
|
272
274
|
return false;
|
|
273
275
|
}
|
|
274
276
|
const testValue = altDisplaySet[sameAttribute];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(self["webpackChunk"] = self["webpackChunk"] || []).push([[
|
|
2
|
+
(self["webpackChunk"] = self["webpackChunk"] || []).push([[451],{
|
|
3
3
|
|
|
4
|
-
/***/
|
|
4
|
+
/***/ 4451:
|
|
5
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
6
|
|
|
7
7
|
// ESM COMPAT FLAG
|
|
@@ -31,59 +31,8 @@ function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, t
|
|
|
31
31
|
return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});
|
|
32
32
|
}
|
|
33
33
|
/* harmony default export */ const initSEGToolGroup = (createSEGToolGroupAndAddTools);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
let {
|
|
37
|
-
segDisplaySet,
|
|
38
|
-
viewportIndex,
|
|
39
|
-
servicesManager
|
|
40
|
-
} = _ref;
|
|
41
|
-
const {
|
|
42
|
-
segmentationService,
|
|
43
|
-
hangingProtocolService,
|
|
44
|
-
viewportGridService
|
|
45
|
-
} = servicesManager.services;
|
|
46
|
-
const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID;
|
|
47
|
-
let segmentationId = null;
|
|
48
|
-
|
|
49
|
-
// We need the hydration to notify panels about the new segmentation added
|
|
50
|
-
const suppressEvents = false;
|
|
51
|
-
segmentationId = await segmentationService.createSegmentationForSEGDisplaySet(segDisplaySet, segmentationId, suppressEvents);
|
|
52
|
-
segmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID);
|
|
53
|
-
const {
|
|
54
|
-
viewports
|
|
55
|
-
} = viewportGridService.getState();
|
|
56
|
-
const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
|
|
57
|
-
|
|
58
|
-
// Todo: fix this after we have a better way for stack viewport segmentations
|
|
59
|
-
|
|
60
|
-
// check every viewport in the viewports to see if the displaySetInstanceUID
|
|
61
|
-
// is being displayed, if so we need to update the viewport to use volume viewport
|
|
62
|
-
// (if already is not using it) since Cornerstone3D currently only supports
|
|
63
|
-
// volume viewport for segmentation
|
|
64
|
-
viewports.forEach((viewport, index) => {
|
|
65
|
-
if (index === viewportIndex) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, segDisplaySet.displaySetInstanceUID);
|
|
69
|
-
if (shouldDisplaySeg) {
|
|
70
|
-
updatedViewports.push({
|
|
71
|
-
viewportIndex: index,
|
|
72
|
-
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
|
|
73
|
-
viewportOptions: {
|
|
74
|
-
initialImageOptions: {
|
|
75
|
-
preset: 'middle'
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// Do the entire update at once
|
|
83
|
-
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
/* harmony default export */ const _hydrateSEG = (_hydrateSEGDisplaySet);
|
|
34
|
+
// EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts
|
|
35
|
+
var _hydrateSEG = __webpack_require__(28417);
|
|
87
36
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts
|
|
88
37
|
|
|
89
38
|
|
|
@@ -96,7 +45,8 @@ function promptHydrateSEG(_ref) {
|
|
|
96
45
|
let {
|
|
97
46
|
servicesManager,
|
|
98
47
|
segDisplaySet,
|
|
99
|
-
viewportIndex
|
|
48
|
+
viewportIndex,
|
|
49
|
+
preHydrateCallbacks
|
|
100
50
|
} = _ref;
|
|
101
51
|
const {
|
|
102
52
|
uiViewportDialogService
|
|
@@ -104,7 +54,10 @@ function promptHydrateSEG(_ref) {
|
|
|
104
54
|
return new Promise(async function (resolve, reject) {
|
|
105
55
|
const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
|
|
106
56
|
if (promptResult === RESPONSE.HYDRATE_SEG) {
|
|
107
|
-
|
|
57
|
+
preHydrateCallbacks?.forEach(callback => {
|
|
58
|
+
callback();
|
|
59
|
+
});
|
|
60
|
+
const isHydrated = await (0,_hydrateSEG/* default */.Z)({
|
|
108
61
|
segDisplaySet,
|
|
109
62
|
viewportIndex,
|
|
110
63
|
servicesManager
|
|
@@ -156,8 +109,8 @@ function _getStatusComponent(_ref) {
|
|
|
156
109
|
let StatusIcon = null;
|
|
157
110
|
const {
|
|
158
111
|
t
|
|
159
|
-
} = (0,es/* useTranslation */.$G)(
|
|
160
|
-
const loadStr = t(
|
|
112
|
+
} = (0,es/* useTranslation */.$G)('Common');
|
|
113
|
+
const loadStr = t('LOAD');
|
|
161
114
|
switch (isHydrated) {
|
|
162
115
|
case true:
|
|
163
116
|
StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
|
|
@@ -211,7 +164,8 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
211
164
|
viewportIndex,
|
|
212
165
|
viewportLabel,
|
|
213
166
|
servicesManager,
|
|
214
|
-
extensionManager
|
|
167
|
+
extensionManager,
|
|
168
|
+
commandsManager
|
|
215
169
|
} = props;
|
|
216
170
|
const {
|
|
217
171
|
t
|
|
@@ -233,7 +187,6 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
233
187
|
const [viewportGrid, viewportGridService] = (0,ui_src/* useViewportGrid */.O_)();
|
|
234
188
|
|
|
235
189
|
// States
|
|
236
|
-
const [isToolGroupCreated, setToolGroupCreated] = (0,react.useState)(false);
|
|
237
190
|
const [selectedSegment, setSelectedSegment] = (0,react.useState)(1);
|
|
238
191
|
|
|
239
192
|
// Hydration means that the SEG is opened and segments are loaded into the
|
|
@@ -273,6 +226,16 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
273
226
|
const onElementDisabled = () => {
|
|
274
227
|
setElement(null);
|
|
275
228
|
};
|
|
229
|
+
const storePresentationState = (0,react.useCallback)(() => {
|
|
230
|
+
viewportGrid?.viewports.forEach(_ref => {
|
|
231
|
+
let {
|
|
232
|
+
viewportIndex
|
|
233
|
+
} = _ref;
|
|
234
|
+
commandsManager.runCommand('storePresentation', {
|
|
235
|
+
viewportIndex
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}, [viewportGrid]);
|
|
276
239
|
const getCornerstoneViewport = (0,react.useCallback)(() => {
|
|
277
240
|
const {
|
|
278
241
|
component: Component
|
|
@@ -322,7 +285,8 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
322
285
|
utils_promptHydrateSEG({
|
|
323
286
|
servicesManager,
|
|
324
287
|
viewportIndex,
|
|
325
|
-
segDisplaySet
|
|
288
|
+
segDisplaySet,
|
|
289
|
+
preHydrateCallbacks: [storePresentationState]
|
|
326
290
|
}).then(isHydrated => {
|
|
327
291
|
if (isHydrated) {
|
|
328
292
|
setIsHydrated(true);
|
|
@@ -351,11 +315,11 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
351
315
|
(0,react.useEffect)(() => {
|
|
352
316
|
const {
|
|
353
317
|
unsubscribe
|
|
354
|
-
} = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE,
|
|
318
|
+
} = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref2 => {
|
|
355
319
|
let {
|
|
356
320
|
percentComplete,
|
|
357
321
|
numSegments
|
|
358
|
-
} =
|
|
322
|
+
} = _ref2;
|
|
359
323
|
setProcessingProgress({
|
|
360
324
|
percentComplete,
|
|
361
325
|
totalSegments: numSegments
|
|
@@ -370,10 +334,10 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
370
334
|
Cleanup the SEG viewport when the viewport is destroyed
|
|
371
335
|
*/
|
|
372
336
|
(0,react.useEffect)(() => {
|
|
373
|
-
const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED,
|
|
337
|
+
const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref3 => {
|
|
374
338
|
let {
|
|
375
339
|
displaySetInstanceUIDs
|
|
376
|
-
} =
|
|
340
|
+
} = _ref3;
|
|
377
341
|
const activeViewport = viewports[activeViewportIndex];
|
|
378
342
|
if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
|
|
379
343
|
viewportGridService.setDisplaySetsForViewport({
|
|
@@ -395,7 +359,6 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
395
359
|
// This creates a custom tool group which has the lifetime of this view
|
|
396
360
|
// only, and does NOT interfere with currently displayed segmentations.
|
|
397
361
|
toolGroup = initSEGToolGroup(toolGroupService, customizationService, toolGroupId);
|
|
398
|
-
setToolGroupCreated(true);
|
|
399
362
|
return () => {
|
|
400
363
|
// remove the segmentation representations if seg displayset changed
|
|
401
364
|
segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
|
|
@@ -438,7 +401,14 @@ function OHIFCornerstoneSEGViewport(props) {
|
|
|
438
401
|
SpacingBetweenSlices
|
|
439
402
|
} = referencedDisplaySetRef.current.metadata;
|
|
440
403
|
const onStatusClick = async () => {
|
|
441
|
-
|
|
404
|
+
// Before hydrating a SEG and make it added to all viewports in the grid
|
|
405
|
+
// that share the same frameOfReferenceUID, we need to store the viewport grid
|
|
406
|
+
// presentation state, so that we can restore it after hydrating the SEG. This is
|
|
407
|
+
// required if the user has changed the viewport (other viewport than SEG viewport)
|
|
408
|
+
// presentation state (w/l and invert) and then opens the SEG. If we don't store
|
|
409
|
+
// the presentation state, the viewport will be reset to the default presentation
|
|
410
|
+
storePresentationState();
|
|
411
|
+
const isHydrated = await (0,_hydrateSEG/* default */.Z)({
|
|
442
412
|
segDisplaySet,
|
|
443
413
|
viewportIndex,
|
|
444
414
|
servicesManager
|