@ohif/app 3.12.0-beta.30 → 3.12.0-beta.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{1447.bundle.7ccbf8c680ed0a7e69d5.js → 1447.bundle.5329a1fc555ff8492f45.js} +2 -2
- package/dist/{2345.bundle.1fedf5750caf46ce99d9.js → 2345.bundle.db2624daf28f03ec2f90.js} +5 -2
- package/dist/{4019.bundle.701981ea6b7abed6a66c.js → 4019.bundle.c5b332003e3cd00868ce.js} +8 -0
- package/dist/{7412.bundle.f5de4a483672f3eabc10.js → 7412.bundle.b891b84732a843f2eeb1.js} +66 -22
- package/dist/{7431.bundle.c5e2e2f2f4ccc2c994d7.js → 7431.bundle.dac1caef5e9f365ce247.js} +3 -0
- package/dist/{8558.bundle.700a45d1df4274c7569e.js → 8558.bundle.d52a1cb49ddc1a5f6d36.js} +135 -15
- package/dist/{9819.bundle.44afc84f644470568735.js → 9819.bundle.327cd242014b11d6c0d7.js} +7172 -6627
- package/dist/{9856.bundle.4a338f5f69c7082091e0.js → 9856.bundle.8e21e8c0322a0837862b.js} +24 -6
- package/dist/{9892.bundle.eb768b852ed006b855ae.js → 9892.bundle.bdb6973617e0eab859cc.js} +72 -23
- package/dist/{app.bundle.dc901a102d764ef35ad4.js → app.bundle.ac2fb321d9cbfff3ec3c.js} +40030 -39477
- package/dist/{compute.bundle.c15fba70f1aff4b27f25.js → compute.bundle.3b6f88dbaa913f5f1244.js} +1 -1
- package/dist/index.html +1 -1
- package/dist/{polySeg.bundle.52580841ea46a924312f.js → polySeg.bundle.393405819b5ecd4d54d1.js} +1 -1
- package/dist/sw.js +1 -1
- package/package.json +21 -21
- /package/dist/{1459.bundle.25ae02642118d90e49ac.js → 1459.bundle.81f4015d88a4945b34f1.js} +0 -0
- /package/dist/{147.bundle.b48793416be71ea5c5d2.js → 147.bundle.33ec7549cc1cec4ac0c0.js} +0 -0
- /package/dist/{1604.bundle.a0651a36c30bba3ca428.js → 1604.bundle.621b39c38a1b84f465aa.js} +0 -0
- /package/dist/{1807.bundle.fb43d3ec0c1810dfd665.js → 1807.bundle.8b1098dd1b8342bb8b62.js} +0 -0
- /package/dist/{1919.bundle.28e3a73be5889d518468.js → 1919.bundle.db7724c4e3134df3a0c1.js} +0 -0
- /package/dist/{213.bundle.a628d19d9049300164e7.js → 213.bundle.3fabd2ec9824ce4802ce.js} +0 -0
- /package/dist/{2243.bundle.8230239618b7b3732cb7.js → 2243.bundle.1235ac95906db3a2172e.js} +0 -0
- /package/dist/{2424.bundle.8e5801b13cbf46346e82.js → 2424.bundle.b061db5c4fa94ee49b68.js} +0 -0
- /package/dist/{2518.bundle.09da9efcaf81e4ea7913.js → 2518.bundle.7ffb0583145b21cb7499.js} +0 -0
- /package/dist/{319.bundle.45c1c250b562a3feefa5.js → 319.bundle.5d3c2ff62d99b3da7f8c.js} +0 -0
- /package/dist/{4113.bundle.c5cda661ac043f9b5e97.js → 4113.bundle.5bd66f3880a8a28f8e20.js} +0 -0
- /package/dist/{414.bundle.aba3037fd5feebd821dc.js → 414.bundle.b6e51f4eab025bf63c56.js} +0 -0
- /package/dist/{5802.bundle.d68c7f909458038aedf1.js → 5802.bundle.48b958ebd8d250156814.js} +0 -0
- /package/dist/{6027.bundle.744b0fb1b090256c0a77.js → 6027.bundle.231b612a29523398d5ee.js} +0 -0
- /package/dist/{6201.bundle.b32ee475e39dcf2d69b4.js → 6201.bundle.bb4265e279b84970186b.js} +0 -0
- /package/dist/{6980.bundle.945ffbd91eaf6f3faaa9.js → 6980.bundle.3d48964dada7673618ad.js} +0 -0
- /package/dist/{6991.bundle.b4826e45919342537aac.js → 6991.bundle.2a13f2fb63ab3107a286.js} +0 -0
- /package/dist/{7197.bundle.27d101c9c06cd67ec070.js → 7197.bundle.e0a8a5313412b8fdaff1.js} +0 -0
- /package/dist/{7639.bundle.f34b172193c9c1218ed7.js → 7639.bundle.9fcdb465e703b74e71b4.js} +0 -0
- /package/dist/{7656.bundle.a821e6064d08e194a9e1.js → 7656.bundle.b4b2468844984c101541.js} +0 -0
- /package/dist/{810.bundle.6843f6cc56987564bb42.js → 810.bundle.c9c84898f521c956a869.js} +0 -0
- /package/dist/{85.bundle.333336f0acd7387b9c12.js → 85.bundle.583b6c0d87b4e1de1eb8.js} +0 -0
- /package/dist/{8815.bundle.4002e0e98ee51da6f347.js → 8815.bundle.f45760ed48273afeab94.js} +0 -0
- /package/dist/{934.bundle.615d68bb584003b7c065.js → 934.bundle.a59426d0dd3a9a428161.js} +0 -0
- /package/dist/{9862.bundle.cf1d70351f4e09fbd7ac.js → 9862.bundle.83995d2aebb597bc4b64.js} +0 -0
|
@@ -9702,8 +9702,8 @@ function AboutModalDefault() {
|
|
|
9702
9702
|
name
|
|
9703
9703
|
} = (0,browser_detect_es5/* default */.A)();
|
|
9704
9704
|
const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`;
|
|
9705
|
-
const versionNumber = "3.12.0-beta.
|
|
9706
|
-
const commitHash = "
|
|
9705
|
+
const versionNumber = "3.12.0-beta.32";
|
|
9706
|
+
const commitHash = "d41eca4ed5f7aec3a5c4e779b86436622262be38";
|
|
9707
9707
|
const [main, beta] = versionNumber.split('-');
|
|
9708
9708
|
return /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU, {
|
|
9709
9709
|
className: "w-[400px]"
|
|
@@ -124,6 +124,8 @@ function drawLinkedTextBox(svgDrawingHelper, annotationUID, textBoxUID, textLine
|
|
|
124
124
|
/* harmony import */ var _utilities_getPixelValueUnits__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(40634);
|
|
125
125
|
/* harmony import */ var _utilities_viewport_isViewportPreScaled__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(18990);
|
|
126
126
|
/* harmony import */ var _utilities_math_basic__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(73262);
|
|
127
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(76712);
|
|
128
|
+
|
|
127
129
|
|
|
128
130
|
|
|
129
131
|
|
|
@@ -506,9 +508,10 @@ class RectangleROITool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .AnnotationT
|
|
|
506
508
|
activeHandleIndex !== undefined) {
|
|
507
509
|
activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
|
|
508
510
|
}
|
|
509
|
-
|
|
511
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_20__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
512
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
510
513
|
const handleGroupUID = '0';
|
|
511
|
-
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, activeHandleCanvasCoords, {
|
|
514
|
+
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, showHandlesAlways ? canvasCoordinates : activeHandleCanvasCoords, {
|
|
512
515
|
color,
|
|
513
516
|
});
|
|
514
517
|
}
|
|
@@ -1466,6 +1466,14 @@ class ContourSegmentationBaseTool extends ContourBaseTool {
|
|
|
1466
1466
|
InterpolationManager/* default */.A.addTool(this.getToolName());
|
|
1467
1467
|
}
|
|
1468
1468
|
}
|
|
1469
|
+
onSetToolConfiguration() {
|
|
1470
|
+
if (this.configuration.interpolation?.enabled) {
|
|
1471
|
+
InterpolationManager/* default */.A.addTool(this.getToolName());
|
|
1472
|
+
}
|
|
1473
|
+
else {
|
|
1474
|
+
InterpolationManager/* default */.A.removeTool(this.getToolName());
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1469
1477
|
isContourSegmentationTool() {
|
|
1470
1478
|
return true;
|
|
1471
1479
|
}
|
|
@@ -3031,7 +3031,7 @@ class Colorbar extends _widgets_Widget__WEBPACK_IMPORTED_MODULE_7__/* ["default"
|
|
|
3031
3031
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3032
3032
|
/* harmony export */ r: () => (/* binding */ version)
|
|
3033
3033
|
/* harmony export */ });
|
|
3034
|
-
const version = '4.
|
|
3034
|
+
const version = '4.3.10';
|
|
3035
3035
|
|
|
3036
3036
|
|
|
3037
3037
|
/***/ }),
|
|
@@ -5366,6 +5366,8 @@ function _toolGroupHasActiveEnabledOrPassiveTool(toolGroup, toolName) {
|
|
|
5366
5366
|
/* harmony import */ var _stateManagement_annotation_helpers_state__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(44049);
|
|
5367
5367
|
/* harmony import */ var _cursors_elementCursor__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(7001);
|
|
5368
5368
|
/* harmony import */ var _stateManagement_annotation_annotationVisibility__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(29601);
|
|
5369
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(76712);
|
|
5370
|
+
|
|
5369
5371
|
|
|
5370
5372
|
|
|
5371
5373
|
|
|
@@ -5663,7 +5665,8 @@ class AngleTool extends _base__WEBPACK_IMPORTED_MODULE_2__/* .AnnotationTool */
|
|
|
5663
5665
|
if (!(0,_stateManagement_annotation_annotationVisibility__WEBPACK_IMPORTED_MODULE_14__.isAnnotationVisible)(annotationUID)) {
|
|
5664
5666
|
continue;
|
|
5665
5667
|
}
|
|
5666
|
-
|
|
5668
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_15__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
5669
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
5667
5670
|
const handleGroupUID = '0';
|
|
5668
5671
|
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
|
|
5669
5672
|
color,
|
|
@@ -7205,6 +7208,8 @@ async function contourAndFindLargestBidirectional(segmentation) {
|
|
|
7205
7208
|
/* harmony import */ var _utilities_drawing__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(473);
|
|
7206
7209
|
/* harmony import */ var _utilities_triggerAnnotationRenderForViewportIds__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(58640);
|
|
7207
7210
|
/* harmony import */ var _cursors_elementCursor__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(7001);
|
|
7211
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(76712);
|
|
7212
|
+
|
|
7208
7213
|
|
|
7209
7214
|
|
|
7210
7215
|
|
|
@@ -7478,7 +7483,8 @@ class LengthTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .AnnotationTool */
|
|
|
7478
7483
|
activeHandleIndex !== null) {
|
|
7479
7484
|
activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
|
|
7480
7485
|
}
|
|
7481
|
-
|
|
7486
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_16__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
7487
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
7482
7488
|
const handleGroupUID = '0';
|
|
7483
7489
|
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_10__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
|
|
7484
7490
|
color,
|
|
@@ -12459,6 +12465,8 @@ function defaultGetSegment(enabledElement, configuration) {
|
|
|
12459
12465
|
/* harmony import */ var _cursors_elementCursor__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(7001);
|
|
12460
12466
|
/* harmony import */ var _stateManagement_annotation_annotationVisibility__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(29601);
|
|
12461
12467
|
/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(53860);
|
|
12468
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(76712);
|
|
12469
|
+
|
|
12462
12470
|
|
|
12463
12471
|
|
|
12464
12472
|
|
|
@@ -12757,7 +12765,8 @@ class ArrowAnnotateTool extends _base__WEBPACK_IMPORTED_MODULE_2__/* .Annotation
|
|
|
12757
12765
|
if (!(0,_stateManagement_annotation_annotationVisibility__WEBPACK_IMPORTED_MODULE_12__.isAnnotationVisible)(annotationUID)) {
|
|
12758
12766
|
continue;
|
|
12759
12767
|
}
|
|
12760
|
-
|
|
12768
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_14__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
12769
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
12761
12770
|
const handleGroupUID = '0';
|
|
12762
12771
|
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_6__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
|
|
12763
12772
|
color,
|
|
@@ -13148,6 +13157,8 @@ const segmentationRenderingEngine = new SegmentationRenderingEngine();
|
|
|
13148
13157
|
/* harmony import */ var _utilities_drawing__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(473);
|
|
13149
13158
|
/* harmony import */ var _cursors_elementCursor__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(7001);
|
|
13150
13159
|
/* harmony import */ var _utilities_triggerAnnotationRenderForViewportIds__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(58640);
|
|
13160
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(76712);
|
|
13161
|
+
|
|
13151
13162
|
|
|
13152
13163
|
|
|
13153
13164
|
|
|
@@ -13664,9 +13675,10 @@ class BidirectionalTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .Annotation
|
|
|
13664
13675
|
activeHandleIndex !== null) {
|
|
13665
13676
|
activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
|
|
13666
13677
|
}
|
|
13667
|
-
|
|
13678
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_17__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
13679
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
13668
13680
|
const handleGroupUID = '0';
|
|
13669
|
-
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_9__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, activeHandleCanvasCoords, {
|
|
13681
|
+
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_9__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, showHandlesAlways ? canvasCoordinates : activeHandleCanvasCoords, {
|
|
13670
13682
|
color,
|
|
13671
13683
|
});
|
|
13672
13684
|
}
|
|
@@ -15044,6 +15056,7 @@ TrackballRotateTool.toolName = 'TrackballRotate';
|
|
|
15044
15056
|
|
|
15045
15057
|
|
|
15046
15058
|
|
|
15059
|
+
|
|
15047
15060
|
class ZoomTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .BaseTool */ .oS {
|
|
15048
15061
|
constructor(toolProps = {}, defaultToolProps = {
|
|
15049
15062
|
supportedInteractionTypes: ['Mouse', 'Touch'],
|
|
@@ -15102,9 +15115,13 @@ class ZoomTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .BaseTool */ .oS {
|
|
|
15102
15115
|
const imageWidth = dimensions[0] * spacing[0];
|
|
15103
15116
|
const imageHeight = dimensions[1] * spacing[1];
|
|
15104
15117
|
const canvasAspect = size[0] / size[1];
|
|
15118
|
+
const insetImageMultiplier = (0,_cornerstonejs_core__WEBPACK_IMPORTED_MODULE_2__.getConfiguration)().rendering
|
|
15119
|
+
?.useLegacyCameraFOV
|
|
15120
|
+
? 1.1
|
|
15121
|
+
: 1;
|
|
15105
15122
|
const displayArea = viewport.options?.displayArea;
|
|
15106
|
-
const imageAreaScaleX = displayArea?.imageArea?.[0] ??
|
|
15107
|
-
const imageAreaScaleY = displayArea?.imageArea?.[1] ??
|
|
15123
|
+
const imageAreaScaleX = displayArea?.imageArea?.[0] ?? insetImageMultiplier;
|
|
15124
|
+
const imageAreaScaleY = displayArea?.imageArea?.[1] ?? insetImageMultiplier;
|
|
15108
15125
|
const scaledImageWidth = imageWidth * imageAreaScaleX;
|
|
15109
15126
|
const scaledImageHeight = imageHeight * imageAreaScaleY;
|
|
15110
15127
|
const scaledImageAspect = scaledImageWidth / scaledImageHeight;
|
|
@@ -15307,6 +15324,11 @@ class InterpolationManager {
|
|
|
15307
15324
|
this.toolNames.push(toolName);
|
|
15308
15325
|
}
|
|
15309
15326
|
}
|
|
15327
|
+
static removeTool(toolName) {
|
|
15328
|
+
if (this.toolNames.includes(toolName)) {
|
|
15329
|
+
this.toolNames = this.toolNames.filter((name) => name !== toolName);
|
|
15330
|
+
}
|
|
15331
|
+
}
|
|
15310
15332
|
static acceptAutoGenerated(annotationGroupSelector, selector = {}) {
|
|
15311
15333
|
const { toolNames, segmentationId, segmentIndex, sliceIndex } = selector;
|
|
15312
15334
|
for (const toolName of toolNames || InterpolationManager.toolNames) {
|
|
@@ -16811,6 +16833,8 @@ function createPresentationViewSynchronizer(synchronizerName, options) {
|
|
|
16811
16833
|
/* harmony import */ var _utilities_math_ellipse__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(87009);
|
|
16812
16834
|
/* harmony import */ var _utilities_math_basic__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(73262);
|
|
16813
16835
|
/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(3823);
|
|
16836
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(76712);
|
|
16837
|
+
|
|
16814
16838
|
|
|
16815
16839
|
|
|
16816
16840
|
|
|
@@ -17222,9 +17246,10 @@ class CircleROITool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .AnnotationTool
|
|
|
17222
17246
|
activeHandleCanvasCoords = canvasCoordinates;
|
|
17223
17247
|
}
|
|
17224
17248
|
}
|
|
17225
|
-
|
|
17249
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_22__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
17250
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
17226
17251
|
const handleGroupUID = '0';
|
|
17227
|
-
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, activeHandleCanvasCoords, {
|
|
17252
|
+
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, showHandlesAlways ? canvasCoordinates : activeHandleCanvasCoords, {
|
|
17228
17253
|
color,
|
|
17229
17254
|
});
|
|
17230
17255
|
}
|
|
@@ -23014,13 +23039,20 @@ class WindowLevelTool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .BaseTool */
|
|
|
23014
23039
|
}, [Infinity, -Infinity]);
|
|
23015
23040
|
const BitsStored = imageVolume?.metadata?.BitsStored;
|
|
23016
23041
|
const metadataDynamicRange = BitsStored ? 2 ** BitsStored : Infinity;
|
|
23017
|
-
|
|
23042
|
+
const calculatedRange = calculatedDynamicRange[1] - calculatedDynamicRange[0];
|
|
23043
|
+
imageDynamicRange = !Number.isFinite(calculatedRange)
|
|
23044
|
+
? metadataDynamicRange
|
|
23045
|
+
: Math.min(calculatedRange, metadataDynamicRange);
|
|
23018
23046
|
}
|
|
23019
23047
|
else {
|
|
23020
23048
|
imageDynamicRange = this._getImageDynamicRangeFromViewport(viewport);
|
|
23021
23049
|
}
|
|
23022
23050
|
const ratio = imageDynamicRange / DEFAULT_IMAGE_DYNAMIC_RANGE;
|
|
23023
|
-
return
|
|
23051
|
+
return !Number.isFinite(ratio)
|
|
23052
|
+
? DEFAULT_IMAGE_DYNAMIC_RANGE
|
|
23053
|
+
: ratio > 1
|
|
23054
|
+
? Math.round(ratio)
|
|
23055
|
+
: ratio;
|
|
23024
23056
|
}
|
|
23025
23057
|
_getImageDynamicRangeFromViewport(viewport) {
|
|
23026
23058
|
const { imageData, voxelManager } = viewport.getImageData();
|
|
@@ -27166,14 +27198,15 @@ function internalAddSegmentationRepresentation(viewportId, representationInput)
|
|
|
27166
27198
|
};
|
|
27167
27199
|
_SegmentationStateManager__WEBPACK_IMPORTED_MODULE_5__/* .defaultSegmentationStateManager */ ._6.addSegmentationRepresentation(viewportId, segmentationId, representationInput.type, renderingConfig);
|
|
27168
27200
|
if (!(0,_segmentIndex__WEBPACK_IMPORTED_MODULE_6__.getActiveSegmentIndex)(segmentationId)) {
|
|
27201
|
+
let firstSegmentIndex = 1;
|
|
27169
27202
|
const segmentation = _SegmentationStateManager__WEBPACK_IMPORTED_MODULE_5__/* .defaultSegmentationStateManager */ ._6.getSegmentation(segmentationId);
|
|
27170
27203
|
if (segmentation) {
|
|
27171
27204
|
const segmentKeys = Object.keys(segmentation.segments);
|
|
27172
27205
|
if (segmentKeys.length > 0) {
|
|
27173
|
-
|
|
27174
|
-
(0,_segmentIndex__WEBPACK_IMPORTED_MODULE_6__.setActiveSegmentIndex)(segmentationId, firstSegmentIndex);
|
|
27206
|
+
firstSegmentIndex = segmentKeys.map((k) => Number(k)).sort()[0];
|
|
27175
27207
|
}
|
|
27176
27208
|
}
|
|
27209
|
+
(0,_segmentIndex__WEBPACK_IMPORTED_MODULE_6__.setActiveSegmentIndex)(segmentationId, firstSegmentIndex);
|
|
27177
27210
|
}
|
|
27178
27211
|
if (representationInput.type === _enums__WEBPACK_IMPORTED_MODULE_2__.SegmentationRepresentations.Contour) {
|
|
27179
27212
|
(0,_utilities_triggerAnnotationRenderForViewportIds__WEBPACK_IMPORTED_MODULE_1__/* .triggerAnnotationRenderForViewportIds */ .t)([viewportId]);
|
|
@@ -28672,6 +28705,8 @@ function getViewportIdsWithSegmentation(segmentationId) {
|
|
|
28672
28705
|
/* harmony import */ var _utilities_drawing__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(473);
|
|
28673
28706
|
/* harmony import */ var _utilities_triggerAnnotationRenderForViewportIds__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(58640);
|
|
28674
28707
|
/* harmony import */ var _cursors_elementCursor__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(7001);
|
|
28708
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(76712);
|
|
28709
|
+
|
|
28675
28710
|
|
|
28676
28711
|
|
|
28677
28712
|
|
|
@@ -28932,7 +28967,8 @@ class HeightTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .AnnotationTool */
|
|
|
28932
28967
|
activeHandleIndex !== null) {
|
|
28933
28968
|
activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
|
|
28934
28969
|
}
|
|
28935
|
-
|
|
28970
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_16__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
28971
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
28936
28972
|
const handleGroupUID = '0';
|
|
28937
28973
|
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_10__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
|
|
28938
28974
|
color,
|
|
@@ -36402,6 +36438,8 @@ function updateLabelmapSegmentationImageReferences(viewportId, segmentationId) {
|
|
|
36402
36438
|
/* harmony import */ var _utilities_viewport_isViewportPreScaled__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(18990);
|
|
36403
36439
|
/* harmony import */ var _utilities_math_basic__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(73262);
|
|
36404
36440
|
/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(3823);
|
|
36441
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(76712);
|
|
36442
|
+
|
|
36405
36443
|
|
|
36406
36444
|
|
|
36407
36445
|
|
|
@@ -36848,9 +36886,10 @@ class EllipticalROITool extends _base__WEBPACK_IMPORTED_MODULE_0__/* .Annotation
|
|
|
36848
36886
|
activeHandleIndex !== null) {
|
|
36849
36887
|
activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
|
|
36850
36888
|
}
|
|
36851
|
-
|
|
36889
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_21__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
36890
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
36852
36891
|
const handleGroupUID = '0';
|
|
36853
|
-
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, activeHandleCanvasCoords, {
|
|
36892
|
+
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_8__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, showHandlesAlways ? canvasCoordinates : activeHandleCanvasCoords, {
|
|
36854
36893
|
color,
|
|
36855
36894
|
});
|
|
36856
36895
|
}
|
|
@@ -37679,10 +37718,11 @@ class SVGMouseCursor extends ImageMouseCursor {
|
|
|
37679
37718
|
}
|
|
37680
37719
|
const urn = getCursorURN(name, pointer, color);
|
|
37681
37720
|
let cursor = super.getDefinedCursor(urn);
|
|
37721
|
+
const pointerStrokeWidth = Number((0,helpers/* getStyleProperty */.h)('pointerStrokeWidth', {}));
|
|
37682
37722
|
if (!cursor) {
|
|
37683
37723
|
const descriptor = getDefinedSVGCursorDescriptor(name);
|
|
37684
37724
|
if (descriptor) {
|
|
37685
|
-
cursor = createSVGMouseCursor(descriptor, urn, pointer, color, super.getDefinedCursor('default'));
|
|
37725
|
+
cursor = createSVGMouseCursor(descriptor, urn, pointer, color, pointerStrokeWidth, super.getDefinedCursor('default'));
|
|
37686
37726
|
super.setDefinedCursor(urn, cursor);
|
|
37687
37727
|
}
|
|
37688
37728
|
}
|
|
@@ -37700,9 +37740,9 @@ function getCursorURN(name, pointer, color) {
|
|
|
37700
37740
|
const type = pointer ? 'pointer' : 'cursor';
|
|
37701
37741
|
return `${type}:${name}/${color}`;
|
|
37702
37742
|
}
|
|
37703
|
-
function createSVGMouseCursor(descriptor, name, pointer, color, fallback) {
|
|
37743
|
+
function createSVGMouseCursor(descriptor, name, pointer, color, pointerStrokeWidth, fallback) {
|
|
37704
37744
|
const { x, y } = descriptor.mousePoint;
|
|
37705
|
-
return new SVGMouseCursor(createSVGIconUrl(descriptor, pointer, { color }), x, y, name, fallback);
|
|
37745
|
+
return new SVGMouseCursor(createSVGIconUrl(descriptor, pointer, { color, pointerStrokeWidth }), x, y, name, fallback);
|
|
37706
37746
|
}
|
|
37707
37747
|
function createSVGIconUrl(descriptor, pointer, options) {
|
|
37708
37748
|
const blob = createSVGIconBlob(descriptor, pointer, options);
|
|
@@ -37728,10 +37768,11 @@ function createSVGIconWithPointer(descriptor, options) {
|
|
|
37728
37768
|
const { iconContent, iconSize, viewBox, mousePointerGroupString } = descriptor;
|
|
37729
37769
|
const scale = iconSize / Math.max(viewBox.x, viewBox.y, 1);
|
|
37730
37770
|
const svgSize = 16 + iconSize;
|
|
37771
|
+
const pointerStrokeWidth = options.pointerStrokeWidth || 1;
|
|
37731
37772
|
const svgString = `
|
|
37732
37773
|
<svg data-icon="cursor" role="img" xmlns="http://www.w3.org/2000/svg"
|
|
37733
37774
|
width="${svgSize}" height="${svgSize}" viewBox="0 0 ${svgSize} ${svgSize}">
|
|
37734
|
-
<g>${mousePointerGroupString}</g>
|
|
37775
|
+
<g stroke-width="${pointerStrokeWidth}">${mousePointerGroupString}</g>
|
|
37735
37776
|
<g transform="translate(16, 16) scale(${scale})">${iconContent}</g>
|
|
37736
37777
|
</svg>`;
|
|
37737
37778
|
return format(svgString, options);
|
|
@@ -43927,6 +43968,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
43927
43968
|
/* harmony import */ var _utilities_triggerAnnotationRenderForViewportIds__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(58640);
|
|
43928
43969
|
/* harmony import */ var _cursors_elementCursor__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(7001);
|
|
43929
43970
|
/* harmony import */ var _stateManagement_annotation_annotationVisibility__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(29601);
|
|
43971
|
+
/* harmony import */ var _stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(76712);
|
|
43972
|
+
|
|
43930
43973
|
|
|
43931
43974
|
|
|
43932
43975
|
|
|
@@ -44279,7 +44322,8 @@ class CobbAngleTool extends _base__WEBPACK_IMPORTED_MODULE_3__/* .AnnotationTool
|
|
|
44279
44322
|
if (!(0,_stateManagement_annotation_annotationVisibility__WEBPACK_IMPORTED_MODULE_17__.isAnnotationVisible)(annotationUID)) {
|
|
44280
44323
|
continue;
|
|
44281
44324
|
}
|
|
44282
|
-
|
|
44325
|
+
const showHandlesAlways = Boolean((0,_stateManagement_annotation_config_helpers__WEBPACK_IMPORTED_MODULE_18__/* .getStyleProperty */ .h)('showHandlesAlways', {}));
|
|
44326
|
+
if (activeHandleCanvasCoords || showHandlesAlways) {
|
|
44283
44327
|
const handleGroupUID = '0';
|
|
44284
44328
|
(0,_drawingSvg__WEBPACK_IMPORTED_MODULE_11__.drawHandles)(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {
|
|
44285
44329
|
color,
|
|
@@ -1931,6 +1931,9 @@ async function updateSurfaceData(segmentationId) {
|
|
|
1931
1931
|
segmentationId,
|
|
1932
1932
|
type: updateSurfaceData_SegmentationRepresentations.Surface,
|
|
1933
1933
|
});
|
|
1934
|
+
if (!surfaceRepresentation) {
|
|
1935
|
+
return;
|
|
1936
|
+
}
|
|
1934
1937
|
return [surfaceRepresentation].map((surfaceRepresentation) => {
|
|
1935
1938
|
segmentation.representationData.Surface.geometryIds.set(segmentIndex, geometryId);
|
|
1936
1939
|
const enabledElement = (0,esm.getEnabledElementByViewportId)(viewportId);
|
|
@@ -150,9 +150,39 @@ const {
|
|
|
150
150
|
DicomMetaDictionary
|
|
151
151
|
} = dcmjs_es/* default.data */.Ay.data;
|
|
152
152
|
const dicomlab2RGB = dcmjs_es/* default.data */.Ay.data.Colors.dicomlab2RGB;
|
|
153
|
-
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Checks and loads contour data for RT Structure Set, handling both inline and bulk data URIs.
|
|
156
|
+
* Processes ROIContourSequence to extract contour data and resolve any bulk data references.
|
|
157
|
+
*
|
|
158
|
+
* @async
|
|
159
|
+
* @function checkAndLoadContourData
|
|
160
|
+
* @param {Object} params - Parameters object
|
|
161
|
+
* @param {Object} params.instance - Initial RT Structure instance
|
|
162
|
+
* @param {Object} params.dataSource - Data source for retrieving bulk data
|
|
163
|
+
* @param {Object} params.extensionManager - OHIF extension manager
|
|
164
|
+
* @param {Object} params.rtStructDisplaySet - RT Structure display set
|
|
165
|
+
* @param {Object} params.headers - HTTP headers for requests
|
|
166
|
+
* @returns {Promise<Object>} Promise that resolves to the processed RT Structure instance with loaded contour data
|
|
167
|
+
* @throws {Promise<string>} Rejects with error message if instance is invalid or data retrieval fails
|
|
168
|
+
*/
|
|
169
|
+
async function checkAndLoadContourData({
|
|
170
|
+
instance: initialInstance,
|
|
171
|
+
dataSource,
|
|
172
|
+
extensionManager,
|
|
173
|
+
rtStructDisplaySet,
|
|
174
|
+
headers
|
|
175
|
+
}) {
|
|
176
|
+
let instance = initialInstance;
|
|
154
177
|
if (!instance || !instance.ROIContourSequence) {
|
|
155
|
-
|
|
178
|
+
instance = await getRTStructInstance({
|
|
179
|
+
extensionManager,
|
|
180
|
+
rtStructDisplaySet,
|
|
181
|
+
headers
|
|
182
|
+
});
|
|
183
|
+
if (!instance || !instance.ROIContourSequence) {
|
|
184
|
+
return Promise.reject('Invalid instance object or ROIContourSequence');
|
|
185
|
+
}
|
|
156
186
|
}
|
|
157
187
|
const promisesMap = new Map();
|
|
158
188
|
for (const ROIContour of instance.ROIContourSequence) {
|
|
@@ -170,10 +200,10 @@ async function checkAndLoadContourData(instance, datasource) {
|
|
|
170
200
|
promisesMap.has(referencedROINumber) ? promisesMap.get(referencedROINumber).push(Promise.resolve(contourData)) : promisesMap.set(referencedROINumber, [Promise.resolve(contourData)]);
|
|
171
201
|
} else if (contourData && contourData.BulkDataURI) {
|
|
172
202
|
const bulkDataURI = contourData.BulkDataURI;
|
|
173
|
-
if (!
|
|
174
|
-
return Promise.reject('Invalid
|
|
203
|
+
if (!dataSource || !dataSource.retrieve || !dataSource.retrieve.bulkDataURI) {
|
|
204
|
+
return Promise.reject('Invalid dataSource object or retrieve function');
|
|
175
205
|
}
|
|
176
|
-
const bulkDataPromise =
|
|
206
|
+
const bulkDataPromise = dataSource.retrieve.bulkDataURI({
|
|
177
207
|
BulkDataURI: bulkDataURI,
|
|
178
208
|
StudyInstanceUID: instance.StudyInstanceUID,
|
|
179
209
|
SeriesInstanceUID: instance.SeriesInstanceUID,
|
|
@@ -220,29 +250,78 @@ async function checkAndLoadContourData(instance, datasource) {
|
|
|
220
250
|
console.error(error);
|
|
221
251
|
}
|
|
222
252
|
});
|
|
253
|
+
return instance;
|
|
223
254
|
}
|
|
224
|
-
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Retrieves and parses RT Structure Set instance from DICOM data.
|
|
258
|
+
* Uses the cornerstone utility module to load DICOM data and converts it to a naturalized dataset.
|
|
259
|
+
*
|
|
260
|
+
* @async
|
|
261
|
+
* @function getRTStructInstance
|
|
262
|
+
* @param {Object} params - Parameters object
|
|
263
|
+
* @param {Object} params.extensionManager - OHIF extension manager
|
|
264
|
+
* @param {Object} params.rtStructDisplaySet - RT Structure display set
|
|
265
|
+
* @param {Object} params.headers - HTTP headers for requests
|
|
266
|
+
* @returns {Promise<Object>} Promise that resolves to the parsed RT Structure dataset
|
|
267
|
+
*/
|
|
268
|
+
const getRTStructInstance = async ({
|
|
269
|
+
extensionManager,
|
|
270
|
+
rtStructDisplaySet,
|
|
271
|
+
headers
|
|
272
|
+
}) => {
|
|
225
273
|
const utilityModule = extensionManager.getModuleEntry('@ohif/extension-cornerstone.utilityModule.common');
|
|
274
|
+
const {
|
|
275
|
+
dicomLoaderService
|
|
276
|
+
} = utilityModule.exports;
|
|
277
|
+
const segArrayBuffer = await dicomLoaderService.findDicomDataPromise(rtStructDisplaySet, null, headers);
|
|
278
|
+
const dicomData = DicomMessage.readFile(segArrayBuffer);
|
|
279
|
+
const rtStructDataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
|
280
|
+
rtStructDataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
|
281
|
+
return rtStructDataset;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Main function to load and process RT Structure Set data.
|
|
286
|
+
* Creates a structure set object with ROI contours, metadata, and visualization properties.
|
|
287
|
+
* Handles both bulk data URI and inline contour data scenarios.
|
|
288
|
+
*
|
|
289
|
+
* @async
|
|
290
|
+
* @function loadRTStruct
|
|
291
|
+
* @param {Object} extensionManager - OHIF extension manager
|
|
292
|
+
* @param {Object} rtStructDisplaySet - RT Structure display set to process
|
|
293
|
+
* @param {Object} headers - HTTP headers for data requests
|
|
294
|
+
* @returns {Promise<Object>} Promise that resolves to a structure set object containing:
|
|
295
|
+
* - StructureSetLabel: Label of the structure set
|
|
296
|
+
* - SeriesInstanceUID: Series instance UID
|
|
297
|
+
* - ROIContours: Array of ROI contour data with points and metadata
|
|
298
|
+
* - visible: Visibility state
|
|
299
|
+
* - ReferencedSOPInstanceUIDsSet: Set of referenced SOP instance UIDs
|
|
300
|
+
*/
|
|
301
|
+
async function loadRTStruct(extensionManager, rtStructDisplaySet, headers) {
|
|
226
302
|
const dataSource = extensionManager.getActiveDataSource()[0];
|
|
227
303
|
const {
|
|
228
304
|
bulkDataURI
|
|
229
305
|
} = dataSource.getConfig?.() || {};
|
|
230
|
-
const {
|
|
231
|
-
dicomLoaderService
|
|
232
|
-
} = utilityModule.exports;
|
|
233
306
|
|
|
234
307
|
// Set here is loading is asynchronous.
|
|
235
308
|
// If this function throws its set back to false.
|
|
236
309
|
rtStructDisplaySet.isLoaded = true;
|
|
237
310
|
let instance = rtStructDisplaySet.instance;
|
|
238
311
|
if (!bulkDataURI || !bulkDataURI.enabled) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
312
|
+
instance = await getRTStructInstance({
|
|
313
|
+
extensionManager,
|
|
314
|
+
rtStructDisplaySet,
|
|
315
|
+
headers
|
|
316
|
+
});
|
|
244
317
|
} else {
|
|
245
|
-
await checkAndLoadContourData(
|
|
318
|
+
instance = await checkAndLoadContourData({
|
|
319
|
+
instance,
|
|
320
|
+
dataSource,
|
|
321
|
+
extensionManager,
|
|
322
|
+
rtStructDisplaySet,
|
|
323
|
+
headers
|
|
324
|
+
});
|
|
246
325
|
}
|
|
247
326
|
const {
|
|
248
327
|
StructureSetROISequence,
|
|
@@ -298,6 +377,19 @@ async function loadRTStruct(extensionManager, rtStructDisplaySet, headers) {
|
|
|
298
377
|
}
|
|
299
378
|
return structureSet;
|
|
300
379
|
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Sets metadata for ROI contour data and adds it to the structure set.
|
|
383
|
+
* Extracts ROI information from StructureSetROISequence and RTROIObservationsSequence,
|
|
384
|
+
* then creates a complete ROI contour data object with visualization properties.
|
|
385
|
+
*
|
|
386
|
+
* @function _setROIContourMetadata
|
|
387
|
+
* @param {Object} structureSet - The structure set object to add ROI contour to
|
|
388
|
+
* @param {Array} StructureSetROISequence - Array of structure set ROI definitions
|
|
389
|
+
* @param {Array} RTROIObservationsSequence - Array of RT ROI observations
|
|
390
|
+
* @param {Object} ROIContour - ROI contour object containing contour data
|
|
391
|
+
* @param {Array} contourPoints - Array of processed contour points
|
|
392
|
+
*/
|
|
301
393
|
function _setROIContourMetadata(structureSet, StructureSetROISequence, RTROIObservationsSequence, ROIContour, contourPoints) {
|
|
302
394
|
const StructureSetROI = StructureSetROISequence.find(structureSetROI => structureSetROI.ROINumber === ROIContour.ReferencedROINumber);
|
|
303
395
|
const ROIContourData = {
|
|
@@ -316,6 +408,15 @@ function _setROIContourMetadata(structureSet, StructureSetROISequence, RTROIObse
|
|
|
316
408
|
}
|
|
317
409
|
structureSet.ROIContours.push(ROIContourData);
|
|
318
410
|
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Sets the display color for ROI contour data.
|
|
414
|
+
* Uses ROIDisplayColor if available, otherwise converts RecommendedDisplayCIELabValue to RGB.
|
|
415
|
+
*
|
|
416
|
+
* @function _setROIContourDataColor
|
|
417
|
+
* @param {Object} ROIContour - ROI contour object containing color information
|
|
418
|
+
* @param {Object} ROIContourData - ROI contour data object to set color on
|
|
419
|
+
*/
|
|
319
420
|
function _setROIContourDataColor(ROIContour, ROIContourData) {
|
|
320
421
|
let {
|
|
321
422
|
ROIDisplayColor,
|
|
@@ -329,6 +430,16 @@ function _setROIContourDataColor(ROIContour, ROIContourData) {
|
|
|
329
430
|
ROIContourData.colorArray = [...ROIDisplayColor];
|
|
330
431
|
}
|
|
331
432
|
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Sets RT ROI observations metadata for ROI contour data.
|
|
436
|
+
* Finds matching RTROIObservations by ROINumber and adds observation details to contour data.
|
|
437
|
+
*
|
|
438
|
+
* @function _setROIContourRTROIObservations
|
|
439
|
+
* @param {Object} ROIContourData - ROI contour data object to add observations to
|
|
440
|
+
* @param {Array} RTROIObservationsSequence - Array of RT ROI observations
|
|
441
|
+
* @param {number} ROINumber - ROI number to match observations
|
|
442
|
+
*/
|
|
332
443
|
function _setROIContourRTROIObservations(ROIContourData, RTROIObservationsSequence, ROINumber) {
|
|
333
444
|
const RTROIObservations = RTROIObservationsSequence.find(RTROIObservations => RTROIObservations.ReferencedROINumber === ROINumber);
|
|
334
445
|
if (RTROIObservations) {
|
|
@@ -347,6 +458,15 @@ function _setROIContourRTROIObservations(ROIContourData, RTROIObservationsSequen
|
|
|
347
458
|
};
|
|
348
459
|
}
|
|
349
460
|
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Converts a single object or array to an array.
|
|
464
|
+
* Utility function to ensure consistent array handling for DICOM sequences.
|
|
465
|
+
*
|
|
466
|
+
* @function _toArray
|
|
467
|
+
* @param {*} objOrArray - Object or array to convert
|
|
468
|
+
* @returns {Array} Array containing the input (if already array) or wrapped in array
|
|
469
|
+
*/
|
|
350
470
|
function _toArray(objOrArray) {
|
|
351
471
|
return Array.isArray(objOrArray) ? objOrArray : [objOrArray];
|
|
352
472
|
}
|