@ohif/app 3.0.0 → 3.5.0
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/151.bundle.07bac9172580a60fae7a.js +2579 -0
- package/dist/192.bundle.62be5f0ef9705a485071.js +894 -0
- package/dist/199.bundle.2286f24cf0a068e7f50c.js +480 -0
- package/dist/205.bundle.39e6c847d618ad2b1b7a.js +62 -0
- package/dist/208.bundle.23748a85dfdc79c05d3a.js +864 -0
- package/dist/270.bundle.abbdb5348274bae3e8bc.js +23906 -0
- package/dist/283.bundle.33f99a75a5e2d9333da2.js +2939 -0
- package/dist/295.bundle.5105ce962be15c92484d.js +48 -0
- package/dist/331.bundle.7ac7b142d249d14fd99e.js +73034 -0
- package/dist/351.bundle.c5d7279ef42e30f61e08.js +1471 -0
- package/dist/351.css +3 -0
- package/dist/36785fbd89b0e17f6099.wasm +0 -0
- package/dist/381.bundle.0905e683605fcbc0895f.js +1009 -0
- package/dist/404.bundle.0f7a500421f246153d89.js +706 -0
- package/dist/50.bundle.4cb103cd20f5ffccf927.js +324 -0
- package/dist/5004fdc02f329ce53b69.wasm +0 -0
- package/dist/531.bundle.1bc152c87c7e2e987d2b.js +5935 -0
- package/dist/55.bundle.a5a215e13a8511f7aee7.js +685 -0
- package/dist/55.css +3 -0
- package/dist/569.bundle.d147c0aa0604f8ea2094.js +514 -0
- package/dist/581.bundle.646c89c5c3e3ee096363.js +508 -0
- package/dist/606.bundle.5d876f5f3dd8287f0a28.js +4939 -0
- package/dist/610.min.worker.js +2 -0
- package/dist/610.min.worker.js.map +1 -0
- package/dist/616.bundle.bec4736d8c9513e62856.js +686 -0
- package/dist/62ab5d58a2bea7b5a1dc.wasm +0 -0
- package/dist/642.bundle.030d908e22c8ff5611f3.js +169 -0
- package/dist/65916ef3def695744bda.wasm +0 -0
- package/dist/664.bundle.4792c88ae0d6d4b5ed13.js +901 -0
- package/dist/707.bundle.0a74aa3e61ed002eb3c6.js +9049 -0
- package/dist/707.css +1 -0
- package/dist/728.bundle.d13856835357400fef82.js +26221 -0
- package/dist/744.bundle.53b07e48e07a11e920ac.js +2355 -0
- package/dist/75788f12450d4c5ed494.wasm +0 -0
- package/dist/75a0c2dfe07b824c7d21.wasm +0 -0
- package/dist/780.bundle.f60ac1906e0ae080dee8.js +4769 -0
- package/dist/790.bundle.b4df2c5d78a2a565b150.js +454 -0
- package/dist/799.bundle.3fff638815e355b0bdfd.js +271 -0
- package/dist/806.css +1 -0
- package/dist/82.bundle.a24015533196e05d190e.js +6104 -0
- package/dist/917.bundle.a094ae9e9de6df4119ae.js +196 -0
- package/dist/926.bundle.dbc9d0e591cb9217fda2.js +72552 -0
- package/dist/935.bundle.deeffff0e4f7b528e3c3.js +1849 -0
- package/dist/945.min.worker.js +2 -0
- package/dist/945.min.worker.js.map +1 -0
- package/dist/953.bundle.c14d9eb6400f697019ee.js +449 -0
- package/dist/973.bundle.4100cf103686b64938d1.js +261 -0
- package/dist/976.bundle.2720eb892514e1818018.js +2725 -0
- package/dist/984.bundle.157fc66ea5040e1364af.js +1842 -0
- package/dist/_headers +6 -0
- package/dist/_redirects +6 -0
- package/dist/app-config.js +215 -0
- package/dist/app.bundle.253eeb2a7ee986e89c50.js +154621 -0
- package/dist/app.bundle.css +21 -0
- package/dist/assets/android-chrome-144x144.png +0 -0
- package/dist/assets/android-chrome-192x192.png +0 -0
- package/dist/assets/android-chrome-256x256.png +0 -0
- package/dist/assets/android-chrome-36x36.png +0 -0
- package/dist/assets/android-chrome-384x384.png +0 -0
- package/dist/assets/android-chrome-48x48.png +0 -0
- package/dist/assets/android-chrome-512x512.png +0 -0
- package/dist/assets/android-chrome-72x72.png +0 -0
- package/dist/assets/android-chrome-96x96.png +0 -0
- package/dist/assets/apple-touch-icon-1024x1024.png +0 -0
- package/dist/assets/apple-touch-icon-114x114.png +0 -0
- package/dist/assets/apple-touch-icon-120x120.png +0 -0
- package/dist/assets/apple-touch-icon-144x144.png +0 -0
- package/dist/assets/apple-touch-icon-152x152.png +0 -0
- package/dist/assets/apple-touch-icon-167x167.png +0 -0
- package/dist/assets/apple-touch-icon-180x180.png +0 -0
- package/dist/assets/apple-touch-icon-57x57.png +0 -0
- package/dist/assets/apple-touch-icon-60x60.png +0 -0
- package/dist/assets/apple-touch-icon-72x72.png +0 -0
- package/dist/assets/apple-touch-icon-76x76.png +0 -0
- package/dist/assets/apple-touch-icon-precomposed.png +0 -0
- package/dist/assets/apple-touch-icon.png +0 -0
- package/dist/assets/apple-touch-startup-image-1182x2208.png +0 -0
- package/dist/assets/apple-touch-startup-image-1242x2148.png +0 -0
- package/dist/assets/apple-touch-startup-image-1496x2048.png +0 -0
- package/dist/assets/apple-touch-startup-image-1536x2008.png +0 -0
- package/dist/assets/apple-touch-startup-image-320x460.png +0 -0
- package/dist/assets/apple-touch-startup-image-640x1096.png +0 -0
- package/dist/assets/apple-touch-startup-image-640x920.png +0 -0
- package/dist/assets/apple-touch-startup-image-748x1024.png +0 -0
- package/dist/assets/apple-touch-startup-image-750x1294.png +0 -0
- package/dist/assets/apple-touch-startup-image-768x1004.png +0 -0
- package/dist/assets/browserconfig.xml +12 -0
- package/dist/assets/coast-228x228.png +0 -0
- package/dist/assets/favicon-16x16.png +0 -0
- package/dist/assets/favicon-32x32.png +0 -0
- package/dist/assets/favicon.ico +0 -0
- package/dist/assets/firefox_app_128x128.png +0 -0
- package/dist/assets/firefox_app_512x512.png +0 -0
- package/dist/assets/firefox_app_60x60.png +0 -0
- package/dist/assets/manifest.webapp +14 -0
- package/dist/assets/mstile-144x144.png +0 -0
- package/dist/assets/mstile-150x150.png +0 -0
- package/dist/assets/mstile-310x150.png +0 -0
- package/dist/assets/mstile-310x310.png +0 -0
- package/dist/assets/mstile-70x70.png +0 -0
- package/dist/assets/yandex-browser-50x50.png +0 -0
- package/dist/assets/yandex-browser-manifest.json +9 -0
- package/dist/b6b803111e2d06a825bd.wasm +0 -0
- package/dist/c22b37c3488e1d6c3aa4.wasm +0 -0
- package/dist/cornerstoneDICOMImageLoader.min.js +2 -0
- package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -0
- package/dist/dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js +12 -0
- package/dist/dicomMicroscopyViewer.min.js +3 -0
- package/dist/dicomMicroscopyViewer.min.js.LICENSE.txt +29 -0
- package/dist/es6-shim.min.js +12 -0
- package/dist/google.js +75 -0
- package/dist/index.html +1 -0
- package/dist/index.worker.ea71efba2ce63c499055.worker.js +2 -0
- package/dist/index.worker.ea71efba2ce63c499055.worker.js.map +1 -0
- package/dist/index.worker.min.worker.js +2 -0
- package/dist/index.worker.min.worker.js.map +1 -0
- package/dist/init-service-worker.js +59 -0
- package/dist/manifest.json +59 -0
- package/dist/ohif-logo-light.svg +15 -0
- package/dist/ohif-logo.svg +15 -0
- package/dist/oidc-client.min.js +46 -0
- package/dist/polyfill.min.js +1 -0
- package/dist/silent-refresh.html +16 -0
- package/dist/sw.js +56 -0
- package/package.json +24 -23
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[581],{
|
|
3
|
+
|
|
4
|
+
/***/ 72581:
|
|
5
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
|
+
|
|
7
|
+
// ESM COMPAT FLAG
|
|
8
|
+
__webpack_require__.r(__webpack_exports__);
|
|
9
|
+
|
|
10
|
+
// EXPORTS
|
|
11
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
12
|
+
"default": () => (/* binding */ viewports_OHIFCornerstoneRTViewport)
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
16
|
+
var react = __webpack_require__(32735);
|
|
17
|
+
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
18
|
+
var prop_types = __webpack_require__(60216);
|
|
19
|
+
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
20
|
+
// EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
|
|
21
|
+
var src = __webpack_require__(48501);
|
|
22
|
+
// EXTERNAL MODULE: ../../ui/src/index.js + 449 modules
|
|
23
|
+
var ui_src = __webpack_require__(43803);
|
|
24
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
|
|
25
|
+
async function _hydrateRTDisplaySet(_ref) {
|
|
26
|
+
let {
|
|
27
|
+
rtDisplaySet,
|
|
28
|
+
viewportIndex,
|
|
29
|
+
servicesManager
|
|
30
|
+
} = _ref;
|
|
31
|
+
const {
|
|
32
|
+
segmentationService,
|
|
33
|
+
hangingProtocolService,
|
|
34
|
+
viewportGridService
|
|
35
|
+
} = servicesManager.services;
|
|
36
|
+
const displaySetInstanceUID = rtDisplaySet.referencedDisplaySetInstanceUID;
|
|
37
|
+
let segmentationId = null;
|
|
38
|
+
|
|
39
|
+
// We need the hydration to notify panels about the new segmentation added
|
|
40
|
+
const suppressEvents = false;
|
|
41
|
+
segmentationId = await segmentationService.createSegmentationForRTDisplaySet(rtDisplaySet, segmentationId, suppressEvents);
|
|
42
|
+
segmentationService.hydrateSegmentation(rtDisplaySet.displaySetInstanceUID);
|
|
43
|
+
const {
|
|
44
|
+
viewports
|
|
45
|
+
} = viewportGridService.getState();
|
|
46
|
+
const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
|
|
47
|
+
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
|
48
|
+
|
|
49
|
+
// Todo: fix this after we have a better way for stack viewport segmentations
|
|
50
|
+
|
|
51
|
+
// check every viewport in the viewports to see if the displaySetInstanceUID
|
|
52
|
+
// is being displayed, if so we need to update the viewport to use volume viewport
|
|
53
|
+
// (if already is not using it) since Cornerstone3D currently only supports
|
|
54
|
+
// volume viewport for segmentation
|
|
55
|
+
viewports.forEach((viewport, index) => {
|
|
56
|
+
if (index === viewportIndex) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, rtDisplaySet.displaySetInstanceUID);
|
|
60
|
+
if (shouldDisplaySeg) {
|
|
61
|
+
updatedViewports.push({
|
|
62
|
+
viewportIndex: index,
|
|
63
|
+
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
|
|
64
|
+
viewportOptions: {
|
|
65
|
+
initialImageOptions: {
|
|
66
|
+
preset: 'middle'
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Do the entire update at once
|
|
74
|
+
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/* harmony default export */ const _hydrateRT = (_hydrateRTDisplaySet);
|
|
78
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
|
|
79
|
+
|
|
80
|
+
const RESPONSE = {
|
|
81
|
+
NO_NEVER: -1,
|
|
82
|
+
CANCEL: 0,
|
|
83
|
+
HYDRATE_SEG: 5
|
|
84
|
+
};
|
|
85
|
+
function promptHydrateRT(_ref) {
|
|
86
|
+
let {
|
|
87
|
+
servicesManager,
|
|
88
|
+
rtDisplaySet,
|
|
89
|
+
viewportIndex,
|
|
90
|
+
toolGroupId = 'default'
|
|
91
|
+
} = _ref;
|
|
92
|
+
const {
|
|
93
|
+
uiViewportDialogService
|
|
94
|
+
} = servicesManager.services;
|
|
95
|
+
return new Promise(async function (resolve, reject) {
|
|
96
|
+
const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
|
|
97
|
+
if (promptResult === RESPONSE.HYDRATE_SEG) {
|
|
98
|
+
const isHydrated = await _hydrateRT({
|
|
99
|
+
rtDisplaySet,
|
|
100
|
+
viewportIndex,
|
|
101
|
+
toolGroupId,
|
|
102
|
+
servicesManager
|
|
103
|
+
});
|
|
104
|
+
resolve(isHydrated);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function _askHydrate(uiViewportDialogService, viewportIndex) {
|
|
109
|
+
return new Promise(function (resolve, reject) {
|
|
110
|
+
const message = 'Do you want to open this Segmentation?';
|
|
111
|
+
const actions = [{
|
|
112
|
+
type: 'secondary',
|
|
113
|
+
text: 'No',
|
|
114
|
+
value: RESPONSE.CANCEL
|
|
115
|
+
}, {
|
|
116
|
+
type: 'primary',
|
|
117
|
+
text: 'Yes',
|
|
118
|
+
value: RESPONSE.HYDRATE_SEG
|
|
119
|
+
}];
|
|
120
|
+
const onSubmit = result => {
|
|
121
|
+
uiViewportDialogService.hide();
|
|
122
|
+
resolve(result);
|
|
123
|
+
};
|
|
124
|
+
uiViewportDialogService.show({
|
|
125
|
+
viewportIndex,
|
|
126
|
+
type: 'info',
|
|
127
|
+
message,
|
|
128
|
+
actions,
|
|
129
|
+
onSubmit,
|
|
130
|
+
onOutsideClick: () => {
|
|
131
|
+
uiViewportDialogService.hide();
|
|
132
|
+
resolve(RESPONSE.CANCEL);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/* harmony default export */ const utils_promptHydrateRT = (promptHydrateRT);
|
|
138
|
+
// EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
|
|
139
|
+
var es = __webpack_require__(21572);
|
|
140
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
function _getStatusComponent(_ref) {
|
|
145
|
+
let {
|
|
146
|
+
isHydrated,
|
|
147
|
+
onStatusClick
|
|
148
|
+
} = _ref;
|
|
149
|
+
let ToolTipMessage = null;
|
|
150
|
+
let StatusIcon = null;
|
|
151
|
+
const {
|
|
152
|
+
t
|
|
153
|
+
} = (0,es/* useTranslation */.$G)('Common');
|
|
154
|
+
const loadStr = t('LOAD');
|
|
155
|
+
switch (isHydrated) {
|
|
156
|
+
case true:
|
|
157
|
+
StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
|
|
158
|
+
name: "status-alert"
|
|
159
|
+
});
|
|
160
|
+
ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "This Segmentation is loaded in the segmentation panel");
|
|
161
|
+
break;
|
|
162
|
+
case false:
|
|
163
|
+
StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
|
|
164
|
+
name: "status-untracked"
|
|
165
|
+
});
|
|
166
|
+
ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "Click LOAD to load RTSTRUCT.");
|
|
167
|
+
}
|
|
168
|
+
const StatusArea = () => /*#__PURE__*/react.createElement("div", {
|
|
169
|
+
className: "flex h-6 leading-6 cursor-default text-sm text-white"
|
|
170
|
+
}, /*#__PURE__*/react.createElement("div", {
|
|
171
|
+
className: "min-w-[45px] flex items-center p-1 rounded-l-xl rounded-r bg-customgray-100"
|
|
172
|
+
}, /*#__PURE__*/react.createElement(StatusIcon, null), /*#__PURE__*/react.createElement("span", {
|
|
173
|
+
className: "ml-1"
|
|
174
|
+
}, "RTSTRUCT")), !isHydrated && /*#__PURE__*/react.createElement("div", {
|
|
175
|
+
className: "ml-1 px-1.5 rounded cursor-pointer hover:text-black bg-primary-main hover:bg-primary-light"
|
|
176
|
+
// Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none
|
|
177
|
+
,
|
|
178
|
+
onMouseUp: onStatusClick
|
|
179
|
+
}, loadStr));
|
|
180
|
+
return /*#__PURE__*/react.createElement(react.Fragment, null, ToolTipMessage && /*#__PURE__*/react.createElement(ui_src/* Tooltip */.u, {
|
|
181
|
+
content: /*#__PURE__*/react.createElement(ToolTipMessage, null),
|
|
182
|
+
position: "bottom-left"
|
|
183
|
+
}, /*#__PURE__*/react.createElement(StatusArea, null)), !ToolTipMessage && /*#__PURE__*/react.createElement(StatusArea, null));
|
|
184
|
+
}
|
|
185
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts
|
|
186
|
+
function createRTToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
|
|
187
|
+
const {
|
|
188
|
+
tools
|
|
189
|
+
} = customizationService.get('cornerstone.overlayViewportTools') ?? {};
|
|
190
|
+
return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});
|
|
191
|
+
}
|
|
192
|
+
/* harmony default export */ const initRTToolGroup = (createRTToolGroupAndAddTools);
|
|
193
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx
|
|
194
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
const {
|
|
204
|
+
formatDate
|
|
205
|
+
} = src.utils;
|
|
206
|
+
const RT_TOOLGROUP_BASE_NAME = 'RTToolGroup';
|
|
207
|
+
function OHIFCornerstoneRTViewport(props) {
|
|
208
|
+
const {
|
|
209
|
+
children,
|
|
210
|
+
displaySets,
|
|
211
|
+
viewportOptions,
|
|
212
|
+
viewportIndex,
|
|
213
|
+
viewportLabel,
|
|
214
|
+
servicesManager,
|
|
215
|
+
extensionManager
|
|
216
|
+
} = props;
|
|
217
|
+
const {
|
|
218
|
+
displaySetService,
|
|
219
|
+
toolGroupService,
|
|
220
|
+
segmentationService,
|
|
221
|
+
uiNotificationService,
|
|
222
|
+
customizationService
|
|
223
|
+
} = servicesManager.services;
|
|
224
|
+
const toolGroupId = `${RT_TOOLGROUP_BASE_NAME}-${viewportIndex}`;
|
|
225
|
+
|
|
226
|
+
// RT viewport will always have a single display set
|
|
227
|
+
if (displaySets.length > 1) {
|
|
228
|
+
throw new Error('RT viewport should only have a single display set');
|
|
229
|
+
}
|
|
230
|
+
const rtDisplaySet = displaySets[0];
|
|
231
|
+
const [viewportGrid, viewportGridService] = (0,ui_src/* useViewportGrid */.O_)();
|
|
232
|
+
|
|
233
|
+
// States
|
|
234
|
+
const [isToolGroupCreated, setToolGroupCreated] = (0,react.useState)(false);
|
|
235
|
+
const [selectedSegment, setSelectedSegment] = (0,react.useState)(1);
|
|
236
|
+
|
|
237
|
+
// Hydration means that the RT is opened and segments are loaded into the
|
|
238
|
+
// segmentation panel, and RT is also rendered on any viewport that is in the
|
|
239
|
+
// same frameOfReferenceUID as the referencedSeriesUID of the RT. However,
|
|
240
|
+
// loading basically means RT loading over network and bit unpacking of the
|
|
241
|
+
// RT data.
|
|
242
|
+
const [isHydrated, setIsHydrated] = (0,react.useState)(rtDisplaySet.isHydrated);
|
|
243
|
+
const [rtIsLoading, setRtIsLoading] = (0,react.useState)(!rtDisplaySet.isLoaded);
|
|
244
|
+
const [element, setElement] = (0,react.useState)(null);
|
|
245
|
+
const [processingProgress, setProcessingProgress] = (0,react.useState)({
|
|
246
|
+
percentComplete: null,
|
|
247
|
+
totalSegments: null
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// refs
|
|
251
|
+
const referencedDisplaySetRef = (0,react.useRef)(null);
|
|
252
|
+
const {
|
|
253
|
+
viewports,
|
|
254
|
+
activeViewportIndex
|
|
255
|
+
} = viewportGrid;
|
|
256
|
+
const referencedDisplaySet = rtDisplaySet.getReferenceDisplaySet();
|
|
257
|
+
const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet);
|
|
258
|
+
referencedDisplaySetRef.current = {
|
|
259
|
+
displaySet: referencedDisplaySet,
|
|
260
|
+
metadata: referencedDisplaySetMetadata
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* OnElementEnabled callback which is called after the cornerstoneExtension
|
|
264
|
+
* has enabled the element. Note: we delegate all the image rendering to
|
|
265
|
+
* cornerstoneExtension, so we don't need to do anything here regarding
|
|
266
|
+
* the image rendering, element enabling etc.
|
|
267
|
+
*/
|
|
268
|
+
const onElementEnabled = evt => {
|
|
269
|
+
setElement(evt.detail.element);
|
|
270
|
+
};
|
|
271
|
+
const onElementDisabled = () => {
|
|
272
|
+
setElement(null);
|
|
273
|
+
};
|
|
274
|
+
const getCornerstoneViewport = (0,react.useCallback)(() => {
|
|
275
|
+
const {
|
|
276
|
+
component: Component
|
|
277
|
+
} = extensionManager.getModuleEntry('@ohif/extension-cornerstone.viewportModule.cornerstone');
|
|
278
|
+
const {
|
|
279
|
+
displaySet: referencedDisplaySet
|
|
280
|
+
} = referencedDisplaySetRef.current;
|
|
281
|
+
|
|
282
|
+
// Todo: jump to the center of the first segment
|
|
283
|
+
return /*#__PURE__*/react.createElement(Component, _extends({}, props, {
|
|
284
|
+
displaySets: [referencedDisplaySet, rtDisplaySet],
|
|
285
|
+
viewportOptions: {
|
|
286
|
+
viewportType: 'volume',
|
|
287
|
+
toolGroupId: toolGroupId,
|
|
288
|
+
orientation: viewportOptions.orientation,
|
|
289
|
+
viewportId: viewportOptions.viewportId
|
|
290
|
+
},
|
|
291
|
+
onElementEnabled: onElementEnabled,
|
|
292
|
+
onElementDisabled: onElementDisabled
|
|
293
|
+
}));
|
|
294
|
+
}, [viewportIndex, rtDisplaySet, toolGroupId]);
|
|
295
|
+
const onSegmentChange = (0,react.useCallback)(direction => {
|
|
296
|
+
direction = direction === 'left' ? -1 : 1;
|
|
297
|
+
const segmentationId = rtDisplaySet.displaySetInstanceUID;
|
|
298
|
+
const segmentation = segmentationService.getSegmentation(segmentationId);
|
|
299
|
+
const {
|
|
300
|
+
segments
|
|
301
|
+
} = segmentation;
|
|
302
|
+
const numberOfSegments = Object.keys(segments).length;
|
|
303
|
+
let newSelectedSegmentIndex = selectedSegment + direction;
|
|
304
|
+
|
|
305
|
+
// Segment 0 is always background
|
|
306
|
+
if (newSelectedSegmentIndex >= numberOfSegments - 1) {
|
|
307
|
+
newSelectedSegmentIndex = 1;
|
|
308
|
+
} else if (newSelectedSegmentIndex === 0) {
|
|
309
|
+
newSelectedSegmentIndex = numberOfSegments - 1;
|
|
310
|
+
}
|
|
311
|
+
segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId);
|
|
312
|
+
setSelectedSegment(newSelectedSegmentIndex);
|
|
313
|
+
}, [selectedSegment]);
|
|
314
|
+
(0,react.useEffect)(() => {
|
|
315
|
+
if (rtIsLoading) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
utils_promptHydrateRT({
|
|
319
|
+
servicesManager,
|
|
320
|
+
viewportIndex,
|
|
321
|
+
rtDisplaySet
|
|
322
|
+
}).then(isHydrated => {
|
|
323
|
+
if (isHydrated) {
|
|
324
|
+
setIsHydrated(true);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}, [servicesManager, viewportIndex, rtDisplaySet, rtIsLoading]);
|
|
328
|
+
(0,react.useEffect)(() => {
|
|
329
|
+
const {
|
|
330
|
+
unsubscribe
|
|
331
|
+
} = segmentationService.subscribe(segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE, evt => {
|
|
332
|
+
if (evt.rtDisplaySet.displaySetInstanceUID === rtDisplaySet.displaySetInstanceUID) {
|
|
333
|
+
setRtIsLoading(false);
|
|
334
|
+
}
|
|
335
|
+
if (evt.overlappingSegments) {
|
|
336
|
+
uiNotificationService.show({
|
|
337
|
+
title: 'Overlapping Segments',
|
|
338
|
+
message: 'Overlapping segments detected which is not currently supported',
|
|
339
|
+
type: 'warning'
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
return () => {
|
|
344
|
+
unsubscribe();
|
|
345
|
+
};
|
|
346
|
+
}, [rtDisplaySet]);
|
|
347
|
+
(0,react.useEffect)(() => {
|
|
348
|
+
const {
|
|
349
|
+
unsubscribe
|
|
350
|
+
} = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref => {
|
|
351
|
+
let {
|
|
352
|
+
percentComplete,
|
|
353
|
+
numSegments
|
|
354
|
+
} = _ref;
|
|
355
|
+
setProcessingProgress({
|
|
356
|
+
percentComplete,
|
|
357
|
+
totalSegments: numSegments
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
return () => {
|
|
361
|
+
unsubscribe();
|
|
362
|
+
};
|
|
363
|
+
}, [rtDisplaySet]);
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
Cleanup the SEG viewport when the viewport is destroyed
|
|
367
|
+
*/
|
|
368
|
+
(0,react.useEffect)(() => {
|
|
369
|
+
const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref2 => {
|
|
370
|
+
let {
|
|
371
|
+
displaySetInstanceUIDs
|
|
372
|
+
} = _ref2;
|
|
373
|
+
const activeViewport = viewports[activeViewportIndex];
|
|
374
|
+
if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
|
|
375
|
+
viewportGridService.setDisplaySetsForViewport({
|
|
376
|
+
viewportIndex: activeViewportIndex,
|
|
377
|
+
displaySetInstanceUIDs: []
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
return () => {
|
|
382
|
+
onDisplaySetsRemovedSubscription.unsubscribe();
|
|
383
|
+
};
|
|
384
|
+
}, []);
|
|
385
|
+
(0,react.useEffect)(() => {
|
|
386
|
+
let toolGroup = toolGroupService.getToolGroup(toolGroupId);
|
|
387
|
+
if (toolGroup) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
toolGroup = initRTToolGroup(toolGroupService, customizationService, toolGroupId);
|
|
391
|
+
setToolGroupCreated(true);
|
|
392
|
+
return () => {
|
|
393
|
+
// remove the segmentation representations if seg displayset changed
|
|
394
|
+
segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
|
|
395
|
+
toolGroupService.destroyToolGroup(toolGroupId);
|
|
396
|
+
};
|
|
397
|
+
}, []);
|
|
398
|
+
(0,react.useEffect)(() => {
|
|
399
|
+
setIsHydrated(rtDisplaySet.isHydrated);
|
|
400
|
+
return () => {
|
|
401
|
+
// remove the segmentation representations if seg displayset changed
|
|
402
|
+
segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
|
|
403
|
+
referencedDisplaySetRef.current = null;
|
|
404
|
+
};
|
|
405
|
+
}, [rtDisplaySet]);
|
|
406
|
+
|
|
407
|
+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
408
|
+
let childrenWithProps = null;
|
|
409
|
+
if (!referencedDisplaySetRef.current || referencedDisplaySet.displaySetInstanceUID !== referencedDisplaySetRef.current.displaySet.displaySetInstanceUID) {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
if (children && children.length) {
|
|
413
|
+
childrenWithProps = children.map((child, index) => {
|
|
414
|
+
return child && /*#__PURE__*/react.cloneElement(child, {
|
|
415
|
+
viewportIndex,
|
|
416
|
+
key: index
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
const {
|
|
421
|
+
PatientID,
|
|
422
|
+
PatientName,
|
|
423
|
+
PatientSex,
|
|
424
|
+
PatientAge,
|
|
425
|
+
SliceThickness,
|
|
426
|
+
ManufacturerModelName,
|
|
427
|
+
StudyDate,
|
|
428
|
+
SeriesDescription,
|
|
429
|
+
SpacingBetweenSlices,
|
|
430
|
+
SeriesNumber
|
|
431
|
+
} = referencedDisplaySetRef.current.metadata;
|
|
432
|
+
const onStatusClick = async () => {
|
|
433
|
+
const isHydrated = await _hydrateRT({
|
|
434
|
+
rtDisplaySet,
|
|
435
|
+
viewportIndex,
|
|
436
|
+
servicesManager
|
|
437
|
+
});
|
|
438
|
+
setIsHydrated(isHydrated);
|
|
439
|
+
};
|
|
440
|
+
return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_src/* ViewportActionBar */.uY, {
|
|
441
|
+
onDoubleClick: evt => {
|
|
442
|
+
evt.stopPropagation();
|
|
443
|
+
evt.preventDefault();
|
|
444
|
+
},
|
|
445
|
+
onArrowsClick: onSegmentChange,
|
|
446
|
+
getStatusComponent: () => {
|
|
447
|
+
return _getStatusComponent({
|
|
448
|
+
isHydrated,
|
|
449
|
+
onStatusClick
|
|
450
|
+
});
|
|
451
|
+
},
|
|
452
|
+
studyData: {
|
|
453
|
+
label: viewportLabel,
|
|
454
|
+
useAltStyling: true,
|
|
455
|
+
studyDate: formatDate(StudyDate),
|
|
456
|
+
currentSeries: SeriesNumber,
|
|
457
|
+
seriesDescription: `RT Viewport ${SeriesDescription}`,
|
|
458
|
+
patientInformation: {
|
|
459
|
+
patientName: PatientName ? src["default"].utils.formatPN(PatientName.Alphabetic) : '',
|
|
460
|
+
patientSex: PatientSex || '',
|
|
461
|
+
patientAge: PatientAge || '',
|
|
462
|
+
MRN: PatientID || '',
|
|
463
|
+
thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',
|
|
464
|
+
spacing: SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '',
|
|
465
|
+
scanner: ManufacturerModelName || ''
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}), /*#__PURE__*/react.createElement("div", {
|
|
469
|
+
className: "relative flex flex-row w-full h-full overflow-hidden"
|
|
470
|
+
}, rtIsLoading && /*#__PURE__*/react.createElement(ui_src/* LoadingIndicatorTotalPercent */.bk, {
|
|
471
|
+
className: "w-full h-full",
|
|
472
|
+
totalNumbers: processingProgress.totalSegments,
|
|
473
|
+
percentComplete: processingProgress.percentComplete,
|
|
474
|
+
loadingText: "Loading RTSTRUCT..."
|
|
475
|
+
}), getCornerstoneViewport(), childrenWithProps));
|
|
476
|
+
}
|
|
477
|
+
OHIFCornerstoneRTViewport.propTypes = {
|
|
478
|
+
displaySets: prop_types_default().arrayOf((prop_types_default()).object),
|
|
479
|
+
viewportIndex: (prop_types_default()).number.isRequired,
|
|
480
|
+
dataSource: (prop_types_default()).object,
|
|
481
|
+
children: (prop_types_default()).node,
|
|
482
|
+
customProps: (prop_types_default()).object
|
|
483
|
+
};
|
|
484
|
+
OHIFCornerstoneRTViewport.defaultProps = {
|
|
485
|
+
customProps: {}
|
|
486
|
+
};
|
|
487
|
+
function _getReferencedDisplaySetMetadata(referencedDisplaySet) {
|
|
488
|
+
const image0 = referencedDisplaySet.images[0];
|
|
489
|
+
const referencedDisplaySetMetadata = {
|
|
490
|
+
PatientID: image0.PatientID,
|
|
491
|
+
PatientName: image0.PatientName,
|
|
492
|
+
PatientSex: image0.PatientSex,
|
|
493
|
+
PatientAge: image0.PatientAge,
|
|
494
|
+
SliceThickness: image0.SliceThickness,
|
|
495
|
+
StudyDate: image0.StudyDate,
|
|
496
|
+
SeriesDescription: image0.SeriesDescription,
|
|
497
|
+
SeriesInstanceUID: image0.SeriesInstanceUID,
|
|
498
|
+
SeriesNumber: image0.SeriesNumber,
|
|
499
|
+
ManufacturerModelName: image0.ManufacturerModelName,
|
|
500
|
+
SpacingBetweenSlices: image0.SpacingBetweenSlices
|
|
501
|
+
};
|
|
502
|
+
return referencedDisplaySetMetadata;
|
|
503
|
+
}
|
|
504
|
+
/* harmony default export */ const viewports_OHIFCornerstoneRTViewport = (OHIFCornerstoneRTViewport);
|
|
505
|
+
|
|
506
|
+
/***/ })
|
|
507
|
+
|
|
508
|
+
}]);
|