@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.
Files changed (24) hide show
  1. package/dist/{150.bundle.94cbce497cafacd4a7d7.js → 150.bundle.2fa62b4d658df1500a7a.js} +71 -3
  2. package/dist/{181.bundle.817ca1ba6479fca5fd15.js → 181.bundle.f5476625f4ca901a1b91.js} +13 -34
  3. package/dist/{236.bundle.3c5f844ce9de4ec0777d.js → 236.bundle.c0a68163699ecfe3169a.js} +25 -11
  4. package/dist/{250.bundle.ee4bcf159c4d610acc3e.js → 250.bundle.1c1cb3520a9285138cfa.js} +18 -6
  5. package/dist/{30.bundle.8fb93818b3a58f29f7e3.js → 30.bundle.c0b2fa8984080ebcfbbc.js} +3 -1
  6. package/dist/{378.bundle.c908a6194c50544b45db.js → 378.bundle.61261ee41e0ea0955440.js} +8 -6
  7. package/dist/{869.bundle.c9c018e6757410919ed8.js → 451.bundle.a08889b823fb10803bd8.js} +38 -68
  8. package/dist/{810.bundle.b3e2cf57e00d35a12f30.js → 471.bundle.3238a0647d80970085f7.js} +36 -65
  9. package/dist/{506.bundle.44629077a406500707ea.js → 506.bundle.b23fa19d91dd23ab44be.js} +73 -4
  10. package/dist/{663.bundle.2dcb8a60d59464f4e563.js → 663.bundle.f5db124e3e922e61e76b.js} +27 -9
  11. package/dist/{678.bundle.13062f7926c30056aee1.js → 678.bundle.c07616be5e27371d875c.js} +103 -21
  12. package/dist/{821.bundle.d4120df6baeed120be9e.js → 821.bundle.d175d0a8f3f0148a1993.js} +79 -29
  13. package/dist/{app.bundle.2905ffdd301e3c34286e.js → app.bundle.7e5633a7d73fc76a884d.js} +255 -95
  14. package/dist/index.html +1 -1
  15. package/dist/sw.js +1 -1
  16. package/package.json +18 -18
  17. /package/dist/{12.bundle.f46296f27a36e6b95f76.js → 12.bundle.cff58bede0136dc8d013.js} +0 -0
  18. /package/dist/{128.bundle.963d34d21c01231fc804.js → 128.bundle.620a2fdce44958dbb9fb.js} +0 -0
  19. /package/dist/{281.bundle.ac92bd142441f317f308.js → 281.bundle.be238c748373d907dffe.js} +0 -0
  20. /package/dist/{348.bundle.323f57efcc2239950451.js → 348.bundle.dcebcb7b75ff9fcc1d5b.js} +0 -0
  21. /package/dist/{359.bundle.3ae0f07b1c428eeb00a8.js → 359.bundle.3cdac00ab9649a10741b.js} +0 -0
  22. /package/dist/{410.bundle.b3cbeff9c619149a2234.js → 410.bundle.fe0269b702be9c375abb.js} +0 -0
  23. /package/dist/{782.bundle.c511611d980f9aa6563b.js → 782.bundle.f2a1076331c6a6816314.js} +0 -0
  24. /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() */ 869).then(__webpack_require__.bind(__webpack_require__, 87869));
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) return;
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) return;
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) return;
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) return 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 (var key in this.annotations) {
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) return;
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) this.clearSelection();
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) this.clearSelection();
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) presentationState.marker = marker;
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
- var blob = new Blob([buffer], {
1667
+ const blob = new Blob([buffer], {
1658
1668
  type: 'application/dicom'
1659
1669
  });
1660
- var link = document.createElement('a');
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) microscopyService.removeAnnotation(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
- let options = {
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) onoff = overlays.item(0).classList.contains('hidden');
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) return;
39
+ if (!list) {
40
+ return;
41
+ }
40
42
  return list.map(item => {
41
- if (!item) return;
43
+ if (!item) {
44
+ return;
45
+ }
42
46
  const generator = item.generator || itemGenerator;
43
- if (!generator) throw new Error(`No generator for ${item}`);
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)) return null;
234
- if (!contents && !valueFunc) return null;
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) this.viewer.resize();
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) siteText.push(site.text);
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) throw new Error(`item ${this} has no code ref`);
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("sameAttribute not defined in", this);
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("sameDisplaySetId not defined in", this);
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("No match for display set", sameDisplaySetId);
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("No display set found with", displaySetInstanceUID, "in", displaySets);
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([[869],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[451],{
3
3
 
4
- /***/ 87869:
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
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts
35
- async function _hydrateSEGDisplaySet(_ref) {
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
- const isHydrated = await _hydrateSEG({
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)("Common");
160
- const loadStr = t("LOAD");
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, _ref => {
318
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref2 => {
355
319
  let {
356
320
  percentComplete,
357
321
  numSegments
358
- } = _ref;
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, _ref2 => {
337
+ const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref3 => {
374
338
  let {
375
339
  displaySetInstanceUIDs
376
- } = _ref2;
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
- const isHydrated = await _hydrateSEG({
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