@ohif/app 3.13.0-beta.116 → 3.13.0-beta.118
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/{1206.bundle.47f070e2254d128c.js → 1206.bundle.e04ca1efe6f987ba.js} +1 -1
- package/dist/1483.bundle.5a98bf0d4c26aa01.js +470 -0
- package/dist/{1602.bundle.097ec19e8e61516f.js → 1602.bundle.2a0e1a9a73063ab5.js} +2 -2
- package/dist/{7701.bundle.945445d6681ddd20.js → 2343.bundle.931645133f98ca47.js} +990 -7
- package/dist/{3500.bundle.1e063b7b4910d6cf.js → 3500.bundle.7afd6d2e9345fca0.js} +1 -1
- package/dist/{3760.bundle.6c7eeb4b7f1583ca.js → 3760.bundle.553d1b88392a20b4.js} +2 -2
- package/dist/{5448.bundle.1e50777e4c4e122a.js → 5448.bundle.5686ebb99c379f64.js} +1 -1
- package/dist/{5696.bundle.9f0366ad867385bc.js → 5696.bundle.615658b8dead54ce.js} +7 -4
- package/dist/{5910.bundle.5561806884c95754.js → 5910.bundle.0f19608f3e76859b.js} +2 -2
- package/dist/{419.bundle.9d0e6a72e1e3a17b.js → 6749.bundle.ed2f94d2dd4c9a24.js} +288 -62
- package/dist/{7248.bundle.f761b21f343d4b9f.js → 7248.bundle.4c7d834f2ec140c7.js} +2 -2
- package/dist/{7295.bundle.4d4b6de4d2bb8856.js → 7499.bundle.743782416c5f430e.js} +502 -5
- package/dist/{781.bundle.efb0a6981676cebb.js → 781.bundle.d353624c7a811425.js} +2 -2
- package/dist/{8423.bundle.5d1b3092bc9562c9.js → 8423.bundle.1f3a472a7f691c1a.js} +2 -2
- package/dist/8492.bundle.44a55a259584d665.js +504 -0
- package/dist/8595.css +2 -0
- package/dist/{899.bundle.e786f8dfb66d74ca.js → 899.bundle.50c16f860acbc848.js} +2 -2
- package/dist/{9068.bundle.cd36fcb4e15a153e.js → 9068.bundle.95f1e638ef694ea9.js} +2 -2
- package/dist/{9402.bundle.6549cc304496cd5c.js → 9402.bundle.57041a8d06a36e8e.js} +2 -2
- package/dist/{9415.bundle.2a970c71de4014bf.js → 9415.bundle.770426487f8c0dfa.js} +2 -2
- package/dist/{9437.bundle.0fff227a859992ea.js → 9437.bundle.0045fb70b8fa0e7b.js} +107 -123
- package/dist/app-config.js +1 -1
- package/dist/{app.bundle.55057e411d635dc3.js → app.bundle.707ae3540bb211e8.js} +203 -36
- package/dist/customizations/index.html +400 -0
- package/dist/customizations/segmentation/segmentationAnnotationTools.jsonc +48 -0
- package/dist/customizations/segmentation/segmentationEditing.jsonc +59 -0
- package/dist/customizations/{ctPresets.jsonc → tools/ctPresets.jsonc} +1 -1
- package/dist/customizations/{measurementLabels.jsonc → tools/measurementLabels.jsonc} +1 -1
- package/dist/customizations/{smoothRotate.jsonc → tools/smoothRotate.jsonc} +1 -1
- package/dist/customizations/veterinary/veterinary.jsonc +5 -0
- package/dist/customizations/{veterinaryOverlay.jsonc → veterinary/veterinaryOverlay.jsonc} +3 -3
- package/dist/customizations/{patientBirthDate.jsonc → worklist/patientBirthDate.jsonc} +2 -2
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/package.json +5 -5
- package/dist/4834.bundle.a91450199d0f45e4.js +0 -900
- package/dist/6001.bundle.0789789db5410764.js +0 -1529
- package/dist/customizations/veterinary.jsonc +0 -5
- /package/dist/{100.bundle.ac04a425c0851574.js → 100.bundle.6ba1a0be02710b9f.js} +0 -0
- /package/dist/{1180.bundle.c19c443fe8d26719.js → 1180.bundle.25017eea64524896.js} +0 -0
- /package/dist/{2779.bundle.dca036a18399be96.js → 2779.bundle.56f7da594c887ff6.js} +0 -0
- /package/dist/{4556.bundle.b705ab15473128c7.js → 4556.bundle.454bc9719a06bc3f.js} +0 -0
- /package/dist/{4683.bundle.5d12928efa9f70f4.js → 4683.bundle.bfb5c3739e9886b5.js} +0 -0
- /package/dist/{7295.css → 8492.css} +0 -0
- /package/dist/{8832.bundle.ede981706cac8e15.js → 8832.bundle.6f31a982f82b96da.js} +0 -0
- /package/dist/{9116.bundle.225e003c28c550c1.js → 9116.bundle.079a64a12966429c.js} +0 -0
- /package/dist/{9290.bundle.a18c40b82772a3c6.js → 9290.bundle.db0d1eb62fa6ee8b.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["rspackChunk"] = globalThis["rspackChunk"] || []).push([[
|
|
2
|
+
(globalThis["rspackChunk"] = globalThis["rspackChunk"] || []).push([[2343], {
|
|
3
3
|
2242(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
4
4
|
|
|
5
5
|
// EXPORTS
|
|
@@ -1628,7 +1628,7 @@ function useViewportSegmentations({
|
|
|
1628
1628
|
}
|
|
1629
1629
|
|
|
1630
1630
|
},
|
|
1631
|
-
|
|
1631
|
+
86714(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
1632
1632
|
|
|
1633
1633
|
// EXPORTS
|
|
1634
1634
|
__webpack_require__.d(__webpack_exports__, {
|
|
@@ -8956,12 +8956,16 @@ const toolbarSections = {
|
|
|
8956
8956
|
};
|
|
8957
8957
|
|
|
8958
8958
|
/**
|
|
8959
|
-
*
|
|
8960
|
-
* - `cornerstone.toolbarButtons` – the
|
|
8961
|
-
* - `cornerstone.toolbarSections` – the
|
|
8959
|
+
* Capability packs registered (at default scope) by the cornerstone extension:
|
|
8960
|
+
* - `cornerstone.toolbarButtons` – the general toolbar button definitions
|
|
8961
|
+
* - `cornerstone.toolbarSections` – the general toolbar layout (section -> button ids)
|
|
8962
8962
|
*
|
|
8963
|
-
*
|
|
8964
|
-
*
|
|
8963
|
+
* These are pure "what can exist" packs — they carry no mode identity. Modes
|
|
8964
|
+
* compose them with `{ $reference }` markers in their own `toolbarButtons` /
|
|
8965
|
+
* `toolbarSections` instance arrays, which the mode route seeds into the Mode
|
|
8966
|
+
* customization scope on enter; URL `?customization=` modules extend the result
|
|
8967
|
+
* through the `mode` phase (e.g.
|
|
8968
|
+
* `mode.basic.toolbarButtons: { $push: [{ $reference: '...' }] }`).
|
|
8965
8969
|
*/
|
|
8966
8970
|
const toolbarButtonsCustomization = {
|
|
8967
8971
|
'cornerstone.toolbarButtons': toolbarButtonsCustomization_toolbarButtons,
|
|
@@ -8969,6 +8973,979 @@ const toolbarButtonsCustomization = {
|
|
|
8969
8973
|
};
|
|
8970
8974
|
|
|
8971
8975
|
/* export default */ const customizations_toolbarButtonsCustomization = (toolbarButtonsCustomization);
|
|
8976
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/customizations/segmentationToolbarCustomization.ts
|
|
8977
|
+
|
|
8978
|
+
|
|
8979
|
+
const {
|
|
8980
|
+
TOOLBAR_SECTIONS: segmentationToolbarCustomization_TOOLBAR_SECTIONS
|
|
8981
|
+
} = core_src/* .ToolbarService */.hx;
|
|
8982
|
+
const MIN_SEGMENTATION_DRAWING_RADIUS = 0.5;
|
|
8983
|
+
const MAX_SEGMENTATION_DRAWING_RADIUS = 99.5;
|
|
8984
|
+
const segmentationToolbarCustomization_setToolActiveToolbar = (/* unused pure expression or super */ null && ({
|
|
8985
|
+
commandName: 'setToolActiveToolbar',
|
|
8986
|
+
commandOptions: {
|
|
8987
|
+
toolGroupIds: ['default', 'mpr', 'SRToolGroup', 'volume3d']
|
|
8988
|
+
}
|
|
8989
|
+
}));
|
|
8990
|
+
const segmentationToolbarCustomization_callbacks = toolName => [{
|
|
8991
|
+
commandName: 'setViewportForToolConfiguration',
|
|
8992
|
+
commandOptions: {
|
|
8993
|
+
toolName
|
|
8994
|
+
}
|
|
8995
|
+
}];
|
|
8996
|
+
|
|
8997
|
+
/**
|
|
8998
|
+
* Segmentation editing toolbar buttons: the toolbox section containers plus
|
|
8999
|
+
* the labelmap / contour editing tools and utilities. These complement the
|
|
9000
|
+
* general buttons in `cornerstone.toolbarButtons`; together they are the
|
|
9001
|
+
* default button set for the segmentation mode, and modes such as basic /
|
|
9002
|
+
* longitudinal can pull them in via a customization (see
|
|
9003
|
+
* `segmentationEditing.jsonc`).
|
|
9004
|
+
*/
|
|
9005
|
+
const segmentationToolbarButtons = [
|
|
9006
|
+
// section containers for the nested toolboxes and toolbars
|
|
9007
|
+
{
|
|
9008
|
+
id: 'BrushTools',
|
|
9009
|
+
uiType: 'ohif.toolBoxButtonGroup',
|
|
9010
|
+
props: {
|
|
9011
|
+
buttonSection: true
|
|
9012
|
+
}
|
|
9013
|
+
}, {
|
|
9014
|
+
id: 'LabelMapUtilities',
|
|
9015
|
+
uiType: 'ohif.Toolbar',
|
|
9016
|
+
props: {
|
|
9017
|
+
buttonSection: true
|
|
9018
|
+
}
|
|
9019
|
+
}, {
|
|
9020
|
+
id: 'ContourUtilities',
|
|
9021
|
+
uiType: 'ohif.Toolbar',
|
|
9022
|
+
props: {
|
|
9023
|
+
buttonSection: true
|
|
9024
|
+
}
|
|
9025
|
+
}, {
|
|
9026
|
+
id: 'LabelMapTools',
|
|
9027
|
+
uiType: 'ohif.toolBoxButtonGroup',
|
|
9028
|
+
props: {
|
|
9029
|
+
buttonSection: true
|
|
9030
|
+
}
|
|
9031
|
+
}, {
|
|
9032
|
+
id: 'ContourTools',
|
|
9033
|
+
uiType: 'ohif.toolBoxButtonGroup',
|
|
9034
|
+
props: {
|
|
9035
|
+
buttonSection: true
|
|
9036
|
+
}
|
|
9037
|
+
},
|
|
9038
|
+
// tool defs
|
|
9039
|
+
{
|
|
9040
|
+
id: 'PlanarFreehandContourSegmentationTool',
|
|
9041
|
+
uiType: 'ohif.toolBoxButton',
|
|
9042
|
+
props: {
|
|
9043
|
+
icon: 'icon-tool-freehand-roi',
|
|
9044
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Freehand Segmentation'),
|
|
9045
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Freehand Segmentation'),
|
|
9046
|
+
evaluate: [{
|
|
9047
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9048
|
+
toolNames: ['PlanarFreehandContourSegmentationTool'],
|
|
9049
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9050
|
+
}, {
|
|
9051
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9052
|
+
segmentationRepresentationType: 'Contour'
|
|
9053
|
+
}],
|
|
9054
|
+
commands: [{
|
|
9055
|
+
commandName: 'setToolActiveToolbar',
|
|
9056
|
+
commandOptions: {
|
|
9057
|
+
bindings: [{
|
|
9058
|
+
mouseButton: 1 // Left Click
|
|
9059
|
+
}, {
|
|
9060
|
+
mouseButton: 1,
|
|
9061
|
+
// Left Click+Shift to create a hole
|
|
9062
|
+
modifierKey: 16 // Shift
|
|
9063
|
+
}]
|
|
9064
|
+
}
|
|
9065
|
+
}, {
|
|
9066
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9067
|
+
commandOptions: {
|
|
9068
|
+
segmentationRepresentationType: 'Contour'
|
|
9069
|
+
}
|
|
9070
|
+
}],
|
|
9071
|
+
options: [{
|
|
9072
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Interpolate Contours'),
|
|
9073
|
+
type: 'switch',
|
|
9074
|
+
id: 'planarFreehandInterpolateContours',
|
|
9075
|
+
value: false,
|
|
9076
|
+
commands: {
|
|
9077
|
+
commandName: 'setInterpolationToolConfiguration'
|
|
9078
|
+
}
|
|
9079
|
+
}]
|
|
9080
|
+
}
|
|
9081
|
+
}, {
|
|
9082
|
+
id: 'LivewireContourSegmentationTool',
|
|
9083
|
+
uiType: 'ohif.toolBoxButton',
|
|
9084
|
+
props: {
|
|
9085
|
+
icon: 'icon-tool-livewire',
|
|
9086
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Livewire Contour'),
|
|
9087
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Livewire Contour'),
|
|
9088
|
+
evaluate: [{
|
|
9089
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9090
|
+
toolNames: ['LivewireContourSegmentationTool'],
|
|
9091
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9092
|
+
}, {
|
|
9093
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9094
|
+
segmentationRepresentationType: 'Contour'
|
|
9095
|
+
}],
|
|
9096
|
+
commands: [{
|
|
9097
|
+
commandName: 'setToolActiveToolbar',
|
|
9098
|
+
commandOptions: {
|
|
9099
|
+
bindings: [{
|
|
9100
|
+
mouseButton: 1 // Left Click
|
|
9101
|
+
}, {
|
|
9102
|
+
mouseButton: 1,
|
|
9103
|
+
// Left Click+Shift to create a hole
|
|
9104
|
+
modifierKey: 16 // Shift
|
|
9105
|
+
}]
|
|
9106
|
+
}
|
|
9107
|
+
}, {
|
|
9108
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9109
|
+
commandOptions: {
|
|
9110
|
+
segmentationRepresentationType: 'Contour'
|
|
9111
|
+
}
|
|
9112
|
+
}],
|
|
9113
|
+
options: [{
|
|
9114
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Interpolate Contours'),
|
|
9115
|
+
type: 'switch',
|
|
9116
|
+
id: 'livewireInterpolateContours',
|
|
9117
|
+
value: false,
|
|
9118
|
+
commands: {
|
|
9119
|
+
commandName: 'setInterpolationToolConfiguration'
|
|
9120
|
+
}
|
|
9121
|
+
}]
|
|
9122
|
+
}
|
|
9123
|
+
}, {
|
|
9124
|
+
id: 'SplineContourSegmentationTool',
|
|
9125
|
+
uiType: 'ohif.toolBoxButton',
|
|
9126
|
+
props: {
|
|
9127
|
+
icon: 'icon-tool-spline-roi',
|
|
9128
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Spline Contour Segmentation Tool'),
|
|
9129
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Spline Contour Segmentation Tool'),
|
|
9130
|
+
evaluate: [{
|
|
9131
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9132
|
+
toolNames: ['CatmullRomSplineROI', 'LinearSplineROI', 'BSplineROI'],
|
|
9133
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9134
|
+
}, {
|
|
9135
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9136
|
+
segmentationRepresentationType: 'Contour'
|
|
9137
|
+
}],
|
|
9138
|
+
commands: [{
|
|
9139
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9140
|
+
commandOptions: {
|
|
9141
|
+
segmentationRepresentationType: 'Contour'
|
|
9142
|
+
}
|
|
9143
|
+
}],
|
|
9144
|
+
options: [{
|
|
9145
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Spline Type'),
|
|
9146
|
+
type: 'select',
|
|
9147
|
+
id: 'splineTypeSelect',
|
|
9148
|
+
value: 'CatmullRomSplineROI',
|
|
9149
|
+
values: [{
|
|
9150
|
+
id: 'CatmullRomSplineROI',
|
|
9151
|
+
value: 'CatmullRomSplineROI',
|
|
9152
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Catmull Rom Spline')
|
|
9153
|
+
}, {
|
|
9154
|
+
id: 'LinearSplineROI',
|
|
9155
|
+
value: 'LinearSplineROI',
|
|
9156
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Linear Spline')
|
|
9157
|
+
}, {
|
|
9158
|
+
id: 'BSplineROI',
|
|
9159
|
+
value: 'BSplineROI',
|
|
9160
|
+
label: i18next/* ["default"].t */.A.t('Buttons:B-Spline')
|
|
9161
|
+
}],
|
|
9162
|
+
commands: {
|
|
9163
|
+
commandName: 'setToolActiveToolbar',
|
|
9164
|
+
commandOptions: {
|
|
9165
|
+
bindings: [{
|
|
9166
|
+
mouseButton: 1 // Left Click
|
|
9167
|
+
}, {
|
|
9168
|
+
mouseButton: 1,
|
|
9169
|
+
// Left Click+Shift to create a hole
|
|
9170
|
+
modifierKey: 16 // Shift
|
|
9171
|
+
}]
|
|
9172
|
+
}
|
|
9173
|
+
}
|
|
9174
|
+
}, {
|
|
9175
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Simplified Spline'),
|
|
9176
|
+
type: 'switch',
|
|
9177
|
+
id: 'simplifiedSpline',
|
|
9178
|
+
value: true,
|
|
9179
|
+
commands: {
|
|
9180
|
+
commandName: 'setSimplifiedSplineForSplineContourSegmentationTool'
|
|
9181
|
+
}
|
|
9182
|
+
}, {
|
|
9183
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Interpolate Contours'),
|
|
9184
|
+
type: 'switch',
|
|
9185
|
+
id: 'splineInterpolateContours',
|
|
9186
|
+
value: false,
|
|
9187
|
+
commands: {
|
|
9188
|
+
commandName: 'setInterpolationToolConfiguration',
|
|
9189
|
+
commandOptions: {
|
|
9190
|
+
toolNames: ['CatmullRomSplineROI', 'LinearSplineROI', 'BSplineROI']
|
|
9191
|
+
}
|
|
9192
|
+
}
|
|
9193
|
+
}]
|
|
9194
|
+
}
|
|
9195
|
+
}, {
|
|
9196
|
+
id: 'SculptorTool',
|
|
9197
|
+
uiType: 'ohif.toolBoxButton',
|
|
9198
|
+
props: {
|
|
9199
|
+
icon: 'icon-tool-sculptor',
|
|
9200
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Sculptor Tool'),
|
|
9201
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Sculptor Tool'),
|
|
9202
|
+
evaluate: [{
|
|
9203
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9204
|
+
toolNames: ['SculptorTool'],
|
|
9205
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9206
|
+
}, {
|
|
9207
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9208
|
+
segmentationRepresentationType: 'Contour'
|
|
9209
|
+
}],
|
|
9210
|
+
commands: ['setToolActiveToolbar', {
|
|
9211
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9212
|
+
commandOptions: {
|
|
9213
|
+
segmentationRepresentationType: 'Contour'
|
|
9214
|
+
}
|
|
9215
|
+
}],
|
|
9216
|
+
options: [{
|
|
9217
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Dynamic Cursor Size'),
|
|
9218
|
+
type: 'switch',
|
|
9219
|
+
id: 'dynamicCursorSize',
|
|
9220
|
+
value: true,
|
|
9221
|
+
commands: {
|
|
9222
|
+
commandName: 'setDynamicCursorSizeForSculptorTool'
|
|
9223
|
+
}
|
|
9224
|
+
}]
|
|
9225
|
+
}
|
|
9226
|
+
}, {
|
|
9227
|
+
id: 'Brush',
|
|
9228
|
+
uiType: 'ohif.toolBoxButton',
|
|
9229
|
+
props: {
|
|
9230
|
+
icon: 'icon-tool-brush',
|
|
9231
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Brush'),
|
|
9232
|
+
evaluate: [{
|
|
9233
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9234
|
+
toolNames: ['CircularBrush', 'SphereBrush'],
|
|
9235
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9236
|
+
}, {
|
|
9237
|
+
name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius',
|
|
9238
|
+
radiusOptionId: 'brush-radius'
|
|
9239
|
+
}, {
|
|
9240
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9241
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9242
|
+
}],
|
|
9243
|
+
commands: {
|
|
9244
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9245
|
+
commandOptions: {
|
|
9246
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9247
|
+
}
|
|
9248
|
+
},
|
|
9249
|
+
options: [{
|
|
9250
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Radius (mm)'),
|
|
9251
|
+
id: 'brush-radius',
|
|
9252
|
+
type: 'range',
|
|
9253
|
+
explicitRunOnly: true,
|
|
9254
|
+
min: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9255
|
+
max: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
9256
|
+
step: 0.5,
|
|
9257
|
+
value: 25,
|
|
9258
|
+
commands: [{
|
|
9259
|
+
commandName: 'setBrushSize',
|
|
9260
|
+
commandOptions: {
|
|
9261
|
+
toolNames: ['CircularBrush', 'SphereBrush']
|
|
9262
|
+
}
|
|
9263
|
+
}]
|
|
9264
|
+
}, {
|
|
9265
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Shape'),
|
|
9266
|
+
type: 'radio',
|
|
9267
|
+
id: 'brush-mode',
|
|
9268
|
+
value: 'CircularBrush',
|
|
9269
|
+
values: [{
|
|
9270
|
+
value: 'CircularBrush',
|
|
9271
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Circle')
|
|
9272
|
+
}, {
|
|
9273
|
+
value: 'SphereBrush',
|
|
9274
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Sphere')
|
|
9275
|
+
}],
|
|
9276
|
+
commands: ['setToolActiveToolbar']
|
|
9277
|
+
}]
|
|
9278
|
+
}
|
|
9279
|
+
}, {
|
|
9280
|
+
id: 'InterpolateLabelmap',
|
|
9281
|
+
uiType: 'ohif.toolButton',
|
|
9282
|
+
props: {
|
|
9283
|
+
icon: 'actions-interpolate',
|
|
9284
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Interpolate Labelmap'),
|
|
9285
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Automatically fill in missing slices between drawn segments. Use brush or threshold tools on at least two slices, then click to interpolate across slices. Works in any direction. Volume must be reconstructable.'),
|
|
9286
|
+
evaluate: [{
|
|
9287
|
+
name: 'evaluate.cornerstone.segmentation'
|
|
9288
|
+
}, {
|
|
9289
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9290
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9291
|
+
}, {
|
|
9292
|
+
name: 'evaluate.displaySetIsReconstructable',
|
|
9293
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:The current viewport cannot handle interpolation.')
|
|
9294
|
+
}],
|
|
9295
|
+
commands: [{
|
|
9296
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9297
|
+
commandOptions: {
|
|
9298
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9299
|
+
}
|
|
9300
|
+
}, 'interpolateLabelmap']
|
|
9301
|
+
}
|
|
9302
|
+
}, {
|
|
9303
|
+
id: 'SegmentBidirectional',
|
|
9304
|
+
uiType: 'ohif.toolButton',
|
|
9305
|
+
props: {
|
|
9306
|
+
icon: 'actions-bidirectional',
|
|
9307
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Segment Bidirectional'),
|
|
9308
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Automatically detects the largest length and width across slices for the selected segment and displays a bidirectional measurement.'),
|
|
9309
|
+
evaluate: [{
|
|
9310
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9311
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9312
|
+
}, {
|
|
9313
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9314
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9315
|
+
}],
|
|
9316
|
+
commands: [{
|
|
9317
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9318
|
+
commandOptions: {
|
|
9319
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9320
|
+
}
|
|
9321
|
+
}, 'runSegmentBidirectional']
|
|
9322
|
+
}
|
|
9323
|
+
}, {
|
|
9324
|
+
id: 'RegionSegmentPlus',
|
|
9325
|
+
uiType: 'ohif.toolBoxButton',
|
|
9326
|
+
props: {
|
|
9327
|
+
icon: 'icon-tool-click-segment',
|
|
9328
|
+
label: i18next/* ["default"].t */.A.t('Buttons:One Click Segment'),
|
|
9329
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Detects segmentable regions with one click. Hover for visual feedback—click when a plus sign appears to auto-segment the lesion.'),
|
|
9330
|
+
evaluate: [{
|
|
9331
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9332
|
+
toolNames: ['RegionSegmentPlus'],
|
|
9333
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable this tool.')
|
|
9334
|
+
}, {
|
|
9335
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9336
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9337
|
+
}],
|
|
9338
|
+
commands: ['setToolActiveToolbar', {
|
|
9339
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9340
|
+
commandOptions: {
|
|
9341
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9342
|
+
}
|
|
9343
|
+
}]
|
|
9344
|
+
}
|
|
9345
|
+
}, {
|
|
9346
|
+
id: 'LabelmapSlicePropagation',
|
|
9347
|
+
uiType: 'ohif.toolBoxButton',
|
|
9348
|
+
props: {
|
|
9349
|
+
icon: 'icon-labelmap-slice-propagation',
|
|
9350
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Labelmap Assist'),
|
|
9351
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Toggle AI assistance for segmenting nearby slices. After drawing on a slice, scroll to preview predictions. Press Enter to accept or Esc to skip.'),
|
|
9352
|
+
evaluate: ['evaluate.cornerstoneTool.toggle', {
|
|
9353
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9354
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9355
|
+
}],
|
|
9356
|
+
listeners: {
|
|
9357
|
+
[core_src/* .ViewportGridService.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED */.sI.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED]: segmentationToolbarCustomization_callbacks('LabelmapSlicePropagation'),
|
|
9358
|
+
[core_src/* .ViewportGridService.EVENTS.VIEWPORTS_READY */.sI.EVENTS.VIEWPORTS_READY]: segmentationToolbarCustomization_callbacks('LabelmapSlicePropagation')
|
|
9359
|
+
},
|
|
9360
|
+
commands: [{
|
|
9361
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9362
|
+
commandOptions: {
|
|
9363
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9364
|
+
}
|
|
9365
|
+
}, 'toggleEnabledDisabledToolbar']
|
|
9366
|
+
}
|
|
9367
|
+
}, {
|
|
9368
|
+
id: 'MarkerLabelmap',
|
|
9369
|
+
uiType: 'ohif.toolBoxButton',
|
|
9370
|
+
props: {
|
|
9371
|
+
icon: 'icon-marker-labelmap',
|
|
9372
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Marker Guided Labelmap'),
|
|
9373
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Use include/exclude markers to guide AI (SAM) segmentation. Click to place markers, Enter to accept results, Esc to reject, and N to go to the next slice while keeping markers.'),
|
|
9374
|
+
evaluate: [{
|
|
9375
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9376
|
+
toolNames: ['MarkerLabelmap', 'MarkerInclude', 'MarkerExclude']
|
|
9377
|
+
}, {
|
|
9378
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9379
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9380
|
+
}],
|
|
9381
|
+
commands: ['setToolActiveToolbar', {
|
|
9382
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9383
|
+
commandOptions: {
|
|
9384
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9385
|
+
}
|
|
9386
|
+
}],
|
|
9387
|
+
listeners: {
|
|
9388
|
+
[core_src/* .ViewportGridService.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED */.sI.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED]: segmentationToolbarCustomization_callbacks('MarkerLabelmap'),
|
|
9389
|
+
[core_src/* .ViewportGridService.EVENTS.VIEWPORTS_READY */.sI.EVENTS.VIEWPORTS_READY]: segmentationToolbarCustomization_callbacks('MarkerLabelmap')
|
|
9390
|
+
},
|
|
9391
|
+
options: [{
|
|
9392
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Marker Mode'),
|
|
9393
|
+
type: 'radio',
|
|
9394
|
+
id: 'marker-mode',
|
|
9395
|
+
value: 'markerInclude',
|
|
9396
|
+
values: [{
|
|
9397
|
+
value: 'markerInclude',
|
|
9398
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Include')
|
|
9399
|
+
}, {
|
|
9400
|
+
value: 'markerExclude',
|
|
9401
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Exclude')
|
|
9402
|
+
}],
|
|
9403
|
+
commands: ({
|
|
9404
|
+
commandsManager,
|
|
9405
|
+
options
|
|
9406
|
+
}) => {
|
|
9407
|
+
const markerModeOption = options.find(option => option.id === 'marker-mode');
|
|
9408
|
+
if (markerModeOption.value === 'markerInclude') {
|
|
9409
|
+
commandsManager.run('setToolActive', {
|
|
9410
|
+
toolName: 'MarkerInclude'
|
|
9411
|
+
});
|
|
9412
|
+
} else {
|
|
9413
|
+
commandsManager.run('setToolActive', {
|
|
9414
|
+
toolName: 'MarkerExclude'
|
|
9415
|
+
});
|
|
9416
|
+
}
|
|
9417
|
+
}
|
|
9418
|
+
}, {
|
|
9419
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Clear Markers'),
|
|
9420
|
+
type: 'button',
|
|
9421
|
+
id: 'clear-markers',
|
|
9422
|
+
commands: 'clearMarkersForMarkerLabelmap'
|
|
9423
|
+
}]
|
|
9424
|
+
}
|
|
9425
|
+
}, {
|
|
9426
|
+
id: 'Eraser',
|
|
9427
|
+
uiType: 'ohif.toolBoxButton',
|
|
9428
|
+
props: {
|
|
9429
|
+
icon: 'icon-tool-eraser',
|
|
9430
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Eraser'),
|
|
9431
|
+
evaluate: [{
|
|
9432
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9433
|
+
toolNames: ['CircularEraser', 'SphereEraser']
|
|
9434
|
+
}, {
|
|
9435
|
+
name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius',
|
|
9436
|
+
radiusOptionId: 'eraser-radius'
|
|
9437
|
+
}, {
|
|
9438
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9439
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9440
|
+
}],
|
|
9441
|
+
options: [{
|
|
9442
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Radius (mm)'),
|
|
9443
|
+
id: 'eraser-radius',
|
|
9444
|
+
type: 'range',
|
|
9445
|
+
explicitRunOnly: true,
|
|
9446
|
+
min: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9447
|
+
max: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
9448
|
+
step: 0.5,
|
|
9449
|
+
value: 25,
|
|
9450
|
+
commands: {
|
|
9451
|
+
commandName: 'setBrushSize',
|
|
9452
|
+
commandOptions: {
|
|
9453
|
+
toolNames: ['CircularEraser', 'SphereEraser']
|
|
9454
|
+
}
|
|
9455
|
+
}
|
|
9456
|
+
}, {
|
|
9457
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Shape'),
|
|
9458
|
+
type: 'radio',
|
|
9459
|
+
id: 'eraser-mode',
|
|
9460
|
+
value: 'CircularEraser',
|
|
9461
|
+
values: [{
|
|
9462
|
+
value: 'CircularEraser',
|
|
9463
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Circle')
|
|
9464
|
+
}, {
|
|
9465
|
+
value: 'SphereEraser',
|
|
9466
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Sphere')
|
|
9467
|
+
}],
|
|
9468
|
+
commands: 'setToolActiveToolbar'
|
|
9469
|
+
}],
|
|
9470
|
+
commands: {
|
|
9471
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9472
|
+
commandOptions: {
|
|
9473
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9474
|
+
}
|
|
9475
|
+
}
|
|
9476
|
+
}
|
|
9477
|
+
}, {
|
|
9478
|
+
id: 'Threshold',
|
|
9479
|
+
uiType: 'ohif.toolBoxButton',
|
|
9480
|
+
props: {
|
|
9481
|
+
icon: 'icon-tool-threshold',
|
|
9482
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Threshold Tool'),
|
|
9483
|
+
evaluate: [{
|
|
9484
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9485
|
+
toolNames: ['ThresholdCircularBrush', 'ThresholdSphereBrush', 'ThresholdCircularBrushDynamic', 'ThresholdSphereBrushDynamic']
|
|
9486
|
+
}, {
|
|
9487
|
+
name: 'evaluate.cornerstone.segmentation.synchronizeDrawingRadius',
|
|
9488
|
+
radiusOptionId: 'threshold-radius'
|
|
9489
|
+
}, {
|
|
9490
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9491
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9492
|
+
}],
|
|
9493
|
+
commands: {
|
|
9494
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9495
|
+
commandOptions: {
|
|
9496
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9497
|
+
}
|
|
9498
|
+
},
|
|
9499
|
+
options: [{
|
|
9500
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Radius (mm)'),
|
|
9501
|
+
id: 'threshold-radius',
|
|
9502
|
+
type: 'range',
|
|
9503
|
+
explicitRunOnly: true,
|
|
9504
|
+
min: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9505
|
+
max: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
9506
|
+
step: 0.5,
|
|
9507
|
+
value: 25,
|
|
9508
|
+
commands: {
|
|
9509
|
+
commandName: 'setBrushSize',
|
|
9510
|
+
commandOptions: {
|
|
9511
|
+
toolNames: ['ThresholdCircularBrush', 'ThresholdSphereBrush', 'ThresholdCircularBrushDynamic', 'ThresholdSphereBrushDynamic']
|
|
9512
|
+
}
|
|
9513
|
+
}
|
|
9514
|
+
}, {
|
|
9515
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Shape'),
|
|
9516
|
+
type: 'radio',
|
|
9517
|
+
id: 'threshold-shape',
|
|
9518
|
+
value: 'ThresholdCircularBrush',
|
|
9519
|
+
values: [{
|
|
9520
|
+
value: 'ThresholdCircularBrush',
|
|
9521
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Circle')
|
|
9522
|
+
}, {
|
|
9523
|
+
value: 'ThresholdSphereBrush',
|
|
9524
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Sphere')
|
|
9525
|
+
}],
|
|
9526
|
+
commands: ({
|
|
9527
|
+
value,
|
|
9528
|
+
commandsManager,
|
|
9529
|
+
options
|
|
9530
|
+
}) => {
|
|
9531
|
+
const optionsDynamic = options.find(option => option.id === 'dynamic-mode');
|
|
9532
|
+
if (optionsDynamic.value === 'ThresholdDynamic') {
|
|
9533
|
+
commandsManager.run('setToolActive', {
|
|
9534
|
+
toolName: value === 'ThresholdCircularBrush' ? 'ThresholdCircularBrushDynamic' : 'ThresholdSphereBrushDynamic'
|
|
9535
|
+
});
|
|
9536
|
+
} else {
|
|
9537
|
+
commandsManager.run('setToolActive', {
|
|
9538
|
+
toolName: value
|
|
9539
|
+
});
|
|
9540
|
+
}
|
|
9541
|
+
}
|
|
9542
|
+
}, {
|
|
9543
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Threshold'),
|
|
9544
|
+
type: 'radio',
|
|
9545
|
+
id: 'dynamic-mode',
|
|
9546
|
+
value: 'ThresholdDynamic',
|
|
9547
|
+
values: [{
|
|
9548
|
+
value: 'ThresholdDynamic',
|
|
9549
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Dynamic')
|
|
9550
|
+
}, {
|
|
9551
|
+
value: 'ThresholdRange',
|
|
9552
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Range')
|
|
9553
|
+
}],
|
|
9554
|
+
commands: ({
|
|
9555
|
+
value,
|
|
9556
|
+
commandsManager,
|
|
9557
|
+
options
|
|
9558
|
+
}) => {
|
|
9559
|
+
const thresholdRangeOption = options.find(option => option.id === 'threshold-shape');
|
|
9560
|
+
if (value === 'ThresholdDynamic') {
|
|
9561
|
+
commandsManager.run('setToolActiveToolbar', {
|
|
9562
|
+
toolName: thresholdRangeOption.value === 'ThresholdCircularBrush' ? 'ThresholdCircularBrushDynamic' : 'ThresholdSphereBrushDynamic'
|
|
9563
|
+
});
|
|
9564
|
+
} else {
|
|
9565
|
+
commandsManager.run('setToolActiveToolbar', {
|
|
9566
|
+
toolName: thresholdRangeOption.value
|
|
9567
|
+
});
|
|
9568
|
+
const thresholdRangeValue = options.find(option => option.id === 'threshold-range').value;
|
|
9569
|
+
commandsManager.run('setThresholdRange', {
|
|
9570
|
+
toolNames: ['ThresholdCircularBrush', 'ThresholdSphereBrush'],
|
|
9571
|
+
value: thresholdRangeValue
|
|
9572
|
+
});
|
|
9573
|
+
}
|
|
9574
|
+
}
|
|
9575
|
+
}, {
|
|
9576
|
+
name: 'ThresholdRange',
|
|
9577
|
+
type: 'double-range',
|
|
9578
|
+
id: 'threshold-range',
|
|
9579
|
+
min: -1000,
|
|
9580
|
+
max: 1000,
|
|
9581
|
+
step: 1,
|
|
9582
|
+
value: [50, 600],
|
|
9583
|
+
condition: ({
|
|
9584
|
+
options
|
|
9585
|
+
}) => options.find(option => option.id === 'dynamic-mode').value === 'ThresholdRange',
|
|
9586
|
+
commands: {
|
|
9587
|
+
commandName: 'setThresholdRange',
|
|
9588
|
+
commandOptions: {
|
|
9589
|
+
toolNames: ['ThresholdCircularBrush', 'ThresholdSphereBrush']
|
|
9590
|
+
}
|
|
9591
|
+
}
|
|
9592
|
+
}]
|
|
9593
|
+
}
|
|
9594
|
+
}, {
|
|
9595
|
+
id: 'Shapes',
|
|
9596
|
+
uiType: 'ohif.toolBoxButton',
|
|
9597
|
+
props: {
|
|
9598
|
+
icon: 'icon-tool-shape',
|
|
9599
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Shapes'),
|
|
9600
|
+
evaluate: [{
|
|
9601
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9602
|
+
toolNames: ['CircleScissor', 'SphereScissor', 'RectangleScissor'],
|
|
9603
|
+
disabledText: i18next/* ["default"].t */.A.t('Buttons:Create new segmentation to enable shapes tool.')
|
|
9604
|
+
}, {
|
|
9605
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9606
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9607
|
+
}],
|
|
9608
|
+
commands: {
|
|
9609
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9610
|
+
commandOptions: {
|
|
9611
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9612
|
+
}
|
|
9613
|
+
},
|
|
9614
|
+
options: [{
|
|
9615
|
+
name: i18next/* ["default"].t */.A.t('Buttons:Shape'),
|
|
9616
|
+
type: 'radio',
|
|
9617
|
+
value: 'CircleScissor',
|
|
9618
|
+
id: 'shape-mode',
|
|
9619
|
+
values: [{
|
|
9620
|
+
value: 'CircleScissor',
|
|
9621
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Circle')
|
|
9622
|
+
}, {
|
|
9623
|
+
value: 'SphereScissor',
|
|
9624
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Sphere')
|
|
9625
|
+
}, {
|
|
9626
|
+
value: 'RectangleScissor',
|
|
9627
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Rectangle')
|
|
9628
|
+
}],
|
|
9629
|
+
commands: 'setToolActiveToolbar'
|
|
9630
|
+
}]
|
|
9631
|
+
}
|
|
9632
|
+
}, {
|
|
9633
|
+
id: 'SimplifyContours',
|
|
9634
|
+
uiType: 'ohif.toolButton',
|
|
9635
|
+
props: {
|
|
9636
|
+
icon: 'actions-simplify',
|
|
9637
|
+
label: 'Simplify Contours',
|
|
9638
|
+
tooltip: 'Simplify Contours',
|
|
9639
|
+
commands: ['toggleActiveSegmentationUtility'],
|
|
9640
|
+
evaluate: [{
|
|
9641
|
+
name: 'cornerstone.isActiveSegmentationUtility'
|
|
9642
|
+
}],
|
|
9643
|
+
options: 'cornerstone.SimplifyContourOptions'
|
|
9644
|
+
}
|
|
9645
|
+
}, {
|
|
9646
|
+
id: 'SmoothContours',
|
|
9647
|
+
uiType: 'ohif.toolButton',
|
|
9648
|
+
props: {
|
|
9649
|
+
icon: 'actions-smooth',
|
|
9650
|
+
label: 'Smooth Contours',
|
|
9651
|
+
tooltip: 'Smooth Contours',
|
|
9652
|
+
commands: ['toggleActiveSegmentationUtility'],
|
|
9653
|
+
evaluate: [{
|
|
9654
|
+
name: 'cornerstone.isActiveSegmentationUtility'
|
|
9655
|
+
}],
|
|
9656
|
+
options: 'cornerstone.SmoothContoursOptions'
|
|
9657
|
+
}
|
|
9658
|
+
}, {
|
|
9659
|
+
id: 'LogicalContourOperations',
|
|
9660
|
+
uiType: 'ohif.toolButton',
|
|
9661
|
+
props: {
|
|
9662
|
+
icon: 'actions-combine',
|
|
9663
|
+
label: 'Combine Contours',
|
|
9664
|
+
tooltip: 'Combine Contours',
|
|
9665
|
+
commands: ['toggleActiveSegmentationUtility'],
|
|
9666
|
+
evaluate: [{
|
|
9667
|
+
name: 'cornerstone.isActiveSegmentationUtility'
|
|
9668
|
+
}],
|
|
9669
|
+
options: 'cornerstone.LogicalContourOperationsOptions'
|
|
9670
|
+
}
|
|
9671
|
+
}, {
|
|
9672
|
+
id: 'LabelMapEditWithContour',
|
|
9673
|
+
uiType: 'ohif.toolBoxButton',
|
|
9674
|
+
props: {
|
|
9675
|
+
icon: 'tool-labelmap-edit-with-contour',
|
|
9676
|
+
label: i18next/* ["default"].t */.A.t('Buttons:Labelmap Edit with Contour Tool'),
|
|
9677
|
+
tooltip: i18next/* ["default"].t */.A.t('Buttons:Labelmap Edit with Contour Tool'),
|
|
9678
|
+
commands: ['setToolActiveToolbar', {
|
|
9679
|
+
commandName: 'activateSelectedSegmentationOfType',
|
|
9680
|
+
commandOptions: {
|
|
9681
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9682
|
+
}
|
|
9683
|
+
}],
|
|
9684
|
+
evaluate: [{
|
|
9685
|
+
name: 'evaluate.cornerstone.segmentation',
|
|
9686
|
+
toolNames: ['LabelMapEditWithContour'],
|
|
9687
|
+
disabledText: 'Create new segmentation to enable this tool.'
|
|
9688
|
+
}, {
|
|
9689
|
+
name: 'evaluate.cornerstone.hasSegmentationOfType',
|
|
9690
|
+
segmentationRepresentationType: 'Labelmap'
|
|
9691
|
+
}]
|
|
9692
|
+
}
|
|
9693
|
+
}];
|
|
9694
|
+
|
|
9695
|
+
/**
|
|
9696
|
+
* The toolbox / utilities section wiring for segmentation editing. These are
|
|
9697
|
+
* the sections rendered by the `panelSegmentationWithTools*` panels, so any
|
|
9698
|
+
* mode that shows those panels can merge this block into its toolbar sections.
|
|
9699
|
+
*/
|
|
9700
|
+
const segmentationToolboxSections = {
|
|
9701
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.labelMapSegmentationToolbox]: ['LabelMapTools'],
|
|
9702
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.contourSegmentationToolbox]: ['ContourTools'],
|
|
9703
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.labelMapSegmentationUtilities]: ['LabelMapUtilities'],
|
|
9704
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.contourSegmentationUtilities]: ['ContourUtilities'],
|
|
9705
|
+
LabelMapTools: ['LabelmapSlicePropagation', 'BrushTools', 'MarkerLabelmap', 'RegionSegmentPlus', 'Shapes', 'LabelMapEditWithContour'],
|
|
9706
|
+
ContourTools: ['PlanarFreehandContourSegmentationTool', 'SculptorTool', 'SplineContourSegmentationTool', 'LivewireContourSegmentationTool'],
|
|
9707
|
+
LabelMapUtilities: ['InterpolateLabelmap', 'SegmentBidirectional'],
|
|
9708
|
+
ContourUtilities: ['LogicalContourOperations', 'SimplifyContours', 'SmoothContours'],
|
|
9709
|
+
BrushTools: ['Brush', 'Eraser', 'Threshold']
|
|
9710
|
+
};
|
|
9711
|
+
|
|
9712
|
+
/**
|
|
9713
|
+
* The segmentation mode's main toolbar layout (primary bar and viewport
|
|
9714
|
+
* action corners). Kept separate from the toolbox wiring above so other modes
|
|
9715
|
+
* can adopt segmentation editing without adopting this mode layout.
|
|
9716
|
+
*/
|
|
9717
|
+
const segmentationModeToolbarSections = {
|
|
9718
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.primary]: ['WindowLevel', 'Pan', 'Zoom', 'TrackballRotate', 'Capture', 'Layout', 'Crosshairs', 'MoreTools'],
|
|
9719
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.viewportActionMenu.topLeft]: ['orientationMenu', 'dataOverlayMenu'],
|
|
9720
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.viewportActionMenu.bottomMiddle]: ['AdvancedRenderingControls'],
|
|
9721
|
+
AdvancedRenderingControls: ['windowLevelMenuEmbedded', 'voiManualControlMenu', 'Colorbar', 'opacityMenu', 'thresholdMenu'],
|
|
9722
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.viewportActionMenu.topRight]: ['modalityLoadBadge', 'trackingStatus', 'navigationComponent'],
|
|
9723
|
+
[segmentationToolbarCustomization_TOOLBAR_SECTIONS.viewportActionMenu.bottomLeft]: ['windowLevelMenu'],
|
|
9724
|
+
MoreTools: ['Reset', 'rotate-right', 'flipHorizontal', 'ReferenceLines', 'ImageOverlayViewer', 'StackScroll', 'invert', 'Cine', 'Magnify', 'TagBrowser']
|
|
9725
|
+
};
|
|
9726
|
+
|
|
9727
|
+
/**
|
|
9728
|
+
* Segmentation capability packs registered (at default scope) by the
|
|
9729
|
+
* cornerstone extension. These are pure "what can exist" packs and carry no
|
|
9730
|
+
* mode identity:
|
|
9731
|
+
* - `cornerstone.segmentationToolbarButtons` – segmentation editing button definitions
|
|
9732
|
+
* - `cornerstone.segmentationToolbarSections` – toolbox/utilities section wiring
|
|
9733
|
+
* - `cornerstone.segmentationModeToolbarSections` – a reusable segmentation-mode toolbar layout
|
|
9734
|
+
*
|
|
9735
|
+
* Modes compose these by name in their own `toolbarButtons` /
|
|
9736
|
+
* `toolbarSections` instance arrays; `?customization=` modules extend the
|
|
9737
|
+
* result through the `mode` phase.
|
|
9738
|
+
*/
|
|
9739
|
+
const segmentationToolbarCustomization = {
|
|
9740
|
+
'cornerstone.segmentationToolbarButtons': segmentationToolbarButtons,
|
|
9741
|
+
'cornerstone.segmentationToolbarSections': segmentationToolboxSections,
|
|
9742
|
+
'cornerstone.segmentationModeToolbarSections': segmentationModeToolbarSections
|
|
9743
|
+
};
|
|
9744
|
+
|
|
9745
|
+
/* export default */ const customizations_segmentationToolbarCustomization = (segmentationToolbarCustomization);
|
|
9746
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/customizations/toolGroupToolsCustomization.ts
|
|
9747
|
+
|
|
9748
|
+
|
|
9749
|
+
|
|
9750
|
+
/**
|
|
9751
|
+
* Reusable tool group "capability blocks", registered as default
|
|
9752
|
+
* customizations so modes and `?customization=` JSON modules can add them to
|
|
9753
|
+
* a tool group by name via a mode's `toolGroupAdditions` customization, e.g.
|
|
9754
|
+
*
|
|
9755
|
+
* "mode": {
|
|
9756
|
+
* "basic": {
|
|
9757
|
+
* "toolGroupAdditions": {
|
|
9758
|
+
* "default": { "$push": [{ "$reference": "cornerstone.segmentationTools" }] }
|
|
9759
|
+
* }
|
|
9760
|
+
* }
|
|
9761
|
+
* }
|
|
9762
|
+
*
|
|
9763
|
+
* Each block is a `{ active/passive/enabled/disabled }` object suitable for
|
|
9764
|
+
* `toolGroupService.addToolsToToolGroup`.
|
|
9765
|
+
*/
|
|
9766
|
+
function getToolGroupToolsCustomization({
|
|
9767
|
+
commandsManager
|
|
9768
|
+
}) {
|
|
9769
|
+
const brushInstances = [{
|
|
9770
|
+
toolName: 'CircularBrush',
|
|
9771
|
+
parentTool: 'Brush',
|
|
9772
|
+
configuration: {
|
|
9773
|
+
activeStrategy: 'FILL_INSIDE_CIRCLE',
|
|
9774
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9775
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS
|
|
9776
|
+
}
|
|
9777
|
+
}, {
|
|
9778
|
+
toolName: 'CircularEraser',
|
|
9779
|
+
parentTool: 'Brush',
|
|
9780
|
+
configuration: {
|
|
9781
|
+
activeStrategy: 'ERASE_INSIDE_CIRCLE',
|
|
9782
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9783
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS
|
|
9784
|
+
}
|
|
9785
|
+
}, {
|
|
9786
|
+
toolName: 'SphereBrush',
|
|
9787
|
+
parentTool: 'Brush',
|
|
9788
|
+
configuration: {
|
|
9789
|
+
activeStrategy: 'FILL_INSIDE_SPHERE',
|
|
9790
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9791
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS
|
|
9792
|
+
}
|
|
9793
|
+
}, {
|
|
9794
|
+
toolName: 'SphereEraser',
|
|
9795
|
+
parentTool: 'Brush',
|
|
9796
|
+
configuration: {
|
|
9797
|
+
activeStrategy: 'ERASE_INSIDE_SPHERE',
|
|
9798
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9799
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS
|
|
9800
|
+
}
|
|
9801
|
+
}, {
|
|
9802
|
+
toolName: 'ThresholdCircularBrush',
|
|
9803
|
+
parentTool: 'Brush',
|
|
9804
|
+
configuration: {
|
|
9805
|
+
activeStrategy: 'THRESHOLD_INSIDE_CIRCLE',
|
|
9806
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9807
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS
|
|
9808
|
+
}
|
|
9809
|
+
}, {
|
|
9810
|
+
toolName: 'ThresholdSphereBrush',
|
|
9811
|
+
parentTool: 'Brush',
|
|
9812
|
+
configuration: {
|
|
9813
|
+
activeStrategy: 'THRESHOLD_INSIDE_SPHERE',
|
|
9814
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9815
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS
|
|
9816
|
+
}
|
|
9817
|
+
}, {
|
|
9818
|
+
toolName: 'ThresholdCircularBrushDynamic',
|
|
9819
|
+
parentTool: 'Brush',
|
|
9820
|
+
configuration: {
|
|
9821
|
+
activeStrategy: 'THRESHOLD_INSIDE_CIRCLE',
|
|
9822
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9823
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
9824
|
+
threshold: {
|
|
9825
|
+
isDynamic: true,
|
|
9826
|
+
dynamicRadius: 3
|
|
9827
|
+
}
|
|
9828
|
+
}
|
|
9829
|
+
}, {
|
|
9830
|
+
toolName: 'ThresholdSphereBrushDynamic',
|
|
9831
|
+
parentTool: 'Brush',
|
|
9832
|
+
configuration: {
|
|
9833
|
+
activeStrategy: 'THRESHOLD_INSIDE_SPHERE',
|
|
9834
|
+
minRadius: MIN_SEGMENTATION_DRAWING_RADIUS,
|
|
9835
|
+
maxRadius: MAX_SEGMENTATION_DRAWING_RADIUS,
|
|
9836
|
+
threshold: {
|
|
9837
|
+
isDynamic: true,
|
|
9838
|
+
dynamicRadius: 3
|
|
9839
|
+
}
|
|
9840
|
+
}
|
|
9841
|
+
}];
|
|
9842
|
+
const splineInstances = [{
|
|
9843
|
+
toolName: 'CatmullRomSplineROI',
|
|
9844
|
+
parentTool: initCornerstoneTools_toolNames.SplineContourSegmentation,
|
|
9845
|
+
configuration: {
|
|
9846
|
+
spline: {
|
|
9847
|
+
type: 'CATMULLROM',
|
|
9848
|
+
enableTwoPointPreview: true
|
|
9849
|
+
}
|
|
9850
|
+
}
|
|
9851
|
+
}, {
|
|
9852
|
+
toolName: 'LinearSplineROI',
|
|
9853
|
+
parentTool: initCornerstoneTools_toolNames.SplineContourSegmentation,
|
|
9854
|
+
configuration: {
|
|
9855
|
+
spline: {
|
|
9856
|
+
type: 'LINEAR',
|
|
9857
|
+
enableTwoPointPreview: true
|
|
9858
|
+
}
|
|
9859
|
+
}
|
|
9860
|
+
}, {
|
|
9861
|
+
toolName: 'BSplineROI',
|
|
9862
|
+
parentTool: initCornerstoneTools_toolNames.SplineContourSegmentation,
|
|
9863
|
+
configuration: {
|
|
9864
|
+
spline: {
|
|
9865
|
+
type: 'BSPLINE',
|
|
9866
|
+
enableTwoPointPreview: true
|
|
9867
|
+
}
|
|
9868
|
+
}
|
|
9869
|
+
}];
|
|
9870
|
+
return {
|
|
9871
|
+
/**
|
|
9872
|
+
* The segmentation editing tools (labelmap brushes/scissors and contour
|
|
9873
|
+
* segmentation tools), matching the buttons in
|
|
9874
|
+
* `cornerstone.segmentationToolbarButtons`.
|
|
9875
|
+
*/
|
|
9876
|
+
'cornerstone.segmentationTools': {
|
|
9877
|
+
passive: [...brushInstances, {
|
|
9878
|
+
toolName: initCornerstoneTools_toolNames.LabelmapSlicePropagation
|
|
9879
|
+
}, {
|
|
9880
|
+
toolName: initCornerstoneTools_toolNames.MarkerLabelmap
|
|
9881
|
+
}, {
|
|
9882
|
+
toolName: initCornerstoneTools_toolNames.RegionSegmentPlus
|
|
9883
|
+
}, {
|
|
9884
|
+
toolName: initCornerstoneTools_toolNames.LabelMapEditWithContourTool
|
|
9885
|
+
}, {
|
|
9886
|
+
toolName: initCornerstoneTools_toolNames.SegmentSelect
|
|
9887
|
+
}, {
|
|
9888
|
+
toolName: initCornerstoneTools_toolNames.CircleScissors
|
|
9889
|
+
}, {
|
|
9890
|
+
toolName: initCornerstoneTools_toolNames.RectangleScissors
|
|
9891
|
+
}, {
|
|
9892
|
+
toolName: initCornerstoneTools_toolNames.SphereScissors
|
|
9893
|
+
}, {
|
|
9894
|
+
toolName: initCornerstoneTools_toolNames.LivewireContourSegmentation
|
|
9895
|
+
}, {
|
|
9896
|
+
toolName: initCornerstoneTools_toolNames.SculptorTool
|
|
9897
|
+
}, ...splineInstances]
|
|
9898
|
+
},
|
|
9899
|
+
/**
|
|
9900
|
+
* The measurement/annotation tools, matching the `MeasurementTools`
|
|
9901
|
+
* buttons in `cornerstone.toolbarButtons`. Useful for adding annotations
|
|
9902
|
+
* to modes (such as segmentation) whose tool groups omit them.
|
|
9903
|
+
*/
|
|
9904
|
+
'cornerstone.annotationTools': {
|
|
9905
|
+
passive: [{
|
|
9906
|
+
toolName: initCornerstoneTools_toolNames.Length
|
|
9907
|
+
}, {
|
|
9908
|
+
toolName: initCornerstoneTools_toolNames.ArrowAnnotate,
|
|
9909
|
+
configuration: {
|
|
9910
|
+
getTextCallback: (callback, eventDetails) => {
|
|
9911
|
+
commandsManager.runCommand('arrowTextCallback', {
|
|
9912
|
+
callback,
|
|
9913
|
+
eventDetails
|
|
9914
|
+
});
|
|
9915
|
+
},
|
|
9916
|
+
changeTextCallback: (data, eventDetails, callback) => {
|
|
9917
|
+
commandsManager.runCommand('arrowTextCallback', {
|
|
9918
|
+
callback,
|
|
9919
|
+
data,
|
|
9920
|
+
eventDetails
|
|
9921
|
+
});
|
|
9922
|
+
}
|
|
9923
|
+
}
|
|
9924
|
+
}, {
|
|
9925
|
+
toolName: initCornerstoneTools_toolNames.Bidirectional
|
|
9926
|
+
}, {
|
|
9927
|
+
toolName: initCornerstoneTools_toolNames.Probe
|
|
9928
|
+
}, {
|
|
9929
|
+
toolName: initCornerstoneTools_toolNames.DragProbe
|
|
9930
|
+
}, {
|
|
9931
|
+
toolName: initCornerstoneTools_toolNames.EllipticalROI
|
|
9932
|
+
}, {
|
|
9933
|
+
toolName: initCornerstoneTools_toolNames.CircleROI
|
|
9934
|
+
}, {
|
|
9935
|
+
toolName: initCornerstoneTools_toolNames.RectangleROI
|
|
9936
|
+
}, {
|
|
9937
|
+
toolName: initCornerstoneTools_toolNames.Angle
|
|
9938
|
+
}, {
|
|
9939
|
+
toolName: initCornerstoneTools_toolNames.CobbAngle
|
|
9940
|
+
}, {
|
|
9941
|
+
toolName: initCornerstoneTools_toolNames.SplineROI
|
|
9942
|
+
}, {
|
|
9943
|
+
toolName: initCornerstoneTools_toolNames.LivewireContour
|
|
9944
|
+
}]
|
|
9945
|
+
}
|
|
9946
|
+
};
|
|
9947
|
+
}
|
|
9948
|
+
/* export default */ const toolGroupToolsCustomization = (getToolGroupToolsCustomization);
|
|
8972
9949
|
// EXTERNAL MODULE: ../../../node_modules/react-dropzone/dist/es/index.js + 4 modules
|
|
8973
9950
|
var dist_es = __webpack_require__(2721);
|
|
8974
9951
|
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
@@ -9784,6 +10761,8 @@ function getViewportScrollbarCustomization() {
|
|
|
9784
10761
|
|
|
9785
10762
|
|
|
9786
10763
|
|
|
10764
|
+
|
|
10765
|
+
|
|
9787
10766
|
function getCustomizationModule({
|
|
9788
10767
|
commandsManager,
|
|
9789
10768
|
servicesManager,
|
|
@@ -9807,6 +10786,10 @@ function getCustomizationModule({
|
|
|
9807
10786
|
...modalityColorMapCustomization,
|
|
9808
10787
|
...windowLevelPresetsCustomization,
|
|
9809
10788
|
...customizations_toolbarButtonsCustomization,
|
|
10789
|
+
...customizations_segmentationToolbarCustomization,
|
|
10790
|
+
...toolGroupToolsCustomization({
|
|
10791
|
+
commandsManager
|
|
10792
|
+
}),
|
|
9810
10793
|
...miscCustomization,
|
|
9811
10794
|
...captureViewportModalCustomization,
|
|
9812
10795
|
...viewportDownloadWarningCustomization,
|