@ohif/app 3.7.0-beta.5 → 3.7.0-beta.50

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 (54) hide show
  1. package/dist/{917.bundle.24fc5ca2280d2980bf0f.js → 12.bundle.7348933f311b7e2e7d1e.js} +6 -6
  2. package/dist/{295.bundle.957b1159fec14b9199a1.js → 125.bundle.1ae4c6313c31cd0502cc.js} +4 -4
  3. package/dist/{208.bundle.e50761cf714ac772d9cc.js → 128.bundle.d933d385a22b1ce9ac77.js} +6 -6
  4. package/dist/{616.bundle.cbb2e0a23b1343b6441f.js → 150.bundle.e6880fd33346f8c24f6e.js} +148 -103
  5. package/dist/{351.bundle.0742237651aef9694a65.js → 181.bundle.234fef330d4fe6baca8b.js} +139 -128
  6. package/dist/{351.css → 181.css} +1 -1
  7. package/dist/{606.bundle.5d876f5f3dd8287f0a28.js → 202.bundle.ac1e5e25d4daf54581b1.js} +3705 -981
  8. package/dist/{926.bundle.dbc9d0e591cb9217fda2.js → 220.bundle.f7e1c96c94245e70f2be.js} +990 -400
  9. package/dist/{664.bundle.09abae984223969d1bde.js → 23.bundle.e008ad788170f2ed5569.js} +5 -6
  10. package/dist/{976.bundle.3b8f97b61cdfa7dc32e3.js → 236.bundle.765f3c70e21f29ab2e89.js} +38 -24
  11. package/dist/{55.bundle.550a823e75eb608e8d5e.js → 250.bundle.3bcee6d765a209281ddd.js} +37 -25
  12. package/dist/{973.bundle.77245411064eaa3ee79a.js → 281.bundle.dcc5492f44a83edd5320.js} +18 -14
  13. package/dist/{744.bundle.81246dc9f043a17fde8a.js → 30.bundle.5e2f6eeb779d579fc16e.js} +77 -89
  14. package/dist/{192.bundle.6dc1f92074738663620f.js → 348.bundle.c2deacff008bb8c68a14.js} +18 -14
  15. package/dist/{404.bundle.b7b371a30ca5bc5a0554.js → 359.bundle.594d68e783da31f97c30.js} +13 -19
  16. package/dist/{50.bundle.135ada11018fff84d66b.js → 378.bundle.6996a4170f4f05198f23.js} +10 -8
  17. package/dist/{790.bundle.ca48b21507b91b675810.js → 410.bundle.c8759293de9af17687c4.js} +6 -6
  18. package/dist/{151.bundle.31ea35044218837bf73f.js → 417.bundle.720dc8f3a6e99f378aa9.js} +9 -11
  19. package/dist/{569.bundle.21f8ad57c06a210448b5.js → 451.bundle.9941d9134fcf747d452a.js} +62 -81
  20. package/dist/{581.bundle.dc6197189f7c88c27d4c.js → 471.bundle.c9e618aeda78362776aa.js} +43 -72
  21. package/dist/{199.bundle.dff92336f7bc36f2e484.js → 506.bundle.8a2562b7038f6c983884.js} +79 -15
  22. package/dist/{935.bundle.deeffff0e4f7b528e3c3.js → 604.bundle.a51f83e64004bca5f497.js} +2 -3
  23. package/dist/{984.bundle.0301a876361809048be0.js → 663.bundle.e839c4819de3e372d07b.js} +52 -34
  24. package/dist/{531.bundle.2a82fb1d69e5b57cc72b.js → 677.bundle.ec5f2b4707db33bd4d8e.js} +731 -447
  25. package/dist/{707.bundle.7068a46e5be26fe60fce.js → 678.bundle.84a43fe18483016344de.js} +237 -244
  26. package/dist/{205.bundle.b5a473c200dcf2bbcdb4.js → 686.bundle.70565410179f1e7d22e6.js} +4 -4
  27. package/dist/{331.bundle.bd0c13931a21d53086c9.js → 754.bundle.8a16fc8ad21fe00c2e15.js} +12346 -7519
  28. package/dist/{728.bundle.d13856835357400fef82.js → 774.bundle.8ba82ee206266eb2da5e.js} +90 -63
  29. package/dist/{381.bundle.0905e683605fcbc0895f.js → 775.bundle.2285e7e0e67878948c0d.js} +16 -16
  30. package/dist/{283.bundle.f06203ec47c287f44cea.js → 782.bundle.0ea6e2a386f4ba43d830.js} +57 -25
  31. package/dist/{82.bundle.0456c9e58fa89b131f14.js → 789.bundle.aad9b29b476ea70e1350.js} +522 -157
  32. package/dist/{642.bundle.e8d980d4ba95b0b2665f.js → 814.bundle.2e308e04f0d21b4295a9.js} +6 -6
  33. package/dist/{799.bundle.758558e64147e5aad612.js → 822.bundle.d40c439da659f0e8500d.js} +65 -16
  34. package/dist/{953.bundle.3b0189ebc11cf0946f18.js → 886.bundle.68ef58774a6837f57631.js} +11 -10
  35. package/dist/{270.bundle.4564621556b0f963a004.js → 925.bundle.a2f1103d968c53a2b8fb.js} +626 -544
  36. package/dist/945.min.worker.js +1 -1
  37. package/dist/945.min.worker.js.map +1 -1
  38. package/dist/app-config.js +7 -7
  39. package/dist/{app.bundle.3ab8624d0394f1b10a0d.js → app.bundle.00cc8e251524b80d3347.js} +59252 -59601
  40. package/dist/app.bundle.css +9 -9
  41. package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
  42. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
  43. package/dist/{dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js → dicom-microscopy-viewer.bundle.44f7fedc03a58d5911d1.js} +3 -3
  44. package/dist/google.js +6 -5
  45. package/dist/index.html +1 -1
  46. package/dist/{index.worker.1c69152d710fa7b84bce.worker.js → index.worker.e62ecca63f1a2e124230.worker.js} +2 -2
  47. package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +1 -0
  48. package/dist/sw.js +1 -1
  49. package/package.json +19 -20
  50. package/dist/780.bundle.fd0f13dc92e9caa0581e.js +0 -4769
  51. package/dist/index.worker.1c69152d710fa7b84bce.worker.js.map +0 -1
  52. /package/dist/{55.css → 250.css} +0 -0
  53. /package/dist/{806.css → 579.css} +0 -0
  54. /package/dist/{707.css → 678.css} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[151],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[417],{
3
3
 
4
- /***/ 71251:
4
+ /***/ 15747:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -603,24 +603,23 @@ function calculateSUVScalingFactors(instances) {
603
603
  }
604
604
 
605
605
 
606
- //# sourceMappingURL=calculate-suv.esm.js.map
607
606
 
608
607
 
609
608
  /***/ }),
610
609
 
611
- /***/ 21767:
610
+ /***/ 94614:
612
611
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
613
612
 
614
613
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
615
614
  /* harmony export */ S_: () => (/* binding */ VariableSizeList)
616
615
  /* harmony export */ });
617
616
  /* unused harmony exports FixedSizeGrid, FixedSizeList, VariableSizeGrid, areEqual, shouldComponentUpdate */
618
- /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20011);
619
- /* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(93173);
620
- /* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23788);
621
- /* harmony import */ var memoize_one__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(89454);
622
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(32735);
623
- /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(66017);
617
+ /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(76805);
618
+ /* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80107);
619
+ /* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(84067);
620
+ /* harmony import */ var memoize_one__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25539);
621
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(43001);
622
+ /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8339);
624
623
 
625
624
 
626
625
 
@@ -2571,7 +2570,6 @@ function shouldComponentUpdate(nextProps, nextState) {
2571
2570
  }
2572
2571
 
2573
2572
 
2574
- //# sourceMappingURL=index.esm.js.map
2575
2573
 
2576
2574
 
2577
2575
  /***/ })
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[569],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[451],{
3
3
 
4
- /***/ 33569:
4
+ /***/ 4451:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -13,16 +13,16 @@ __webpack_require__.d(__webpack_exports__, {
13
13
  });
14
14
 
15
15
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
16
- var prop_types = __webpack_require__(60216);
16
+ var prop_types = __webpack_require__(3827);
17
17
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
18
18
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
19
- var react = __webpack_require__(32735);
19
+ var react = __webpack_require__(43001);
20
20
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
21
- var es = __webpack_require__(21572);
22
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
23
- var src = __webpack_require__(48501);
24
- // EXTERNAL MODULE: ../../ui/src/index.js + 452 modules
25
- var ui_src = __webpack_require__(28619);
21
+ var es = __webpack_require__(69190);
22
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
23
+ var src = __webpack_require__(24966);
24
+ // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
25
+ var ui_src = __webpack_require__(60082);
26
26
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
27
27
  function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
28
28
  const {
@@ -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
@@ -256,7 +209,7 @@ function OHIFCornerstoneSEGViewport(props) {
256
209
  activeViewportIndex
257
210
  } = viewportGrid;
258
211
  const referencedDisplaySet = segDisplaySet.getReferenceDisplaySet();
259
- const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet);
212
+ const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet, segDisplaySet);
260
213
  referencedDisplaySetRef.current = {
261
214
  displaySet: referencedDisplaySet,
262
215
  metadata: referencedDisplaySetMetadata
@@ -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
@@ -467,8 +437,9 @@ function OHIFCornerstoneSEGViewport(props) {
467
437
  patientSex: PatientSex || '',
468
438
  patientAge: PatientAge || '',
469
439
  MRN: PatientID || '',
470
- thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',
471
- spacing: SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '',
440
+ thickness: SliceThickness ? src.utils.roundNumber(SliceThickness, 2) : '',
441
+ thicknessUnits: SliceThickness !== undefined ? 'mm' : '',
442
+ spacing: SpacingBetweenSlices !== undefined ? src.utils.roundNumber(SpacingBetweenSlices, 2) : '',
472
443
  scanner: ManufacturerModelName || ''
473
444
  }
474
445
  }
@@ -491,20 +462,30 @@ OHIFCornerstoneSEGViewport.propTypes = {
491
462
  OHIFCornerstoneSEGViewport.defaultProps = {
492
463
  customProps: {}
493
464
  };
494
- function _getReferencedDisplaySetMetadata(referencedDisplaySet) {
465
+ function _getReferencedDisplaySetMetadata(referencedDisplaySet, segDisplaySet) {
466
+ const {
467
+ SharedFunctionalGroupsSequence: [SharedFunctionalGroup]
468
+ } = segDisplaySet.instance;
469
+ const {
470
+ PixelMeasuresSequence: [PixelMeasures]
471
+ } = SharedFunctionalGroup;
472
+ const {
473
+ SpacingBetweenSlices,
474
+ SliceThickness
475
+ } = PixelMeasures;
495
476
  const image0 = referencedDisplaySet.images[0];
496
477
  const referencedDisplaySetMetadata = {
497
478
  PatientID: image0.PatientID,
498
479
  PatientName: image0.PatientName,
499
480
  PatientSex: image0.PatientSex,
500
481
  PatientAge: image0.PatientAge,
501
- SliceThickness: image0.SliceThickness,
482
+ SliceThickness: image0.SliceThickness || SliceThickness,
502
483
  StudyDate: image0.StudyDate,
503
484
  SeriesDescription: image0.SeriesDescription,
504
485
  SeriesInstanceUID: image0.SeriesInstanceUID,
505
486
  SeriesNumber: image0.SeriesNumber,
506
487
  ManufacturerModelName: image0.ManufacturerModelName,
507
- SpacingBetweenSlices: image0.SpacingBetweenSlices
488
+ SpacingBetweenSlices: image0.SpacingBetweenSlices || SpacingBetweenSlices
508
489
  };
509
490
  return referencedDisplaySetMetadata;
510
491
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[581],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[471],{
3
3
 
4
- /***/ 72581:
4
+ /***/ 56471:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -13,68 +13,16 @@ __webpack_require__.d(__webpack_exports__, {
13
13
  });
14
14
 
15
15
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
16
- var react = __webpack_require__(32735);
16
+ var react = __webpack_require__(43001);
17
17
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
18
- var prop_types = __webpack_require__(60216);
18
+ var prop_types = __webpack_require__(3827);
19
19
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
20
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
21
- var src = __webpack_require__(48501);
22
- // EXTERNAL MODULE: ../../ui/src/index.js + 452 modules
23
- var ui_src = __webpack_require__(28619);
24
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
25
- async function _hydrateRTDisplaySet(_ref) {
26
- let {
27
- rtDisplaySet,
28
- viewportIndex,
29
- servicesManager
30
- } = _ref;
31
- const {
32
- segmentationService,
33
- hangingProtocolService,
34
- viewportGridService
35
- } = servicesManager.services;
36
- const displaySetInstanceUID = rtDisplaySet.referencedDisplaySetInstanceUID;
37
- let segmentationId = null;
38
-
39
- // We need the hydration to notify panels about the new segmentation added
40
- const suppressEvents = false;
41
- segmentationId = await segmentationService.createSegmentationForRTDisplaySet(rtDisplaySet, segmentationId, suppressEvents);
42
- segmentationService.hydrateSegmentation(rtDisplaySet.displaySetInstanceUID);
43
- const {
44
- viewports
45
- } = viewportGridService.getState();
46
- const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
47
- viewportGridService.setDisplaySetsForViewports(updatedViewports);
48
-
49
- // Todo: fix this after we have a better way for stack viewport segmentations
50
-
51
- // check every viewport in the viewports to see if the displaySetInstanceUID
52
- // is being displayed, if so we need to update the viewport to use volume viewport
53
- // (if already is not using it) since Cornerstone3D currently only supports
54
- // volume viewport for segmentation
55
- viewports.forEach((viewport, index) => {
56
- if (index === viewportIndex) {
57
- return;
58
- }
59
- const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, rtDisplaySet.displaySetInstanceUID);
60
- if (shouldDisplaySeg) {
61
- updatedViewports.push({
62
- viewportIndex: index,
63
- displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
64
- viewportOptions: {
65
- initialImageOptions: {
66
- preset: 'middle'
67
- }
68
- }
69
- });
70
- }
71
- });
72
-
73
- // Do the entire update at once
74
- viewportGridService.setDisplaySetsForViewports(updatedViewports);
75
- return true;
76
- }
77
- /* harmony default export */ const _hydrateRT = (_hydrateRTDisplaySet);
20
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
21
+ var src = __webpack_require__(24966);
22
+ // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
23
+ var ui_src = __webpack_require__(60082);
24
+ // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
25
+ var _hydrateRT = __webpack_require__(50995);
78
26
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
79
27
 
80
28
 
@@ -88,7 +36,8 @@ function promptHydrateRT(_ref) {
88
36
  servicesManager,
89
37
  rtDisplaySet,
90
38
  viewportIndex,
91
- toolGroupId = 'default'
39
+ toolGroupId = 'default',
40
+ preHydrateCallbacks
92
41
  } = _ref;
93
42
  const {
94
43
  uiViewportDialogService
@@ -96,7 +45,10 @@ function promptHydrateRT(_ref) {
96
45
  return new Promise(async function (resolve, reject) {
97
46
  const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
98
47
  if (promptResult === RESPONSE.HYDRATE_SEG) {
99
- const isHydrated = await _hydrateRT({
48
+ preHydrateCallbacks?.forEach(callback => {
49
+ callback();
50
+ });
51
+ const isHydrated = await (0,_hydrateRT/* default */.Z)({
100
52
  rtDisplaySet,
101
53
  viewportIndex,
102
54
  toolGroupId,
@@ -137,7 +89,7 @@ function _askHydrate(uiViewportDialogService, viewportIndex) {
137
89
  }
138
90
  /* harmony default export */ const utils_promptHydrateRT = (promptHydrateRT);
139
91
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
140
- var es = __webpack_require__(21572);
92
+ var es = __webpack_require__(69190);
141
93
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx
142
94
 
143
95
 
@@ -213,7 +165,8 @@ function OHIFCornerstoneRTViewport(props) {
213
165
  viewportIndex,
214
166
  viewportLabel,
215
167
  servicesManager,
216
- extensionManager
168
+ extensionManager,
169
+ commandsManager
217
170
  } = props;
218
171
  const {
219
172
  displaySetService,
@@ -272,6 +225,16 @@ function OHIFCornerstoneRTViewport(props) {
272
225
  const onElementDisabled = () => {
273
226
  setElement(null);
274
227
  };
228
+ const storePresentationState = (0,react.useCallback)(() => {
229
+ viewportGrid?.viewports.forEach(_ref => {
230
+ let {
231
+ viewportIndex
232
+ } = _ref;
233
+ commandsManager.runCommand('storePresentation', {
234
+ viewportIndex
235
+ });
236
+ });
237
+ }, [viewportGrid]);
275
238
  const getCornerstoneViewport = (0,react.useCallback)(() => {
276
239
  const {
277
240
  component: Component
@@ -319,7 +282,8 @@ function OHIFCornerstoneRTViewport(props) {
319
282
  utils_promptHydrateRT({
320
283
  servicesManager,
321
284
  viewportIndex,
322
- rtDisplaySet
285
+ rtDisplaySet,
286
+ preHydrateCallbacks: [storePresentationState]
323
287
  }).then(isHydrated => {
324
288
  if (isHydrated) {
325
289
  setIsHydrated(true);
@@ -348,11 +312,11 @@ function OHIFCornerstoneRTViewport(props) {
348
312
  (0,react.useEffect)(() => {
349
313
  const {
350
314
  unsubscribe
351
- } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref => {
315
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref2 => {
352
316
  let {
353
317
  percentComplete,
354
318
  numSegments
355
- } = _ref;
319
+ } = _ref2;
356
320
  setProcessingProgress({
357
321
  percentComplete,
358
322
  totalSegments: numSegments
@@ -367,10 +331,10 @@ function OHIFCornerstoneRTViewport(props) {
367
331
  Cleanup the SEG viewport when the viewport is destroyed
368
332
  */
369
333
  (0,react.useEffect)(() => {
370
- const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref2 => {
334
+ const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref3 => {
371
335
  let {
372
336
  displaySetInstanceUIDs
373
- } = _ref2;
337
+ } = _ref3;
374
338
  const activeViewport = viewports[activeViewportIndex];
375
339
  if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
376
340
  viewportGridService.setDisplaySetsForViewport({
@@ -431,7 +395,14 @@ function OHIFCornerstoneRTViewport(props) {
431
395
  SeriesNumber
432
396
  } = referencedDisplaySetRef.current.metadata;
433
397
  const onStatusClick = async () => {
434
- const isHydrated = await _hydrateRT({
398
+ // Before hydrating a RT and make it added to all viewports in the grid
399
+ // that share the same frameOfReferenceUID, we need to store the viewport grid
400
+ // presentation state, so that we can restore it after hydrating the RT. This is
401
+ // required if the user has changed the viewport (other viewport than RT viewport)
402
+ // presentation state (w/l and invert) and then opens the RT. If we don't store
403
+ // the presentation state, the viewport will be reset to the default presentation
404
+ storePresentationState();
405
+ const isHydrated = await (0,_hydrateRT/* default */.Z)({
435
406
  rtDisplaySet,
436
407
  viewportIndex,
437
408
  servicesManager
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[199],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[506],{
3
3
 
4
- /***/ 31199:
4
+ /***/ 53506:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -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_rt_src)
12
+ "default": () => (/* binding */ cornerstone_dicom_rt_src),
13
+ hydrateRTDisplaySet: () => (/* reexport */ _hydrateRT/* default */.Z)
13
14
  });
14
15
 
15
16
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/package.json
@@ -21,11 +22,11 @@ const SOPClassHandlerName = 'dicom-rt';
21
22
  const SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;
22
23
 
23
24
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
24
- var react = __webpack_require__(32735);
25
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
26
- var src = __webpack_require__(48501);
25
+ var react = __webpack_require__(43001);
26
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
27
+ var src = __webpack_require__(24966);
27
28
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
28
- var dcmjs_es = __webpack_require__(22737);
29
+ var dcmjs_es = __webpack_require__(67540);
29
30
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/loadRTStruct.js
30
31
 
31
32
  const {
@@ -159,11 +160,6 @@ async function loadRTStruct(extensionManager, rtStructDisplaySet, referencedDisp
159
160
  NumberOfContourPoints,
160
161
  ContourGeometricType
161
162
  } = ContourSequenceArray[c];
162
- const sopInstanceUID = ContourImageSequence.ReferencedSOPInstanceUID;
163
- const imageId = _getImageId(imageIdSopInstanceUidPairs, sopInstanceUID);
164
- if (!imageId) {
165
- continue;
166
- }
167
163
  let isSupported = false;
168
164
  const points = [];
169
165
  for (let p = 0; p < NumberOfContourPoints * 3; p += 3) {
@@ -420,13 +416,16 @@ function getSopClassHandlerModule(_ref2) {
420
416
  }];
421
417
  }
422
418
  /* harmony default export */ const src_getSopClassHandlerModule = (getSopClassHandlerModule);
419
+ // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
420
+ var _hydrateRT = __webpack_require__(50995);
423
421
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/index.tsx
424
422
  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); }
425
423
 
426
424
 
427
425
 
426
+
428
427
  const Component = /*#__PURE__*/react.lazy(() => {
429
- return __webpack_require__.e(/* import() */ 581).then(__webpack_require__.bind(__webpack_require__, 72581));
428
+ return __webpack_require__.e(/* import() */ 471).then(__webpack_require__.bind(__webpack_require__, 56471));
430
429
  });
431
430
  const OHIFCornerstoneRTViewport = props => {
432
431
  return /*#__PURE__*/react.createElement(react.Suspense, {
@@ -452,12 +451,14 @@ const extension = {
452
451
  getViewportModule(_ref) {
453
452
  let {
454
453
  servicesManager,
455
- extensionManager
454
+ extensionManager,
455
+ commandsManager
456
456
  } = _ref;
457
457
  const ExtendedOHIFCornerstoneRTViewport = props => {
458
458
  return /*#__PURE__*/react.createElement(OHIFCornerstoneRTViewport, _extends({
459
459
  servicesManager: servicesManager,
460
- extensionManager: extensionManager
460
+ extensionManager: extensionManager,
461
+ commandsManager: commandsManager
461
462
  }, props));
462
463
  };
463
464
  return [{
@@ -475,6 +476,69 @@ const extension = {
475
476
  };
476
477
  /* harmony default export */ const cornerstone_dicom_rt_src = (extension);
477
478
 
479
+
480
+ /***/ }),
481
+
482
+ /***/ 50995:
483
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
484
+
485
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
486
+ /* harmony export */ Z: () => (__WEBPACK_DEFAULT_EXPORT__)
487
+ /* harmony export */ });
488
+ async function _hydrateRTDisplaySet(_ref) {
489
+ let {
490
+ rtDisplaySet,
491
+ viewportIndex,
492
+ servicesManager
493
+ } = _ref;
494
+ const {
495
+ segmentationService,
496
+ hangingProtocolService,
497
+ viewportGridService
498
+ } = servicesManager.services;
499
+ const displaySetInstanceUID = rtDisplaySet.referencedDisplaySetInstanceUID;
500
+ let segmentationId = null;
501
+
502
+ // We need the hydration to notify panels about the new segmentation added
503
+ const suppressEvents = false;
504
+ segmentationId = await segmentationService.createSegmentationForRTDisplaySet(rtDisplaySet, segmentationId, suppressEvents);
505
+ segmentationService.hydrateSegmentation(rtDisplaySet.displaySetInstanceUID);
506
+ const {
507
+ viewports
508
+ } = viewportGridService.getState();
509
+ const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
510
+ viewportGridService.setDisplaySetsForViewports(updatedViewports);
511
+
512
+ // Todo: fix this after we have a better way for stack viewport segmentations
513
+
514
+ // check every viewport in the viewports to see if the displaySetInstanceUID
515
+ // is being displayed, if so we need to update the viewport to use volume viewport
516
+ // (if already is not using it) since Cornerstone3D currently only supports
517
+ // volume viewport for segmentation
518
+ viewports.forEach((viewport, index) => {
519
+ if (index === viewportIndex) {
520
+ return;
521
+ }
522
+ const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, rtDisplaySet.displaySetInstanceUID);
523
+ if (shouldDisplaySeg) {
524
+ updatedViewports.push({
525
+ viewportIndex: index,
526
+ displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
527
+ viewportOptions: {
528
+ initialImageOptions: {
529
+ preset: 'middle'
530
+ }
531
+ }
532
+ });
533
+ }
534
+ });
535
+
536
+ // Do the entire update at once
537
+ viewportGridService.setDisplaySetsForViewports(updatedViewports);
538
+ return true;
539
+ }
540
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_hydrateRTDisplaySet);
541
+
478
542
  /***/ })
479
543
 
480
544
  }]);