@ohif/app 3.12.0-beta.90 → 3.12.0-beta.92

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 (45) hide show
  1. package/dist/{1037.bundle.87a5adb8c92bd5bf53f5.js → 1037.bundle.dd9098a9a640f0d0ef0f.js} +129 -96
  2. package/dist/{1608.bundle.3d904bc76f5d5f78ff21.js → 1608.bundle.f855c4bdb7f00eb66fca.js} +1 -1
  3. package/dist/{1903.bundle.f0505c6e927d0bef5589.js → 1903.bundle.9a291597f23ebaa3371c.js} +49 -47
  4. package/dist/{1604.bundle.4f01a6b0b8d5b1cbc294.js → 1933.bundle.a5d41c04da5425d06694.js} +13 -26
  5. package/dist/{2018.bundle.59c7c4cb3f79f63bab68.js → 2018.bundle.4527f2b0c1c8ff75f568.js} +18 -43
  6. package/dist/{306.bundle.f9faa2b3cdd7e86b5869.js → 306.bundle.a0af0889477845729c6a.js} +23 -1
  7. package/dist/{3461.bundle.458597198f24359ec78f.js → 3461.bundle.3cac685ef19f883a0f9d.js} +27 -8
  8. package/dist/{4019.bundle.1be1cdd0805ad2c59d65.js → 4019.bundle.03029c488a02493cb7f3.js} +17 -1
  9. package/dist/{2518.bundle.644302643ac0790e7374.js → 4033.bundle.1609f8751de2a6aff280.js} +457 -303
  10. package/dist/{4819.bundle.f187a4c0517c85e37ab0.js → 4819.bundle.14344bf9acf5c5f6d123.js} +3 -3
  11. package/dist/{5028.bundle.6003ab9178779929462f.js → 5028.bundle.c61b7cd88172e2d589d5.js} +2 -2
  12. package/dist/{5400.bundle.c3a3fe8867efa2edfa94.js → 5400.bundle.428fdd2dc347a7fda9e6.js} +96 -92
  13. package/dist/5457.bundle.af893cd38fdaeafd5c2a.js +89 -0
  14. package/dist/{5485.bundle.2ee096f57ff7e51d4c23.js → 5485.bundle.929d9add8bdf90a4f3c7.js} +8 -0
  15. package/dist/{5802.bundle.8922caf16c088b10cdb0.js → 5802.bundle.756d2ed511c06ee8b461.js} +2 -2
  16. package/dist/{6991.bundle.46bc04720d99fbb06785.js → 6991.bundle.7d091de815571097b96e.js} +8 -10
  17. package/dist/{7412.bundle.34fe5e72833e857edc0a.js → 7412.bundle.dfe01ae3e53107abe53d.js} +80 -57
  18. package/dist/{8305.bundle.8ea926425cdffaf84fe3.js → 8305.bundle.08ba73235df90e099838.js} +75 -55
  19. package/dist/{8558.bundle.c9ffb4f942dbbbff1849.js → 8558.bundle.705446f4883e84021bf4.js} +29 -11
  20. package/dist/{8583.bundle.7715397a42e8f00a9e3e.js → 8583.bundle.0288cadf5cf8401446b1.js} +12 -13
  21. package/dist/{874.bundle.92ddc54408fef9debee7.js → 874.bundle.7e543ec9343c9a718e3d.js} +35 -42
  22. package/dist/{3613.bundle.6157004e0592003c0800.js → 8802.bundle.4958d8ba1d0d521a002a.js} +131 -76
  23. package/dist/{9548.bundle.7be4f24aeadd0ad4f16c.js → 9195.bundle.70afccd0f802b78c279a.js} +75 -104
  24. package/dist/{9845.bundle.7e4db5e31b28d73fdac2.js → 9845.bundle.0d22f2210c1d5ac18882.js} +1 -1
  25. package/dist/{app.bundle.bdd8a45996ed4ca28560.js → app.bundle.2b7e40349f89ffdfd96c.js} +1055 -219
  26. package/dist/{compute.bundle.f3ca9fb0e7ce9e885b9c.js → compute.bundle.4c0ef8b919cbe5eef44d.js} +3 -3
  27. package/dist/index.html +1 -1
  28. package/dist/{polySeg.bundle.7b8d1bb21d442a48da1d.js → polySeg.bundle.75f37f2780c5375e161e.js} +3 -3
  29. package/dist/sw.js +1 -1
  30. package/package.json +22 -22
  31. package/dist/5457.bundle.535bae0c872c1ca0c2cb.js +0 -1358
  32. /package/dist/{1459.bundle.0481573ae1bde12b24ee.js → 1459.bundle.c4acfc6df383fc187e9e.js} +0 -0
  33. /package/dist/{147.bundle.6fc65a239d1ae1c6a918.js → 147.bundle.c191ca0b67633f707aff.js} +0 -0
  34. /package/dist/{1515.bundle.73d415797a677ae5261e.js → 1515.bundle.3f81b326242dd945ecdb.js} +0 -0
  35. /package/dist/{1604.css → 1933.css} +0 -0
  36. /package/dist/{213.bundle.9b152cd4d202cae43af2.js → 213.bundle.33092c23ffe1d81ae242.js} +0 -0
  37. /package/dist/{2243.bundle.25ca9faa6d0776355adf.js → 2243.bundle.e37c80996a222167dc14.js} +0 -0
  38. /package/dist/{2424.bundle.57b7484a3b1b1e5a1722.js → 2424.bundle.45583fc64208a2821aa3.js} +0 -0
  39. /package/dist/{319.bundle.4ea0dbcfeb553c900206.js → 319.bundle.febb2a63634488c11db6.js} +0 -0
  40. /package/dist/{6027.bundle.06ab1f1cd27f93f826e5.js → 6027.bundle.b2942a0dd2c583374d7b.js} +0 -0
  41. /package/dist/{7431.bundle.55dd86000e66bee467e2.js → 7431.bundle.b80819b8eb28d2ee897d.js} +0 -0
  42. /package/dist/{7639.bundle.a89f4a8c6e8b2593d7a4.js → 7639.bundle.2ad4b6cd132d87439fa6.js} +0 -0
  43. /package/dist/{85.bundle.f3a9149485e3fcf652f0.js → 85.bundle.a772983604a0f9514e33.js} +0 -0
  44. /package/dist/{9862.bundle.0456a2d473895bf2916e.js → 9862.bundle.eca4ea8821bb040a44c1.js} +0 -0
  45. /package/dist/{9927.bundle.d7051dac659d827d62d3.js → 9927.bundle.775cb41458de4c28a9ba.js} +0 -0
@@ -357,7 +357,7 @@ function useMeasurements({
357
357
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
358
358
  /* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(62051);
359
359
  /* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_1__);
360
- /* harmony import */ var _ohif_core_src_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12505);
360
+ /* harmony import */ var _ohif_core_src_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(37447);
361
361
  /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(42356);
362
362
 
363
363
 
@@ -1482,7 +1482,7 @@ function getCustomizationData(customizationService) {
1482
1482
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
1483
1483
  /* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(62051);
1484
1484
  /* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_1__);
1485
- /* harmony import */ var _ohif_core_src_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12505);
1485
+ /* harmony import */ var _ohif_core_src_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(37447);
1486
1486
  /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(42356);
1487
1487
 
1488
1488
 
@@ -1808,8 +1808,8 @@ function destroy() {
1808
1808
  var ai_dist_esm = __webpack_require__(75165);
1809
1809
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/polymorphic-segmentation/dist/esm/index.js + 14 modules
1810
1810
  var polymorphic_segmentation_dist_esm = __webpack_require__(56983);
1811
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 141 modules
1812
- var default_src = __webpack_require__(39548);
1811
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 139 modules
1812
+ var default_src = __webpack_require__(39195);
1813
1813
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/state.ts
1814
1814
  var state = __webpack_require__(71353);
1815
1815
  ;// ../../../extensions/cornerstone/src/utils/getViewportEnabledElement.ts
@@ -1922,8 +1922,8 @@ function onCompletedCalibrationLine(servicesManager, csToolsEvent) {
1922
1922
  });
1923
1923
  });
1924
1924
  }
1925
- // EXTERNAL MODULE: ../../core/src/utils/index.ts + 31 modules
1926
- var utils = __webpack_require__(12505);
1925
+ // EXTERNAL MODULE: ../../core/src/utils/index.ts + 33 modules
1926
+ var utils = __webpack_require__(37447);
1927
1927
  ;// ../../../extensions/cornerstone/src/tools/OverlayPlaneModuleProvider.ts
1928
1928
 
1929
1929
  const _cachedOverlayMetadata = new Map();
@@ -6015,6 +6015,9 @@ const connectMeasurementServiceToTools = ({
6015
6015
  const annotationManager = dist_esm.annotation.state.getAnnotationManager();
6016
6016
  const newAnnotation = {
6017
6017
  annotationUID: measurement.uid,
6018
+ // Not used in CS3D but stored in the CS3D state so that saving
6019
+ // can apply the predecessor consistently.
6020
+ predecessorImageId: measurement?.predecessorImageId,
6018
6021
  highlighted: false,
6019
6022
  isLocked: false,
6020
6023
  // This is used to force a re-render of the annotation to
@@ -7486,7 +7489,7 @@ const ExportSegmentationSubMenuItem = ({
7486
7489
  const {
7487
7490
  t
7488
7491
  } = (0,es/* useTranslation */.Bd)('SegmentationTable');
7489
- return /*#__PURE__*/react.createElement(react.Fragment, null, segmentationRepresentationType === esm_enums.SegmentationRepresentations.Labelmap && /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuSub */.lvB, null, /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuSubTrigger */.nVd, {
7492
+ return /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuSub */.lvB, null, /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuSubTrigger */.nVd, {
7490
7493
  className: "pl-1"
7491
7494
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.Export, {
7492
7495
  className: "text-foreground"
@@ -7498,13 +7501,13 @@ const ExportSegmentationSubMenuItem = ({
7498
7501
  className: "h-5 w-5"
7499
7502
  }), /*#__PURE__*/react.createElement("span", {
7500
7503
  className: "pl-1"
7501
- }, t('Download'))), /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7504
+ }, t('Download'))), segmentationRepresentationType === esm_enums.SegmentationRepresentations.Labelmap && /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7502
7505
  onClick: e => {
7503
7506
  e.preventDefault();
7504
7507
  actions.downloadCSVSegmentationReport(segmentationId);
7505
7508
  },
7506
7509
  disabled: !allowExport
7507
- }, t('CSV Report')), /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7510
+ }, t('CSV Report')), segmentationRepresentationType === esm_enums.SegmentationRepresentations.Labelmap && /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7508
7511
  onClick: e => {
7509
7512
  e.preventDefault();
7510
7513
  actions.onSegmentationDownload(segmentationId);
@@ -7522,23 +7525,19 @@ const ExportSegmentationSubMenuItem = ({
7522
7525
  className: "h-5 w-5"
7523
7526
  }), /*#__PURE__*/react.createElement("span", {
7524
7527
  className: "pl-1 pt-1"
7525
- }, t('Export'))), /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7528
+ }, t('Export'))), segmentationRepresentationType === esm_enums.SegmentationRepresentations.Labelmap && /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7526
7529
  onClick: e => {
7527
7530
  e.preventDefault();
7528
- actions.storeSegmentation(segmentationId);
7531
+ actions.storeSegmentation(segmentationId, 'SEG');
7529
7532
  },
7530
7533
  disabled: !allowExport
7531
- }, t('DICOM SEG'))))), segmentationRepresentationType === esm_enums.SegmentationRepresentations.Contour && /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7534
+ }, t('DICOM SEG')), /*#__PURE__*/react.createElement(ui_next_src/* DropdownMenuItem */._26, {
7532
7535
  onClick: e => {
7533
7536
  e.preventDefault();
7534
- actions.onSegmentationDownloadRTSS(segmentationId);
7537
+ actions.storeSegmentation(segmentationId, 'RTSTRUCT');
7535
7538
  },
7536
7539
  disabled: !allowExport
7537
- }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.Export, {
7538
- className: "text-foreground"
7539
- }), /*#__PURE__*/react.createElement("span", {
7540
- className: "pl-2"
7541
- }, t('Download DICOM RTSS')))));
7540
+ }, t('DICOM RTSS')))));
7542
7541
  };
7543
7542
  ;// ../../../extensions/cornerstone/src/customizations/CustomDropdownMenuContent.tsx
7544
7543
 
@@ -7583,21 +7582,22 @@ const CustomDropdownMenuContent = () => {
7583
7582
  segmentation = activeSegmentation;
7584
7583
  segmentationId = activeSegmentationId;
7585
7584
  }
7585
+ if (!segmentation || !segmentationId) {
7586
+ return null;
7587
+ }
7586
7588
 
7587
7589
  // Determine if export is allowed for this segmentation
7588
- if (exportOptions && segmentationId) {
7590
+ if (exportOptions) {
7589
7591
  const exportOption = exportOptions.find(opt => opt.segmentationId === segmentationId);
7590
7592
  allowExport = exportOption?.isExportable || false;
7591
7593
  }
7592
- if (!segmentation || !segmentationId) {
7593
- return null;
7594
- }
7595
7594
  const actions = {
7596
- storeSegmentation: async segmentationId => {
7595
+ storeSegmentation: async (segmentationId, modality = 'SEG') => {
7597
7596
  commandsManager.run({
7598
7597
  commandName: 'storeSegmentation',
7599
7598
  commandOptions: {
7600
- segmentationId
7599
+ segmentationId,
7600
+ modality
7601
7601
  },
7602
7602
  context: 'CORNERSTONE'
7603
7603
  });
@@ -9441,6 +9441,10 @@ var html2canvas_esm = __webpack_require__(91037);
9441
9441
 
9442
9442
 
9443
9443
 
9444
+
9445
+ const {
9446
+ downloadUrl
9447
+ } = src/* utils */.Wp;
9444
9448
  const DEFAULT_SIZE = 512;
9445
9449
  const CornerstoneViewportDownloadForm_MAX_TEXTURE_SIZE = 10000;
9446
9450
  const VIEWPORT_ID = 'cornerstone-viewport-download-form';
@@ -9637,10 +9641,7 @@ const CornerstoneViewportDownloadForm = ({
9637
9641
  return;
9638
9642
  }
9639
9643
  const canvas = await (0,html2canvas_esm/* default */.A)(divForDownloadViewport);
9640
- const link = document.createElement('a');
9641
- link.download = `${filename}.${fileType}`;
9642
- link.href = canvas.toDataURL(`image/${fileType}`, 1.0);
9643
- link.click();
9644
+ downloadUrl(canvas.toDataURL(`image/${fileType}`, 1.0));
9644
9645
  };
9645
9646
  const ViewportDownloadFormNew = customizationService.getCustomization('ohif.captureViewportModal');
9646
9647
  return /*#__PURE__*/react.createElement(ViewportDownloadFormNew, {
@@ -9818,6 +9819,10 @@ function updateSegmentBidirectionalStats({
9818
9819
  return null;
9819
9820
  }
9820
9821
  ;// ../../../extensions/cornerstone/src/utils/generateSegmentationCSVReport.ts
9822
+
9823
+ const {
9824
+ downloadCsv
9825
+ } = src/* utils */.Wp;
9821
9826
  function generateSegmentationCSVReport(segmentationData, info) {
9822
9827
  // Initialize the rows for our CSV
9823
9828
  const csvRows = [];
@@ -9903,19 +9908,9 @@ function generateSegmentationCSVReport(segmentationData, info) {
9903
9908
  });
9904
9909
  csvString += formattedRow.join(',') + '\n';
9905
9910
  }
9906
-
9907
- // Create a download link and trigger the download
9908
- const blob = new Blob([csvString], {
9909
- type: 'text/csv;charset=utf-8;'
9911
+ downloadCsv(csvString, {
9912
+ filename: `${segmentationData.label || 'Segmentation'}_Report_${new Date().toISOString().split('T')[0]}.csv`
9910
9913
  });
9911
- const url = URL.createObjectURL(blob);
9912
- const link = document.createElement('a');
9913
- link.setAttribute('href', url);
9914
- link.setAttribute('download', `${segmentationData.label || 'Segmentation'}_Report_${new Date().toISOString().split('T')[0]}.csv`);
9915
- link.style.visibility = 'hidden';
9916
- document.body.appendChild(link);
9917
- link.click();
9918
- document.body.removeChild(link);
9919
9914
  }
9920
9915
  ;// ../../../extensions/cornerstone/src/utils/hydrationUtils.ts
9921
9916
  function getUpdatedViewportsForSegmentation({
@@ -12033,18 +12028,17 @@ function commandsModule({
12033
12028
  * Stores a segmentation and shows it in the viewport
12034
12029
  * @param props.segmentationId - The ID of the segmentation to store
12035
12030
  */
12036
- storeSegmentationCommand: async ({
12037
- segmentationId
12038
- }) => {
12031
+ storeSegmentationCommand: async args => {
12032
+ const {
12033
+ segmentationId
12034
+ } = args;
12039
12035
  const {
12040
12036
  segmentationService,
12041
12037
  viewportGridService
12042
12038
  } = servicesManager.services;
12043
12039
  const displaySetInstanceUIDs = await (0,default_src.createReportAsync)({
12044
12040
  servicesManager,
12045
- getReport: () => commandsManager.runCommand('storeSegmentation', {
12046
- segmentationId
12047
- }),
12041
+ getReport: () => commandsManager.runCommand('storeSegmentation', args),
12048
12042
  reportType: 'Segmentation'
12049
12043
  });
12050
12044
  if (displaySetInstanceUIDs) {
@@ -19389,11 +19383,15 @@ class SegmentationService extends src/* PubSubService */.Rc {
19389
19383
  }
19390
19384
  async addSegmentationRepresentation(viewportId, {
19391
19385
  segmentationId,
19386
+ predecessorImageId,
19392
19387
  type,
19393
19388
  config,
19394
19389
  suppressEvents = false
19395
19390
  }) {
19396
19391
  const segmentation = this.getSegmentation(segmentationId);
19392
+ if (segmentation && !segmentation.predecessorImageId && predecessorImageId) {
19393
+ segmentation.predecessorImageId = predecessorImageId;
19394
+ }
19397
19395
  const csViewport = this.getAndValidateViewport(viewportId);
19398
19396
  if (!csViewport) {
19399
19397
  return;
@@ -22153,8 +22151,12 @@ class CornerstoneViewportService extends src/* PubSubService */.Rc {
22153
22151
  } = this.servicesManager.services;
22154
22152
  const segmentationId = displaySet.displaySetInstanceUID;
22155
22153
  const representationType = displaySet.Modality === 'SEG' ? dist_esm.Enums.SegmentationRepresentations.Labelmap : dist_esm.Enums.SegmentationRepresentations.Contour;
22154
+ const {
22155
+ predecessorImageId
22156
+ } = displaySet;
22156
22157
  segmentationService.addSegmentationRepresentation(viewport.id, {
22157
22158
  segmentationId,
22159
+ predecessorImageId,
22158
22160
  type: representationType
22159
22161
  });
22160
22162
 
@@ -23177,7 +23179,7 @@ const hasExportableLabelMapData = (labelmap, displaySetService) => {
23177
23179
  const SOPInstanceUID = instance.SOPInstanceUID || instance.SopInstanceUID;
23178
23180
  const SeriesInstanceUID = instance.SeriesInstanceUID;
23179
23181
  const displaySet = displaySetService.getDisplaySetForSOPInstanceUID(SOPInstanceUID, SeriesInstanceUID);
23180
- return displaySet?.isReconstructable;
23182
+ return !!displaySet;
23181
23183
  };
23182
23184
 
23183
23185
  /**
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[1604,2591],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[1933,2591],{
3
3
 
4
- /***/ 65090:
4
+ /***/ 6015:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -22,8 +22,8 @@ const id = package_namespaceObject.UU;
22
22
  var react = __webpack_require__(86326);
23
23
  // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
24
24
  var src = __webpack_require__(1246);
25
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 141 modules
26
- var default_src = __webpack_require__(39548);
25
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 139 modules
26
+ var default_src = __webpack_require__(39195);
27
27
  // EXTERNAL MODULE: ../../core/src/index.ts + 69 modules
28
28
  var core_src = __webpack_require__(42356);
29
29
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
@@ -1582,21 +1582,6 @@ function constructSR(metadata, {
1582
1582
  };
1583
1583
  return dataset;
1584
1584
  }
1585
- ;// ../../../extensions/dicom-microscopy/src/utils/saveByteArray.ts
1586
- /**
1587
- * Trigger file download from an array buffer
1588
- * @param buffer
1589
- * @param filename
1590
- */
1591
- function saveByteArray(buffer, filename) {
1592
- const blob = new Blob([buffer], {
1593
- type: 'application/dicom'
1594
- });
1595
- const link = document.createElement('a');
1596
- link.href = window.URL.createObjectURL(blob);
1597
- link.download = filename;
1598
- link.click();
1599
- }
1600
1585
  ;// ../../../extensions/dicom-microscopy/src/components/MicroscopyPanel/MicroscopyPanel.tsx
1601
1586
 
1602
1587
 
@@ -1606,7 +1591,9 @@ function saveByteArray(buffer, filename) {
1606
1591
 
1607
1592
 
1608
1593
 
1609
-
1594
+ const {
1595
+ downloadDicom
1596
+ } = core_src/* utils */.Wp;
1610
1597
  let saving = false;
1611
1598
  const {
1612
1599
  datasetToBuffer
@@ -1778,7 +1765,9 @@ function MicroscopyPanel(props) {
1778
1765
  if (dataSource.wadoRoot == 'saveDicom') {
1779
1766
  // download as DICOM file
1780
1767
  const part10Buffer = datasetToBuffer(dataset);
1781
- saveByteArray(part10Buffer, `sr-microscopy.dcm`);
1768
+ downloadDicom(part10Buffer, {
1769
+ filename: `sr-microscopy.dcm`
1770
+ });
1782
1771
  } else {
1783
1772
  // Save into Web Data source
1784
1773
  const {
@@ -1864,16 +1853,14 @@ function MicroscopyPanel(props) {
1864
1853
  * @param param0
1865
1854
  */
1866
1855
  const onMeasurementItemEditHandler = ({
1867
- uid,
1868
- isActive
1856
+ uid
1869
1857
  }) => {
1870
1858
  props.commandsManager.runCommand('setLabel', {
1871
1859
  uid
1872
1860
  }, 'MICROSCOPY');
1873
1861
  };
1874
1862
  const onMeasurementDeleteHandler = ({
1875
- uid,
1876
- isActive
1863
+ uid
1877
1864
  }) => {
1878
1865
  const roiAnnotation = microscopyService.getAnnotation(uid);
1879
1866
  microscopyService.removeAnnotation(roiAnnotation);
@@ -2776,7 +2763,7 @@ const extension = {
2776
2763
  /* harmony export */ A: () => (/* binding */ getDicomWebClient)
2777
2764
  /* harmony export */ });
2778
2765
  /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(42356);
2779
- /* harmony import */ var _ohif_extension_default__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39548);
2766
+ /* harmony import */ var _ohif_extension_default__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39195);
2780
2767
 
2781
2768
 
2782
2769
 
@@ -9,7 +9,8 @@ __webpack_require__.r(__webpack_exports__);
9
9
 
10
10
  // EXPORTS
11
11
  __webpack_require__.d(__webpack_exports__, {
12
- "default": () => (/* binding */ segmentation_src)
12
+ "default": () => (/* binding */ segmentation_src),
13
+ toolbarButtons: () => (/* reexport */ toolbarButtons)
13
14
  });
14
15
 
15
16
  ;// ../../../modes/segmentation/package.json
@@ -1357,41 +1358,15 @@ function setUpAutoTabSwitchHandler({
1357
1358
  unsubscribeAutoTabSwitchEvents
1358
1359
  };
1359
1360
  }
1361
+ // EXTERNAL MODULE: ../../../modes/basic/src/index.tsx + 4 modules
1362
+ var basic_src = __webpack_require__(35485);
1360
1363
  ;// ../../../modes/segmentation/src/index.tsx
1361
1364
 
1362
1365
 
1363
1366
 
1364
1367
 
1365
- const ohif = {
1366
- layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',
1367
- sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',
1368
- hangingProtocol: '@ohif/extension-default.hangingProtocolModule.default',
1369
- leftPanel: '@ohif/extension-default.panelModule.seriesList'
1370
- };
1371
- const cornerstone = {
1372
- viewport: '@ohif/extension-cornerstone.viewportModule.cornerstone',
1373
- labelMapSegmentationPanel: '@ohif/extension-cornerstone.panelModule.panelSegmentationWithToolsLabelMap',
1374
- contourSegmentationPanel: '@ohif/extension-cornerstone.panelModule.panelSegmentationWithToolsContour',
1375
- measurements: '@ohif/extension-cornerstone.panelModule.panelMeasurement'
1376
- };
1377
- const segmentation = {
1378
- sopClassHandler: '@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg',
1379
- viewport: '@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg'
1380
- };
1381
- const dicomRT = {
1382
- viewport: '@ohif/extension-cornerstone-dicom-rt.viewportModule.dicom-rt',
1383
- sopClassHandler: '@ohif/extension-cornerstone-dicom-rt.sopClassHandlerModule.dicom-rt'
1384
- };
1385
- /**
1386
- * Just two dependencies to be able to render a viewport with panels in order
1387
- * to make sure that the mode is working.
1388
- */
1389
- const extensionDependencies = {
1390
- '@ohif/extension-default': '^3.0.0',
1391
- '@ohif/extension-cornerstone': '^3.0.0',
1392
- '@ohif/extension-cornerstone-dicom-seg': '^3.0.0',
1393
- '@ohif/extension-cornerstone-dicom-rt': '^3.0.0'
1394
- };
1368
+
1369
+
1395
1370
  function modeFactory({
1396
1371
  modeConfiguration
1397
1372
  }) {
@@ -1515,41 +1490,41 @@ function modeFactory({
1515
1490
  servicesManager
1516
1491
  }) => {
1517
1492
  return {
1518
- id: ohif.layout,
1493
+ id: basic_src.ohif.layout,
1519
1494
  props: {
1520
- leftPanels: [ohif.leftPanel],
1495
+ leftPanels: [basic_src.ohif.thumbnailList],
1521
1496
  leftPanelResizable: true,
1522
- rightPanels: [cornerstone.labelMapSegmentationPanel, cornerstone.contourSegmentationPanel],
1497
+ rightPanels: [basic_src.cornerstone.labelMapSegmentationPanel, basic_src.cornerstone.contourSegmentationPanel],
1523
1498
  rightPanelResizable: true,
1524
1499
  // leftPanelClosed: true,
1525
1500
  viewports: [{
1526
- namespace: cornerstone.viewport,
1527
- displaySetsToDisplay: [ohif.sopClassHandler]
1501
+ namespace: basic_src.cornerstone.viewport,
1502
+ displaySetsToDisplay: [basic_src.ohif.sopClassHandler]
1528
1503
  }, {
1529
- namespace: segmentation.viewport,
1530
- displaySetsToDisplay: [segmentation.sopClassHandler]
1504
+ namespace: basic_src.segmentation.viewport,
1505
+ displaySetsToDisplay: [basic_src.segmentation.sopClassHandler]
1531
1506
  }, {
1532
- namespace: dicomRT.viewport,
1533
- displaySetsToDisplay: [dicomRT.sopClassHandler]
1507
+ namespace: basic_src.dicomRT.viewport,
1508
+ displaySetsToDisplay: [basic_src.dicomRT.sopClassHandler]
1534
1509
  }]
1535
1510
  }
1536
1511
  };
1537
1512
  }
1538
1513
  }],
1539
1514
  /** List of extensions that are used by the mode */
1540
- extensions: extensionDependencies,
1515
+ extensions: basic_src.extensionDependencies,
1541
1516
  /** HangingProtocol used by the mode */
1542
1517
  // Commented out to just use the most applicable registered hanging protocol
1543
1518
  // The example is used for a grid layout to specify that as a preferred layout
1544
1519
  hangingProtocol: ['@ohif/mnGrid'],
1545
1520
  /** SopClassHandlers used by the mode */
1546
- sopClassHandlers: [ohif.sopClassHandler, segmentation.sopClassHandler, dicomRT.sopClassHandler]
1521
+ sopClassHandlers: [basic_src.ohif.sopClassHandler, basic_src.segmentation.sopClassHandler, basic_src.dicomRT.sopClassHandler]
1547
1522
  };
1548
1523
  }
1549
1524
  const mode = {
1550
1525
  id: id,
1551
1526
  modeFactory,
1552
- extensionDependencies
1527
+ extensionDependencies: basic_src.extensionDependencies
1553
1528
  };
1554
1529
  /* harmony default export */ const segmentation_src = (mode);
1555
1530
 
@@ -5094,6 +5094,7 @@ const projectionRadiographSOPClassUIDs = new Set([
5094
5094
  '1.2.840.10008.5.1.4.1.1.12.2.1',
5095
5095
  '1.2.840.10008.5.1.4.1.1.12.3',
5096
5096
  ]);
5097
+ const alreadySeenWarn = new Set();
5097
5098
  function calculateRadiographicPixelSpacing(instance) {
5098
5099
  const { PixelSpacing, ImagerPixelSpacing, EstimatedRadiographicMagnificationFactor, PixelSpacingCalibrationType, PixelSpacingCalibrationDescription, } = instance;
5099
5100
  const isProjection = true;
@@ -5106,7 +5107,10 @@ function calculateRadiographicPixelSpacing(instance) {
5106
5107
  }
5107
5108
  if (!PixelSpacing) {
5108
5109
  if (!EstimatedRadiographicMagnificationFactor) {
5109
- console.warn('EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing.');
5110
+ if (!alreadySeenWarn.has(instance.SeriesInstanceUID)) {
5111
+ console.warn('EstimatedRadiographicMagnificationFactor was not present on series', instance.SeriesInstanceUID, ' Unable to correct ImagerPixelSpacing.');
5112
+ alreadySeenWarn.add(instance.SeriesInstanceUID);
5113
+ }
5110
5114
  return {
5111
5115
  PixelSpacing: ImagerPixelSpacing,
5112
5116
  type: enums.CalibrationTypes.PROJECTION,
@@ -8784,6 +8788,24 @@ function defaultGetTextLines(data, targetId) {
8784
8788
  /* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = ((/* unused pure expression or super */ null && (BidirectionalTool)));
8785
8789
 
8786
8790
 
8791
+ /***/ }),
8792
+
8793
+ /***/ 85817:
8794
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8795
+
8796
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8797
+ /* harmony export */ EC: () => (/* reexport safe */ _AnnotationTool__WEBPACK_IMPORTED_MODULE_1__.A),
8798
+ /* harmony export */ oS: () => (/* reexport safe */ _BaseTool__WEBPACK_IMPORTED_MODULE_0__.A)
8799
+ /* harmony export */ });
8800
+ /* harmony import */ var _BaseTool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(37234);
8801
+ /* harmony import */ var _AnnotationTool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(91350);
8802
+ /* harmony import */ var _AnnotationDisplayTool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6030);
8803
+
8804
+
8805
+
8806
+
8807
+
8808
+
8787
8809
  /***/ }),
8788
8810
 
8789
8811
  /***/ 48736:
@@ -11,7 +11,7 @@
11
11
  /* harmony export */ sh: () => (/* binding */ SCOORDTypes)
12
12
  /* harmony export */ });
13
13
  /* unused harmony export RelationshipType */
14
- /* harmony import */ var _cornerstonejs_adapters__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(53434);
14
+ /* harmony import */ var _cornerstonejs_adapters__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14041);
15
15
 
16
16
  const {
17
17
  CodeScheme: Cornerstone3DCodeScheme
@@ -79,8 +79,8 @@ var src = __webpack_require__(42356);
79
79
  var i18n_src = __webpack_require__(68523);
80
80
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 192 modules
81
81
  var cornerstone_src = __webpack_require__(71903);
82
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/esm/index.js + 69 modules
83
- var esm = __webpack_require__(53434);
82
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/esm/index.js + 70 modules
83
+ var esm = __webpack_require__(14041);
84
84
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js
85
85
  var dist_esm = __webpack_require__(4667);
86
86
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 1 modules
@@ -549,7 +549,8 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
549
549
  SeriesDate,
550
550
  SeriesTime,
551
551
  ConceptNameCodeSequence,
552
- SOPClassUID
552
+ SOPClassUID,
553
+ imageId: predecessorImageId
553
554
  } = instance;
554
555
  validateSameStudyUID(instance.StudyInstanceUID, instances);
555
556
  const is3DSR = SOPClassUID === sopClassDictionary.Comprehensive3DSR;
@@ -574,6 +575,7 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
574
575
  isImagingMeasurementReport,
575
576
  sopClassUids,
576
577
  instance,
578
+ predecessorImageId,
577
579
  addInstances,
578
580
  label: SeriesDescription || `${i18n_src/* default */.A.t('Series')} ${SeriesNumber} - ${i18n_src/* default */.A.t('SR')}`
579
581
  };
@@ -626,6 +628,12 @@ async function _load(srDisplaySet, servicesManager, extensionManager) {
626
628
  srDisplaySet.referencedImages = [];
627
629
  srDisplaySet.measurements = [];
628
630
  }
631
+ const {
632
+ predecessorImageId
633
+ } = srDisplaySet;
634
+ for (const measurement of srDisplaySet.measurements) {
635
+ measurement.predecessorImageId = predecessorImageId;
636
+ }
629
637
  const mappings = measurementService.getSourceMappings(CORNERSTONE_3D_TOOLS_SOURCE_NAME, CORNERSTONE_3D_TOOLS_SOURCE_VERSION);
630
638
  srDisplaySet.isHydrated = false;
631
639
  srDisplaySet.isRehydratable = isRehydratable(srDisplaySet, mappings);
@@ -1364,13 +1372,20 @@ function hydrateStructuredReport({
1364
1372
  const codingValues = customizationService.getCustomization('codingValues');
1365
1373
  const disableEditing = customizationService.getCustomization('panelMeasurement.disableEditing');
1366
1374
  const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
1375
+ const {
1376
+ StudyInstanceUID: studyUID,
1377
+ SeriesInstanceUID: seriesUID,
1378
+ instance: {
1379
+ SOPInstanceUID: sopUID
1380
+ }
1381
+ } = displaySet;
1367
1382
 
1368
1383
  // TODO -> We should define a strict versioning somewhere.
1369
1384
  const mappings = measurementService.getSourceMappings(hydrateStructuredReport_CORNERSTONE_3D_TOOLS_SOURCE_NAME, hydrateStructuredReport_CORNERSTONE_3D_TOOLS_SOURCE_VERSION);
1370
1385
  if (!mappings || !mappings.length) {
1371
1386
  throw new Error(`Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.`);
1372
1387
  }
1373
- const instance = src/* DicomMetadataStore */.H8.getInstance(displaySet.StudyInstanceUID, displaySet.SeriesInstanceUID, displaySet.SOPInstanceUID);
1388
+ const instance = src/* DicomMetadataStore */.H8.getInstance(studyUID, seriesUID, sopUID);
1374
1389
  const sopInstanceUIDToImageId = {};
1375
1390
  displaySet.measurements.forEach(measurement => {
1376
1391
  const {
@@ -1487,6 +1502,7 @@ function hydrateStructuredReport({
1487
1502
  const annotation = {
1488
1503
  annotationUID: toolData.annotation.annotationUID,
1489
1504
  data: toolData.annotation.data,
1505
+ predecessorImageId: toolData.predecessorImageId,
1490
1506
  metadata: {
1491
1507
  ...referenceData,
1492
1508
  toolName: annotationType
@@ -1620,6 +1636,9 @@ function choosePoints(points) {
1620
1636
 
1621
1637
 
1622
1638
 
1639
+ const {
1640
+ downloadBlob
1641
+ } = src/* utils */.Wp;
1623
1642
  const {
1624
1643
  MeasurementReport: commandsModule_MeasurementReport
1625
1644
  } = esm/* adaptersSR */.QX.Cornerstone3D;
@@ -1645,7 +1664,6 @@ const _generateReport = (measurementData, additionalFindingTypes, options = {})
1645
1664
  if (typeof dataset.SpecificCharacterSet === 'undefined') {
1646
1665
  dataset.SpecificCharacterSet = 'ISO_IR 192';
1647
1666
  }
1648
- dataset.InstanceNumber = options.InstanceNumber ?? 1;
1649
1667
  return dataset;
1650
1668
  };
1651
1669
  const commandsModule = props => {
@@ -1696,8 +1714,9 @@ const commandsModule = props => {
1696
1714
  const reportBlob = dcmjs_es/* default.data */.Ay.data.datasetToBlob(srDataset);
1697
1715
 
1698
1716
  //Create a URL for the binary.
1699
- const objectUrl = URL.createObjectURL(reportBlob);
1700
- window.location.assign(objectUrl);
1717
+ downloadBlob(reportBlob, {
1718
+ filename: 'dicom-sr.dcm'
1719
+ });
1701
1720
  },
1702
1721
  /**
1703
1722
  *
@@ -2126,11 +2126,27 @@ var getContourHolesDataCanvas = __webpack_require__(15451);
2126
2126
 
2127
2127
 
2128
2128
 
2129
-
2130
2129
  class ContourBaseTool extends AnnotationTool/* default */.A {
2131
2130
  constructor(toolProps, defaultToolProps) {
2132
2131
  super(toolProps, defaultToolProps);
2133
2132
  }
2133
+ static getContourSequence(toolData, metadataProvider) {
2134
+ const { data } = toolData;
2135
+ const ContourData = [];
2136
+ for (const point of data.contour.polyline) {
2137
+ for (const v of point) {
2138
+ ContourData.push(v.toFixed(2));
2139
+ }
2140
+ }
2141
+ const { referencedImageId } = toolData.metadata;
2142
+ const ContourImageSequence = metadataProvider.get('ImageSopInstanceReference', referencedImageId);
2143
+ return {
2144
+ NumberOfContourPoints: ContourData.length / 3,
2145
+ ContourImageSequence,
2146
+ ContourGeometricType: 'CLOSED_PLANAR',
2147
+ ContourData,
2148
+ };
2149
+ }
2134
2150
  renderAnnotation(enabledElement, svgDrawingHelper) {
2135
2151
  let renderStatus = false;
2136
2152
  const { viewport } = enabledElement;