@ohif/app 3.8.0-beta.7 → 3.8.0-beta.70
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/{220.bundle.f7e1c96c94245e70f2be.js → 109.bundle.b4fee2a22b622839baf5.js} +4466 -3715
- package/dist/{471.bundle.49c8d281adbae4a2c4df.js → 121.bundle.21827fec690c01ee9ab3.js} +85 -112
- package/dist/{19.bundle.e5579df6d7b74af50b1d.js → 155.bundle.0dabe8513b605b01ac3d.js} +334 -287
- package/dist/{687.bundle.9d0330ea5d61fe3117da.js → 164.bundle.0b1a2be351543c1433e8.js} +22 -38
- package/dist/17dd54813d5acc10bf8f.wasm +0 -0
- package/dist/{506.bundle.ab8226d3d81abe874544.js → 188.bundle.81e83b073b6fd4ae0058.js} +23 -28
- package/dist/191.bundle.7d89c921abefd1140d50.js +30360 -0
- package/dist/{221.bundle.c2dc03d8fa4235dc1285.js → 2.bundle.04dbbf67a52fe109749c.js} +351 -546
- package/dist/20fc4c659b85ccd2a9c0.wasm +0 -0
- package/dist/290.bundle.952de53057f98e2c5ef0.js +8883 -0
- package/dist/{451.bundle.57c21db5d003c75e9d61.js → 295.bundle.3a0d5062d65296c4bf5d.js} +102 -127
- package/dist/{125.bundle.253395f320b72180da63.js → 297.bundle.194d8985ab974839b5b6.js} +7 -8
- package/dist/{202.bundle.d3490836f71e001dd30f.js → 342.bundle.6e49f63ea7cea4645c0a.js} +544 -860
- package/dist/41.bundle.6ec0794a483e9a30eb94.js +831 -0
- package/dist/425.bundle.ffcdde2143a5757926b9.js +2957 -0
- package/dist/425.css +2 -0
- package/dist/{126.bundle.42df2dafc9c0310da188.js → 448.bundle.9177b9d909654efbc8d5.js} +316 -427
- package/dist/{957.bundle.9ea4506963ef8b2d84ba.js → 504.bundle.993d7e2dec36257d4ce4.js} +14338 -27291
- package/dist/{886.bundle.c8dd3ecc42a4253de278.js → 530.bundle.566bfd08dccb4cf6d98b.js} +75 -105
- package/dist/{250.bundle.aea3335667054bdefe36.js → 544.bundle.1110b24e96863d719a95.js} +39 -56
- package/dist/{663.bundle.9f359963019cd8ccf8f9.js → 559.bundle.4f111410af43324629ca.js} +151 -147
- package/dist/{181.bundle.a62b9f0ec692299acb35.js → 574.bundle.83afbc7922736fc6846d.js} +1246 -289
- package/dist/{181.css → 574.css} +1 -1
- package/dist/{410.bundle.38c9d3820e152e89288e.js → 594.bundle.ffeebda1bb9a81182a80.js} +183 -221
- package/dist/{776.bundle.004382036bdbd8ee2b95.js → 595.bundle.1c1a50c4ff87763b786a.js} +3128 -1028
- package/dist/{774.bundle.4b2dc46a35012b898e1a.js → 644.bundle.1e77691d2eeb96a423b0.js} +1852 -8945
- package/dist/699.bundle.db05df7b8e2ad605e928.js +767 -0
- package/dist/{359.bundle.8abe0036a7bf6b5fd115.js → 724.bundle.eada9d6c23678a5a2947.js} +130 -254
- package/dist/{757.bundle.ec8301d8e70d2b990f65.js → 726.bundle.c8de818cf1a3ff0cf7d2.js} +512 -879
- package/dist/{530.bundle.a03b6f942ace3e1baa1e.js → 835.bundle.15aff0b7433bb0dd6d6d.js} +37 -30
- package/dist/{822.bundle.82cdc418f8f56da6060b.js → 862.bundle.959ef65b18c1d3b5e2b4.js} +77 -96
- package/dist/{236.bundle.c9e70d55e7b2574c1ecd.js → 889.bundle.67c6e5f988c9b1d289ef.js} +198 -197
- package/dist/{342.bundle.d9668551811e3a88aaa4.js → 90.bundle.f41c8c4fc78cdfd4de30.js} +1430 -1055
- package/dist/{281.bundle.16a2933086a57e60c96c.js → 905.bundle.eb821474b36b96b897f9.js} +155 -122
- package/dist/{814.bundle.a1aba9c1e3d336008351.js → 907.bundle.ca904d9747480a0e4bf1.js} +16 -30
- package/dist/{417.bundle.af0a207c29b109f84159.js → 931.bundle.d270a1fda9a2836c3cc5.js} +26 -26
- package/dist/{686.bundle.dccef1f36e4bc79bcc48.js → 939.bundle.9d93b2e47c52338747a2.js} +7 -8
- package/dist/{12.bundle.37a8b47d2ae587cb9226.js → 961.bundle.65967b1a4af002af1d1d.js} +16 -31
- package/dist/987.bundle.6bdfb3cd8762b8889632.js +122950 -0
- package/dist/app-config.js +1 -0
- package/dist/app.bundle.css +15 -13
- package/dist/{app.bundle.437d085e13599d1e1ced.js → app.bundle.e21e5afd46fb064cb5de.js} +147713 -61638
- package/dist/assets/images/CT-AAA.png +0 -0
- package/dist/assets/images/CT-AAA2.png +0 -0
- package/dist/assets/images/CT-Air.png +0 -0
- package/dist/assets/images/CT-Bone.png +0 -0
- package/dist/assets/images/CT-Bones.png +0 -0
- package/dist/assets/images/CT-Cardiac.png +0 -0
- package/dist/assets/images/CT-Cardiac2.png +0 -0
- package/dist/assets/images/CT-Cardiac3.png +0 -0
- package/dist/assets/images/CT-Chest-Contrast-Enhanced.png +0 -0
- package/dist/assets/images/CT-Chest-Vessels.png +0 -0
- package/dist/assets/images/CT-Coronary-Arteries-2.png +0 -0
- package/dist/assets/images/CT-Coronary-Arteries-3.png +0 -0
- package/dist/assets/images/CT-Coronary-Arteries.png +0 -0
- package/dist/assets/images/CT-Cropped-Volume-Bone.png +0 -0
- package/dist/assets/images/CT-Fat.png +0 -0
- package/dist/assets/images/CT-Liver-Vasculature.png +0 -0
- package/dist/assets/images/CT-Lung.png +0 -0
- package/dist/assets/images/CT-MIP.png +0 -0
- package/dist/assets/images/CT-Muscle.png +0 -0
- package/dist/assets/images/CT-Pulmonary-Arteries.png +0 -0
- package/dist/assets/images/CT-Soft-Tissue.png +0 -0
- package/dist/assets/images/DTI-FA-Brain.png +0 -0
- package/dist/assets/images/MR-Angio.png +0 -0
- package/dist/assets/images/MR-Default.png +0 -0
- package/dist/assets/images/MR-MIP.png +0 -0
- package/dist/assets/images/MR-T2-Brain.png +0 -0
- package/dist/assets/images/VolumeRendering.png +0 -0
- package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
- package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
- package/dist/{dicom-microscopy-viewer.bundle.2c146384eb9466d02ff8.js → dicom-microscopy-viewer.bundle.d3a56dc9f62df5e11019.js} +3 -3
- package/dist/index.html +1 -1
- package/dist/{index.worker.e62ecca63f1a2e124230.worker.js → index.worker.64c896c4316fcd506666.worker.js} +2 -2
- package/dist/index.worker.64c896c4316fcd506666.worker.js.map +1 -0
- package/dist/polySeg.bundle.e7b4c29fb9173e8567b8.js +252 -0
- package/dist/serve.json +12 -0
- package/dist/sw.js +1 -1
- package/package.json +25 -22
- package/dist/23.bundle.e008ad788170f2ed5569.js +0 -900
- package/dist/604.bundle.a51f83e64004bca5f497.js +0 -1848
- package/dist/613.bundle.aed640a7900dbcb688f5.js +0 -532
- package/dist/743.bundle.489f7df3a089d4d374e1.js +0 -78007
- package/dist/75788f12450d4c5ed494.wasm +0 -0
- package/dist/775.bundle.2285e7e0e67878948c0d.js +0 -1009
- package/dist/788.bundle.dcd53828d1bb2ac64d04.js +0 -2682
- package/dist/82.bundle.5a94dd7645e5c5476f59.js +0 -1049
- package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +0 -1
- /package/dist/{19.css → 155.css} +0 -0
- /package/dist/{221.css → 2.css} +0 -0
- /package/dist/{579.css → 481.css} +0 -0
- /package/dist/{250.css → 544.css} +0 -0
- /package/dist/{776.css → 595.css} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[2,481],{
|
|
2
3
|
|
|
3
|
-
/***/
|
|
4
|
+
/***/ 14349:
|
|
4
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
5
6
|
|
|
6
|
-
"use strict";
|
|
7
7
|
// ESM COMPAT FLAG
|
|
8
8
|
__webpack_require__.r(__webpack_exports__);
|
|
9
9
|
|
|
@@ -13,23 +13,25 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/package.json
|
|
16
|
-
const package_namespaceObject = JSON.parse('{"
|
|
16
|
+
const package_namespaceObject = /*#__PURE__*/JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-seg"}');
|
|
17
17
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/id.js
|
|
18
18
|
|
|
19
|
-
const id = package_namespaceObject.
|
|
19
|
+
const id = package_namespaceObject.UU;
|
|
20
20
|
const SOPClassHandlerName = 'dicom-seg';
|
|
21
21
|
const SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;
|
|
22
22
|
|
|
23
23
|
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
24
|
-
var react = __webpack_require__(
|
|
25
|
-
// EXTERNAL MODULE: ../../core/src/index.ts +
|
|
26
|
-
var src = __webpack_require__(
|
|
27
|
-
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js +
|
|
28
|
-
var esm = __webpack_require__(
|
|
24
|
+
var react = __webpack_require__(41766);
|
|
25
|
+
// EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
|
|
26
|
+
var src = __webpack_require__(85073);
|
|
27
|
+
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
|
|
28
|
+
var esm = __webpack_require__(50719);
|
|
29
|
+
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 16 modules
|
|
30
|
+
var dist_esm = __webpack_require__(20767);
|
|
29
31
|
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/adapters.es.js
|
|
30
|
-
var adapters_es = __webpack_require__(
|
|
32
|
+
var adapters_es = __webpack_require__(83342);
|
|
31
33
|
// EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
|
|
32
|
-
var dcmjs_es = __webpack_require__(
|
|
34
|
+
var dcmjs_es = __webpack_require__(31426);
|
|
33
35
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/dicomlabToRGB.ts
|
|
34
36
|
|
|
35
37
|
|
|
@@ -39,7 +41,7 @@ var dcmjs_es = __webpack_require__(67540);
|
|
|
39
41
|
* @returns The RGB color as an array of three integers between 0 and 255.
|
|
40
42
|
*/
|
|
41
43
|
function dicomlabToRGB(cielab) {
|
|
42
|
-
const rgb = dcmjs_es
|
|
44
|
+
const rgb = dcmjs_es/* default.data */.Ay.data.Colors.dicomlab2RGB(cielab).map(x => Math.round(x * 255));
|
|
43
45
|
return rgb;
|
|
44
46
|
}
|
|
45
47
|
|
|
@@ -49,6 +51,7 @@ function dicomlabToRGB(cielab) {
|
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
|
|
54
|
+
|
|
52
55
|
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4'];
|
|
53
56
|
let loadPromises = {};
|
|
54
57
|
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
|
|
@@ -119,12 +122,9 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
|
|
|
119
122
|
displaySet.referencedVolumeId = referencedVolumeId;
|
|
120
123
|
return referencedDisplaySet;
|
|
121
124
|
};
|
|
122
|
-
displaySet.load = async
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
} = _ref;
|
|
126
|
-
return await _load(displaySet, servicesManager, extensionManager, headers);
|
|
127
|
-
};
|
|
125
|
+
displaySet.load = async ({
|
|
126
|
+
headers
|
|
127
|
+
}) => await _load(displaySet, servicesManager, extensionManager, headers);
|
|
128
128
|
return [displaySet];
|
|
129
129
|
}
|
|
130
130
|
function _load(segDisplaySet, servicesManager, extensionManager, headers) {
|
|
@@ -161,16 +161,16 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) {
|
|
|
161
161
|
});
|
|
162
162
|
return loadPromises[SOPInstanceUID];
|
|
163
163
|
}
|
|
164
|
-
async function _loadSegments(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
} = _ref2;
|
|
164
|
+
async function _loadSegments({
|
|
165
|
+
extensionManager,
|
|
166
|
+
servicesManager,
|
|
167
|
+
segDisplaySet,
|
|
168
|
+
headers
|
|
169
|
+
}) {
|
|
171
170
|
const utilityModule = extensionManager.getModuleEntry('@ohif/extension-cornerstone.utilityModule.common');
|
|
172
171
|
const {
|
|
173
|
-
segmentationService
|
|
172
|
+
segmentationService,
|
|
173
|
+
uiNotificationService
|
|
174
174
|
} = servicesManager.services;
|
|
175
175
|
const {
|
|
176
176
|
dicomLoaderService
|
|
@@ -187,7 +187,7 @@ async function _loadSegments(_ref2) {
|
|
|
187
187
|
// Todo: what should be defaults here
|
|
188
188
|
const tolerance = 0.001;
|
|
189
189
|
const skipOverlapping = true;
|
|
190
|
-
esm.eventTarget.addEventListener(adapters_es/* Enums */.
|
|
190
|
+
esm.eventTarget.addEventListener(adapters_es/* Enums */.fX.Events.SEGMENTATION_LOAD_PROGRESS, evt => {
|
|
191
191
|
const {
|
|
192
192
|
percentComplete
|
|
193
193
|
} = evt.detail;
|
|
@@ -195,28 +195,50 @@ async function _loadSegments(_ref2) {
|
|
|
195
195
|
percentComplete
|
|
196
196
|
});
|
|
197
197
|
});
|
|
198
|
-
const results = await adapters_es
|
|
198
|
+
const results = await adapters_es/* adaptersSEG */.ql.Cornerstone3D.Segmentation.generateToolState(imageIds, arrayBuffer, esm.metaData, {
|
|
199
199
|
skipOverlapping,
|
|
200
200
|
tolerance,
|
|
201
201
|
eventTarget: esm.eventTarget,
|
|
202
202
|
triggerEvent: esm.triggerEvent
|
|
203
203
|
});
|
|
204
|
+
let usedRecommendedDisplayCIELabValue = true;
|
|
204
205
|
results.segMetadata.data.forEach((data, i) => {
|
|
205
206
|
if (i > 0) {
|
|
206
|
-
data.rgba =
|
|
207
|
+
data.rgba = data.RecommendedDisplayCIELabValue;
|
|
208
|
+
if (data.rgba) {
|
|
209
|
+
data.rgba = dicomlabToRGB(data.rgba);
|
|
210
|
+
} else {
|
|
211
|
+
usedRecommendedDisplayCIELabValue = false;
|
|
212
|
+
data.rgba = dist_esm.CONSTANTS.COLOR_LUT[i % dist_esm.CONSTANTS.COLOR_LUT.length];
|
|
213
|
+
}
|
|
207
214
|
}
|
|
208
215
|
});
|
|
216
|
+
if (results.overlappingSegments) {
|
|
217
|
+
uiNotificationService.show({
|
|
218
|
+
title: 'Overlapping Segments',
|
|
219
|
+
message: 'Unsupported overlapping segments detected, segmentation rendering results may be incorrect.',
|
|
220
|
+
type: 'warning'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
if (!usedRecommendedDisplayCIELabValue) {
|
|
224
|
+
// Display a notification about the non-utilization of RecommendedDisplayCIELabValue
|
|
225
|
+
uiNotificationService.show({
|
|
226
|
+
title: 'DICOM SEG import',
|
|
227
|
+
message: 'RecommendedDisplayCIELabValue not found for one or more segments. The default color was used instead.',
|
|
228
|
+
type: 'warning',
|
|
229
|
+
duration: 5000
|
|
230
|
+
});
|
|
231
|
+
}
|
|
209
232
|
Object.assign(segDisplaySet, results);
|
|
210
233
|
}
|
|
211
234
|
function _segmentationExists(segDisplaySet, segmentationService) {
|
|
212
235
|
// This should be abstracted with the CornerstoneCacheService
|
|
213
236
|
return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID);
|
|
214
237
|
}
|
|
215
|
-
function getSopClassHandlerModule(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
} = _ref3;
|
|
238
|
+
function getSopClassHandlerModule({
|
|
239
|
+
servicesManager,
|
|
240
|
+
extensionManager
|
|
241
|
+
}) {
|
|
220
242
|
const getDisplaySetsFromSeries = instances => {
|
|
221
243
|
return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);
|
|
222
244
|
};
|
|
@@ -292,24 +314,29 @@ function getHangingProtocolModule() {
|
|
|
292
314
|
/* harmony default export */ const src_getHangingProtocolModule = (getHangingProtocolModule);
|
|
293
315
|
|
|
294
316
|
// EXTERNAL MODULE: ./state/index.js + 1 modules
|
|
295
|
-
var state = __webpack_require__(
|
|
296
|
-
// EXTERNAL MODULE:
|
|
297
|
-
var
|
|
317
|
+
var state = __webpack_require__(15575);
|
|
318
|
+
// EXTERNAL MODULE: ../../ui/src/index.js + 542 modules
|
|
319
|
+
var ui_src = __webpack_require__(48804);
|
|
320
|
+
// EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 78 modules
|
|
321
|
+
var default_src = __webpack_require__(54090);
|
|
298
322
|
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
299
|
-
var prop_types = __webpack_require__(
|
|
323
|
+
var prop_types = __webpack_require__(11374);
|
|
300
324
|
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
301
|
-
|
|
302
|
-
|
|
325
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/types/segmentation.tsx
|
|
326
|
+
let SegmentationPanelMode = /*#__PURE__*/function (SegmentationPanelMode) {
|
|
327
|
+
SegmentationPanelMode["Expanded"] = "expanded";
|
|
328
|
+
SegmentationPanelMode["Dropdown"] = "dropdown";
|
|
329
|
+
return SegmentationPanelMode;
|
|
330
|
+
}({});
|
|
303
331
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/panels/callInputDialog.tsx
|
|
304
332
|
|
|
305
333
|
|
|
306
334
|
function callInputDialog(uiDialogService, label, callback) {
|
|
307
335
|
const dialogId = 'enter-segment-label';
|
|
308
|
-
const onSubmitHandler =
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
} = _ref;
|
|
336
|
+
const onSubmitHandler = ({
|
|
337
|
+
action,
|
|
338
|
+
value
|
|
339
|
+
}) => {
|
|
313
340
|
switch (action.id) {
|
|
314
341
|
case 'save':
|
|
315
342
|
callback(value.label, action.id);
|
|
@@ -328,7 +355,7 @@ function callInputDialog(uiDialogService, label, callback) {
|
|
|
328
355
|
centralize: true,
|
|
329
356
|
isDraggable: false,
|
|
330
357
|
showOverlay: true,
|
|
331
|
-
content: ui_src/* Dialog */.
|
|
358
|
+
content: ui_src/* Dialog */.lG,
|
|
332
359
|
contentProps: {
|
|
333
360
|
title: 'Segment',
|
|
334
361
|
value: {
|
|
@@ -341,19 +368,18 @@ function callInputDialog(uiDialogService, label, callback) {
|
|
|
341
368
|
actions: [{
|
|
342
369
|
id: 'cancel',
|
|
343
370
|
text: 'Cancel',
|
|
344
|
-
type: ui_src/* ButtonEnums.type */.
|
|
371
|
+
type: ui_src/* ButtonEnums.type */.Ny.NW.secondary
|
|
345
372
|
}, {
|
|
346
373
|
id: 'save',
|
|
347
374
|
text: 'Confirm',
|
|
348
|
-
type: ui_src/* ButtonEnums.type */.
|
|
375
|
+
type: ui_src/* ButtonEnums.type */.Ny.NW.primary
|
|
349
376
|
}],
|
|
350
377
|
onSubmit: onSubmitHandler,
|
|
351
|
-
body:
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
return /*#__PURE__*/react.createElement(ui_src/* Input */.II, {
|
|
378
|
+
body: ({
|
|
379
|
+
value,
|
|
380
|
+
setValue
|
|
381
|
+
}) => {
|
|
382
|
+
return /*#__PURE__*/react.createElement(ui_src/* Input */.pd, {
|
|
357
383
|
label: "Enter the segment label",
|
|
358
384
|
labelClassName: "text-white text-[14px] leading-[1.2]",
|
|
359
385
|
autoFocus: true,
|
|
@@ -385,7 +411,7 @@ function callInputDialog(uiDialogService, label, callback) {
|
|
|
385
411
|
}
|
|
386
412
|
/* harmony default export */ const panels_callInputDialog = (callInputDialog);
|
|
387
413
|
// EXTERNAL MODULE: ../../../node_modules/react-color/es/index.js + 219 modules
|
|
388
|
-
var es = __webpack_require__(
|
|
414
|
+
var es = __webpack_require__(13726);
|
|
389
415
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/panels/colorPickerDialog.css
|
|
390
416
|
// extracted by mini-css-extract-plugin
|
|
391
417
|
|
|
@@ -396,11 +422,10 @@ var es = __webpack_require__(22831);
|
|
|
396
422
|
|
|
397
423
|
function callColorPickerDialog(uiDialogService, rgbaColor, callback) {
|
|
398
424
|
const dialogId = 'pick-color';
|
|
399
|
-
const onSubmitHandler =
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
} = _ref;
|
|
425
|
+
const onSubmitHandler = ({
|
|
426
|
+
action,
|
|
427
|
+
value
|
|
428
|
+
}) => {
|
|
404
429
|
switch (action.id) {
|
|
405
430
|
case 'save':
|
|
406
431
|
callback(value.rgbaColor, action.id);
|
|
@@ -419,7 +444,7 @@ function callColorPickerDialog(uiDialogService, rgbaColor, callback) {
|
|
|
419
444
|
centralize: true,
|
|
420
445
|
isDraggable: false,
|
|
421
446
|
showOverlay: true,
|
|
422
|
-
content: ui_src/* Dialog */.
|
|
447
|
+
content: ui_src/* Dialog */.lG,
|
|
423
448
|
contentProps: {
|
|
424
449
|
title: 'Segment Color',
|
|
425
450
|
value: {
|
|
@@ -439,17 +464,16 @@ function callColorPickerDialog(uiDialogService, rgbaColor, callback) {
|
|
|
439
464
|
type: 'secondary'
|
|
440
465
|
}],
|
|
441
466
|
onSubmit: onSubmitHandler,
|
|
442
|
-
body:
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
} = _ref2;
|
|
467
|
+
body: ({
|
|
468
|
+
value,
|
|
469
|
+
setValue
|
|
470
|
+
}) => {
|
|
447
471
|
const handleChange = color => {
|
|
448
472
|
setValue({
|
|
449
473
|
rgbaColor: color.rgb
|
|
450
474
|
});
|
|
451
475
|
};
|
|
452
|
-
return /*#__PURE__*/react.createElement(es/* ChromePicker */.
|
|
476
|
+
return /*#__PURE__*/react.createElement(es/* ChromePicker */.xk, {
|
|
453
477
|
color: value.rgbaColor,
|
|
454
478
|
onChange: handleChange,
|
|
455
479
|
presetColors: [],
|
|
@@ -462,7 +486,7 @@ function callColorPickerDialog(uiDialogService, rgbaColor, callback) {
|
|
|
462
486
|
}
|
|
463
487
|
/* harmony default export */ const colorPickerDialog = (callColorPickerDialog);
|
|
464
488
|
// EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
|
|
465
|
-
var dist_es = __webpack_require__(
|
|
489
|
+
var dist_es = __webpack_require__(80619);
|
|
466
490
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/panels/PanelSegmentation.tsx
|
|
467
491
|
|
|
468
492
|
|
|
@@ -471,13 +495,17 @@ var dist_es = __webpack_require__(69190);
|
|
|
471
495
|
|
|
472
496
|
|
|
473
497
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
498
|
+
|
|
499
|
+
const components = {
|
|
500
|
+
[SegmentationPanelMode.Expanded]: ui_src/* SegmentationGroupTableExpanded */.fO,
|
|
501
|
+
[SegmentationPanelMode.Dropdown]: ui_src/* SegmentationGroupTable */.QQ
|
|
502
|
+
};
|
|
503
|
+
function PanelSegmentation({
|
|
504
|
+
servicesManager,
|
|
505
|
+
commandsManager,
|
|
506
|
+
extensionManager,
|
|
507
|
+
configuration
|
|
508
|
+
}) {
|
|
481
509
|
const {
|
|
482
510
|
segmentationService,
|
|
483
511
|
viewportGridService,
|
|
@@ -485,7 +513,7 @@ function PanelSegmentation(_ref) {
|
|
|
485
513
|
} = servicesManager.services;
|
|
486
514
|
const {
|
|
487
515
|
t
|
|
488
|
-
} = (0,dist_es/* useTranslation
|
|
516
|
+
} = (0,dist_es/* useTranslation */.Bd)('PanelSegmentation');
|
|
489
517
|
const [selectedSegmentationId, setSelectedSegmentationId] = (0,react.useState)(null);
|
|
490
518
|
const [segmentationConfiguration, setSegmentationConfiguration] = (0,react.useState)(segmentationService.getConfiguration());
|
|
491
519
|
const [segmentations, setSegmentations] = (0,react.useState)(() => segmentationService.getSegmentations());
|
|
@@ -567,7 +595,6 @@ function PanelSegmentation(_ref) {
|
|
|
567
595
|
);
|
|
568
596
|
});
|
|
569
597
|
};
|
|
570
|
-
|
|
571
598
|
const onSegmentColorClick = (segmentationId, segmentIndex) => {
|
|
572
599
|
const segmentation = segmentationService.getSegmentation(segmentationId);
|
|
573
600
|
const segment = segmentation.segments[segmentIndex];
|
|
@@ -607,6 +634,15 @@ function PanelSegmentation(_ref) {
|
|
|
607
634
|
};
|
|
608
635
|
const onToggleSegmentationVisibility = segmentationId => {
|
|
609
636
|
segmentationService.toggleSegmentationVisibility(segmentationId);
|
|
637
|
+
const segmentation = segmentationService.getSegmentation(segmentationId);
|
|
638
|
+
const isVisible = segmentation.isVisible;
|
|
639
|
+
const segments = segmentation.segments;
|
|
640
|
+
const toolGroupIds = getToolGroupIds(segmentationId);
|
|
641
|
+
toolGroupIds.forEach(toolGroupId => {
|
|
642
|
+
segments.forEach((segment, segmentIndex) => {
|
|
643
|
+
segmentationService.setSegmentVisibility(segmentationId, segmentIndex, isVisible, toolGroupId);
|
|
644
|
+
});
|
|
645
|
+
});
|
|
610
646
|
};
|
|
611
647
|
const _setSegmentationConfiguration = (0,react.useCallback)((segmentationId, key, value) => {
|
|
612
648
|
segmentationService.setConfiguration({
|
|
@@ -647,9 +683,8 @@ function PanelSegmentation(_ref) {
|
|
|
647
683
|
segmentationId
|
|
648
684
|
});
|
|
649
685
|
};
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
}, /*#__PURE__*/react.createElement(ui_src/* SegmentationGroupTable */.cX, {
|
|
686
|
+
const SegmentationGroupTableComponent = components[configuration?.segmentationPanelMode];
|
|
687
|
+
return /*#__PURE__*/react.createElement(SegmentationGroupTableComponent, {
|
|
653
688
|
title: t('Segmentations'),
|
|
654
689
|
segmentations: segmentations,
|
|
655
690
|
disableEditing: configuration.disableEditing,
|
|
@@ -680,7 +715,7 @@ function PanelSegmentation(_ref) {
|
|
|
680
715
|
setOutlineWidthActive: value => _setSegmentationConfiguration(selectedSegmentationId, 'outlineWidthActive', value),
|
|
681
716
|
setFillAlpha: value => _setSegmentationConfiguration(selectedSegmentationId, 'fillAlpha', value),
|
|
682
717
|
setFillAlphaInactive: value => _setSegmentationConfiguration(selectedSegmentationId, 'fillAlphaInactive', value)
|
|
683
|
-
})
|
|
718
|
+
});
|
|
684
719
|
}
|
|
685
720
|
PanelSegmentation.propTypes = {
|
|
686
721
|
commandsManager: prop_types_default().shape({
|
|
@@ -698,405 +733,46 @@ PanelSegmentation.propTypes = {
|
|
|
698
733
|
}).isRequired
|
|
699
734
|
}).isRequired
|
|
700
735
|
};
|
|
701
|
-
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 348 modules
|
|
702
|
-
var dist_esm = __webpack_require__(14957);
|
|
703
|
-
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/panels/SegmentationToolbox.tsx
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
const {
|
|
708
|
-
segmentation: segmentationUtils
|
|
709
|
-
} = dist_esm.utilities;
|
|
710
|
-
const TOOL_TYPES = {
|
|
711
|
-
CIRCULAR_BRUSH: 'CircularBrush',
|
|
712
|
-
SPHERE_BRUSH: 'SphereBrush',
|
|
713
|
-
CIRCULAR_ERASER: 'CircularEraser',
|
|
714
|
-
SPHERE_ERASER: 'SphereEraser',
|
|
715
|
-
CIRCLE_SHAPE: 'CircleScissor',
|
|
716
|
-
RECTANGLE_SHAPE: 'RectangleScissor',
|
|
717
|
-
SPHERE_SHAPE: 'SphereScissor',
|
|
718
|
-
THRESHOLD_CIRCULAR_BRUSH: 'ThresholdCircularBrush',
|
|
719
|
-
THRESHOLD_SPHERE_BRUSH: 'ThresholdSphereBrush'
|
|
720
|
-
};
|
|
721
|
-
const ACTIONS = {
|
|
722
|
-
SET_TOOL_CONFIG: 'SET_TOOL_CONFIG',
|
|
723
|
-
SET_ACTIVE_TOOL: 'SET_ACTIVE_TOOL'
|
|
724
|
-
};
|
|
725
|
-
const initialState = {
|
|
726
|
-
Brush: {
|
|
727
|
-
brushSize: 15,
|
|
728
|
-
mode: 'CircularBrush' // Can be 'CircularBrush' or 'SphereBrush'
|
|
729
|
-
},
|
|
730
|
-
|
|
731
|
-
Eraser: {
|
|
732
|
-
brushSize: 15,
|
|
733
|
-
mode: 'CircularEraser' // Can be 'CircularEraser' or 'SphereEraser'
|
|
734
|
-
},
|
|
735
|
-
|
|
736
|
-
Shapes: {
|
|
737
|
-
brushSize: 15,
|
|
738
|
-
mode: 'CircleScissor' // E.g., 'CircleScissor', 'RectangleScissor', or 'SphereScissor'
|
|
739
|
-
},
|
|
740
|
-
|
|
741
|
-
ThresholdBrush: {
|
|
742
|
-
brushSize: 15,
|
|
743
|
-
thresholdRange: [-500, 500]
|
|
744
|
-
},
|
|
745
|
-
activeTool: null
|
|
746
|
-
};
|
|
747
|
-
function toolboxReducer(state, action) {
|
|
748
|
-
switch (action.type) {
|
|
749
|
-
case ACTIONS.SET_TOOL_CONFIG:
|
|
750
|
-
const {
|
|
751
|
-
tool,
|
|
752
|
-
config
|
|
753
|
-
} = action.payload;
|
|
754
|
-
return {
|
|
755
|
-
...state,
|
|
756
|
-
[tool]: {
|
|
757
|
-
...state[tool],
|
|
758
|
-
...config
|
|
759
|
-
}
|
|
760
|
-
};
|
|
761
|
-
case ACTIONS.SET_ACTIVE_TOOL:
|
|
762
|
-
return {
|
|
763
|
-
...state,
|
|
764
|
-
activeTool: action.payload
|
|
765
|
-
};
|
|
766
|
-
default:
|
|
767
|
-
return state;
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
function SegmentationToolbox(_ref) {
|
|
771
|
-
let {
|
|
772
|
-
servicesManager,
|
|
773
|
-
extensionManager
|
|
774
|
-
} = _ref;
|
|
775
|
-
const {
|
|
776
|
-
toolbarService,
|
|
777
|
-
segmentationService,
|
|
778
|
-
toolGroupService
|
|
779
|
-
} = servicesManager.services;
|
|
780
|
-
const [viewportGrid] = (0,ui_src/* useViewportGrid */.O_)();
|
|
781
|
-
const {
|
|
782
|
-
viewports,
|
|
783
|
-
activeViewportId
|
|
784
|
-
} = viewportGrid;
|
|
785
|
-
const [toolsEnabled, setToolsEnabled] = (0,react.useState)(false);
|
|
786
|
-
const [state, dispatch] = (0,react.useReducer)(toolboxReducer, initialState);
|
|
787
|
-
const updateActiveTool = (0,react.useCallback)(() => {
|
|
788
|
-
if (!viewports?.size || activeViewportId === undefined) {
|
|
789
|
-
return;
|
|
790
|
-
}
|
|
791
|
-
const viewport = viewports.get(activeViewportId);
|
|
792
|
-
if (!viewport) {
|
|
793
|
-
return;
|
|
794
|
-
}
|
|
795
|
-
dispatch({
|
|
796
|
-
type: ACTIONS.SET_ACTIVE_TOOL,
|
|
797
|
-
payload: toolGroupService.getActiveToolForViewport(viewport.viewportId)
|
|
798
|
-
});
|
|
799
|
-
}, [activeViewportId, viewports, toolGroupService, dispatch]);
|
|
800
|
-
const setToolActive = (0,react.useCallback)(toolName => {
|
|
801
|
-
toolbarService.recordInteraction({
|
|
802
|
-
interactionType: 'tool',
|
|
803
|
-
commands: [{
|
|
804
|
-
commandName: 'setToolActive',
|
|
805
|
-
commandOptions: {
|
|
806
|
-
toolName
|
|
807
|
-
}
|
|
808
|
-
}]
|
|
809
|
-
});
|
|
810
|
-
dispatch({
|
|
811
|
-
type: ACTIONS.SET_ACTIVE_TOOL,
|
|
812
|
-
payload: toolName
|
|
813
|
-
});
|
|
814
|
-
}, [toolbarService, dispatch]);
|
|
815
|
-
|
|
816
|
-
/**
|
|
817
|
-
* sets the tools enabled IF there are segmentations
|
|
818
|
-
*/
|
|
819
|
-
(0,react.useEffect)(() => {
|
|
820
|
-
const events = [segmentationService.EVENTS.SEGMENTATION_ADDED, segmentationService.EVENTS.SEGMENTATION_UPDATED, segmentationService.EVENTS.SEGMENTATION_REMOVED];
|
|
821
|
-
const unsubscriptions = [];
|
|
822
|
-
events.forEach(event => {
|
|
823
|
-
const {
|
|
824
|
-
unsubscribe
|
|
825
|
-
} = segmentationService.subscribe(event, () => {
|
|
826
|
-
const segmentations = segmentationService.getSegmentations();
|
|
827
|
-
const activeSegmentation = segmentations?.find(seg => seg.isActive);
|
|
828
|
-
setToolsEnabled(activeSegmentation?.segmentCount > 0);
|
|
829
|
-
});
|
|
830
|
-
unsubscriptions.push(unsubscribe);
|
|
831
|
-
});
|
|
832
|
-
updateActiveTool();
|
|
833
|
-
return () => {
|
|
834
|
-
unsubscriptions.forEach(unsubscribe => unsubscribe());
|
|
835
|
-
};
|
|
836
|
-
}, [activeViewportId, viewports, segmentationService, updateActiveTool]);
|
|
837
|
-
|
|
838
|
-
/**
|
|
839
|
-
* Update the active tool when the toolbar state changes
|
|
840
|
-
*/
|
|
841
|
-
(0,react.useEffect)(() => {
|
|
842
|
-
const {
|
|
843
|
-
unsubscribe
|
|
844
|
-
} = toolbarService.subscribe(toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED, () => {
|
|
845
|
-
updateActiveTool();
|
|
846
|
-
});
|
|
847
|
-
return () => {
|
|
848
|
-
unsubscribe();
|
|
849
|
-
};
|
|
850
|
-
}, [toolbarService, updateActiveTool]);
|
|
851
|
-
(0,react.useEffect)(() => {
|
|
852
|
-
// if the active tool is not a brush tool then do nothing
|
|
853
|
-
if (!Object.values(TOOL_TYPES).includes(state.activeTool)) {
|
|
854
|
-
return;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
// if the tool is Segmentation and it is enabled then do nothing
|
|
858
|
-
if (toolsEnabled) {
|
|
859
|
-
return;
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
// if the tool is Segmentation and it is disabled, then switch
|
|
863
|
-
// back to the window level tool to not confuse the user when no
|
|
864
|
-
// segmentation is active or when there is no segment in the segmentation
|
|
865
|
-
setToolActive('WindowLevel');
|
|
866
|
-
}, [toolsEnabled, state.activeTool, setToolActive]);
|
|
867
|
-
const updateBrushSize = (0,react.useCallback)((toolName, brushSize) => {
|
|
868
|
-
toolGroupService.getToolGroupIds()?.forEach(toolGroupId => {
|
|
869
|
-
segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize, toolName);
|
|
870
|
-
});
|
|
871
|
-
}, [toolGroupService]);
|
|
872
|
-
const onBrushSizeChange = (0,react.useCallback)((valueAsStringOrNumber, toolCategory) => {
|
|
873
|
-
const value = Number(valueAsStringOrNumber);
|
|
874
|
-
_getToolNamesFromCategory(toolCategory).forEach(toolName => {
|
|
875
|
-
updateBrushSize(toolName, value);
|
|
876
|
-
});
|
|
877
|
-
dispatch({
|
|
878
|
-
type: ACTIONS.SET_TOOL_CONFIG,
|
|
879
|
-
payload: {
|
|
880
|
-
tool: toolCategory,
|
|
881
|
-
config: {
|
|
882
|
-
brushSize: value
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
});
|
|
886
|
-
}, [toolGroupService, dispatch]);
|
|
887
|
-
const handleRangeChange = (0,react.useCallback)(newRange => {
|
|
888
|
-
if (newRange[0] === state.ThresholdBrush.thresholdRange[0] && newRange[1] === state.ThresholdBrush.thresholdRange[1]) {
|
|
889
|
-
return;
|
|
890
|
-
}
|
|
891
|
-
const toolNames = _getToolNamesFromCategory('ThresholdBrush');
|
|
892
|
-
toolNames.forEach(toolName => {
|
|
893
|
-
toolGroupService.getToolGroupIds()?.forEach(toolGroupId => {
|
|
894
|
-
const toolGroup = toolGroupService.getToolGroup(toolGroupId);
|
|
895
|
-
toolGroup.setToolConfiguration(toolName, {
|
|
896
|
-
strategySpecificConfiguration: {
|
|
897
|
-
THRESHOLD_INSIDE_CIRCLE: {
|
|
898
|
-
threshold: newRange
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
});
|
|
902
|
-
});
|
|
903
|
-
});
|
|
904
|
-
dispatch({
|
|
905
|
-
type: ACTIONS.SET_TOOL_CONFIG,
|
|
906
|
-
payload: {
|
|
907
|
-
tool: 'ThresholdBrush',
|
|
908
|
-
config: {
|
|
909
|
-
thresholdRange: newRange
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
});
|
|
913
|
-
}, [toolGroupService, dispatch, state.ThresholdBrush.thresholdRange]);
|
|
914
|
-
return /*#__PURE__*/react.createElement(ui_src/* AdvancedToolbox */.bY, {
|
|
915
|
-
title: "Segmentation Tools",
|
|
916
|
-
items: [{
|
|
917
|
-
name: 'Brush',
|
|
918
|
-
icon: 'icon-tool-brush',
|
|
919
|
-
disabled: !toolsEnabled,
|
|
920
|
-
active: state.activeTool === TOOL_TYPES.CIRCULAR_BRUSH || state.activeTool === TOOL_TYPES.SPHERE_BRUSH,
|
|
921
|
-
onClick: () => setToolActive(TOOL_TYPES.CIRCULAR_BRUSH),
|
|
922
|
-
options: [{
|
|
923
|
-
name: 'Radius (mm)',
|
|
924
|
-
id: 'brush-radius',
|
|
925
|
-
type: 'range',
|
|
926
|
-
min: 0.5,
|
|
927
|
-
max: 99.5,
|
|
928
|
-
value: state.Brush.brushSize,
|
|
929
|
-
step: 0.5,
|
|
930
|
-
onChange: value => onBrushSizeChange(value, 'Brush')
|
|
931
|
-
}, {
|
|
932
|
-
name: 'Mode',
|
|
933
|
-
type: 'radio',
|
|
934
|
-
id: 'brush-mode',
|
|
935
|
-
value: state.Brush.mode,
|
|
936
|
-
values: [{
|
|
937
|
-
value: TOOL_TYPES.CIRCULAR_BRUSH,
|
|
938
|
-
label: 'Circle'
|
|
939
|
-
}, {
|
|
940
|
-
value: TOOL_TYPES.SPHERE_BRUSH,
|
|
941
|
-
label: 'Sphere'
|
|
942
|
-
}],
|
|
943
|
-
onChange: value => setToolActive(value)
|
|
944
|
-
}]
|
|
945
|
-
}, {
|
|
946
|
-
name: 'Eraser',
|
|
947
|
-
icon: 'icon-tool-eraser',
|
|
948
|
-
disabled: !toolsEnabled,
|
|
949
|
-
active: state.activeTool === TOOL_TYPES.CIRCULAR_ERASER || state.activeTool === TOOL_TYPES.SPHERE_ERASER,
|
|
950
|
-
onClick: () => setToolActive(TOOL_TYPES.CIRCULAR_ERASER),
|
|
951
|
-
options: [{
|
|
952
|
-
name: 'Radius (mm)',
|
|
953
|
-
type: 'range',
|
|
954
|
-
id: 'eraser-radius',
|
|
955
|
-
min: 0.5,
|
|
956
|
-
max: 99.5,
|
|
957
|
-
value: state.Eraser.brushSize,
|
|
958
|
-
step: 0.5,
|
|
959
|
-
onChange: value => onBrushSizeChange(value, 'Eraser')
|
|
960
|
-
}, {
|
|
961
|
-
name: 'Mode',
|
|
962
|
-
type: 'radio',
|
|
963
|
-
id: 'eraser-mode',
|
|
964
|
-
value: state.Eraser.mode,
|
|
965
|
-
values: [{
|
|
966
|
-
value: TOOL_TYPES.CIRCULAR_ERASER,
|
|
967
|
-
label: 'Circle'
|
|
968
|
-
}, {
|
|
969
|
-
value: TOOL_TYPES.SPHERE_ERASER,
|
|
970
|
-
label: 'Sphere'
|
|
971
|
-
}],
|
|
972
|
-
onChange: value => setToolActive(value)
|
|
973
|
-
}]
|
|
974
|
-
}, {
|
|
975
|
-
name: 'Shapes',
|
|
976
|
-
icon: 'icon-tool-shape',
|
|
977
|
-
disabled: !toolsEnabled,
|
|
978
|
-
active: state.activeTool === TOOL_TYPES.CIRCLE_SHAPE || state.activeTool === TOOL_TYPES.RECTANGLE_SHAPE || state.activeTool === TOOL_TYPES.SPHERE_SHAPE,
|
|
979
|
-
onClick: () => setToolActive(TOOL_TYPES.CIRCLE_SHAPE),
|
|
980
|
-
options: [{
|
|
981
|
-
name: 'Mode',
|
|
982
|
-
type: 'radio',
|
|
983
|
-
value: state.Shapes.mode,
|
|
984
|
-
id: 'shape-mode',
|
|
985
|
-
values: [{
|
|
986
|
-
value: TOOL_TYPES.CIRCLE_SHAPE,
|
|
987
|
-
label: 'Circle'
|
|
988
|
-
}, {
|
|
989
|
-
value: TOOL_TYPES.RECTANGLE_SHAPE,
|
|
990
|
-
label: 'Rectangle'
|
|
991
|
-
}, {
|
|
992
|
-
value: TOOL_TYPES.SPHERE_SHAPE,
|
|
993
|
-
label: 'Sphere'
|
|
994
|
-
}],
|
|
995
|
-
onChange: value => setToolActive(value)
|
|
996
|
-
}]
|
|
997
|
-
}, {
|
|
998
|
-
name: 'Threshold Tool',
|
|
999
|
-
icon: 'icon-tool-threshold',
|
|
1000
|
-
disabled: !toolsEnabled,
|
|
1001
|
-
active: state.activeTool === TOOL_TYPES.THRESHOLD_CIRCULAR_BRUSH || state.activeTool === TOOL_TYPES.THRESHOLD_SPHERE_BRUSH,
|
|
1002
|
-
onClick: () => setToolActive(TOOL_TYPES.THRESHOLD_CIRCULAR_BRUSH),
|
|
1003
|
-
options: [{
|
|
1004
|
-
name: 'Radius (mm)',
|
|
1005
|
-
id: 'threshold-radius',
|
|
1006
|
-
type: 'range',
|
|
1007
|
-
min: 0.5,
|
|
1008
|
-
max: 99.5,
|
|
1009
|
-
value: state.ThresholdBrush.brushSize,
|
|
1010
|
-
step: 0.5,
|
|
1011
|
-
onChange: value => onBrushSizeChange(value, 'ThresholdBrush')
|
|
1012
|
-
}, {
|
|
1013
|
-
name: 'Mode',
|
|
1014
|
-
type: 'radio',
|
|
1015
|
-
id: 'threshold-mode',
|
|
1016
|
-
value: state.activeTool,
|
|
1017
|
-
values: [{
|
|
1018
|
-
value: TOOL_TYPES.THRESHOLD_CIRCULAR_BRUSH,
|
|
1019
|
-
label: 'Circle'
|
|
1020
|
-
}, {
|
|
1021
|
-
value: TOOL_TYPES.THRESHOLD_SPHERE_BRUSH,
|
|
1022
|
-
label: 'Sphere'
|
|
1023
|
-
}],
|
|
1024
|
-
onChange: value => setToolActive(value)
|
|
1025
|
-
}, {
|
|
1026
|
-
type: 'custom',
|
|
1027
|
-
id: 'segmentation-threshold-range',
|
|
1028
|
-
children: () => {
|
|
1029
|
-
return /*#__PURE__*/react.createElement("div", null, /*#__PURE__*/react.createElement("div", {
|
|
1030
|
-
className: "bg-secondary-light h-[1px]"
|
|
1031
|
-
}), /*#__PURE__*/react.createElement("div", {
|
|
1032
|
-
className: "mt-1 text-[13px] text-white"
|
|
1033
|
-
}, "Threshold"), /*#__PURE__*/react.createElement(ui_src/* InputDoubleRange */.R0, {
|
|
1034
|
-
values: state.ThresholdBrush.thresholdRange,
|
|
1035
|
-
onChange: handleRangeChange,
|
|
1036
|
-
minValue: -1000,
|
|
1037
|
-
maxValue: 1000,
|
|
1038
|
-
step: 1,
|
|
1039
|
-
showLabel: true,
|
|
1040
|
-
allowNumberEdit: true,
|
|
1041
|
-
showAdjustmentArrows: false
|
|
1042
|
-
}));
|
|
1043
|
-
}
|
|
1044
|
-
}]
|
|
1045
|
-
}]
|
|
1046
|
-
});
|
|
1047
|
-
}
|
|
1048
|
-
function _getToolNamesFromCategory(category) {
|
|
1049
|
-
let toolNames = [];
|
|
1050
|
-
switch (category) {
|
|
1051
|
-
case 'Brush':
|
|
1052
|
-
toolNames = ['CircularBrush', 'SphereBrush'];
|
|
1053
|
-
break;
|
|
1054
|
-
case 'Eraser':
|
|
1055
|
-
toolNames = ['CircularEraser', 'SphereEraser'];
|
|
1056
|
-
break;
|
|
1057
|
-
case 'ThresholdBrush':
|
|
1058
|
-
toolNames = ['ThresholdCircularBrush', 'ThresholdSphereBrush'];
|
|
1059
|
-
break;
|
|
1060
|
-
default:
|
|
1061
|
-
break;
|
|
1062
|
-
}
|
|
1063
|
-
return toolNames;
|
|
1064
|
-
}
|
|
1065
|
-
/* harmony default export */ const panels_SegmentationToolbox = (SegmentationToolbox);
|
|
1066
736
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/getPanelModule.tsx
|
|
1067
737
|
|
|
1068
738
|
|
|
1069
739
|
|
|
1070
740
|
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
741
|
+
|
|
742
|
+
const getPanelModule = ({
|
|
743
|
+
commandsManager,
|
|
744
|
+
servicesManager,
|
|
745
|
+
extensionManager,
|
|
746
|
+
configuration,
|
|
747
|
+
title
|
|
748
|
+
}) => {
|
|
1078
749
|
const {
|
|
1079
750
|
customizationService
|
|
1080
751
|
} = servicesManager.services;
|
|
1081
752
|
const wrappedPanelSegmentation = configuration => {
|
|
1082
|
-
const [appConfig] = (0,state/* useAppConfig */.
|
|
753
|
+
const [appConfig] = (0,state/* useAppConfig */.r)();
|
|
1083
754
|
const disableEditingForMode = customizationService.get('segmentation.disableEditing');
|
|
755
|
+
const segmentationPanelMode = customizationService.get('segmentation.segmentationPanelMode')?.value || SegmentationPanelMode.Dropdown;
|
|
1084
756
|
return /*#__PURE__*/react.createElement(PanelSegmentation, {
|
|
1085
757
|
commandsManager: commandsManager,
|
|
1086
758
|
servicesManager: servicesManager,
|
|
1087
759
|
extensionManager: extensionManager,
|
|
1088
760
|
configuration: {
|
|
1089
761
|
...configuration,
|
|
1090
|
-
disableEditing: appConfig.disableEditing || disableEditingForMode?.value
|
|
762
|
+
disableEditing: appConfig.disableEditing || disableEditingForMode?.value,
|
|
763
|
+
segmentationPanelMode: segmentationPanelMode
|
|
1091
764
|
}
|
|
1092
765
|
});
|
|
1093
766
|
};
|
|
1094
767
|
const wrappedPanelSegmentationWithTools = configuration => {
|
|
1095
|
-
const [appConfig] = (0,state/* useAppConfig */.
|
|
1096
|
-
|
|
768
|
+
const [appConfig] = (0,state/* useAppConfig */.r)();
|
|
769
|
+
const segmentationPanelMode = customizationService.get('segmentation.segmentationPanelMode')?.value || SegmentationPanelMode.Dropdown;
|
|
770
|
+
return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_src/* Toolbox */.OO, {
|
|
1097
771
|
commandsManager: commandsManager,
|
|
1098
772
|
servicesManager: servicesManager,
|
|
1099
773
|
extensionManager: extensionManager,
|
|
774
|
+
buttonSectionId: "segmentationToolbox",
|
|
775
|
+
title: "Segmentation Tools",
|
|
1100
776
|
configuration: {
|
|
1101
777
|
...configuration
|
|
1102
778
|
}
|
|
@@ -1105,7 +781,8 @@ const getPanelModule = _ref => {
|
|
|
1105
781
|
servicesManager: servicesManager,
|
|
1106
782
|
extensionManager: extensionManager,
|
|
1107
783
|
configuration: {
|
|
1108
|
-
...configuration
|
|
784
|
+
...configuration,
|
|
785
|
+
segmentationPanelMode: segmentationPanelMode
|
|
1109
786
|
}
|
|
1110
787
|
}));
|
|
1111
788
|
};
|
|
@@ -1124,12 +801,12 @@ const getPanelModule = _ref => {
|
|
|
1124
801
|
}];
|
|
1125
802
|
};
|
|
1126
803
|
/* harmony default export */ const src_getPanelModule = (getPanelModule);
|
|
1127
|
-
// EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Filters/General/ImageMarchingSquares.js
|
|
1128
|
-
var ImageMarchingSquares = __webpack_require__(
|
|
804
|
+
// EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Filters/General/ImageMarchingSquares.js
|
|
805
|
+
var ImageMarchingSquares = __webpack_require__(52754);
|
|
1129
806
|
// EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/DataArray.js
|
|
1130
|
-
var DataArray = __webpack_require__(
|
|
807
|
+
var DataArray = __webpack_require__(45128);
|
|
1131
808
|
// EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/DataModel/ImageData.js + 2 modules
|
|
1132
|
-
var ImageData = __webpack_require__(
|
|
809
|
+
var ImageData = __webpack_require__(94448);
|
|
1133
810
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/hydrationUtils.ts
|
|
1134
811
|
|
|
1135
812
|
|
|
@@ -1147,13 +824,12 @@ var ImageData = __webpack_require__(96372);
|
|
|
1147
824
|
*
|
|
1148
825
|
* @returns Returns true upon successful update of viewports for segmentation rendering.
|
|
1149
826
|
*/
|
|
1150
|
-
async function updateViewportsForSegmentationRendering(
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
} = _ref;
|
|
827
|
+
async function updateViewportsForSegmentationRendering({
|
|
828
|
+
viewportId,
|
|
829
|
+
loadFn,
|
|
830
|
+
servicesManager,
|
|
831
|
+
referencedDisplaySetInstanceUID
|
|
832
|
+
}) {
|
|
1157
833
|
const {
|
|
1158
834
|
cornerstoneViewportService,
|
|
1159
835
|
segmentationService,
|
|
@@ -1221,11 +897,10 @@ async function updateViewportsForSegmentationRendering(_ref) {
|
|
|
1221
897
|
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
|
1222
898
|
return true;
|
|
1223
899
|
}
|
|
1224
|
-
const getTargetViewport =
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
} = _ref2;
|
|
900
|
+
const getTargetViewport = ({
|
|
901
|
+
viewportId,
|
|
902
|
+
viewportGridService
|
|
903
|
+
}) => {
|
|
1229
904
|
const {
|
|
1230
905
|
viewports,
|
|
1231
906
|
activeViewportId
|
|
@@ -1247,12 +922,11 @@ const getTargetViewport = _ref2 => {
|
|
|
1247
922
|
*
|
|
1248
923
|
* @returns {Array} Returns an array of viewports that require updates for segmentation rendering.
|
|
1249
924
|
*/
|
|
1250
|
-
function getUpdatedViewportsForSegmentation(
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
} = _ref3;
|
|
925
|
+
function getUpdatedViewportsForSegmentation({
|
|
926
|
+
viewportId,
|
|
927
|
+
servicesManager,
|
|
928
|
+
referencedDisplaySetInstanceUID
|
|
929
|
+
}) {
|
|
1256
930
|
const {
|
|
1257
931
|
hangingProtocolService,
|
|
1258
932
|
displaySetService,
|
|
@@ -1288,7 +962,7 @@ function getUpdatedViewportsForSegmentation(_ref3) {
|
|
|
1288
962
|
});
|
|
1289
963
|
}
|
|
1290
964
|
});
|
|
1291
|
-
return updatedViewports;
|
|
965
|
+
return updatedViewports.filter(v => v.viewportOptions?.viewportType !== 'volume3d');
|
|
1292
966
|
}
|
|
1293
967
|
|
|
1294
968
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/commandsModule.ts
|
|
@@ -1302,9 +976,12 @@ function getUpdatedViewportsForSegmentation(_ref3) {
|
|
|
1302
976
|
|
|
1303
977
|
|
|
1304
978
|
|
|
979
|
+
const {
|
|
980
|
+
segmentation: segmentationUtils
|
|
981
|
+
} = dist_esm.utilities;
|
|
1305
982
|
const {
|
|
1306
983
|
datasetToBlob
|
|
1307
|
-
} = dcmjs_es
|
|
984
|
+
} = dcmjs_es/* default.data */.Ay.data;
|
|
1308
985
|
const {
|
|
1309
986
|
Cornerstone3D: {
|
|
1310
987
|
Segmentation: {
|
|
@@ -1312,28 +989,28 @@ const {
|
|
|
1312
989
|
generateSegmentation
|
|
1313
990
|
}
|
|
1314
991
|
}
|
|
1315
|
-
} = adapters_es
|
|
992
|
+
} = adapters_es/* adaptersSEG */.ql;
|
|
1316
993
|
const {
|
|
1317
994
|
Cornerstone3D: {
|
|
1318
995
|
RTSS: {
|
|
1319
996
|
generateRTSSFromSegmentations
|
|
1320
997
|
}
|
|
1321
998
|
}
|
|
1322
|
-
} = adapters_es
|
|
999
|
+
} = adapters_es/* adaptersRT */.f_;
|
|
1323
1000
|
const {
|
|
1324
1001
|
downloadDICOMData
|
|
1325
|
-
} = adapters_es
|
|
1326
|
-
const commandsModule =
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
} = _ref;
|
|
1002
|
+
} = adapters_es/* helpers */._$;
|
|
1003
|
+
const commandsModule = ({
|
|
1004
|
+
servicesManager,
|
|
1005
|
+
extensionManager
|
|
1006
|
+
}) => {
|
|
1331
1007
|
const {
|
|
1332
1008
|
uiNotificationService,
|
|
1333
1009
|
segmentationService,
|
|
1334
1010
|
uiDialogService,
|
|
1335
1011
|
displaySetService,
|
|
1336
|
-
viewportGridService
|
|
1012
|
+
viewportGridService,
|
|
1013
|
+
toolGroupService
|
|
1337
1014
|
} = servicesManager.services;
|
|
1338
1015
|
const actions = {
|
|
1339
1016
|
/**
|
|
@@ -1360,10 +1037,9 @@ const commandsModule = _ref => {
|
|
|
1360
1037
|
* @param params.viewportId - the target viewport ID.
|
|
1361
1038
|
*
|
|
1362
1039
|
*/
|
|
1363
|
-
createEmptySegmentationForViewport: async
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
} = _ref2;
|
|
1040
|
+
createEmptySegmentationForViewport: async ({
|
|
1041
|
+
viewportId
|
|
1042
|
+
}) => {
|
|
1367
1043
|
const viewport = getTargetViewport({
|
|
1368
1044
|
viewportId,
|
|
1369
1045
|
viewportGridService
|
|
@@ -1412,11 +1088,10 @@ const commandsModule = _ref => {
|
|
|
1412
1088
|
* @param params.viewportId - the target viewport ID.
|
|
1413
1089
|
*
|
|
1414
1090
|
*/
|
|
1415
|
-
loadSegmentationsForViewport: async
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
} = _ref3;
|
|
1091
|
+
loadSegmentationsForViewport: async ({
|
|
1092
|
+
segmentations,
|
|
1093
|
+
viewportId
|
|
1094
|
+
}) => {
|
|
1420
1095
|
updateViewportsForSegmentationRendering({
|
|
1421
1096
|
viewportId,
|
|
1422
1097
|
servicesManager,
|
|
@@ -1479,13 +1154,13 @@ const commandsModule = _ref => {
|
|
|
1479
1154
|
* @param params.displaySets - Array of display sets to be loaded for segmentation.
|
|
1480
1155
|
*
|
|
1481
1156
|
*/
|
|
1482
|
-
loadSegmentationDisplaySetsForViewport: async
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
} = _ref4;
|
|
1157
|
+
loadSegmentationDisplaySetsForViewport: async ({
|
|
1158
|
+
viewportId,
|
|
1159
|
+
displaySets
|
|
1160
|
+
}) => {
|
|
1487
1161
|
// Todo: handle adding more than one segmentation
|
|
1488
1162
|
const displaySet = displaySets[0];
|
|
1163
|
+
const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySet.referencedDisplaySetInstanceUID);
|
|
1489
1164
|
updateViewportsForSegmentationRendering({
|
|
1490
1165
|
viewportId,
|
|
1491
1166
|
servicesManager,
|
|
@@ -1496,6 +1171,8 @@ const commandsModule = _ref => {
|
|
|
1496
1171
|
const serviceFunction = segDisplaySet.Modality === 'SEG' ? 'createSegmentationForSEGDisplaySet' : 'createSegmentationForRTDisplaySet';
|
|
1497
1172
|
const boundFn = segmentationService[serviceFunction].bind(segmentationService);
|
|
1498
1173
|
const segmentationId = await boundFn(segDisplaySet, null, suppressEvents);
|
|
1174
|
+
const segmentation = segmentationService.getSegmentation(segmentationId);
|
|
1175
|
+
segmentation.description = `S${referencedDisplaySet.SeriesNumber}: ${referencedDisplaySet.SeriesDescription}`;
|
|
1499
1176
|
return segmentationId;
|
|
1500
1177
|
}
|
|
1501
1178
|
});
|
|
@@ -1513,11 +1190,10 @@ const commandsModule = _ref => {
|
|
|
1513
1190
|
*
|
|
1514
1191
|
* @returns Returns the generated segmentation data.
|
|
1515
1192
|
*/
|
|
1516
|
-
generateSegmentation:
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
} = _ref5;
|
|
1193
|
+
generateSegmentation: ({
|
|
1194
|
+
segmentationId,
|
|
1195
|
+
options = {}
|
|
1196
|
+
}) => {
|
|
1521
1197
|
const segmentation = dist_esm.segmentation.state.getSegmentation(segmentationId);
|
|
1522
1198
|
const {
|
|
1523
1199
|
referencedVolumeId
|
|
@@ -1537,7 +1213,7 @@ const commandsModule = _ref => {
|
|
|
1537
1213
|
label,
|
|
1538
1214
|
color
|
|
1539
1215
|
} = segment;
|
|
1540
|
-
const RecommendedDisplayCIELabValue = dcmjs_es
|
|
1216
|
+
const RecommendedDisplayCIELabValue = dcmjs_es/* default.data */.Ay.data.Colors.rgb2DICOMLAB(color.slice(0, 3).map(value => value / 255)).map(value => Math.round(value));
|
|
1541
1217
|
const segmentMetadata = {
|
|
1542
1218
|
SegmentNumber: segmentIndex.toString(),
|
|
1543
1219
|
SegmentLabel: label,
|
|
@@ -1570,10 +1246,9 @@ const commandsModule = _ref => {
|
|
|
1570
1246
|
* @param params.segmentationId - ID of the segmentation to be downloaded.
|
|
1571
1247
|
*
|
|
1572
1248
|
*/
|
|
1573
|
-
downloadSegmentation:
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
} = _ref6;
|
|
1249
|
+
downloadSegmentation: ({
|
|
1250
|
+
segmentationId
|
|
1251
|
+
}) => {
|
|
1577
1252
|
const segmentationInOHIF = segmentationService.getSegmentation(segmentationId);
|
|
1578
1253
|
const generatedSegmentation = actions.generateSegmentation({
|
|
1579
1254
|
segmentationId
|
|
@@ -1592,11 +1267,10 @@ const commandsModule = _ref => {
|
|
|
1592
1267
|
* @returns {Object|void} Returns the naturalized report if successfully stored,
|
|
1593
1268
|
* otherwise throws an error.
|
|
1594
1269
|
*/
|
|
1595
|
-
storeSegmentation: async
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
} = _ref7;
|
|
1270
|
+
storeSegmentation: async ({
|
|
1271
|
+
segmentationId,
|
|
1272
|
+
dataSource
|
|
1273
|
+
}) => {
|
|
1600
1274
|
const promptResult = await (0,default_src.createReportDialogPrompt)(uiDialogService, {
|
|
1601
1275
|
extensionManager
|
|
1602
1276
|
});
|
|
@@ -1641,15 +1315,14 @@ const commandsModule = _ref => {
|
|
|
1641
1315
|
* converts dataset to downloadable blob.
|
|
1642
1316
|
*
|
|
1643
1317
|
*/
|
|
1644
|
-
downloadRTSS:
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
} = _ref8;
|
|
1318
|
+
downloadRTSS: ({
|
|
1319
|
+
segmentationId
|
|
1320
|
+
}) => {
|
|
1648
1321
|
const segmentations = segmentationService.getSegmentation(segmentationId);
|
|
1649
1322
|
const vtkUtils = {
|
|
1650
|
-
vtkImageMarchingSquares: ImageMarchingSquares/* default */.
|
|
1651
|
-
vtkDataArray: DataArray/* default */.
|
|
1652
|
-
vtkImageData: ImageData/* default */.
|
|
1323
|
+
vtkImageMarchingSquares: ImageMarchingSquares/* default */.Ay,
|
|
1324
|
+
vtkDataArray: DataArray/* default */.Ay,
|
|
1325
|
+
vtkImageData: ImageData/* default */.Ay
|
|
1653
1326
|
};
|
|
1654
1327
|
const RTSS = generateRTSSFromSegmentations(segmentations, src.classes.MetadataProvider, src.DicomMetadataStore, esm.cache, dist_esm.Enums, vtkUtils);
|
|
1655
1328
|
try {
|
|
@@ -1661,6 +1334,62 @@ const commandsModule = _ref => {
|
|
|
1661
1334
|
} catch (e) {
|
|
1662
1335
|
console.warn(e);
|
|
1663
1336
|
}
|
|
1337
|
+
},
|
|
1338
|
+
setBrushSize: ({
|
|
1339
|
+
value,
|
|
1340
|
+
toolNames
|
|
1341
|
+
}) => {
|
|
1342
|
+
const brushSize = Number(value);
|
|
1343
|
+
toolGroupService.getToolGroupIds()?.forEach(toolGroupId => {
|
|
1344
|
+
if (toolNames?.length === 0) {
|
|
1345
|
+
segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize);
|
|
1346
|
+
} else {
|
|
1347
|
+
toolNames?.forEach(toolName => {
|
|
1348
|
+
segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize, toolName);
|
|
1349
|
+
});
|
|
1350
|
+
}
|
|
1351
|
+
});
|
|
1352
|
+
},
|
|
1353
|
+
setThresholdRange: ({
|
|
1354
|
+
value,
|
|
1355
|
+
toolNames = ['ThresholdCircularBrush', 'ThresholdSphereBrush']
|
|
1356
|
+
}) => {
|
|
1357
|
+
toolGroupService.getToolGroupIds()?.forEach(toolGroupId => {
|
|
1358
|
+
const toolGroup = toolGroupService.getToolGroup(toolGroupId);
|
|
1359
|
+
toolNames?.forEach(toolName => {
|
|
1360
|
+
toolGroup.setToolConfiguration(toolName, {
|
|
1361
|
+
strategySpecificConfiguration: {
|
|
1362
|
+
THRESHOLD: {
|
|
1363
|
+
threshold: value
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
});
|
|
1367
|
+
});
|
|
1368
|
+
});
|
|
1369
|
+
},
|
|
1370
|
+
toggleThresholdRangeAndDynamic() {
|
|
1371
|
+
const toolGroupIds = toolGroupService.getToolGroupIds();
|
|
1372
|
+
if (!toolGroupIds) {
|
|
1373
|
+
return;
|
|
1374
|
+
}
|
|
1375
|
+
toolGroupIds.forEach(toolGroupId => {
|
|
1376
|
+
const toolGroup = toolGroupService.getToolGroup(toolGroupId);
|
|
1377
|
+
const brushInstances = segmentationUtils.getBrushToolInstances(toolGroup.id);
|
|
1378
|
+
brushInstances.forEach(({
|
|
1379
|
+
configuration
|
|
1380
|
+
}) => {
|
|
1381
|
+
const {
|
|
1382
|
+
activeStrategy,
|
|
1383
|
+
strategySpecificConfiguration
|
|
1384
|
+
} = configuration;
|
|
1385
|
+
if (activeStrategy.startsWith('THRESHOLD')) {
|
|
1386
|
+
const thresholdConfig = strategySpecificConfiguration.THRESHOLD;
|
|
1387
|
+
if (thresholdConfig) {
|
|
1388
|
+
thresholdConfig.isDynamic = !thresholdConfig.isDynamic;
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
});
|
|
1392
|
+
});
|
|
1664
1393
|
}
|
|
1665
1394
|
};
|
|
1666
1395
|
const definitions = {
|
|
@@ -1687,20 +1416,101 @@ const commandsModule = _ref => {
|
|
|
1687
1416
|
},
|
|
1688
1417
|
downloadRTSS: {
|
|
1689
1418
|
commandFn: actions.downloadRTSS
|
|
1419
|
+
},
|
|
1420
|
+
setBrushSize: {
|
|
1421
|
+
commandFn: actions.setBrushSize
|
|
1422
|
+
},
|
|
1423
|
+
setThresholdRange: {
|
|
1424
|
+
commandFn: actions.setThresholdRange
|
|
1425
|
+
},
|
|
1426
|
+
toggleThresholdRangeAndDynamic: {
|
|
1427
|
+
commandFn: actions.toggleThresholdRangeAndDynamic
|
|
1690
1428
|
}
|
|
1691
1429
|
};
|
|
1692
1430
|
return {
|
|
1693
1431
|
actions,
|
|
1694
|
-
definitions
|
|
1432
|
+
definitions,
|
|
1433
|
+
defaultContext: 'SEGMENTATION'
|
|
1695
1434
|
};
|
|
1696
1435
|
};
|
|
1697
1436
|
/* harmony default export */ const src_commandsModule = (commandsModule);
|
|
1437
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/getToolbarModule.ts
|
|
1438
|
+
function getToolbarModule({
|
|
1439
|
+
commandsManager,
|
|
1440
|
+
servicesManager
|
|
1441
|
+
}) {
|
|
1442
|
+
const {
|
|
1443
|
+
segmentationService,
|
|
1444
|
+
toolGroupService
|
|
1445
|
+
} = servicesManager.services;
|
|
1446
|
+
return [{
|
|
1447
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
1448
|
+
evaluate: ({
|
|
1449
|
+
viewportId,
|
|
1450
|
+
button,
|
|
1451
|
+
toolNames,
|
|
1452
|
+
disabledText
|
|
1453
|
+
}) => {
|
|
1454
|
+
// Todo: we need to pass in the button section Id since we are kind of
|
|
1455
|
+
// forcing the button to have black background since initially
|
|
1456
|
+
// it is designed for the toolbox not the toolbar on top
|
|
1457
|
+
// we should then branch the buttonSectionId to have different styles
|
|
1458
|
+
const segmentations = segmentationService.getSegmentations();
|
|
1459
|
+
if (!segmentations?.length) {
|
|
1460
|
+
return {
|
|
1461
|
+
disabled: true,
|
|
1462
|
+
className: '!text-common-bright !bg-black opacity-50',
|
|
1463
|
+
disabledText: disabledText ?? 'No segmentations available'
|
|
1464
|
+
};
|
|
1465
|
+
}
|
|
1466
|
+
const toolGroup = toolGroupService.getToolGroupForViewport(viewportId);
|
|
1467
|
+
if (!toolGroup) {
|
|
1468
|
+
return;
|
|
1469
|
+
}
|
|
1470
|
+
const toolName = getToolNameForButton(button);
|
|
1471
|
+
if (!toolGroup || !toolGroup.hasTool(toolName)) {
|
|
1472
|
+
return {
|
|
1473
|
+
disabled: true,
|
|
1474
|
+
className: '!text-common-bright ohif-disabled',
|
|
1475
|
+
disabledText: disabledText ?? 'Not available on the current viewport'
|
|
1476
|
+
};
|
|
1477
|
+
}
|
|
1478
|
+
const isPrimaryActive = toolNames ? toolNames.includes(toolGroup.getActivePrimaryMouseButtonTool()) : toolGroup.getActivePrimaryMouseButtonTool() === toolName;
|
|
1479
|
+
return {
|
|
1480
|
+
disabled: false,
|
|
1481
|
+
className: isPrimaryActive ? '!text-black !bg-primary-light hover:bg-primary-light hover-text-black hover:cursor-pointer' : '!text-common-bright !bg-black hover:bg-primary-light hover:cursor-pointer hover:text-black',
|
|
1482
|
+
// Todo: isActive right now is used for nested buttons where the primary
|
|
1483
|
+
// button needs to be fully rounded (vs partial rounded) when active
|
|
1484
|
+
// otherwise it does not have any other use
|
|
1485
|
+
isActive: isPrimaryActive
|
|
1486
|
+
};
|
|
1487
|
+
}
|
|
1488
|
+
}];
|
|
1489
|
+
}
|
|
1490
|
+
function getToolNameForButton(button) {
|
|
1491
|
+
const {
|
|
1492
|
+
props
|
|
1493
|
+
} = button;
|
|
1494
|
+
const commands = props?.commands || button.commands;
|
|
1495
|
+
if (commands && commands.length) {
|
|
1496
|
+
const command = commands[0];
|
|
1497
|
+
const {
|
|
1498
|
+
commandOptions
|
|
1499
|
+
} = command;
|
|
1500
|
+
const {
|
|
1501
|
+
toolName
|
|
1502
|
+
} = commandOptions || {
|
|
1503
|
+
toolName: props?.id ?? button.id
|
|
1504
|
+
};
|
|
1505
|
+
return toolName;
|
|
1506
|
+
}
|
|
1507
|
+
return null;
|
|
1508
|
+
}
|
|
1698
1509
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/init.ts
|
|
1699
1510
|
|
|
1700
|
-
function init(
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
} = _ref;
|
|
1511
|
+
function init({
|
|
1512
|
+
servicesManager
|
|
1513
|
+
}) {
|
|
1704
1514
|
(0,dist_esm.addTool)(dist_esm.BrushTool);
|
|
1705
1515
|
}
|
|
1706
1516
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/index.tsx
|
|
@@ -1712,8 +1522,9 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
|
|
|
1712
1522
|
|
|
1713
1523
|
|
|
1714
1524
|
|
|
1525
|
+
|
|
1715
1526
|
const Component = /*#__PURE__*/react.lazy(() => {
|
|
1716
|
-
return __webpack_require__.e(/* import() */
|
|
1527
|
+
return __webpack_require__.e(/* import() */ 295).then(__webpack_require__.bind(__webpack_require__, 58295));
|
|
1717
1528
|
});
|
|
1718
1529
|
const OHIFCornerstoneSEGViewport = props => {
|
|
1719
1530
|
return /*#__PURE__*/react.createElement(react.Suspense, {
|
|
@@ -1739,11 +1550,12 @@ const extension = {
|
|
|
1739
1550
|
*/
|
|
1740
1551
|
getPanelModule: src_getPanelModule,
|
|
1741
1552
|
getCommandsModule: src_commandsModule,
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1553
|
+
getToolbarModule: getToolbarModule,
|
|
1554
|
+
getViewportModule({
|
|
1555
|
+
servicesManager,
|
|
1556
|
+
extensionManager,
|
|
1557
|
+
commandsManager
|
|
1558
|
+
}) {
|
|
1747
1559
|
const ExtendedOHIFCornerstoneSEGViewport = props => {
|
|
1748
1560
|
return /*#__PURE__*/react.createElement(OHIFCornerstoneSEGViewport, _extends({
|
|
1749
1561
|
servicesManager: servicesManager,
|
|
@@ -1767,13 +1579,6 @@ const extension = {
|
|
|
1767
1579
|
};
|
|
1768
1580
|
/* harmony default export */ const cornerstone_dicom_seg_src = (extension);
|
|
1769
1581
|
|
|
1770
|
-
/***/ }),
|
|
1771
|
-
|
|
1772
|
-
/***/ 78753:
|
|
1773
|
-
/***/ (() => {
|
|
1774
|
-
|
|
1775
|
-
/* (ignored) */
|
|
1776
|
-
|
|
1777
1582
|
/***/ })
|
|
1778
1583
|
|
|
1779
1584
|
}]);
|