Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b01b78a62 | ||
|
|
369807a907 | ||
|
|
22a1f321af | ||
|
|
7cf8abf0ba | ||
|
|
5d0d8adb5f | ||
|
|
c7522db9bf | ||
|
|
ae4c319dff | ||
|
|
50f3361071 | ||
|
|
42d8373782 | ||
|
|
dd5f38c1a3 | ||
|
|
9f8fdf8ad2 | ||
|
|
04e240b385 | ||
|
|
2e9eb99b62 | ||
|
|
1ac149a2de | ||
|
|
339299113c | ||
|
|
1a57e54f74 | ||
|
|
aebcf962bb | ||
|
|
b7ebb0aa8f | ||
|
|
29c02121df | ||
|
|
a3d7f88b03 | ||
|
|
a3d8129089 | ||
|
|
b427af622e | ||
|
|
634abf353f | ||
|
|
471e6a1559 | ||
|
|
2f811470a8 | ||
|
|
6262a7f9d4 | ||
|
|
53c2740d75 | ||
|
|
85a82fac0e | ||
|
|
4c8a808a12 | ||
|
|
711c177cf2 | ||
|
|
f82ab4fda4 | ||
|
|
2d4e049d8a | ||
|
|
9f5165de47 | ||
|
|
1b290bdaa1 | ||
|
|
8feef28bff | ||
|
|
60d68e3410 | ||
|
|
3539e04019 | ||
|
|
c11c3b7e61 | ||
|
|
4029a8445b | ||
|
|
19bdcbb453 | ||
|
|
0386c29480 | ||
|
|
1dcdc9dabe | ||
|
|
feaebd7f61 | ||
|
|
df32a05a4d | ||
|
|
e205bf5c4e | ||
|
|
5ddf8a1602 | ||
|
|
83fccad46b | ||
|
|
72ec0bffb5 | ||
|
|
82c6c3c353 | ||
|
|
1d38fe30a4 | ||
|
|
666964b6d7 | ||
|
|
fa4ee5c559 | ||
|
|
cd58560e9c | ||
|
|
16afa740b6 | ||
|
|
6715ad9bd6 |
@ -495,13 +495,18 @@ workflows:
|
|||||||
- BUILD:
|
- BUILD:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: release
|
only: /^release\/.*/
|
||||||
- NPM_PUBLISH:
|
- HOLD_FOR_APPROVAL:
|
||||||
|
type: approval
|
||||||
requires:
|
requires:
|
||||||
- BUILD
|
- BUILD
|
||||||
|
- NPM_PUBLISH:
|
||||||
|
requires:
|
||||||
|
- HOLD_FOR_APPROVAL
|
||||||
- DOCKER_RELEASE_PUBLISH:
|
- DOCKER_RELEASE_PUBLISH:
|
||||||
requires:
|
requires:
|
||||||
- NPM_PUBLISH
|
- NPM_PUBLISH
|
||||||
|
|
||||||
###
|
###
|
||||||
# Unit and E2E tests have already run for PR_CHECKS
|
# Unit and E2E tests have already run for PR_CHECKS
|
||||||
# Re-running should not gain us any confidence here
|
# Re-running should not gain us any confidence here
|
||||||
|
|||||||
94
CHANGELOG.md
94
CHANGELOG.md
@ -3,6 +3,100 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **DicomWebDataSource:** Enhance QIDO query to disable wildcard for mrn ([#4435](https://github.com/OHIF/Viewers/issues/4435)) ([22a1f32](https://github.com/OHIF/Viewers/commit/22a1f321af6e01eb12edd6acbc2c829fc243a19b))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **4d:** panel generate image ([#4430](https://github.com/OHIF/Viewers/issues/4430)) ([c7522db](https://github.com/OHIF/Viewers/commit/c7522db9bf5eb932d2df526086b7d290efe73e83))
|
||||||
|
* **dependent:** high priority vulnerabilities ([#4396](https://github.com/OHIF/Viewers/issues/4396)) ([#4429](https://github.com/OHIF/Viewers/issues/4429)) ([50f3361](https://github.com/OHIF/Viewers/commit/50f3361071f205dd942909e5d8354e7829cebda8))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package ohif-monorepo-root
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **cli:** version txt had a new line which it should not ([3392991](https://github.com/OHIF/Viewers/commit/339299113c65b5ce4032b02b5b4043a8968107ed))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **contour:** set renderFill to false for contour ([#4186](https://github.com/OHIF/Viewers/issues/4186)) ([471e6a1](https://github.com/OHIF/Viewers/commit/471e6a1559d983267448058b8e17461f79130c79))
|
||||||
|
* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([2d4e049](https://github.com/OHIF/Viewers/commit/2d4e049d8a54ca25c9dc02f29f2e53a6968d82e1))
|
||||||
|
* dicom json for orthanc by Update package versions for [@cornerstonejs](https://github.com/cornerstonejs) dependencies ([#4165](https://github.com/OHIF/Viewers/issues/4165)) ([9f5165d](https://github.com/OHIF/Viewers/commit/9f5165de47ed547919683498cfae87909de94786))
|
||||||
|
* **docker:** docker build was broken because of imports ([#4192](https://github.com/OHIF/Viewers/issues/4192)) ([53c2740](https://github.com/OHIF/Viewers/commit/53c2740d7589439f5fa6de20baf00b766680ddee))
|
||||||
|
* **rt:** dont convert to volume for RTSTRUCT ([#4157](https://github.com/OHIF/Viewers/issues/4157)) ([634abf3](https://github.com/OHIF/Viewers/commit/634abf353f02cffec462e341d594741fdefb6f22))
|
||||||
|
* segmentation creation and segmentation mode viewport rendering ([#4193](https://github.com/OHIF/Viewers/issues/4193)) ([a3d7f88](https://github.com/OHIF/Viewers/commit/a3d7f88b038fdb8c9dbe5358402a159cdadd41c8))
|
||||||
|
* **segmentation:** Address issue where segmentation creation failed on layout change ([#4153](https://github.com/OHIF/Viewers/issues/4153)) ([1b290bd](https://github.com/OHIF/Viewers/commit/1b290bdaa1a0ba750a4e5f539a51a636de529240))
|
||||||
|
* **seg:** should be able to navigate outside toolbox and come back later ([#4196](https://github.com/OHIF/Viewers/issues/4196)) ([6262a7f](https://github.com/OHIF/Viewers/commit/6262a7f9d4cb71d2dd9615ccc8fe25c947da65dd))
|
||||||
|
* **select:** utilize react portals for select component ([#4144](https://github.com/OHIF/Viewers/issues/4144)) ([8feef28](https://github.com/OHIF/Viewers/commit/8feef28bff1ef4547ff744b64ffbbbfdb93d4c72))
|
||||||
|
* **tmtv:** crosshairs should not have viewport indicators ([#4197](https://github.com/OHIF/Viewers/issues/4197)) ([a3d8129](https://github.com/OHIF/Viewers/commit/a3d81290897397634a246910a30190301066580c))
|
||||||
|
* **tmtv:** side panel crashing when activeToolOptions is not an array ([#4189](https://github.com/OHIF/Viewers/issues/4189)) ([85a82fa](https://github.com/OHIF/Viewers/commit/85a82fac0e1700eb2b9964078a90aadb1877853b))
|
||||||
|
* **tmtv:** threshold was crashing the side panel ([#4119](https://github.com/OHIF/Viewers/issues/4119)) ([c11c3b7](https://github.com/OHIF/Viewers/commit/c11c3b7e611af231773c5d52320b8b777c7c717d))
|
||||||
|
* **us:** logic for color conversion ([b7ebb0a](https://github.com/OHIF/Viewers/commit/b7ebb0aa8f814427045b7d5e7568dc0298ab0973))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **types:** typed app config ([#4171](https://github.com/OHIF/Viewers/issues/4171)) ([4c8a808](https://github.com/OHIF/Viewers/commit/4c8a808a12718865501e362ce37c2d2f75a1a687))
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.7.0](https://github.com/OHIF/Viewers/compare/v3.7.0-beta.110...v3.7.0) (2023-10-11)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.6.0](https://github.com/OHIF/Viewers/compare/v3.6.0-beta.3...v3.6.0) (2023-06-07)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.5.0](https://github.com/OHIF/Viewers/compare/v3.5.0-beta.1...v3.5.0) (2023-06-07)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **app:** change ohif viewer to ohif app ([#3451](https://github.com/OHIF/Viewers/issues/3451)) ([16afa74](https://github.com/OHIF/Viewers/commit/16afa740b60b31037100444ef9311b80ffea2f67))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
f1a736d1934733a434cb87b2c284907a3122403f
|
22a1f321af6e01eb12edd6acbc2c829fc243a19b
|
||||||
@ -3,6 +3,62 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **rt:** dont convert to volume for RTSTRUCT ([#4157](https://github.com/OHIF/Viewers/issues/4157)) ([634abf3](https://github.com/OHIF/Viewers/commit/634abf353f02cffec462e341d594741fdefb6f22))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-rt
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone-dicom-rt",
|
"name": "@ohif/extension-cornerstone-dicom-rt",
|
||||||
"version": "3.8.0-beta.93",
|
"version": "3.8.5",
|
||||||
"description": "DICOM RT read workflow",
|
"description": "DICOM RT read workflow",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -33,10 +33,10 @@
|
|||||||
"start": "yarn run dev"
|
"start": "yarn run dev"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "3.8.0-beta.93",
|
"@ohif/core": "3.8.5\n",
|
||||||
"@ohif/extension-cornerstone": "3.8.0-beta.93",
|
"@ohif/extension-cornerstone": "3.8.5\n",
|
||||||
"@ohif/extension-default": "3.8.0-beta.93",
|
"@ohif/extension-default": "3.8.5\n",
|
||||||
"@ohif/i18n": "3.8.0-beta.93",
|
"@ohif/i18n": "3.8.5\n",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
|
|||||||
@ -5,9 +5,13 @@ import loadRTStruct from './loadRTStruct';
|
|||||||
|
|
||||||
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.481.3'];
|
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.481.3'];
|
||||||
|
|
||||||
let loadPromises = {};
|
const loadPromises = {};
|
||||||
|
|
||||||
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
|
function _getDisplaySetsFromSeries(
|
||||||
|
instances,
|
||||||
|
servicesManager: AppTypes.ServicesManager,
|
||||||
|
extensionManager
|
||||||
|
) {
|
||||||
const instance = instances[0];
|
const instance = instances[0];
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -69,8 +73,8 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
|
|||||||
displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID;
|
displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID;
|
||||||
|
|
||||||
displaySet.getReferenceDisplaySet = () => {
|
displaySet.getReferenceDisplaySet = () => {
|
||||||
const { DisplaySetService } = servicesManager.services;
|
const { displaySetService } = servicesManager.services;
|
||||||
const referencedDisplaySets = DisplaySetService.getDisplaySetsForSeries(
|
const referencedDisplaySets = displaySetService.getDisplaySetsForSeries(
|
||||||
displaySet.referencedSeriesInstanceUID
|
displaySet.referencedSeriesInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -90,7 +94,7 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
|
|||||||
return [displaySet];
|
return [displaySet];
|
||||||
}
|
}
|
||||||
|
|
||||||
function _load(rtDisplaySet, servicesManager, extensionManager, headers) {
|
function _load(rtDisplaySet, servicesManager: AppTypes.ServicesManager, extensionManager, headers) {
|
||||||
const { SOPInstanceUID } = rtDisplaySet;
|
const { SOPInstanceUID } = rtDisplaySet;
|
||||||
const { segmentationService } = servicesManager.services;
|
const { segmentationService } = servicesManager.services;
|
||||||
if (
|
if (
|
||||||
@ -168,7 +172,10 @@ function _deriveReferencedSeriesSequenceFromFrameOfReferenceSequence(
|
|||||||
return ReferencedSeriesSequence;
|
return ReferencedSeriesSequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _segmentationExistsInCache(rtDisplaySet, segmentationService) {
|
function _segmentationExistsInCache(
|
||||||
|
rtDisplaySet,
|
||||||
|
segmentationService: AppTypes.SegmentationService
|
||||||
|
) {
|
||||||
// Todo: fix this
|
// Todo: fix this
|
||||||
return false;
|
return false;
|
||||||
// This should be abstracted with the CornerstoneCacheService
|
// This should be abstracted with the CornerstoneCacheService
|
||||||
@ -13,7 +13,7 @@ function promptHydrateRT({
|
|||||||
toolGroupId = 'default',
|
toolGroupId = 'default',
|
||||||
preHydrateCallbacks,
|
preHydrateCallbacks,
|
||||||
hydrateRTDisplaySet,
|
hydrateRTDisplaySet,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { uiViewportDialogService } = servicesManager.services;
|
const { uiViewportDialogService } = servicesManager.services;
|
||||||
|
|
||||||
return new Promise(async function (resolve, reject) {
|
return new Promise(async function (resolve, reject) {
|
||||||
@ -36,7 +36,7 @@ function promptHydrateRT({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function _askHydrate(uiViewportDialogService, viewportId) {
|
function _askHydrate(uiViewportDialogService: AppTypes.UIViewportDialogService, viewportId) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
const message = 'Do you want to open this Segmentation?';
|
const message = 'Do you want to open this Segmentation?';
|
||||||
const actions = [
|
const actions = [
|
||||||
@ -57,6 +57,7 @@ function _askHydrate(uiViewportDialogService, viewportId) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
uiViewportDialogService.show({
|
uiViewportDialogService.show({
|
||||||
|
id: 'promptHydrateRT',
|
||||||
viewportId,
|
viewportId,
|
||||||
type: 'info',
|
type: 'info',
|
||||||
message,
|
message,
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import createRTToolGroupAndAddTools from '../utils/initRTToolGroup';
|
|||||||
|
|
||||||
const RT_TOOLGROUP_BASE_NAME = 'RTToolGroup';
|
const RT_TOOLGROUP_BASE_NAME = 'RTToolGroup';
|
||||||
|
|
||||||
function OHIFCornerstoneRTViewport(props) {
|
function OHIFCornerstoneRTViewport(props: withAppTypes) {
|
||||||
const {
|
const {
|
||||||
children,
|
children,
|
||||||
displaySets,
|
displaySets,
|
||||||
@ -111,7 +111,7 @@ function OHIFCornerstoneRTViewport(props) {
|
|||||||
{...props}
|
{...props}
|
||||||
displaySets={[referencedDisplaySet, rtDisplaySet]}
|
displaySets={[referencedDisplaySet, rtDisplaySet]}
|
||||||
viewportOptions={{
|
viewportOptions={{
|
||||||
viewportType: 'volume',
|
viewportType: 'stack',
|
||||||
toolGroupId: toolGroupId,
|
toolGroupId: toolGroupId,
|
||||||
orientation: viewportOptions.orientation,
|
orientation: viewportOptions.orientation,
|
||||||
viewportId: viewportOptions.viewportId,
|
viewportId: viewportOptions.viewportId,
|
||||||
|
|||||||
@ -3,6 +3,67 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([2d4e049](https://github.com/OHIF/Viewers/commit/2d4e049d8a54ca25c9dc02f29f2e53a6968d82e1))
|
||||||
|
* dicom json for orthanc by Update package versions for [@cornerstonejs](https://github.com/cornerstonejs) dependencies ([#4165](https://github.com/OHIF/Viewers/issues/4165)) ([9f5165d](https://github.com/OHIF/Viewers/commit/9f5165de47ed547919683498cfae87909de94786))
|
||||||
|
* **rt:** dont convert to volume for RTSTRUCT ([#4157](https://github.com/OHIF/Viewers/issues/4157)) ([634abf3](https://github.com/OHIF/Viewers/commit/634abf353f02cffec462e341d594741fdefb6f22))
|
||||||
|
* segmentation creation and segmentation mode viewport rendering ([#4193](https://github.com/OHIF/Viewers/issues/4193)) ([a3d7f88](https://github.com/OHIF/Viewers/commit/a3d7f88b038fdb8c9dbe5358402a159cdadd41c8))
|
||||||
|
* **segmentation:** Address issue where segmentation creation failed on layout change ([#4153](https://github.com/OHIF/Viewers/issues/4153)) ([1b290bd](https://github.com/OHIF/Viewers/commit/1b290bdaa1a0ba750a4e5f539a51a636de529240))
|
||||||
|
* **us:** logic for color conversion ([b7ebb0a](https://github.com/OHIF/Viewers/commit/b7ebb0aa8f814427045b7d5e7568dc0298ab0973))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-seg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone-dicom-seg",
|
"name": "@ohif/extension-cornerstone-dicom-seg",
|
||||||
"version": "3.8.0-beta.93",
|
"version": "3.8.5",
|
||||||
"description": "DICOM SEG read workflow",
|
"description": "DICOM SEG read workflow",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -33,10 +33,10 @@
|
|||||||
"start": "yarn run dev"
|
"start": "yarn run dev"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "3.8.0-beta.93",
|
"@ohif/core": "3.8.5\n",
|
||||||
"@ohif/extension-cornerstone": "3.8.0-beta.93",
|
"@ohif/extension-cornerstone": "3.8.5\n",
|
||||||
"@ohif/extension-default": "3.8.0-beta.93",
|
"@ohif/extension-default": "3.8.5\n",
|
||||||
"@ohif/i18n": "3.8.0-beta.93",
|
"@ohif/i18n": "3.8.5\n",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
@ -46,8 +46,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^1.70.14",
|
"@cornerstonejs/adapters": "^1.77.6",
|
||||||
"@cornerstonejs/core": "^1.70.14",
|
"@cornerstonejs/core": "^1.77.6",
|
||||||
"@kitware/vtk.js": "30.4.1",
|
"@kitware/vtk.js": "30.4.1",
|
||||||
"react-color": "^2.19.3"
|
"react-color": "^2.19.3"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import dcmjs from 'dcmjs';
|
import dcmjs from 'dcmjs';
|
||||||
import { createReportDialogPrompt } from '@ohif/extension-default';
|
import { createReportDialogPrompt } from '@ohif/extension-default';
|
||||||
import { ServicesManager, Types } from '@ohif/core';
|
import { Types } from '@ohif/core';
|
||||||
import { cache, metaData } from '@cornerstonejs/core';
|
import { cache, metaData } from '@cornerstonejs/core';
|
||||||
import {
|
import {
|
||||||
segmentation as cornerstoneToolsSegmentation,
|
segmentation as cornerstoneToolsSegmentation,
|
||||||
@ -48,7 +48,7 @@ const commandsModule = ({
|
|||||||
displaySetService,
|
displaySetService,
|
||||||
viewportGridService,
|
viewportGridService,
|
||||||
toolGroupService,
|
toolGroupService,
|
||||||
} = (servicesManager as ServicesManager).services;
|
} = servicesManager.services;
|
||||||
|
|
||||||
const actions = {
|
const actions = {
|
||||||
/**
|
/**
|
||||||
@ -94,6 +94,7 @@ const commandsModule = ({
|
|||||||
updateViewportsForSegmentationRendering({
|
updateViewportsForSegmentationRendering({
|
||||||
viewportId,
|
viewportId,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
|
displaySet,
|
||||||
loadFn: async () => {
|
loadFn: async () => {
|
||||||
const currentSegmentations = segmentationService.getSegmentations();
|
const currentSegmentations = segmentationService.getSegmentations();
|
||||||
const segmentationId = await segmentationService.createSegmentationForDisplaySet(
|
const segmentationId = await segmentationService.createSegmentationForDisplaySet(
|
||||||
@ -213,7 +214,7 @@ const commandsModule = ({
|
|||||||
updateViewportsForSegmentationRendering({
|
updateViewportsForSegmentationRendering({
|
||||||
viewportId,
|
viewportId,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
referencedDisplaySetInstanceUID: displaySet.referencedDisplaySetInstanceUID,
|
displaySet,
|
||||||
loadFn: async () => {
|
loadFn: async () => {
|
||||||
const segDisplaySet = displaySet;
|
const segDisplaySet = displaySet;
|
||||||
const suppressEvents = false;
|
const suppressEvents = false;
|
||||||
|
|||||||
@ -10,7 +10,7 @@ const getPanelModule = ({
|
|||||||
extensionManager,
|
extensionManager,
|
||||||
configuration,
|
configuration,
|
||||||
title,
|
title,
|
||||||
}) => {
|
}: withAppTypes) => {
|
||||||
const { customizationService } = servicesManager.services;
|
const { customizationService } = servicesManager.services;
|
||||||
|
|
||||||
const wrappedPanelSegmentation = configuration => {
|
const wrappedPanelSegmentation = configuration => {
|
||||||
|
|||||||
@ -8,9 +8,13 @@ import { dicomlabToRGB } from './utils/dicomlabToRGB';
|
|||||||
|
|
||||||
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4'];
|
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4'];
|
||||||
|
|
||||||
let loadPromises = {};
|
const loadPromises = {};
|
||||||
|
|
||||||
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
|
function _getDisplaySetsFromSeries(
|
||||||
|
instances,
|
||||||
|
servicesManager: AppTypes.ServicesManager,
|
||||||
|
extensionManager
|
||||||
|
) {
|
||||||
const instance = instances[0];
|
const instance = instances[0];
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -95,7 +99,12 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
|
|||||||
return [displaySet];
|
return [displaySet];
|
||||||
}
|
}
|
||||||
|
|
||||||
function _load(segDisplaySet, servicesManager, extensionManager, headers) {
|
function _load(
|
||||||
|
segDisplaySet,
|
||||||
|
servicesManager: AppTypes.ServicesManager,
|
||||||
|
extensionManager,
|
||||||
|
headers
|
||||||
|
) {
|
||||||
const { SOPInstanceUID } = segDisplaySet;
|
const { SOPInstanceUID } = segDisplaySet;
|
||||||
const { segmentationService } = servicesManager.services;
|
const { segmentationService } = servicesManager.services;
|
||||||
|
|
||||||
@ -137,7 +146,12 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) {
|
|||||||
return loadPromises[SOPInstanceUID];
|
return loadPromises[SOPInstanceUID];
|
||||||
}
|
}
|
||||||
|
|
||||||
async function _loadSegments({ extensionManager, servicesManager, segDisplaySet, headers }) {
|
async function _loadSegments({
|
||||||
|
extensionManager,
|
||||||
|
servicesManager,
|
||||||
|
segDisplaySet,
|
||||||
|
headers,
|
||||||
|
}: withAppTypes) {
|
||||||
const utilityModule = extensionManager.getModuleEntry(
|
const utilityModule = extensionManager.getModuleEntry(
|
||||||
'@ohif/extension-cornerstone.utilityModule.common'
|
'@ohif/extension-cornerstone.utilityModule.common'
|
||||||
);
|
);
|
||||||
@ -212,7 +226,7 @@ async function _loadSegments({ extensionManager, servicesManager, segDisplaySet,
|
|||||||
Object.assign(segDisplaySet, results);
|
Object.assign(segDisplaySet, results);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _segmentationExists(segDisplaySet, segmentationService) {
|
function _segmentationExists(segDisplaySet, segmentationService: AppTypes.SegmentationService) {
|
||||||
// This should be abstracted with the CornerstoneCacheService
|
// This should be abstracted with the CornerstoneCacheService
|
||||||
return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID);
|
return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID);
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
export function getToolbarModule({ servicesManager }) {
|
export function getToolbarModule({ servicesManager }: withAppTypes) {
|
||||||
const { segmentationService, toolbarService, toolGroupService } = servicesManager.services;
|
const { segmentationService, toolbarService, toolGroupService } = servicesManager.services;
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -17,7 +17,7 @@ export default function PanelSegmentation({
|
|||||||
commandsManager,
|
commandsManager,
|
||||||
extensionManager,
|
extensionManager,
|
||||||
configuration,
|
configuration,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const {
|
const {
|
||||||
segmentationService,
|
segmentationService,
|
||||||
viewportGridService,
|
viewportGridService,
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import { Enums, cache } from '@cornerstonejs/core';
|
|||||||
* @param params.viewportId - ID of the viewport to be updated.
|
* @param params.viewportId - ID of the viewport to be updated.
|
||||||
* @param params.loadFn - Function to load the segmentation data.
|
* @param params.loadFn - Function to load the segmentation data.
|
||||||
* @param params.servicesManager - The services manager.
|
* @param params.servicesManager - The services manager.
|
||||||
* @param params.referencedDisplaySetInstanceUID - Optional UID for the referenced display set instance.
|
* @param params.displaySet - the display set.
|
||||||
*
|
*
|
||||||
* @returns Returns true upon successful update of viewports for segmentation rendering.
|
* @returns Returns true upon successful update of viewports for segmentation rendering.
|
||||||
*/
|
*/
|
||||||
@ -18,12 +18,12 @@ async function updateViewportsForSegmentationRendering({
|
|||||||
viewportId,
|
viewportId,
|
||||||
loadFn,
|
loadFn,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
referencedDisplaySetInstanceUID,
|
displaySet,
|
||||||
}: {
|
}: {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
loadFn: () => Promise<string>;
|
loadFn: () => Promise<string>;
|
||||||
servicesManager: any;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
referencedDisplaySetInstanceUID?: string;
|
displaySet?: any;
|
||||||
}) {
|
}) {
|
||||||
const { cornerstoneViewportService, segmentationService, viewportGridService } =
|
const { cornerstoneViewportService, segmentationService, viewportGridService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
@ -31,13 +31,13 @@ async function updateViewportsForSegmentationRendering({
|
|||||||
const viewport = getTargetViewport({ viewportId, viewportGridService });
|
const viewport = getTargetViewport({ viewportId, viewportGridService });
|
||||||
const targetViewportId = viewport.viewportOptions.viewportId;
|
const targetViewportId = viewport.viewportOptions.viewportId;
|
||||||
|
|
||||||
referencedDisplaySetInstanceUID =
|
const referencedDisplaySetInstanceUID =
|
||||||
referencedDisplaySetInstanceUID || viewport?.displaySetInstanceUIDs[0];
|
displaySet?.referencedDisplaySetInstanceUID || viewport?.displaySetInstanceUIDs[0];
|
||||||
|
|
||||||
const updatedViewports = getUpdatedViewportsForSegmentation({
|
const updatedViewports = getUpdatedViewportsForSegmentation({
|
||||||
servicesManager,
|
|
||||||
viewportId,
|
viewportId,
|
||||||
referencedDisplaySetInstanceUID,
|
servicesManager,
|
||||||
|
displaySet,
|
||||||
});
|
});
|
||||||
|
|
||||||
// create Segmentation callback which needs to be waited until
|
// create Segmentation callback which needs to be waited until
|
||||||
@ -56,7 +56,7 @@ async function updateViewportsForSegmentationRendering({
|
|||||||
updatedViewports.forEach(async viewport => {
|
updatedViewports.forEach(async viewport => {
|
||||||
viewport.viewportOptions = {
|
viewport.viewportOptions = {
|
||||||
...viewport.viewportOptions,
|
...viewport.viewportOptions,
|
||||||
viewportType: 'volume',
|
viewportType: displaySet?.Modality === 'RTSTRUCT' ? 'stack' : 'volume',
|
||||||
needsRerendering: true,
|
needsRerendering: true,
|
||||||
};
|
};
|
||||||
const viewportId = viewport.viewportId;
|
const viewportId = viewport.viewportId;
|
||||||
@ -66,7 +66,7 @@ async function updateViewportsForSegmentationRendering({
|
|||||||
|
|
||||||
// only run the createSegmentationForVolume for the targetViewportId
|
// only run the createSegmentationForVolume for the targetViewportId
|
||||||
// since the rest will get handled by cornerstoneViewportService
|
// since the rest will get handled by cornerstoneViewportService
|
||||||
if (volumeExists && viewportId === targetViewportId) {
|
if ((volumeExists || displaySet.Modality === 'RTSTRUCT') && viewportId === targetViewportId) {
|
||||||
await createSegmentationForVolume();
|
await createSegmentationForVolume();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -126,15 +126,15 @@ const getTargetViewport = ({ viewportId, viewportGridService }) => {
|
|||||||
* @param {Object} params - Parameters for the function.
|
* @param {Object} params - Parameters for the function.
|
||||||
* @param params.viewportId - the ID of the viewport to be updated.
|
* @param params.viewportId - the ID of the viewport to be updated.
|
||||||
* @param params.servicesManager - The services manager
|
* @param params.servicesManager - The services manager
|
||||||
* @param params.referencedDisplaySetInstanceUID - Optional UID for the referenced display set instance.
|
* @param params.displaySet - the display set.
|
||||||
*
|
*
|
||||||
* @returns {Array} Returns an array of viewports that require updates for segmentation rendering.
|
* @returns {Array} Returns an array of viewports that require updates for segmentation rendering.
|
||||||
*/
|
*/
|
||||||
function getUpdatedViewportsForSegmentation({
|
function getUpdatedViewportsForSegmentation({
|
||||||
viewportId,
|
viewportId,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
referencedDisplaySetInstanceUID,
|
displaySet,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { hangingProtocolService, displaySetService, segmentationService, viewportGridService } =
|
const { hangingProtocolService, displaySetService, segmentationService, viewportGridService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ function getUpdatedViewportsForSegmentation({
|
|||||||
const displaySetInstanceUIDs = viewports.get(targetViewportId).displaySetInstanceUIDs;
|
const displaySetInstanceUIDs = viewports.get(targetViewportId).displaySetInstanceUIDs;
|
||||||
|
|
||||||
const referenceDisplaySetInstanceUID =
|
const referenceDisplaySetInstanceUID =
|
||||||
referencedDisplaySetInstanceUID || displaySetInstanceUIDs[0];
|
displaySet?.referencedDisplaySetInstanceUID || displaySetInstanceUIDs[0];
|
||||||
|
|
||||||
const referencedDisplaySet = displaySetService.getDisplaySetByUID(referenceDisplaySetInstanceUID);
|
const referencedDisplaySet = displaySetService.getDisplaySetByUID(referenceDisplaySetInstanceUID);
|
||||||
const segmentationFrameOfReferenceUID = referencedDisplaySet.instances[0].FrameOfReferenceUID;
|
const segmentationFrameOfReferenceUID = referencedDisplaySet.instances[0].FrameOfReferenceUID;
|
||||||
@ -175,7 +175,7 @@ function getUpdatedViewportsForSegmentation({
|
|||||||
viewportId,
|
viewportId,
|
||||||
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
|
displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
|
||||||
viewportOptions: {
|
viewportOptions: {
|
||||||
viewportType: 'volume',
|
viewportType: displaySet?.Modality === 'RTSTRUCT' ? 'stack' : 'volume',
|
||||||
needsRerendering: true,
|
needsRerendering: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -12,7 +12,7 @@ function promptHydrateSEG({
|
|||||||
viewportId,
|
viewportId,
|
||||||
preHydrateCallbacks,
|
preHydrateCallbacks,
|
||||||
hydrateSEGDisplaySet,
|
hydrateSEGDisplaySet,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { uiViewportDialogService } = servicesManager.services;
|
const { uiViewportDialogService } = servicesManager.services;
|
||||||
|
|
||||||
return new Promise(async function (resolve, reject) {
|
return new Promise(async function (resolve, reject) {
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import _getStatusComponent from './_getStatusComponent';
|
|||||||
|
|
||||||
const SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';
|
const SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';
|
||||||
|
|
||||||
function OHIFCornerstoneSEGViewport(props) {
|
function OHIFCornerstoneSEGViewport(props: withAppTypes) {
|
||||||
const {
|
const {
|
||||||
children,
|
children,
|
||||||
displaySets,
|
displaySets,
|
||||||
|
|||||||
@ -3,6 +3,65 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([2d4e049](https://github.com/OHIF/Viewers/commit/2d4e049d8a54ca25c9dc02f29f2e53a6968d82e1))
|
||||||
|
* dicom json for orthanc by Update package versions for [@cornerstonejs](https://github.com/cornerstonejs) dependencies ([#4165](https://github.com/OHIF/Viewers/issues/4165)) ([9f5165d](https://github.com/OHIF/Viewers/commit/9f5165de47ed547919683498cfae87909de94786))
|
||||||
|
* **segmentation:** Address issue where segmentation creation failed on layout change ([#4153](https://github.com/OHIF/Viewers/issues/4153)) ([1b290bd](https://github.com/OHIF/Viewers/commit/1b290bdaa1a0ba750a4e5f539a51a636de529240))
|
||||||
|
* **us:** logic for color conversion ([b7ebb0a](https://github.com/OHIF/Viewers/commit/b7ebb0aa8f814427045b7d5e7568dc0298ab0973))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dicom-sr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone-dicom-sr",
|
"name": "@ohif/extension-cornerstone-dicom-sr",
|
||||||
"version": "3.8.0-beta.93",
|
"version": "3.8.5",
|
||||||
"description": "OHIF extension for an SR Cornerstone Viewport",
|
"description": "OHIF extension for an SR Cornerstone Viewport",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -34,10 +34,10 @@
|
|||||||
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
|
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "3.8.0-beta.93",
|
"@ohif/core": "3.8.5\n",
|
||||||
"@ohif/extension-cornerstone": "3.8.0-beta.93",
|
"@ohif/extension-cornerstone": "3.8.5\n",
|
||||||
"@ohif/extension-measurement-tracking": "3.8.0-beta.93",
|
"@ohif/extension-measurement-tracking": "3.8.5\n",
|
||||||
"@ohif/ui": "3.8.0-beta.93",
|
"@ohif/ui": "3.8.5\n",
|
||||||
"dcmjs": "^0.29.12",
|
"dcmjs": "^0.29.12",
|
||||||
"dicom-parser": "^1.8.9",
|
"dicom-parser": "^1.8.9",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
@ -46,9 +46,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^1.70.14",
|
"@cornerstonejs/adapters": "^1.77.6",
|
||||||
"@cornerstonejs/core": "^1.70.14",
|
"@cornerstonejs/core": "^1.77.6",
|
||||||
"@cornerstonejs/tools": "^1.70.14",
|
"@cornerstonejs/tools": "^1.77.6",
|
||||||
"classnames": "^2.3.2"
|
"classnames": "^2.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ const _generateReport = (measurementData, additionalFindingTypes, options = {})
|
|||||||
return dataset;
|
return dataset;
|
||||||
};
|
};
|
||||||
|
|
||||||
const commandsModule = props => {
|
const commandsModule = (props: withAppTypes) => {
|
||||||
const { servicesManager } = props;
|
const { servicesManager } = props;
|
||||||
const { customizationService } = servicesManager.services;
|
const { customizationService } = servicesManager.services;
|
||||||
const actions = {
|
const actions = {
|
||||||
@ -57,7 +57,7 @@ const commandsModule = props => {
|
|||||||
const reportBlob = dcmjs.data.datasetToBlob(srDataset);
|
const reportBlob = dcmjs.data.datasetToBlob(srDataset);
|
||||||
|
|
||||||
//Create a URL for the binary.
|
//Create a URL for the binary.
|
||||||
var objectUrl = URL.createObjectURL(reportBlob);
|
const objectUrl = URL.createObjectURL(reportBlob);
|
||||||
window.location.assign(objectUrl);
|
window.location.assign(objectUrl);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -85,7 +85,11 @@ function addInstances(instances: InstanceMetadata[], displaySetService: DisplayS
|
|||||||
* @param servicesManager is the services that can be used for creating
|
* @param servicesManager is the services that can be used for creating
|
||||||
* @returns The list of display sets created for the given instances object
|
* @returns The list of display sets created for the given instances object
|
||||||
*/
|
*/
|
||||||
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
|
function _getDisplaySetsFromSeries(
|
||||||
|
instances,
|
||||||
|
servicesManager: AppTypes.ServicesManager,
|
||||||
|
extensionManager
|
||||||
|
) {
|
||||||
// If the series has no instances, stop here
|
// If the series has no instances, stop here
|
||||||
if (!instances || !instances.length) {
|
if (!instances || !instances.length) {
|
||||||
throw new Error('No instances were provided');
|
throw new Error('No instances were provided');
|
||||||
@ -150,7 +154,7 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
|
|||||||
return [displaySet];
|
return [displaySet];
|
||||||
}
|
}
|
||||||
|
|
||||||
async function _load(displaySet, servicesManager, extensionManager) {
|
async function _load(displaySet, servicesManager: AppTypes.ServicesManager, extensionManager) {
|
||||||
const { displaySetService, measurementService } = servicesManager.services;
|
const { displaySetService, measurementService } = servicesManager.services;
|
||||||
const dataSources = extensionManager.getDataSources();
|
const dataSources = extensionManager.getDataSources();
|
||||||
const dataSource = dataSources[0];
|
const dataSource = dataSources[0];
|
||||||
@ -223,7 +227,7 @@ function _checkIfCanAddMeasurementsToDisplaySet(
|
|||||||
srDisplaySet,
|
srDisplaySet,
|
||||||
newDisplaySet,
|
newDisplaySet,
|
||||||
dataSource,
|
dataSource,
|
||||||
servicesManager
|
servicesManager: AppTypes.ServicesManager
|
||||||
) {
|
) {
|
||||||
const { customizationService } = servicesManager.services;
|
const { customizationService } = servicesManager.services;
|
||||||
let unloadedMeasurements = srDisplaySet.measurements.filter(
|
let unloadedMeasurements = srDisplaySet.measurements.filter(
|
||||||
|
|||||||
@ -43,7 +43,7 @@ const convertSites = (codingValues, sites) => {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export default function hydrateStructuredReport(
|
export default function hydrateStructuredReport(
|
||||||
{ servicesManager, extensionManager, appConfig },
|
{ servicesManager, extensionManager, appConfig }: withAppTypes,
|
||||||
displaySetInstanceUID
|
displaySetInstanceUID
|
||||||
) {
|
) {
|
||||||
const annotationManager = CsAnnotation.state.getAnnotationManager();
|
const annotationManager = CsAnnotation.state.getAnnotationManager();
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { useCallback, useContext, useEffect, useState } from 'react';
|
import React, { useCallback, useContext, useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { ServicesManager, ExtensionManager } from '@ohif/core';
|
import { ExtensionManager } from '@ohif/core';
|
||||||
|
|
||||||
import { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule';
|
import { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule';
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ const MEASUREMENT_TRACKING_EXTENSION_ID = '@ohif/extension-measurement-tracking'
|
|||||||
|
|
||||||
const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup';
|
const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup';
|
||||||
|
|
||||||
function OHIFCornerstoneSRViewport(props) {
|
function OHIFCornerstoneSRViewport(props: withAppTypes) {
|
||||||
const { children, dataSource, displaySets, viewportOptions, servicesManager, extensionManager } =
|
const { children, dataSource, displaySets, viewportOptions, servicesManager, extensionManager } =
|
||||||
props;
|
props;
|
||||||
|
|
||||||
@ -369,7 +369,7 @@ OHIFCornerstoneSRViewport.propTypes = {
|
|||||||
viewportLabel: PropTypes.string,
|
viewportLabel: PropTypes.string,
|
||||||
customProps: PropTypes.object,
|
customProps: PropTypes.object,
|
||||||
viewportOptions: PropTypes.object,
|
viewportOptions: PropTypes.object,
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager).isRequired,
|
servicesManager: PropTypes.object.isRequired,
|
||||||
extensionManager: PropTypes.instanceOf(ExtensionManager).isRequired,
|
extensionManager: PropTypes.instanceOf(ExtensionManager).isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,68 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **4d:** panel generate image ([#4430](https://github.com/OHIF/Viewers/issues/4430)) ([c7522db](https://github.com/OHIF/Viewers/commit/c7522db9bf5eb932d2df526086b7d290efe73e83))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([2d4e049](https://github.com/OHIF/Viewers/commit/2d4e049d8a54ca25c9dc02f29f2e53a6968d82e1))
|
||||||
|
* dicom json for orthanc by Update package versions for [@cornerstonejs](https://github.com/cornerstonejs) dependencies ([#4165](https://github.com/OHIF/Viewers/issues/4165)) ([9f5165d](https://github.com/OHIF/Viewers/commit/9f5165de47ed547919683498cfae87909de94786))
|
||||||
|
* **segmentation:** Address issue where segmentation creation failed on layout change ([#4153](https://github.com/OHIF/Viewers/issues/4153)) ([1b290bd](https://github.com/OHIF/Viewers/commit/1b290bdaa1a0ba750a4e5f539a51a636de529240))
|
||||||
|
* **us:** logic for color conversion ([b7ebb0a](https://github.com/OHIF/Viewers/commit/b7ebb0aa8f814427045b7d5e7568dc0298ab0973))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone-dynamic-volume
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone-dynamic-volume",
|
"name": "@ohif/extension-cornerstone-dynamic-volume",
|
||||||
"version": "3.8.0-beta.93",
|
"version": "3.8.5",
|
||||||
"description": "OHIF extension for 4D volumes data",
|
"description": "OHIF extension for 4D volumes data",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -29,11 +29,11 @@
|
|||||||
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
|
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "3.8.0-beta.93",
|
"@ohif/core": "3.8.5\n",
|
||||||
"@ohif/extension-cornerstone": "3.8.0-beta.93",
|
"@ohif/extension-cornerstone": "3.8.5\n",
|
||||||
"@ohif/extension-default": "3.8.0-beta.93",
|
"@ohif/extension-default": "3.8.5\n",
|
||||||
"@ohif/i18n": "3.8.0-beta.93",
|
"@ohif/i18n": "3.8.5\n",
|
||||||
"@ohif/ui": "3.8.0-beta.93",
|
"@ohif/ui": "3.8.5\n",
|
||||||
"dcmjs": "^0.29.5",
|
"dcmjs": "^0.29.5",
|
||||||
"dicom-parser": "^1.8.21",
|
"dicom-parser": "^1.8.21",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
@ -42,9 +42,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/core": "^1.70.14",
|
"@cornerstonejs/core": "^1.77.6",
|
||||||
"@cornerstonejs/streaming-image-volume-loader": "^1.70.14",
|
"@cornerstonejs/streaming-image-volume-loader": "^1.77.6",
|
||||||
"@cornerstonejs/tools": "^1.70.14",
|
"@cornerstonejs/tools": "^1.77.6",
|
||||||
"classnames": "^2.3.2"
|
"classnames": "^2.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -265,7 +265,7 @@ function _getInstanceFromSegmentations(segmentations, displaySetService) {
|
|||||||
return { seriesMetadata, instance };
|
return { seriesMetadata, instance };
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateSegmentationsChartDisplaySet({ servicesManager }): void {
|
function updateSegmentationsChartDisplaySet({ servicesManager }: withAppTypes): void {
|
||||||
const { segmentationService, displaySetService } = servicesManager.services;
|
const { segmentationService, displaySetService } = servicesManager.services;
|
||||||
const segmentations = segmentationService.getSegmentations();
|
const segmentations = segmentationService.getSegmentations();
|
||||||
const { seriesMetadata, instance } =
|
const { seriesMetadata, instance } =
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { cache } from '@cornerstonejs/core';
|
|||||||
|
|
||||||
const LABELMAP = Enums.SegmentationRepresentations.Labelmap;
|
const LABELMAP = Enums.SegmentationRepresentations.Labelmap;
|
||||||
|
|
||||||
const commandsModule = ({ commandsManager, servicesManager }) => {
|
const commandsModule = ({ commandsManager, servicesManager }: withAppTypes) => {
|
||||||
const services = servicesManager.services;
|
const services = servicesManager.services;
|
||||||
const { displaySetService, viewportGridService, segmentationService } = services;
|
const { displaySetService, viewportGridService, segmentationService } = services;
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
|
|||||||
import { ActionButtons } from '@ohif/ui';
|
import { ActionButtons } from '@ohif/ui';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
function DynamicExport({ commandsManager, servicesManager, extensionManager }) {
|
function DynamicExport({ commandsManager, servicesManager, extensionManager }: withAppTypes) {
|
||||||
const { segmentationService } = servicesManager.services;
|
const { segmentationService } = servicesManager.services;
|
||||||
const { t } = useTranslation('dynamicExport');
|
const { t } = useTranslation('dynamicExport');
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import DynamicVolumeControls from './DynamicVolumeControls';
|
|||||||
|
|
||||||
const SOPClassHandlerId = '@ohif/extension-default.sopClassHandlerModule.stack';
|
const SOPClassHandlerId = '@ohif/extension-default.sopClassHandlerModule.stack';
|
||||||
|
|
||||||
export default function PanelGenerateImage({ servicesManager, commandsManager }) {
|
export default function PanelGenerateImage({ servicesManager, commandsManager }: withAppTypes) {
|
||||||
const { cornerstoneViewportService, viewportGridService, displaySetService } =
|
const { cornerstoneViewportService, viewportGridService, displaySetService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
|
|
||||||
@ -256,6 +256,9 @@ async function createComputedVolume(dynamicVolumeId, computedVolumeId) {
|
|||||||
if (!cache.getVolume(computedVolumeId)) {
|
if (!cache.getVolume(computedVolumeId)) {
|
||||||
const computedVolume = await volumeLoader.createAndCacheDerivedVolume(dynamicVolumeId, {
|
const computedVolume = await volumeLoader.createAndCacheDerivedVolume(dynamicVolumeId, {
|
||||||
volumeId: computedVolumeId,
|
volumeId: computedVolumeId,
|
||||||
|
targetBuffer: {
|
||||||
|
type: 'Float32Array',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
return computedVolume;
|
return computedVolume;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,67 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **contour:** set renderFill to false for contour ([#4186](https://github.com/OHIF/Viewers/issues/4186)) ([471e6a1](https://github.com/OHIF/Viewers/commit/471e6a1559d983267448058b8e17461f79130c79))
|
||||||
|
* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([2d4e049](https://github.com/OHIF/Viewers/commit/2d4e049d8a54ca25c9dc02f29f2e53a6968d82e1))
|
||||||
|
* dicom json for orthanc by Update package versions for [@cornerstonejs](https://github.com/cornerstonejs) dependencies ([#4165](https://github.com/OHIF/Viewers/issues/4165)) ([9f5165d](https://github.com/OHIF/Viewers/commit/9f5165de47ed547919683498cfae87909de94786))
|
||||||
|
* **rt:** dont convert to volume for RTSTRUCT ([#4157](https://github.com/OHIF/Viewers/issues/4157)) ([634abf3](https://github.com/OHIF/Viewers/commit/634abf353f02cffec462e341d594741fdefb6f22))
|
||||||
|
* **segmentation:** Address issue where segmentation creation failed on layout change ([#4153](https://github.com/OHIF/Viewers/issues/4153)) ([1b290bd](https://github.com/OHIF/Viewers/commit/1b290bdaa1a0ba750a4e5f539a51a636de529240))
|
||||||
|
* **us:** logic for color conversion ([b7ebb0a](https://github.com/OHIF/Viewers/commit/b7ebb0aa8f814427045b7d5e7568dc0298ab0973))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone",
|
"name": "@ohif/extension-cornerstone",
|
||||||
"version": "3.8.0-beta.93",
|
"version": "3.8.5",
|
||||||
"description": "OHIF extension for Cornerstone",
|
"description": "OHIF extension for Cornerstone",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -38,10 +38,10 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "^1.2.2",
|
"@cornerstonejs/codec-openjpeg": "^1.2.2",
|
||||||
"@cornerstonejs/codec-openjph": "^2.4.2",
|
"@cornerstonejs/codec-openjph": "^2.4.2",
|
||||||
"@cornerstonejs/dicom-image-loader": "^1.70.14",
|
"@cornerstonejs/dicom-image-loader": "^1.77.6",
|
||||||
"@icr/polyseg-wasm": "^0.4.0",
|
"@icr/polyseg-wasm": "^0.4.0",
|
||||||
"@ohif/core": "3.8.0-beta.93",
|
"@ohif/core": "3.8.5\n",
|
||||||
"@ohif/ui": "3.8.0-beta.93",
|
"@ohif/ui": "3.8.5\n",
|
||||||
"dcmjs": "^0.29.12",
|
"dcmjs": "^0.29.12",
|
||||||
"dicom-parser": "^1.8.21",
|
"dicom-parser": "^1.8.21",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
@ -55,10 +55,10 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^1.70.14",
|
"@cornerstonejs/adapters": "^1.77.6",
|
||||||
"@cornerstonejs/core": "^1.70.14",
|
"@cornerstonejs/core": "^1.77.6",
|
||||||
"@cornerstonejs/streaming-image-volume-loader": "^1.70.14",
|
"@cornerstonejs/streaming-image-volume-loader": "^1.77.6",
|
||||||
"@cornerstonejs/tools": "^1.70.14",
|
"@cornerstonejs/tools": "^1.77.6",
|
||||||
"@icr/polyseg-wasm": "^0.4.0",
|
"@icr/polyseg-wasm": "^0.4.0",
|
||||||
"@kitware/vtk.js": "30.4.1",
|
"@kitware/vtk.js": "30.4.1",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
|
|||||||
@ -18,7 +18,6 @@ import { setEnabledElement } from '../state';
|
|||||||
import './OHIFCornerstoneViewport.css';
|
import './OHIFCornerstoneViewport.css';
|
||||||
import CornerstoneOverlays from './Overlays/CornerstoneOverlays';
|
import CornerstoneOverlays from './Overlays/CornerstoneOverlays';
|
||||||
import getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes';
|
import getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes';
|
||||||
import CornerstoneServices from '../types/CornerstoneServices';
|
|
||||||
import CinePlayer from '../components/CinePlayer';
|
import CinePlayer from '../components/CinePlayer';
|
||||||
import { Types } from '@ohif/core';
|
import { Types } from '@ohif/core';
|
||||||
|
|
||||||
@ -100,7 +99,7 @@ function areEqual(prevProps, nextProps) {
|
|||||||
|
|
||||||
// Todo: This should be done with expose of internal API similar to react-vtkjs-viewport
|
// Todo: This should be done with expose of internal API similar to react-vtkjs-viewport
|
||||||
// Then we don't need to worry about the re-renders if the props change.
|
// Then we don't need to worry about the re-renders if the props change.
|
||||||
const OHIFCornerstoneViewport = React.memo(props => {
|
const OHIFCornerstoneViewport = React.memo((props: withAppTypes) => {
|
||||||
const {
|
const {
|
||||||
displaySets,
|
displaySets,
|
||||||
dataSource,
|
dataSource,
|
||||||
@ -108,11 +107,13 @@ const OHIFCornerstoneViewport = React.memo(props => {
|
|||||||
displaySetOptions,
|
displaySetOptions,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
onElementEnabled,
|
onElementEnabled,
|
||||||
|
// eslint-disable-next-line react/prop-types
|
||||||
onElementDisabled,
|
onElementDisabled,
|
||||||
isJumpToMeasurementDisabled,
|
isJumpToMeasurementDisabled,
|
||||||
// Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation
|
// Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation
|
||||||
// of the imageData in the OHIFCornerstoneViewport. This prop is used
|
// of the imageData in the OHIFCornerstoneViewport. This prop is used
|
||||||
// to set the initial state of the viewport's first image to render
|
// to set the initial state of the viewport's first image to render
|
||||||
|
// eslint-disable-next-line react/prop-types
|
||||||
initialImageIndex,
|
initialImageIndex,
|
||||||
// if the viewport is part of a hanging protocol layout
|
// if the viewport is part of a hanging protocol layout
|
||||||
// we should not really rely on the old synchronizers and
|
// we should not really rely on the old synchronizers and
|
||||||
@ -120,6 +121,7 @@ const OHIFCornerstoneViewport = React.memo(props => {
|
|||||||
// is not part of the hanging protocol layout. HPs should
|
// is not part of the hanging protocol layout. HPs should
|
||||||
// define their own synchronizers. Since the synchronizers are
|
// define their own synchronizers. Since the synchronizers are
|
||||||
// viewportId dependent and
|
// viewportId dependent and
|
||||||
|
// eslint-disable-next-line react/prop-types
|
||||||
isHangingProtocolLayout,
|
isHangingProtocolLayout,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
@ -152,7 +154,7 @@ const OHIFCornerstoneViewport = React.memo(props => {
|
|||||||
viewportGridService,
|
viewportGridService,
|
||||||
stateSyncService,
|
stateSyncService,
|
||||||
viewportActionCornersService,
|
viewportActionCornersService,
|
||||||
} = servicesManager.services as CornerstoneServices;
|
} = servicesManager.services;
|
||||||
|
|
||||||
const [viewportDialogState] = useViewportDialog();
|
const [viewportDialogState] = useViewportDialog();
|
||||||
// useCallback for scroll bar height calculation
|
// useCallback for scroll bar height calculation
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import CustomizableViewportOverlay from './CustomizableViewportOverlay';
|
|||||||
import ViewportOrientationMarkers from './ViewportOrientationMarkers';
|
import ViewportOrientationMarkers from './ViewportOrientationMarkers';
|
||||||
import ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator';
|
import ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator';
|
||||||
|
|
||||||
function CornerstoneOverlays(props) {
|
function CornerstoneOverlays(props: withAppTypes) {
|
||||||
const { viewportId, element, scrollbarHeight, servicesManager } = props;
|
const { viewportId, element, scrollbarHeight, servicesManager } = props;
|
||||||
const { cornerstoneViewportService } = servicesManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const [imageSliceData, setImageSliceData] = useState({
|
const [imageSliceData, setImageSliceData] = useState({
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import PropTypes from 'prop-types';
|
|||||||
import { metaData, Enums, utilities } from '@cornerstonejs/core';
|
import { metaData, Enums, utilities } from '@cornerstonejs/core';
|
||||||
import { ImageSliceData } from '@cornerstonejs/core/dist/esm/types';
|
import { ImageSliceData } from '@cornerstonejs/core/dist/esm/types';
|
||||||
import { ViewportOverlay } from '@ohif/ui';
|
import { ViewportOverlay } from '@ohif/ui';
|
||||||
import { ServicesManager } from '@ohif/core';
|
|
||||||
import { InstanceMetadata } from '@ohif/core/src/types';
|
import { InstanceMetadata } from '@ohif/core/src/types';
|
||||||
import { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils';
|
import { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils';
|
||||||
import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService';
|
import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService';
|
||||||
@ -19,7 +18,7 @@ interface OverlayItemProps {
|
|||||||
element: HTMLElement;
|
element: HTMLElement;
|
||||||
viewportData: ViewportData;
|
viewportData: ViewportData;
|
||||||
imageSliceData: ImageSliceData;
|
imageSliceData: ImageSliceData;
|
||||||
servicesManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
instance: InstanceMetadata;
|
instance: InstanceMetadata;
|
||||||
customization: any;
|
customization: any;
|
||||||
@ -59,7 +58,7 @@ function CustomizableViewportOverlay({
|
|||||||
viewportData: ViewportData;
|
viewportData: ViewportData;
|
||||||
imageSliceData: ImageSliceData;
|
imageSliceData: ImageSliceData;
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
servicesManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
}) {
|
}) {
|
||||||
const { cornerstoneViewportService, customizationService, toolGroupService } =
|
const { cornerstoneViewportService, customizationService, toolGroupService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
@ -318,7 +317,7 @@ function CustomizableViewportOverlay({
|
|||||||
function _getViewportInstances(viewportData) {
|
function _getViewportInstances(viewportData) {
|
||||||
const imageIds = [];
|
const imageIds = [];
|
||||||
if (viewportData.viewportType === Enums.ViewportType.STACK) {
|
if (viewportData.viewportType === Enums.ViewportType.STACK) {
|
||||||
imageIds.push(viewportData.data.imageIds[0]);
|
imageIds.push(viewportData.data[0].imageIds[0]);
|
||||||
} else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {
|
} else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {
|
||||||
const volumes = viewportData.data;
|
const volumes = viewportData.data;
|
||||||
volumes.forEach(volume => {
|
volumes.forEach(volume => {
|
||||||
@ -358,7 +357,7 @@ const getInstanceNumber = (viewportData, viewportId, imageIndex, cornerstoneView
|
|||||||
};
|
};
|
||||||
|
|
||||||
function _getInstanceNumberFromStack(viewportData, imageIndex) {
|
function _getInstanceNumberFromStack(viewportData, imageIndex) {
|
||||||
const imageIds = viewportData.data.imageIds;
|
const imageIds = viewportData.data[0].imageIds;
|
||||||
const imageId = imageIds[imageIndex];
|
const imageId = imageIds[imageIndex];
|
||||||
|
|
||||||
if (!imageId) {
|
if (!imageId) {
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
|
|||||||
import { Enums, Types, utilities } from '@cornerstonejs/core';
|
import { Enums, Types, utilities } from '@cornerstonejs/core';
|
||||||
import { utilities as csToolsUtils } from '@cornerstonejs/tools';
|
import { utilities as csToolsUtils } from '@cornerstonejs/tools';
|
||||||
import { ImageScrollbar } from '@ohif/ui';
|
import { ImageScrollbar } from '@ohif/ui';
|
||||||
import { ServicesManger } from '@ohif/core';
|
|
||||||
|
|
||||||
function CornerstoneImageScrollbar({
|
function CornerstoneImageScrollbar({
|
||||||
viewportData,
|
viewportData,
|
||||||
@ -13,8 +12,8 @@ function CornerstoneImageScrollbar({
|
|||||||
setImageSliceData,
|
setImageSliceData,
|
||||||
scrollbarHeight,
|
scrollbarHeight,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { cineService, cornerstoneViewportService } = (servicesManager as ServicesManger).services;
|
const { cineService, cornerstoneViewportService } = servicesManager.services;
|
||||||
|
|
||||||
const onImageScrollbarChange = (imageIndex, viewportId) => {
|
const onImageScrollbarChange = (imageIndex, viewportId) => {
|
||||||
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
||||||
@ -49,7 +48,7 @@ function CornerstoneImageScrollbar({
|
|||||||
|
|
||||||
setImageSliceData({
|
setImageSliceData({
|
||||||
imageIndex: imageIndex,
|
imageIndex: imageIndex,
|
||||||
numberOfSlices: viewportData.data.imageIds.length,
|
numberOfSlices: viewportData.data[0].imageIds.length,
|
||||||
});
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -79,7 +78,7 @@ function CornerstoneImageScrollbar({
|
|||||||
// find the index of imageId in the imageIds
|
// find the index of imageId in the imageIds
|
||||||
setImageSliceData({
|
setImageSliceData({
|
||||||
imageIndex: newImageIdIndex,
|
imageIndex: newImageIdIndex,
|
||||||
numberOfSlices: viewportData.data.imageIds.length,
|
numberOfSlices: viewportData.data[0].imageIds.length,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@ function ViewportOrientationMarkers({
|
|||||||
viewportId,
|
viewportId,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
orientationMarkers = ['top', 'left'],
|
orientationMarkers = ['top', 'left'],
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
// Rotation is in degrees
|
// Rotation is in degrees
|
||||||
const [rotation, setRotation] = useState(0);
|
const [rotation, setRotation] = useState(0);
|
||||||
const [flipHorizontal, setFlipHorizontal] = useState(false);
|
const [flipHorizontal, setFlipHorizontal] = useState(false);
|
||||||
@ -67,7 +67,7 @@ function ViewportOrientationMarkers({
|
|||||||
let rowCosines, columnCosines;
|
let rowCosines, columnCosines;
|
||||||
if (viewportData.viewportType === 'stack') {
|
if (viewportData.viewportType === 'stack') {
|
||||||
const imageIndex = imageSliceData.imageIndex;
|
const imageIndex = imageSliceData.imageIndex;
|
||||||
const imageId = viewportData.data.imageIds?.[imageIndex];
|
const imageId = viewportData.data[0].imageIds?.[imageIndex];
|
||||||
|
|
||||||
// Workaround for below TODO stub
|
// Workaround for below TODO stub
|
||||||
if (!imageId) {
|
if (!imageId) {
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import { callLabelAutocompleteDialog, showLabelAnnotationPopup } from './utils/c
|
|||||||
import toggleImageSliceSync from './utils/imageSliceSync/toggleImageSliceSync';
|
import toggleImageSliceSync from './utils/imageSliceSync/toggleImageSliceSync';
|
||||||
import { getFirstAnnotationSelected } from './utils/measurementServiceMappings/utils/selection';
|
import { getFirstAnnotationSelected } from './utils/measurementServiceMappings/utils/selection';
|
||||||
import getActiveViewportEnabledElement from './utils/getActiveViewportEnabledElement';
|
import getActiveViewportEnabledElement from './utils/getActiveViewportEnabledElement';
|
||||||
import { CornerstoneServices } from './types';
|
|
||||||
import toggleVOISliceSync from './utils/toggleVOISliceSync';
|
import toggleVOISliceSync from './utils/toggleVOISliceSync';
|
||||||
|
|
||||||
const toggleSyncFunctions = {
|
const toggleSyncFunctions = {
|
||||||
@ -44,7 +43,7 @@ function commandsModule({
|
|||||||
colorbarService,
|
colorbarService,
|
||||||
hangingProtocolService,
|
hangingProtocolService,
|
||||||
syncGroupService,
|
syncGroupService,
|
||||||
} = servicesManager.services as CornerstoneServices;
|
} = servicesManager.services;
|
||||||
|
|
||||||
const { measurementServiceSource } = this;
|
const { measurementServiceSource } = this;
|
||||||
|
|
||||||
|
|||||||
@ -1,14 +1,9 @@
|
|||||||
import React, { ReactElement } from 'react';
|
import React, { ReactElement } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { ServicesManager } from '@ohif/core';
|
|
||||||
import { useViewportGrid } from '@ohif/ui';
|
import { useViewportGrid } from '@ohif/ui';
|
||||||
import ViewportWindowLevel from '../ViewportWindowLevel/ViewportWindowLevel';
|
import ViewportWindowLevel from '../ViewportWindowLevel/ViewportWindowLevel';
|
||||||
|
|
||||||
const ActiveViewportWindowLevel = ({
|
const ActiveViewportWindowLevel = ({ servicesManager }: withAppTypes): ReactElement => {
|
||||||
servicesManager,
|
|
||||||
}: {
|
|
||||||
servicesManager: ServicesManager;
|
|
||||||
}): ReactElement => {
|
|
||||||
const [viewportGrid] = useViewportGrid();
|
const [viewportGrid] = useViewportGrid();
|
||||||
const { activeViewportId } = viewportGrid;
|
const { activeViewportId } = viewportGrid;
|
||||||
|
|
||||||
@ -25,7 +20,7 @@ const ActiveViewportWindowLevel = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
ActiveViewportWindowLevel.propTypes = {
|
ActiveViewportWindowLevel.propTypes = {
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager),
|
servicesManager: PropTypes.object.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ActiveViewportWindowLevel;
|
export default ActiveViewportWindowLevel;
|
||||||
|
|||||||
@ -4,7 +4,14 @@ import { Enums, eventTarget, cache } from '@cornerstonejs/core';
|
|||||||
import { Enums as StreamingEnums } from '@cornerstonejs/streaming-image-volume-loader';
|
import { Enums as StreamingEnums } from '@cornerstonejs/streaming-image-volume-loader';
|
||||||
import { useAppConfig } from '@state';
|
import { useAppConfig } from '@state';
|
||||||
|
|
||||||
function WrappedCinePlayer({ enabledVPElement, viewportId, servicesManager }) {
|
function WrappedCinePlayer({
|
||||||
|
enabledVPElement,
|
||||||
|
viewportId,
|
||||||
|
servicesManager,
|
||||||
|
}: withAppTypes<{
|
||||||
|
enabledVPElement: HTMLElement;
|
||||||
|
viewportId: string;
|
||||||
|
}>) {
|
||||||
const { customizationService, displaySetService, viewportGridService } = servicesManager.services;
|
const { customizationService, displaySetService, viewportGridService } = servicesManager.services;
|
||||||
const [{ isCineEnabled, cines }, cineService] = useCine();
|
const [{ isCineEnabled, cines }, cineService] = useCine();
|
||||||
const [newStackFrameRate, setNewStackFrameRate] = useState(24);
|
const [newStackFrameRate, setNewStackFrameRate] = useState(24);
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import React, { useEffect, useCallback, useState, ReactElement } from 'react';
|
import React, { useEffect, useCallback, useState, ReactElement } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import debounce from 'lodash.debounce';
|
import debounce from 'lodash.debounce';
|
||||||
import { ServicesManager } from '@ohif/core';
|
|
||||||
import { PanelSection, WindowLevel } from '@ohif/ui';
|
import { PanelSection, WindowLevel } from '@ohif/ui';
|
||||||
import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';
|
import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';
|
||||||
import { Enums, eventTarget, cache as cs3DCache, utilities as csUtils } from '@cornerstonejs/core';
|
import { Enums, eventTarget, cache as cs3DCache, utilities as csUtils } from '@cornerstonejs/core';
|
||||||
@ -12,10 +11,9 @@ const { Events } = Enums;
|
|||||||
const ViewportWindowLevel = ({
|
const ViewportWindowLevel = ({
|
||||||
servicesManager,
|
servicesManager,
|
||||||
viewportId,
|
viewportId,
|
||||||
}: {
|
}: withAppTypes<{
|
||||||
servicesManager: ServicesManager;
|
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
}): ReactElement => {
|
}>): ReactElement => {
|
||||||
const { cornerstoneViewportService } = servicesManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const [windowLevels, setWindowLevels] = useState([]);
|
const [windowLevels, setWindowLevels] = useState([]);
|
||||||
const [cachedHistograms, setCachedHistograms] = useState({});
|
const [cachedHistograms, setCachedHistograms] = useState({});
|
||||||
@ -380,7 +378,7 @@ const ViewportWindowLevel = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
ViewportWindowLevel.propTypes = {
|
ViewportWindowLevel.propTypes = {
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager),
|
servicesManager: PropTypes.object.isRequired,
|
||||||
viewportId: PropTypes.string.isRequired,
|
viewportId: PropTypes.string.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -8,10 +8,10 @@ export function setViewportColorbar(
|
|||||||
viewportId,
|
viewportId,
|
||||||
displaySets,
|
displaySets,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
serviceManager,
|
servicesManager: AppTypes.ServicesManager,
|
||||||
colorbarOptions
|
colorbarOptions
|
||||||
) {
|
) {
|
||||||
const { cornerstoneViewportService } = serviceManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
||||||
|
|
||||||
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
||||||
@ -59,10 +59,10 @@ export function Colorbar({
|
|||||||
viewportId,
|
viewportId,
|
||||||
displaySets,
|
displaySets,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
colorbarProperties,
|
colorbarProperties,
|
||||||
}: ColorbarProps): ReactElement {
|
}: withAppTypes<ColorbarProps>): ReactElement {
|
||||||
const { colorbarService } = serviceManager.services;
|
const { colorbarService } = servicesManager.services;
|
||||||
const {
|
const {
|
||||||
width: colorbarWidth,
|
width: colorbarWidth,
|
||||||
colorbarTickPosition,
|
colorbarTickPosition,
|
||||||
@ -73,7 +73,7 @@ export function Colorbar({
|
|||||||
const [showColorbar, setShowColorbar] = useState(colorbarService.hasColorbar(viewportId));
|
const [showColorbar, setShowColorbar] = useState(colorbarService.hasColorbar(viewportId));
|
||||||
|
|
||||||
const onSetColorbar = useCallback(() => {
|
const onSetColorbar = useCallback(() => {
|
||||||
setViewportColorbar(viewportId, displaySets, commandsManager, serviceManager, {
|
setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, {
|
||||||
viewportId,
|
viewportId,
|
||||||
colormaps,
|
colormaps,
|
||||||
ticks: {
|
ticks: {
|
||||||
|
|||||||
@ -8,9 +8,9 @@ export function Colormap({
|
|||||||
viewportId,
|
viewportId,
|
||||||
displaySets,
|
displaySets,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
}: ColormapProps): ReactElement {
|
}: ColormapProps): ReactElement {
|
||||||
const { cornerstoneViewportService } = serviceManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
|
|
||||||
const [activeDisplaySet, setActiveDisplaySet] = useState(displaySets[0]);
|
const [activeDisplaySet, setActiveDisplaySet] = useState(displaySets[0]);
|
||||||
|
|
||||||
|
|||||||
@ -2,11 +2,11 @@ import React, { ReactElement, useState, useEffect, useCallback } from 'react';
|
|||||||
import { VolumeLightingProps } from '../../types/ViewportPresets';
|
import { VolumeLightingProps } from '../../types/ViewportPresets';
|
||||||
|
|
||||||
export function VolumeLighting({
|
export function VolumeLighting({
|
||||||
serviceManager,
|
servicesManager,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
viewportId,
|
viewportId,
|
||||||
}: VolumeLightingProps): ReactElement {
|
}: VolumeLightingProps): ReactElement {
|
||||||
const { cornerstoneViewportService } = serviceManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const [ambient, setAmbient] = useState(null);
|
const [ambient, setAmbient] = useState(null);
|
||||||
const [diffuse, setDiffuse] = useState(null);
|
const [diffuse, setDiffuse] = useState(null);
|
||||||
const [specular, setSpecular] = useState(null);
|
const [specular, setSpecular] = useState(null);
|
||||||
|
|||||||
@ -9,21 +9,21 @@ export function VolumeRenderingOptions({
|
|||||||
viewportId,
|
viewportId,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
volumeRenderingQualityRange,
|
volumeRenderingQualityRange,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
}: VolumeRenderingOptionsProps): ReactElement {
|
}: VolumeRenderingOptionsProps): ReactElement {
|
||||||
return (
|
return (
|
||||||
<AllInOneMenu.ItemPanel>
|
<AllInOneMenu.ItemPanel>
|
||||||
<VolumeRenderingQuality
|
<VolumeRenderingQuality
|
||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
volumeRenderingQualityRange={volumeRenderingQualityRange}
|
volumeRenderingQualityRange={volumeRenderingQualityRange}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<VolumeShift
|
<VolumeShift
|
||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
/>
|
/>
|
||||||
<div className="all-in-one-menu-item mt-2 flex !h-[20px] w-full justify-start">
|
<div className="all-in-one-menu-item mt-2 flex !h-[20px] w-full justify-start">
|
||||||
<div className="text-aqua-pale text-[13px]">LIGHTING</div>
|
<div className="text-aqua-pale text-[13px]">LIGHTING</div>
|
||||||
@ -32,14 +32,14 @@ export function VolumeRenderingOptions({
|
|||||||
<div className="all-in-one-menu-item flex w-full justify-center">
|
<div className="all-in-one-menu-item flex w-full justify-center">
|
||||||
<VolumeShade
|
<VolumeShade
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<VolumeLighting
|
<VolumeLighting
|
||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
/>
|
/>
|
||||||
</AllInOneMenu.ItemPanel>
|
</AllInOneMenu.ItemPanel>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import { VolumeRenderingPresetsContent } from './VolumeRenderingPresetsContent';
|
|||||||
|
|
||||||
export function VolumeRenderingPresets({
|
export function VolumeRenderingPresets({
|
||||||
viewportId,
|
viewportId,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
volumeRenderingPresets,
|
volumeRenderingPresets,
|
||||||
}: VolumeRenderingPresetsProps): ReactElement {
|
}: VolumeRenderingPresetsProps): ReactElement {
|
||||||
const { uiModalService } = serviceManager.services;
|
const { uiModalService } = servicesManager.services;
|
||||||
|
|
||||||
const onClickPresets = () => {
|
const onClickPresets = () => {
|
||||||
uiModalService.show({
|
uiModalService.show({
|
||||||
|
|||||||
@ -4,10 +4,10 @@ import { VolumeRenderingQualityProps } from '../../types/ViewportPresets';
|
|||||||
export function VolumeRenderingQuality({
|
export function VolumeRenderingQuality({
|
||||||
volumeRenderingQualityRange,
|
volumeRenderingQualityRange,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
viewportId,
|
viewportId,
|
||||||
}: VolumeRenderingQualityProps): ReactElement {
|
}: VolumeRenderingQualityProps): ReactElement {
|
||||||
const { cornerstoneViewportService } = serviceManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const { min, max, step } = volumeRenderingQualityRange;
|
const { min, max, step } = volumeRenderingQualityRange;
|
||||||
const [quality, setQuality] = useState(null);
|
const [quality, setQuality] = useState(null);
|
||||||
|
|
||||||
|
|||||||
@ -5,9 +5,9 @@ import { VolumeShadeProps } from '../../types/ViewportPresets';
|
|||||||
export function VolumeShade({
|
export function VolumeShade({
|
||||||
commandsManager,
|
commandsManager,
|
||||||
viewportId,
|
viewportId,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
}: VolumeShadeProps): ReactElement {
|
}: VolumeShadeProps): ReactElement {
|
||||||
const { cornerstoneViewportService } = serviceManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const [shade, setShade] = useState(true);
|
const [shade, setShade] = useState(true);
|
||||||
const [key, setKey] = useState(0);
|
const [key, setKey] = useState(0);
|
||||||
|
|
||||||
|
|||||||
@ -4,9 +4,9 @@ import { VolumeShiftProps } from '../../types/ViewportPresets';
|
|||||||
export function VolumeShift({
|
export function VolumeShift({
|
||||||
viewportId,
|
viewportId,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
}: VolumeShiftProps): ReactElement {
|
}: VolumeShiftProps): ReactElement {
|
||||||
const { cornerstoneViewportService } = serviceManager.services;
|
const { cornerstoneViewportService } = servicesManager.services;
|
||||||
const [minShift, setMinShift] = useState<number | null>(null);
|
const [minShift, setMinShift] = useState<number | null>(null);
|
||||||
const [maxShift, setMaxShift] = useState<number | null>(null);
|
const [maxShift, setMaxShift] = useState<number | null>(null);
|
||||||
const [shift, setShift] = useState<number | null>(
|
const [shift, setShift] = useState<number | null>(
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import React, { ReactElement, useCallback, useEffect, useState } from 'react';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { AllInOneMenu, useViewportGrid } from '@ohif/ui';
|
import { AllInOneMenu, useViewportGrid } from '@ohif/ui';
|
||||||
import { CommandsManager, ServicesManager } from '@ohif/core';
|
|
||||||
import { Colormap } from './Colormap';
|
import { Colormap } from './Colormap';
|
||||||
import { Colorbar } from './Colorbar';
|
import { Colorbar } from './Colorbar';
|
||||||
import { setViewportColorbar } from './Colorbar';
|
import { setViewportColorbar } from './Colorbar';
|
||||||
@ -22,8 +21,6 @@ export type WindowLevelActionMenuProps = {
|
|||||||
presets: Array<Record<string, Array<WindowLevelPreset>>>;
|
presets: Array<Record<string, Array<WindowLevelPreset>>>;
|
||||||
verticalDirection: AllInOneMenu.VerticalDirection;
|
verticalDirection: AllInOneMenu.VerticalDirection;
|
||||||
horizontalDirection: AllInOneMenu.HorizontalDirection;
|
horizontalDirection: AllInOneMenu.HorizontalDirection;
|
||||||
commandsManager: CommandsManager;
|
|
||||||
serviceManager: ServicesManager;
|
|
||||||
colorbarProperties: ColorbarProperties;
|
colorbarProperties: ColorbarProperties;
|
||||||
displaySets: Array<any>;
|
displaySets: Array<any>;
|
||||||
volumeRenderingPresets: Array<ViewportPreset>;
|
volumeRenderingPresets: Array<ViewportPreset>;
|
||||||
@ -37,12 +34,12 @@ export function WindowLevelActionMenu({
|
|||||||
verticalDirection,
|
verticalDirection,
|
||||||
horizontalDirection,
|
horizontalDirection,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
serviceManager,
|
servicesManager,
|
||||||
colorbarProperties,
|
colorbarProperties,
|
||||||
displaySets,
|
displaySets,
|
||||||
volumeRenderingPresets,
|
volumeRenderingPresets,
|
||||||
volumeRenderingQualityRange,
|
volumeRenderingQualityRange,
|
||||||
}: WindowLevelActionMenuProps): ReactElement {
|
}: withAppTypes<WindowLevelActionMenuProps>): ReactElement {
|
||||||
const {
|
const {
|
||||||
colormaps,
|
colormaps,
|
||||||
colorbarContainerPosition,
|
colorbarContainerPosition,
|
||||||
@ -50,7 +47,7 @@ export function WindowLevelActionMenu({
|
|||||||
colorbarTickPosition,
|
colorbarTickPosition,
|
||||||
width: colorbarWidth,
|
width: colorbarWidth,
|
||||||
} = colorbarProperties;
|
} = colorbarProperties;
|
||||||
const { colorbarService, cornerstoneViewportService } = serviceManager.services;
|
const { colorbarService, cornerstoneViewportService } = servicesManager.services;
|
||||||
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
||||||
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
||||||
const backgroundColor = viewportInfo.getViewportOptions().background;
|
const backgroundColor = viewportInfo.getViewportOptions().background;
|
||||||
@ -68,7 +65,7 @@ export function WindowLevelActionMenu({
|
|||||||
const [is3DVolume, setIs3DVolume] = useState(false);
|
const [is3DVolume, setIs3DVolume] = useState(false);
|
||||||
|
|
||||||
const onSetColorbar = useCallback(() => {
|
const onSetColorbar = useCallback(() => {
|
||||||
setViewportColorbar(viewportId, displaySets, commandsManager, serviceManager, {
|
setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, {
|
||||||
colormaps,
|
colormaps,
|
||||||
ticks: {
|
ticks: {
|
||||||
position: colorbarTickPosition,
|
position: colorbarTickPosition,
|
||||||
@ -138,7 +135,7 @@ export function WindowLevelActionMenu({
|
|||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))}
|
displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
colorbarProperties={colorbarProperties}
|
colorbarProperties={colorbarProperties}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@ -154,7 +151,7 @@ export function WindowLevelActionMenu({
|
|||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))}
|
displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
/>
|
/>
|
||||||
</AllInOneMenu.SubMenu>
|
</AllInOneMenu.SubMenu>
|
||||||
)}
|
)}
|
||||||
@ -175,7 +172,7 @@ export function WindowLevelActionMenu({
|
|||||||
|
|
||||||
{volumeRenderingPresets && is3DVolume && (
|
{volumeRenderingPresets && is3DVolume && (
|
||||||
<VolumeRenderingPresets
|
<VolumeRenderingPresets
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
volumeRenderingPresets={volumeRenderingPresets}
|
volumeRenderingPresets={volumeRenderingPresets}
|
||||||
@ -188,7 +185,7 @@ export function WindowLevelActionMenu({
|
|||||||
viewportId={viewportId}
|
viewportId={viewportId}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
volumeRenderingQualityRange={volumeRenderingQualityRange}
|
volumeRenderingQualityRange={volumeRenderingQualityRange}
|
||||||
serviceManager={serviceManager}
|
servicesManager={servicesManager}
|
||||||
/>
|
/>
|
||||||
</AllInOneMenu.SubMenu>
|
</AllInOneMenu.SubMenu>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -9,7 +9,7 @@ export function getWindowLevelActionMenu({
|
|||||||
commandsManager,
|
commandsManager,
|
||||||
verticalDirection,
|
verticalDirection,
|
||||||
horizontalDirection,
|
horizontalDirection,
|
||||||
}): ReactNode {
|
}: withAppTypes): ReactNode {
|
||||||
const { customizationService } = servicesManager.services;
|
const { customizationService } = servicesManager.services;
|
||||||
|
|
||||||
const { presets } = customizationService.get('cornerstone.windowLevelPresets');
|
const { presets } = customizationService.get('cornerstone.windowLevelPresets');
|
||||||
@ -32,7 +32,7 @@ export function getWindowLevelActionMenu({
|
|||||||
verticalDirection={verticalDirection}
|
verticalDirection={verticalDirection}
|
||||||
horizontalDirection={horizontalDirection}
|
horizontalDirection={horizontalDirection}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
serviceManager={servicesManager}
|
servicesManager={servicesManager}
|
||||||
colorbarProperties={colorbarProperties}
|
colorbarProperties={colorbarProperties}
|
||||||
displaySets={displaySets}
|
displaySets={displaySets}
|
||||||
volumeRenderingPresets={volumeRenderingPresets}
|
volumeRenderingPresets={volumeRenderingPresets}
|
||||||
|
|||||||
@ -6,7 +6,7 @@ const getToggledClassName = (isToggled: boolean) => {
|
|||||||
: '!text-common-bright hover:!bg-primary-dark hover:text-primary-light';
|
: '!text-common-bright hover:!bg-primary-dark hover:text-primary-light';
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function getToolbarModule({ commandsManager, servicesManager }) {
|
export default function getToolbarModule({ commandsManager, servicesManager }: withAppTypes) {
|
||||||
const {
|
const {
|
||||||
toolGroupService,
|
toolGroupService,
|
||||||
toolbarService,
|
toolbarService,
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import {
|
|||||||
} from '@cornerstonejs/core';
|
} from '@cornerstonejs/core';
|
||||||
import * as csStreamingImageVolumeLoader from '@cornerstonejs/streaming-image-volume-loader';
|
import * as csStreamingImageVolumeLoader from '@cornerstonejs/streaming-image-volume-loader';
|
||||||
import { Enums as cs3DToolsEnums } from '@cornerstonejs/tools';
|
import { Enums as cs3DToolsEnums } from '@cornerstonejs/tools';
|
||||||
import { ServicesManager, Types } from '@ohif/core';
|
import { Types } from '@ohif/core';
|
||||||
|
|
||||||
import init from './init';
|
import init from './init';
|
||||||
import getCustomizationModule from './getCustomizationModule';
|
import getCustomizationModule from './getCustomizationModule';
|
||||||
@ -61,7 +61,7 @@ const cornerstoneExtension: Types.Extensions.Extension = {
|
|||||||
*/
|
*/
|
||||||
id,
|
id,
|
||||||
|
|
||||||
onModeEnter: ({ servicesManager }): void => {
|
onModeEnter: ({ servicesManager }: withAppTypes): void => {
|
||||||
const { cornerstoneViewportService, toolbarService, segmentationService } =
|
const { cornerstoneViewportService, toolbarService, segmentationService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
toolbarService.registerEventForToolbarUpdate(cornerstoneViewportService, [
|
toolbarService.registerEventForToolbarUpdate(cornerstoneViewportService, [
|
||||||
@ -79,7 +79,7 @@ const cornerstoneExtension: Types.Extensions.Extension = {
|
|||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
|
|
||||||
onModeExit: ({ servicesManager }): void => {
|
onModeExit: ({ servicesManager }: withAppTypes): void => {
|
||||||
const { cineService } = servicesManager.services;
|
const { cineService } = servicesManager.services;
|
||||||
// Empty out the image load and retrieval pools to prevent memory leaks
|
// Empty out the image load and retrieval pools to prevent memory leaks
|
||||||
// on the mode exits
|
// on the mode exits
|
||||||
@ -132,7 +132,7 @@ const cornerstoneExtension: Types.Extensions.Extension = {
|
|||||||
// const onNewImageHandler = jumpData => {
|
// const onNewImageHandler = jumpData => {
|
||||||
// commandsManager.runCommand('jumpToImage', jumpData);
|
// commandsManager.runCommand('jumpToImage', jumpData);
|
||||||
// };
|
// };
|
||||||
const { toolbarService } = (servicesManager as ServicesManager).services;
|
const { toolbarService } = servicesManager.services;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<OHIFCornerstoneViewport
|
<OHIFCornerstoneViewport
|
||||||
|
|||||||
@ -30,12 +30,9 @@ import nthLoader from './utils/nthLoader';
|
|||||||
import interleaveTopToBottom from './utils/interleaveTopToBottom';
|
import interleaveTopToBottom from './utils/interleaveTopToBottom';
|
||||||
import initContextMenu from './initContextMenu';
|
import initContextMenu from './initContextMenu';
|
||||||
import initDoubleClick from './initDoubleClick';
|
import initDoubleClick from './initDoubleClick';
|
||||||
import { CornerstoneServices } from './types';
|
|
||||||
import initViewTiming from './utils/initViewTiming';
|
import initViewTiming from './utils/initViewTiming';
|
||||||
import { colormaps } from './utils/colormaps';
|
import { colormaps } from './utils/colormaps';
|
||||||
|
|
||||||
import { debounce } from 'lodash';
|
|
||||||
|
|
||||||
const { registerColormap } = csUtilities.colormap;
|
const { registerColormap } = csUtilities.colormap;
|
||||||
|
|
||||||
// TODO: Cypress tests are currently grabbing this from the window?
|
// TODO: Cypress tests are currently grabbing this from the window?
|
||||||
@ -101,7 +98,7 @@ export default async function init({
|
|||||||
hangingProtocolService,
|
hangingProtocolService,
|
||||||
viewportGridService,
|
viewportGridService,
|
||||||
stateSyncService,
|
stateSyncService,
|
||||||
} = servicesManager.services as CornerstoneServices;
|
} = servicesManager.services;
|
||||||
|
|
||||||
window.services = servicesManager.services;
|
window.services = servicesManager.services;
|
||||||
window.extensionManager = extensionManager;
|
window.extensionManager = extensionManager;
|
||||||
@ -144,6 +141,7 @@ export default async function init({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const labelmapRepresentation = cornerstoneTools.Enums.SegmentationRepresentations.Labelmap;
|
const labelmapRepresentation = cornerstoneTools.Enums.SegmentationRepresentations.Labelmap;
|
||||||
|
const contourRepresentation = cornerstoneTools.Enums.SegmentationRepresentations.Contour;
|
||||||
|
|
||||||
cornerstoneTools.segmentation.config.setGlobalRepresentationConfig(labelmapRepresentation, {
|
cornerstoneTools.segmentation.config.setGlobalRepresentationConfig(labelmapRepresentation, {
|
||||||
fillAlpha: 0.5,
|
fillAlpha: 0.5,
|
||||||
@ -152,6 +150,10 @@ export default async function init({
|
|||||||
outlineOpacityInactive: 0.65,
|
outlineOpacityInactive: 0.65,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
cornerstoneTools.segmentation.config.setGlobalRepresentationConfig(contourRepresentation, {
|
||||||
|
renderFill: false,
|
||||||
|
});
|
||||||
|
|
||||||
const metadataProvider = OHIF.classes.MetadataProvider;
|
const metadataProvider = OHIF.classes.MetadataProvider;
|
||||||
|
|
||||||
volumeLoader.registerVolumeLoader(
|
volumeLoader.registerVolumeLoader(
|
||||||
|
|||||||
@ -19,7 +19,7 @@ function _getVolumeFromViewport(viewport) {
|
|||||||
* @param srcViewportIndex Source viewport index
|
* @param srcViewportIndex Source viewport index
|
||||||
* @returns array with viewport information.
|
* @returns array with viewport information.
|
||||||
*/
|
*/
|
||||||
function _getSyncedViewports(servicesManager, srcViewportId) {
|
function _getSyncedViewports(servicesManager: AppTypes.ServicesManager, srcViewportId) {
|
||||||
const { viewportGridService, cornerstoneViewportService } = servicesManager.services;
|
const { viewportGridService, cornerstoneViewportService } = servicesManager.services;
|
||||||
|
|
||||||
const { viewports: viewportsStates } = viewportGridService.getState();
|
const { viewports: viewportsStates } = viewportGridService.getState();
|
||||||
@ -48,7 +48,7 @@ function _getSyncedViewports(servicesManager, srcViewportId) {
|
|||||||
.map(({ viewportId }) => ({ viewportId }));
|
.map(({ viewportId }) => ({ viewportId }));
|
||||||
}
|
}
|
||||||
|
|
||||||
function initCineService(servicesManager) {
|
function initCineService(servicesManager: AppTypes.ServicesManager) {
|
||||||
const { cineService } = servicesManager.services;
|
const { cineService } = servicesManager.services;
|
||||||
|
|
||||||
const getSyncedViewports = viewportId => {
|
const getSyncedViewports = viewportId => {
|
||||||
|
|||||||
@ -178,7 +178,7 @@ const initMeasurementService = (
|
|||||||
return csTools3DVer1MeasurementSource;
|
return csTools3DVer1MeasurementSource;
|
||||||
};
|
};
|
||||||
|
|
||||||
const connectToolsToMeasurementService = servicesManager => {
|
const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesManager) => {
|
||||||
const {
|
const {
|
||||||
measurementService,
|
measurementService,
|
||||||
displaySetService,
|
displaySetService,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
import { ServicesManager, Types } from '@ohif/core';
|
import { Types } from '@ohif/core';
|
||||||
import { cache as cs3DCache, Enums, volumeLoader, utilities as utils } from '@cornerstonejs/core';
|
import { cache as cs3DCache, Enums, volumeLoader, utilities as utils } from '@cornerstonejs/core';
|
||||||
|
|
||||||
import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType';
|
import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType';
|
||||||
@ -17,9 +17,9 @@ class CornerstoneCacheService {
|
|||||||
|
|
||||||
stackImageIds: Map<string, string[]> = new Map();
|
stackImageIds: Map<string, string[]> = new Map();
|
||||||
volumeImageIds: Map<string, string[]> = new Map();
|
volumeImageIds: Map<string, string[]> = new Map();
|
||||||
readonly servicesManager: ServicesManager;
|
readonly servicesManager: AppTypes.ServicesManager;
|
||||||
|
|
||||||
constructor(servicesManager: ServicesManager) {
|
constructor(servicesManager: AppTypes.ServicesManager) {
|
||||||
this.servicesManager = servicesManager;
|
this.servicesManager = servicesManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,14 +129,25 @@ class CornerstoneCacheService {
|
|||||||
return newViewportData;
|
return newViewportData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _getStackViewportData(
|
private async _getStackViewportData(
|
||||||
dataSource,
|
dataSource,
|
||||||
displaySets,
|
displaySets,
|
||||||
initialImageIndex,
|
initialImageIndex,
|
||||||
viewportType: Enums.ViewportType
|
viewportType: Enums.ViewportType
|
||||||
): StackViewportData {
|
): Promise<StackViewportData> {
|
||||||
// For Stack Viewport we don't have fusion currently
|
const overlayDisplaySets = displaySets.filter(ds => ds.isOverlayDisplaySet);
|
||||||
const displaySet = displaySets[0];
|
const nonOverlayDisplaySets = displaySets.filter(ds => !ds.isOverlayDisplaySet);
|
||||||
|
|
||||||
|
// load overlays if they are not loaded
|
||||||
|
for (const overlayDisplaySet of overlayDisplaySets) {
|
||||||
|
if (overlayDisplaySet.load && overlayDisplaySet.load instanceof Function) {
|
||||||
|
const { userAuthenticationService } = this.servicesManager.services;
|
||||||
|
const headers = userAuthenticationService.getAuthorizationHeader();
|
||||||
|
await overlayDisplaySet.load({ headers });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const displaySet = nonOverlayDisplaySets[0];
|
||||||
|
|
||||||
let stackImageIds = this.stackImageIds.get(displaySet.displaySetInstanceUID);
|
let stackImageIds = this.stackImageIds.get(displaySet.displaySetInstanceUID);
|
||||||
|
|
||||||
@ -145,23 +156,23 @@ class CornerstoneCacheService {
|
|||||||
this.stackImageIds.set(displaySet.displaySetInstanceUID, stackImageIds);
|
this.stackImageIds.set(displaySet.displaySetInstanceUID, stackImageIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { displaySetInstanceUID, StudyInstanceUID, isCompositeStack } = displaySet;
|
// Ensuring the first non-overlay `displaySet` is always the primary one
|
||||||
|
const StackViewportData = [displaySet, ...overlayDisplaySets].map(ds => {
|
||||||
|
const { displaySetInstanceUID, StudyInstanceUID, isCompositeStack } = ds;
|
||||||
|
|
||||||
const StackViewportData: StackViewportData = {
|
return {
|
||||||
viewportType,
|
|
||||||
data: {
|
|
||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
displaySetInstanceUID,
|
displaySetInstanceUID,
|
||||||
isCompositeStack,
|
isCompositeStack,
|
||||||
imageIds: stackImageIds,
|
imageIds: stackImageIds,
|
||||||
},
|
initialImageIndex,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
viewportType,
|
||||||
|
data: StackViewportData,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (typeof initialImageIndex === 'number') {
|
|
||||||
StackViewportData.data.initialImageIndex = initialImageIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return StackViewportData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _getVolumeViewportData(
|
private async _getVolumeViewportData(
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { Types as OhifTypes, ServicesManager, PubSubService } from '@ohif/core';
|
import { Types as OhifTypes, PubSubService } from '@ohif/core';
|
||||||
import {
|
import {
|
||||||
cache,
|
cache,
|
||||||
Enums as csEnums,
|
Enums as csEnums,
|
||||||
@ -60,7 +60,7 @@ class SegmentationService extends PubSubService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
segmentations: Record<string, Segmentation>;
|
segmentations: Record<string, Segmentation>;
|
||||||
readonly servicesManager: ServicesManager;
|
readonly servicesManager: AppTypes.ServicesManager;
|
||||||
highlightIntervalId = null;
|
highlightIntervalId = null;
|
||||||
readonly EVENTS = EVENTS;
|
readonly EVENTS = EVENTS;
|
||||||
|
|
||||||
@ -1015,6 +1015,8 @@ class SegmentationService extends PubSubService {
|
|||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
const segmentation = this.getSegmentation(segmentationId);
|
const segmentation = this.getSegmentation(segmentationId);
|
||||||
|
|
||||||
|
toolGroupId = toolGroupId || this._getApplicableToolGroupId();
|
||||||
|
|
||||||
if (!segmentation) {
|
if (!segmentation) {
|
||||||
throw new Error(`Segmentation with segmentationId ${segmentationId} not found.`);
|
throw new Error(`Segmentation with segmentationId ${segmentationId} not found.`);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools';
|
import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools';
|
||||||
import { getRenderingEngines, utilities } from '@cornerstonejs/core';
|
import { getRenderingEngines, utilities } from '@cornerstonejs/core';
|
||||||
|
|
||||||
import { pubSubServiceInterface, Types, ServicesManager } from '@ohif/core';
|
import { pubSubServiceInterface, Types } from '@ohif/core';
|
||||||
|
|
||||||
const EVENTS = {
|
const EVENTS = {
|
||||||
TOOL_GROUP_CREATED: 'event::cornerstone::syncgroupservice:toolgroupcreated',
|
TOOL_GROUP_CREATED: 'event::cornerstone::syncgroupservice:toolgroupcreated',
|
||||||
@ -40,7 +40,7 @@ export default class SyncGroupService {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
servicesManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
listeners: { [key: string]: (...args: any[]) => void } = {};
|
listeners: { [key: string]: (...args: any[]) => void } = {};
|
||||||
EVENTS: { [key: string]: string };
|
EVENTS: { [key: string]: string };
|
||||||
synchronizerCreators: Record<string, SyncCreator> = {
|
synchronizerCreators: Record<string, SyncCreator> = {
|
||||||
@ -55,8 +55,8 @@ export default class SyncGroupService {
|
|||||||
|
|
||||||
synchronizersByType: { [key: string]: Synchronizer[] } = {};
|
synchronizersByType: { [key: string]: Synchronizer[] } = {};
|
||||||
|
|
||||||
constructor(serviceManager: ServicesManager) {
|
constructor(servicesManager: AppTypes.ServicesManager) {
|
||||||
this.servicesManager = serviceManager;
|
this.servicesManager = servicesManager;
|
||||||
this.listeners = {};
|
this.listeners = {};
|
||||||
this.EVENTS = EVENTS;
|
this.EVENTS = EVENTS;
|
||||||
//
|
//
|
||||||
|
|||||||
@ -32,7 +32,10 @@ export default class ToolGroupService {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
serviceManager: any;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
|
cornerstoneViewportService: any;
|
||||||
|
viewportGridService: any;
|
||||||
|
uiNotificationService: any;
|
||||||
private toolGroupIds: Set<string> = new Set();
|
private toolGroupIds: Set<string> = new Set();
|
||||||
/**
|
/**
|
||||||
* Service-specific
|
* Service-specific
|
||||||
@ -40,9 +43,9 @@ export default class ToolGroupService {
|
|||||||
listeners: { [key: string]: Function[] };
|
listeners: { [key: string]: Function[] };
|
||||||
EVENTS: { [key: string]: string };
|
EVENTS: { [key: string]: string };
|
||||||
|
|
||||||
constructor(serviceManager) {
|
constructor(servicesManager: AppTypes.ServicesManager) {
|
||||||
const { cornerstoneViewportService, viewportGridService, uiNotificationService } =
|
const { cornerstoneViewportService, viewportGridService, uiNotificationService } =
|
||||||
serviceManager.services;
|
servicesManager.services;
|
||||||
this.cornerstoneViewportService = cornerstoneViewportService;
|
this.cornerstoneViewportService = cornerstoneViewportService;
|
||||||
this.viewportGridService = viewportGridService;
|
this.viewportGridService = viewportGridService;
|
||||||
this.uiNotificationService = uiNotificationService;
|
this.uiNotificationService = uiNotificationService;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { PubSubService, ServicesManager } from '@ohif/core';
|
import { PubSubService } from '@ohif/core';
|
||||||
import * as OhifTypes from '@ohif/core/types';
|
import * as OhifTypes from '@ohif/core/types';
|
||||||
import {
|
import {
|
||||||
RenderingEngine,
|
RenderingEngine,
|
||||||
@ -52,14 +52,14 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
|
|||||||
enableResizeDetector: true;
|
enableResizeDetector: true;
|
||||||
resizeRefreshRateMs: 200;
|
resizeRefreshRateMs: 200;
|
||||||
resizeRefreshMode: 'debounce';
|
resizeRefreshMode: 'debounce';
|
||||||
servicesManager = null;
|
servicesManager: AppTypes.ServicesManager = null;
|
||||||
|
|
||||||
resizeQueue = [];
|
resizeQueue = [];
|
||||||
viewportResizeTimer = null;
|
viewportResizeTimer = null;
|
||||||
gridResizeDelay = 50;
|
gridResizeDelay = 50;
|
||||||
gridResizeTimeOut = null;
|
gridResizeTimeOut = null;
|
||||||
|
|
||||||
constructor(servicesManager: ServicesManager) {
|
constructor(servicesManager: AppTypes.ServicesManager) {
|
||||||
super(EVENTS);
|
super(EVENTS);
|
||||||
this.renderingEngine = null;
|
this.renderingEngine = null;
|
||||||
this.viewportGridResizeObserver = null;
|
this.viewportGridResizeObserver = null;
|
||||||
@ -557,9 +557,14 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
|
|||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const displaySetOptions = viewportInfo.getDisplaySetOptions();
|
const displaySetOptions = viewportInfo.getDisplaySetOptions();
|
||||||
|
|
||||||
const { imageIds, initialImageIndex, displaySetInstanceUID } = viewportData.data;
|
const displaySetInstanceUIDs = viewportData.data.map(data => data.displaySetInstanceUID);
|
||||||
|
|
||||||
this.viewportsDisplaySets.set(viewport.id, [displaySetInstanceUID]);
|
// based on the cache service construct always the first one is the non-overlay
|
||||||
|
// and the rest are overlays
|
||||||
|
|
||||||
|
this.viewportsDisplaySets.set(viewport.id, [...displaySetInstanceUIDs]);
|
||||||
|
|
||||||
|
const { initialImageIndex, imageIds } = viewportData.data[0];
|
||||||
|
|
||||||
let initialImageIndexToUse =
|
let initialImageIndexToUse =
|
||||||
presentations?.positionPresentation?.initialImageIndex ?? initialImageIndex;
|
presentations?.positionPresentation?.initialImageIndex ?? initialImageIndex;
|
||||||
@ -588,6 +593,8 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._handleOverlays(viewport);
|
||||||
|
|
||||||
return viewport.setStack(imageIds, initialImageIndexToUse).then(() => {
|
return viewport.setStack(imageIds, initialImageIndexToUse).then(() => {
|
||||||
viewport.setProperties({ ...properties });
|
viewport.setProperties({ ...properties });
|
||||||
this.setPresentations(viewport.id, presentations);
|
this.setPresentations(viewport.id, presentations);
|
||||||
@ -772,24 +779,7 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
|
|||||||
|
|
||||||
this.setPresentations(viewport.id, presentations);
|
this.setPresentations(viewport.id, presentations);
|
||||||
|
|
||||||
// load any secondary displaySets
|
this._handleOverlays(viewport);
|
||||||
const displaySetInstanceUIDs = this.viewportsDisplaySets.get(viewport.id);
|
|
||||||
|
|
||||||
// can be SEG or RTSTRUCT for now
|
|
||||||
const overlayDisplaySet = displaySetInstanceUIDs
|
|
||||||
.map(displaySetService.getDisplaySetByUID)
|
|
||||||
.find(displaySet => displaySet?.isOverlayDisplaySet);
|
|
||||||
|
|
||||||
if (overlayDisplaySet) {
|
|
||||||
this.addOverlayRepresentationForDisplaySet(overlayDisplaySet, viewport);
|
|
||||||
} else {
|
|
||||||
// If the displaySet is not a SEG displaySet we assume it is a primary displaySet
|
|
||||||
// and we can look into hydrated segmentations to check if any of them are
|
|
||||||
// associated with the primary displaySet
|
|
||||||
|
|
||||||
// get segmentations only returns the hydrated segmentations
|
|
||||||
this._addSegmentationRepresentationToToolGroupIfNecessary(displaySetInstanceUIDs, viewport);
|
|
||||||
}
|
|
||||||
|
|
||||||
const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id);
|
const toolGroup = toolGroupService.getToolGroupForViewport(viewport.id);
|
||||||
csToolsUtils.segmentation.triggerSegmentationRender(toolGroup.id);
|
csToolsUtils.segmentation.triggerSegmentationRender(toolGroup.id);
|
||||||
@ -809,6 +799,28 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _handleOverlays(viewport: Types.IStackViewport | Types.IVolumeViewport) {
|
||||||
|
const { displaySetService } = this.servicesManager.services;
|
||||||
|
|
||||||
|
// load any secondary displaySets
|
||||||
|
const displaySetInstanceUIDs = this.viewportsDisplaySets.get(viewport.id);
|
||||||
|
|
||||||
|
// can be SEG or RTSTRUCT for now
|
||||||
|
const overlayDisplaySet = displaySetInstanceUIDs
|
||||||
|
.map(displaySetService.getDisplaySetByUID)
|
||||||
|
.find(displaySet => displaySet?.isOverlayDisplaySet);
|
||||||
|
if (overlayDisplaySet) {
|
||||||
|
this.addOverlayRepresentationForDisplaySet(overlayDisplaySet, viewport);
|
||||||
|
} else {
|
||||||
|
// If the displaySet is not a SEG displaySet we assume it is a primary displaySet
|
||||||
|
// and we can look into hydrated segmentations to check if any of them are
|
||||||
|
// associated with the primary displaySet
|
||||||
|
|
||||||
|
// get segmentations only returns the hydrated segmentations
|
||||||
|
this._addSegmentationRepresentationToToolGroupIfNecessary(displaySetInstanceUIDs, viewport);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private _addSegmentationRepresentationToToolGroupIfNecessary(
|
private _addSegmentationRepresentationToToolGroupIfNecessary(
|
||||||
displaySetInstanceUIDs: string[],
|
displaySetInstanceUIDs: string[],
|
||||||
viewport: any
|
viewport: any
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import { Presentations } from '../../types/Presentation';
|
|||||||
* updating the viewport.
|
* updating the viewport.
|
||||||
*/
|
*/
|
||||||
export interface IViewportService {
|
export interface IViewportService {
|
||||||
servicesManager: unknown;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
hangingProtocolService: unknown;
|
hangingProtocolService: unknown;
|
||||||
renderingEngine: unknown;
|
renderingEngine: unknown;
|
||||||
viewportGridResizeObserver: unknown;
|
viewportGridResizeObserver: unknown;
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import { metaData } from '@cornerstonejs/core';
|
|
||||||
import { LengthTool, utilities } from '@cornerstonejs/tools';
|
import { LengthTool, utilities } from '@cornerstonejs/tools';
|
||||||
import callInputDialog from '../utils/callInputDialog';
|
import callInputDialog from '../utils/callInputDialog';
|
||||||
import getActiveViewportEnabledElement from '../utils/getActiveViewportEnabledElement';
|
import getActiveViewportEnabledElement from '../utils/getActiveViewportEnabledElement';
|
||||||
@ -49,7 +48,10 @@ function calculateLength3(pos1, pos2) {
|
|||||||
|
|
||||||
export default CalibrationLineTool;
|
export default CalibrationLineTool;
|
||||||
|
|
||||||
export function onCompletedCalibrationLine(servicesManager, csToolsEvent) {
|
export function onCompletedCalibrationLine(
|
||||||
|
servicesManager: AppTypes.ServicesManager,
|
||||||
|
csToolsEvent
|
||||||
|
) {
|
||||||
const { uiDialogService, viewportGridService } = servicesManager.services;
|
const { uiDialogService, viewportGridService } = servicesManager.services;
|
||||||
|
|
||||||
// calculate length (mm) with the current Pixel Spacing
|
// calculate length (mm) with the current Pixel Spacing
|
||||||
|
|||||||
29
extensions/cornerstone/src/types/AppTypes.ts
Normal file
29
extensions/cornerstone/src/types/AppTypes.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-namespace */
|
||||||
|
import CornerstoneCacheServiceType from '../services/CornerstoneCacheService';
|
||||||
|
import CornerstoneViewportServiceType from '../services/ViewportService/CornerstoneViewportService';
|
||||||
|
import SegmentationServiceType from '../services/SegmentationService';
|
||||||
|
import SyncGroupServiceType from '../services/SyncGroupService';
|
||||||
|
import ToolGroupServiceType from '../services/ToolGroupService';
|
||||||
|
import ViewportActionCornersServiceType from '../services/ViewportActionCornersService/ViewportActionCornersService';
|
||||||
|
import ColorbarServiceType from '../services/ColorbarService';
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
namespace AppTypes {
|
||||||
|
export type CornerstoneCacheService = CornerstoneCacheServiceType;
|
||||||
|
export type CornerstoneViewportService = CornerstoneViewportServiceType;
|
||||||
|
export type SegmentationService = SegmentationServiceType;
|
||||||
|
export type SyncGroupService = SyncGroupServiceType;
|
||||||
|
export type ToolGroupService = ToolGroupServiceType;
|
||||||
|
export type ViewportActionCornersService = ViewportActionCornersServiceType;
|
||||||
|
export type ColorbarService = ColorbarServiceType;
|
||||||
|
export interface Services {
|
||||||
|
cornerstoneViewportService?: CornerstoneViewportServiceType;
|
||||||
|
toolGroupService?: ToolGroupServiceType;
|
||||||
|
syncGroupService?: SyncGroupServiceType;
|
||||||
|
segmentationService?: SegmentationServiceType;
|
||||||
|
cornerstoneCacheService?: CornerstoneCacheServiceType;
|
||||||
|
viewportActionCornersService?: ViewportActionCornersServiceType;
|
||||||
|
colorbarService?: ColorbarServiceType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,4 @@
|
|||||||
import { ColorMapPreset } from './Colormap';
|
import { ColorMapPreset } from './Colormap';
|
||||||
import { CommandsManager, ServicesManager } from '@ohif/core';
|
|
||||||
|
|
||||||
export type ColorbarOptions = {
|
export type ColorbarOptions = {
|
||||||
position: string;
|
position: string;
|
||||||
@ -11,8 +10,6 @@ export type ColorbarOptions = {
|
|||||||
|
|
||||||
export type ColorbarProps = {
|
export type ColorbarProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
|
||||||
serviceManager: ServicesManager;
|
|
||||||
displaySets: Array<any>;
|
displaySets: Array<any>;
|
||||||
colorbarProperties: ColorbarProperties;
|
colorbarProperties: ColorbarProperties;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { CommandsManager, ServicesManager } from '@ohif/core';
|
import { CommandsManager } from '@ohif/core';
|
||||||
|
|
||||||
export type ColorMapPreset = {
|
export type ColorMapPreset = {
|
||||||
ColorSpace;
|
ColorSpace;
|
||||||
@ -10,7 +10,7 @@ export type ColorMapPreset = {
|
|||||||
export type ColormapProps = {
|
export type ColormapProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
colormaps: Array<ColorMapPreset>;
|
colormaps: Array<ColorMapPreset>;
|
||||||
displaySets: Array<any>;
|
displaySets: Array<any>;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -22,7 +22,7 @@ type VolumeData = {
|
|||||||
|
|
||||||
type StackViewportData = {
|
type StackViewportData = {
|
||||||
viewportType: Enums.ViewportType;
|
viewportType: Enums.ViewportType;
|
||||||
data: StackData;
|
data: StackData[];
|
||||||
};
|
};
|
||||||
|
|
||||||
type VolumeViewportData = {
|
type VolumeViewportData = {
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import SegmentationService from '../services/SegmentationService';
|
|||||||
import CornerstoneCacheService from '../services/CornerstoneCacheService';
|
import CornerstoneCacheService from '../services/CornerstoneCacheService';
|
||||||
import CornerstoneViewportService from '../services/ViewportService/CornerstoneViewportService';
|
import CornerstoneViewportService from '../services/ViewportService/CornerstoneViewportService';
|
||||||
import ViewportActionCornersService from '../services/ViewportActionCornersService/ViewportActionCornersService';
|
import ViewportActionCornersService from '../services/ViewportActionCornersService/ViewportActionCornersService';
|
||||||
|
import ColorbarService from '../services/ColorbarService';
|
||||||
|
|
||||||
interface CornerstoneServices extends Types.Services {
|
interface CornerstoneServices extends Types.Services {
|
||||||
cornerstoneViewportService: CornerstoneViewportService;
|
cornerstoneViewportService: CornerstoneViewportService;
|
||||||
@ -13,6 +14,7 @@ interface CornerstoneServices extends Types.Services {
|
|||||||
segmentationService: SegmentationService;
|
segmentationService: SegmentationService;
|
||||||
cornerstoneCacheService: CornerstoneCacheService;
|
cornerstoneCacheService: CornerstoneCacheService;
|
||||||
viewportActionCornersService: ViewportActionCornersService;
|
viewportActionCornersService: ViewportActionCornersService;
|
||||||
|
colorbarService: ColorbarService;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CornerstoneServices;
|
export default CornerstoneServices;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ServicesManager, CommandsManager } from '@ohif/core';
|
import { CommandsManager } from '@ohif/core';
|
||||||
|
|
||||||
export type ViewportPreset = {
|
export type ViewportPreset = {
|
||||||
name: string;
|
name: string;
|
||||||
@ -15,7 +15,7 @@ export type ViewportPreset = {
|
|||||||
|
|
||||||
export type VolumeRenderingPresetsProps = {
|
export type VolumeRenderingPresetsProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
volumeRenderingPresets: ViewportPreset[];
|
volumeRenderingPresets: ViewportPreset[];
|
||||||
};
|
};
|
||||||
@ -30,7 +30,7 @@ export type VolumeRenderingPresetsContentProps = {
|
|||||||
export type VolumeRenderingOptionsProps = {
|
export type VolumeRenderingOptionsProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
volumeRenderingQualityRange: VolumeRenderingQualityRange;
|
volumeRenderingQualityRange: VolumeRenderingQualityRange;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -43,24 +43,24 @@ export type VolumeRenderingQualityRange = {
|
|||||||
export type VolumeRenderingQualityProps = {
|
export type VolumeRenderingQualityProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
volumeRenderingQualityRange: VolumeRenderingQualityRange;
|
volumeRenderingQualityRange: VolumeRenderingQualityRange;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type VolumeShiftProps = {
|
export type VolumeShiftProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type VolumeShadeProps = {
|
export type VolumeShadeProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type VolumeLightingProps = {
|
export type VolumeLightingProps = {
|
||||||
viewportId: string;
|
viewportId: string;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
serviceManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -128,7 +128,7 @@ const CornerstoneViewportDownloadForm = ({
|
|||||||
// for some reason we need a reset camera here, and I don't know why
|
// for some reason we need a reset camera here, and I don't know why
|
||||||
downloadViewport.resetCamera();
|
downloadViewport.resetCamera();
|
||||||
const presentation = activeViewport.getViewPresentation();
|
const presentation = activeViewport.getViewPresentation();
|
||||||
downloadViewport.setView(activeViewport.getViewReference(), presentation);
|
downloadViewport.setViewPresentation(presentation);
|
||||||
downloadViewport.render();
|
downloadViewport.render();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,10 +1,12 @@
|
|||||||
|
import { DisplaySetService, ViewportGridService } from '@ohif/core';
|
||||||
|
|
||||||
const IMAGE_SLICE_SYNC_NAME = 'IMAGE_SLICE_SYNC';
|
const IMAGE_SLICE_SYNC_NAME = 'IMAGE_SLICE_SYNC';
|
||||||
|
|
||||||
export default function toggleImageSliceSync({
|
export default function toggleImageSliceSync({
|
||||||
servicesManager,
|
servicesManager,
|
||||||
viewports: providedViewports,
|
viewports: providedViewports,
|
||||||
syncId,
|
syncId,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
|
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
|
|
||||||
@ -46,7 +48,7 @@ export default function toggleImageSliceSync({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function disableSync(syncName, servicesManager) {
|
function disableSync(syncName, servicesManager: AppTypes.ServicesManager) {
|
||||||
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
|
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
const viewports = getReconstructableStackViewports(viewportGridService, displaySetService);
|
const viewports = getReconstructableStackViewports(viewportGridService, displaySetService);
|
||||||
@ -68,7 +70,10 @@ function disableSync(syncName, servicesManager) {
|
|||||||
* Gets the consistent spacing stack viewport types, which are the ones which
|
* Gets the consistent spacing stack viewport types, which are the ones which
|
||||||
* can be navigated using the stack image sync right now.
|
* can be navigated using the stack image sync right now.
|
||||||
*/
|
*/
|
||||||
function getReconstructableStackViewports(viewportGridService, displaySetService) {
|
function getReconstructableStackViewports(
|
||||||
|
viewportGridService: ViewportGridService,
|
||||||
|
displaySetService: DisplaySetService
|
||||||
|
) {
|
||||||
let { viewports } = viewportGridService.getState();
|
let { viewports } = viewportGridService.getState();
|
||||||
|
|
||||||
viewports = [...viewports.values()];
|
viewports = [...viewports.values()];
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { DisplaySetService, ViewportGridService } from '@ohif/core';
|
||||||
|
|
||||||
const VOI_SYNC_NAME = 'VOI_SYNC';
|
const VOI_SYNC_NAME = 'VOI_SYNC';
|
||||||
|
|
||||||
const getSyncId = modality => `${VOI_SYNC_NAME}_${modality}`;
|
const getSyncId = modality => `${VOI_SYNC_NAME}_${modality}`;
|
||||||
@ -6,7 +8,7 @@ export default function toggleVOISliceSync({
|
|||||||
servicesManager,
|
servicesManager,
|
||||||
viewports: providedViewports,
|
viewports: providedViewports,
|
||||||
syncId,
|
syncId,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
|
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
|
|
||||||
@ -52,7 +54,7 @@ export default function toggleVOISliceSync({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function disableSync(modalityViewports, syncId, servicesManager) {
|
function disableSync(modalityViewports, syncId, servicesManager: AppTypes.ServicesManager) {
|
||||||
const { syncGroupService, cornerstoneViewportService } = servicesManager.services;
|
const { syncGroupService, cornerstoneViewportService } = servicesManager.services;
|
||||||
|
|
||||||
const viewports = modalityViewports;
|
const viewports = modalityViewports;
|
||||||
@ -70,7 +72,10 @@ function disableSync(modalityViewports, syncId, servicesManager) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function groupViewportsByModality(viewportGridService, displaySetService) {
|
function groupViewportsByModality(
|
||||||
|
viewportGridService: ViewportGridService,
|
||||||
|
displaySetService: DisplaySetService
|
||||||
|
) {
|
||||||
let { viewports } = viewportGridService.getState();
|
let { viewports } = viewportGridService.getState();
|
||||||
|
|
||||||
viewports = [...viewports.values()];
|
viewports = [...viewports.values()];
|
||||||
|
|||||||
@ -3,6 +3,66 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **DicomWebDataSource:** Enhance QIDO query to disable wildcard for mrn ([#4435](https://github.com/OHIF/Viewers/issues/4435)) ([22a1f32](https://github.com/OHIF/Viewers/commit/22a1f321af6e01eb12edd6acbc2c829fc243a19b))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-default
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-default
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-default
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **crosshairs:** reset angle, position, and slabthickness for crosshairs when reset viewport tool is used ([#4113](https://github.com/OHIF/Viewers/issues/4113)) ([2d4e049](https://github.com/OHIF/Viewers/commit/2d4e049d8a54ca25c9dc02f29f2e53a6968d82e1))
|
||||||
|
* **docker:** docker build was broken because of imports ([#4192](https://github.com/OHIF/Viewers/issues/4192)) ([53c2740](https://github.com/OHIF/Viewers/commit/53c2740d7589439f5fa6de20baf00b766680ddee))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-default
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
**Note:** Version bump only for package @ohif/extension-default
|
**Note:** Version bump only for package @ohif/extension-default
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-default",
|
"name": "@ohif/extension-default",
|
||||||
"version": "3.8.0-beta.93",
|
"version": "3.8.5",
|
||||||
"description": "Common/default features and functionality for basic image viewing",
|
"description": "Common/default features and functionality for basic image viewing",
|
||||||
"author": "OHIF Core Team",
|
"author": "OHIF Core Team",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -32,8 +32,8 @@
|
|||||||
"start": "yarn run dev"
|
"start": "yarn run dev"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "3.8.0-beta.93",
|
"@ohif/core": "3.8.5\n",
|
||||||
"@ohif/i18n": "3.8.0-beta.93",
|
"@ohif/i18n": "3.8.5\n",
|
||||||
"dcmjs": "^0.29.12",
|
"dcmjs": "^0.29.12",
|
||||||
"dicomweb-client": "^0.10.4",
|
"dicomweb-client": "^0.10.4",
|
||||||
"prop-types": "^15.6.2",
|
"prop-types": "^15.6.2",
|
||||||
|
|||||||
@ -5,7 +5,11 @@ import { DicomMetadataStore } from '@ohif/core';
|
|||||||
*
|
*
|
||||||
* @param {*} servicesManager
|
* @param {*} servicesManager
|
||||||
*/
|
*/
|
||||||
async function createReportAsync({ servicesManager, getReport, reportType = 'measurement' }) {
|
async function createReportAsync({
|
||||||
|
servicesManager,
|
||||||
|
getReport,
|
||||||
|
reportType = 'measurement',
|
||||||
|
}: withAppTypes) {
|
||||||
const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services;
|
const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services;
|
||||||
const loadingDialogId = uiDialogService.create({
|
const loadingDialogId = uiDialogService.create({
|
||||||
showOverlay: true,
|
showOverlay: true,
|
||||||
|
|||||||
@ -1,18 +1,13 @@
|
|||||||
import React, { ReactElement, useCallback, useEffect, useState } from 'react';
|
import React, { ReactElement, useCallback, useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { Icon, useModal } from '@ohif/ui';
|
import { Icon, useModal } from '@ohif/ui';
|
||||||
import { ExtensionManager, ServicesManager, Types } from '@ohif/core';
|
import { Types } from '@ohif/core';
|
||||||
import DataSourceConfigurationModalComponent from './DataSourceConfigurationModalComponent';
|
import DataSourceConfigurationModalComponent from './DataSourceConfigurationModalComponent';
|
||||||
|
|
||||||
type DataSourceConfigurationComponentProps = {
|
|
||||||
servicesManager: ServicesManager;
|
|
||||||
extensionManager: ExtensionManager;
|
|
||||||
};
|
|
||||||
|
|
||||||
function DataSourceConfigurationComponent({
|
function DataSourceConfigurationComponent({
|
||||||
servicesManager,
|
servicesManager,
|
||||||
extensionManager,
|
extensionManager,
|
||||||
}: DataSourceConfigurationComponentProps): ReactElement {
|
}: withAppTypes): ReactElement {
|
||||||
const { t } = useTranslation('DataSourceConfiguration');
|
const { t } = useTranslation('DataSourceConfiguration');
|
||||||
const { show, hide } = useModal();
|
const { show, hide } = useModal();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import React, { useEffect, useState, useCallback, ReactElement } from 'react';
|
import React, { useEffect, useState, useCallback, ReactElement } from 'react';
|
||||||
import { ServicesManager } from '@ohif/core';
|
|
||||||
import { ProgressDropdown } from '@ohif/ui';
|
import { ProgressDropdown } from '@ohif/ui';
|
||||||
|
|
||||||
const workflowStepsToDropdownOptions = (steps = []) =>
|
const workflowStepsToDropdownOptions = (steps = []) =>
|
||||||
@ -11,11 +10,7 @@ const workflowStepsToDropdownOptions = (steps = []) =>
|
|||||||
completed: false,
|
completed: false,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
function ProgressDropdownWithService({
|
export function ProgressDropdownWithService({ servicesManager }: withAppTypes): ReactElement {
|
||||||
servicesManager,
|
|
||||||
}: {
|
|
||||||
servicesManager: ServicesManager;
|
|
||||||
}): ReactElement {
|
|
||||||
const { workflowStepsService } = servicesManager.services;
|
const { workflowStepsService } = servicesManager.services;
|
||||||
const [activeStepId, setActiveStepId] = useState(workflowStepsService.activeWorkflowStep?.id);
|
const [activeStepId, setActiveStepId] = useState(workflowStepsService.activeWorkflowStep?.id);
|
||||||
|
|
||||||
@ -105,5 +100,3 @@ function ProgressDropdownWithService({
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ProgressDropdownWithService;
|
|
||||||
@ -1,9 +1,9 @@
|
|||||||
import React, { useEffect, useState, useCallback } from 'react';
|
import React, { useEffect, useState, useCallback } from 'react';
|
||||||
import { SidePanel } from '@ohif/ui';
|
import { SidePanel } from '@ohif/ui';
|
||||||
import { PanelService, ServicesManager, Types } from '@ohif/core';
|
import { Types } from '@ohif/core';
|
||||||
|
|
||||||
export type SidePanelWithServicesProps = {
|
export type SidePanelWithServicesProps = {
|
||||||
servicesManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
side: 'left' | 'right';
|
side: 'left' | 'right';
|
||||||
className: string;
|
className: string;
|
||||||
activeTabIndex: number;
|
activeTabIndex: number;
|
||||||
@ -19,7 +19,7 @@ const SidePanelWithServices = ({
|
|||||||
expandedWidth,
|
expandedWidth,
|
||||||
...props
|
...props
|
||||||
}: SidePanelWithServicesProps) => {
|
}: SidePanelWithServicesProps) => {
|
||||||
const panelService: PanelService = servicesManager?.services?.panelService;
|
const panelService = servicesManager?.services?.panelService;
|
||||||
|
|
||||||
// Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM.
|
// Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM.
|
||||||
// Thus going to the Study List page and back to the viewer resets this flag for a SidePanel.
|
// Thus going to the Study List page and back to the viewer resets this flag for a SidePanel.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import * as ContextMenuItemsBuilder from './ContextMenuItemsBuilder';
|
import * as ContextMenuItemsBuilder from './ContextMenuItemsBuilder';
|
||||||
import ContextMenu from '../../../../platform/ui/src/components/ContextMenu/ContextMenu';
|
import ContextMenu from '../../../../platform/ui/src/components/ContextMenu/ContextMenu';
|
||||||
import { CommandsManager, ServicesManager, Types } from '@ohif/core';
|
import { CommandsManager } from '@ohif/core';
|
||||||
import { annotation as CsAnnotation } from '@cornerstonejs/tools';
|
import { annotation as CsAnnotation } from '@cornerstonejs/tools';
|
||||||
import { Menu, MenuItem, Point, ContextMenuProps } from './types';
|
import { Menu, MenuItem, Point, ContextMenuProps } from './types';
|
||||||
|
|
||||||
@ -17,11 +17,11 @@ import { Menu, MenuItem, Point, ContextMenuProps } from './types';
|
|||||||
*/
|
*/
|
||||||
export default class ContextMenuController {
|
export default class ContextMenuController {
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
services: Types.Services;
|
services: AppTypes.Services;
|
||||||
menuItems: Menu[] | MenuItem[];
|
menuItems: Menu[] | MenuItem[];
|
||||||
|
|
||||||
constructor(servicesManager: ServicesManager, commandsManager: CommandsManager) {
|
constructor(servicesManager: AppTypes.ServicesManager, commandsManager: CommandsManager) {
|
||||||
this.services = servicesManager.services as Obj;
|
this.services = servicesManager.services;
|
||||||
this.commandsManager = commandsManager;
|
this.commandsManager = commandsManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,7 +42,7 @@ class GoogleCloudDataSourceConfigurationAPI implements Types.BaseDataSourceConfi
|
|||||||
private _fetchOptions: { method: string; headers: unknown };
|
private _fetchOptions: { method: string; headers: unknown };
|
||||||
private _dataSourceName: string;
|
private _dataSourceName: string;
|
||||||
|
|
||||||
constructor(dataSourceName, servicesManager, extensionManager) {
|
constructor(dataSourceName, servicesManager: AppTypes.ServicesManager, extensionManager) {
|
||||||
this._dataSourceName = dataSourceName;
|
this._dataSourceName = dataSourceName;
|
||||||
this._extensionManager = extensionManager;
|
this._extensionManager = extensionManager;
|
||||||
const userAuthenticationService = servicesManager.services.userAuthenticationService;
|
const userAuthenticationService = servicesManager.services.userAuthenticationService;
|
||||||
|
|||||||
@ -8,13 +8,13 @@ import {
|
|||||||
processResults,
|
processResults,
|
||||||
processSeriesResults,
|
processSeriesResults,
|
||||||
} from './qido.js';
|
} from './qido.js';
|
||||||
import dcm4cheeReject from './dcm4cheeReject';
|
import dcm4cheeReject from './dcm4cheeReject.js';
|
||||||
|
|
||||||
import getImageId from './utils/getImageId';
|
import getImageId from './utils/getImageId.js';
|
||||||
import dcmjs from 'dcmjs';
|
import dcmjs from 'dcmjs';
|
||||||
import { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js';
|
import { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js';
|
||||||
import StaticWadoClient from './utils/StaticWadoClient';
|
import StaticWadoClient from './utils/StaticWadoClient';
|
||||||
import getDirectURL from '../utils/getDirectURL';
|
import getDirectURL from '../utils/getDirectURL.js';
|
||||||
import { fixBulkDataURI } from './utils/fixBulkDataURI';
|
import { fixBulkDataURI } from './utils/fixBulkDataURI';
|
||||||
|
|
||||||
const { DicomMetaDictionary, DicomDict } = dcmjs.data;
|
const { DicomMetaDictionary, DicomDict } = dcmjs.data;
|
||||||
@ -89,9 +89,9 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
generateWadoHeader = () => {
|
generateWadoHeader = () => {
|
||||||
let authorizationHeader = getAuthrorizationHeader();
|
const authorizationHeader = getAuthrorizationHeader();
|
||||||
//Generate accept header depending on config params
|
//Generate accept header depending on config params
|
||||||
let formattedAcceptHeader = utils.generateAcceptHeader(
|
const formattedAcceptHeader = utils.generateAcceptHeader(
|
||||||
dicomWebConfig.acceptHeader,
|
dicomWebConfig.acceptHeader,
|
||||||
dicomWebConfig.requestTransferSyntaxUID,
|
dicomWebConfig.requestTransferSyntaxUID,
|
||||||
dicomWebConfig.omitQuotationForMultipartRequest
|
dicomWebConfig.omitQuotationForMultipartRequest
|
||||||
|
|||||||
@ -154,9 +154,11 @@ function mapParams(params, options = {}) {
|
|||||||
// Add more fields here if you want them in the result
|
// Add more fields here if you want them in the result
|
||||||
].join(',');
|
].join(',');
|
||||||
|
|
||||||
const { supportsWildcard } = options;
|
const useWildcard =
|
||||||
|
params?.disableWildcard !== undefined ? !params.disableWildcard : options.supportsWildcard;
|
||||||
|
|
||||||
const withWildcard = value => {
|
const withWildcard = value => {
|
||||||
return supportsWildcard && value ? `*${value}*` : value;
|
return useWildcard && value ? `*${value}*` : value;
|
||||||
};
|
};
|
||||||
|
|
||||||
const parameters = {
|
const parameters = {
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import { createDicomWebApi } from '../DicomWebDataSource/index';
|
|||||||
* dicomWeb configuration array
|
* dicomWeb configuration array
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
|
function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager: AppTypes.ServicesManager) {
|
||||||
const { name } = dicomWebProxyConfig;
|
const { name } = dicomWebProxyConfig;
|
||||||
let dicomWebDelegate = undefined;
|
let dicomWebDelegate = undefined;
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
|
|||||||
throw new Error(`No url for '${name}'`);
|
throw new Error(`No url for '${name}'`);
|
||||||
} else {
|
} else {
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
let data = await response.json();
|
const data = await response.json();
|
||||||
if (!data.servers?.dicomWeb?.[0]) {
|
if (!data.servers?.dicomWeb?.[0]) {
|
||||||
throw new Error('Invalid configuration returned by url');
|
throw new Error('Invalid configuration returned by url');
|
||||||
}
|
}
|
||||||
@ -167,7 +167,7 @@ export const callByRetrieveAETitle = ({
|
|||||||
|
|
||||||
function createMergeDataSourceApi(
|
function createMergeDataSourceApi(
|
||||||
mergeConfig: MergeConfig,
|
mergeConfig: MergeConfig,
|
||||||
servicesManager: unknown,
|
servicesManager: AppTypes.ServicesManager,
|
||||||
extensionManager
|
extensionManager
|
||||||
) {
|
) {
|
||||||
const { seriesMerge } = mergeConfig;
|
const { seriesMerge } = mergeConfig;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { utils, ServicesManager } from '@ohif/core';
|
import { utils } from '@ohif/core';
|
||||||
import {
|
import {
|
||||||
MeasurementTable,
|
MeasurementTable,
|
||||||
Dialog,
|
Dialog,
|
||||||
@ -24,14 +24,13 @@ export default function PanelMeasurementTable({
|
|||||||
servicesManager,
|
servicesManager,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
extensionManager,
|
extensionManager,
|
||||||
}): React.FunctionComponent {
|
}: withAppTypes): React.FunctionComponent {
|
||||||
const { t } = useTranslation('MeasurementTable');
|
const { t } = useTranslation('MeasurementTable');
|
||||||
|
|
||||||
const [viewportGrid, viewportGridService] = useViewportGrid();
|
const [viewportGrid, viewportGridService] = useViewportGrid();
|
||||||
const { activeViewportId, viewports } = viewportGrid;
|
const { activeViewportId, viewports } = viewportGrid;
|
||||||
const { measurementService, uiDialogService, uiNotificationService, displaySetService } = (
|
const { measurementService, uiDialogService, uiNotificationService, displaySetService } =
|
||||||
servicesManager as ServicesManager
|
servicesManager.services;
|
||||||
).services;
|
|
||||||
const [displayMeasurements, setDisplayMeasurements] = useState([]);
|
const [displayMeasurements, setDisplayMeasurements] = useState([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -245,7 +244,7 @@ export default function PanelMeasurementTable({
|
|||||||
}
|
}
|
||||||
|
|
||||||
PanelMeasurementTable.propTypes = {
|
PanelMeasurementTable.propTypes = {
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager).isRequired,
|
servicesManager: PropTypes.object.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
function _getMappedMeasurements(measurementService) {
|
function _getMappedMeasurements(measurementService) {
|
||||||
|
|||||||
@ -16,7 +16,7 @@ function PanelStudyBrowser({
|
|||||||
getStudiesForPatientByMRN,
|
getStudiesForPatientByMRN,
|
||||||
requestDisplaySetCreationForStudy,
|
requestDisplaySetCreationForStudy,
|
||||||
dataSource,
|
dataSource,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { hangingProtocolService, displaySetService, uiNotificationService } =
|
const { hangingProtocolService, displaySetService, uiNotificationService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|||||||
@ -2,6 +2,7 @@ async function getStudiesForPatientByMRN(dataSource, qidoForStudyUID) {
|
|||||||
if (qidoForStudyUID && qidoForStudyUID.length && qidoForStudyUID[0].mrn) {
|
if (qidoForStudyUID && qidoForStudyUID.length && qidoForStudyUID[0].mrn) {
|
||||||
return dataSource.query.studies.search({
|
return dataSource.query.studies.search({
|
||||||
patientId: qidoForStudyUID[0].mrn,
|
patientId: qidoForStudyUID[0].mrn,
|
||||||
|
disableWildcard: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
console.log('No mrn found for', qidoForStudyUID);
|
console.log('No mrn found for', qidoForStudyUID);
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
import React, { useEffect, useState, useCallback } from 'react';
|
import React, { useEffect, useState, useCallback } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { LayoutSelector as OHIFLayoutSelector, ToolbarButton } from '@ohif/ui';
|
import { LayoutSelector as OHIFLayoutSelector, ToolbarButton } from '@ohif/ui';
|
||||||
import { ServicesManager } from '@ohif/core';
|
|
||||||
|
|
||||||
function LegacyLayoutSelectorWithServices({ servicesManager, ...props }) {
|
function LegacyLayoutSelectorWithServices({ servicesManager, ...props }: withAppTypes) {
|
||||||
const { toolbarService } = servicesManager.services;
|
const { toolbarService } = servicesManager.services;
|
||||||
|
|
||||||
const onSelection = useCallback(
|
const onSelection = useCallback(
|
||||||
@ -76,7 +75,7 @@ LayoutSelector.propTypes = {
|
|||||||
rows: PropTypes.number,
|
rows: PropTypes.number,
|
||||||
columns: PropTypes.number,
|
columns: PropTypes.number,
|
||||||
onLayoutChange: PropTypes.func,
|
onLayoutChange: PropTypes.func,
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager),
|
servicesManager: PropTypes.object.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
LayoutSelector.defaultProps = {
|
LayoutSelector.defaultProps = {
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import React, { useEffect, useState, useCallback } from 'react';
|
import React, { useEffect, useState, useCallback, useRef } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { LayoutSelector as OHIFLayoutSelector, ToolbarButton, LayoutPreset } from '@ohif/ui';
|
import { LayoutSelector as OHIFLayoutSelector, ToolbarButton, LayoutPreset } from '@ohif/ui';
|
||||||
import { ServicesManager } from '@ohif/core';
|
|
||||||
|
|
||||||
const defaultCommonPresets = [
|
const defaultCommonPresets = [
|
||||||
{
|
{
|
||||||
@ -45,7 +44,7 @@ const _areSelectorsValid = (hp, displaySets, hangingProtocolService) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const generateAdvancedPresets = ({ servicesManager }) => {
|
const generateAdvancedPresets = ({ servicesManager }: withAppTypes) => {
|
||||||
const { hangingProtocolService, viewportGridService, displaySetService } =
|
const { hangingProtocolService, viewportGridService, displaySetService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
|
|
||||||
@ -84,7 +83,11 @@ const generateAdvancedPresets = ({ servicesManager }) => {
|
|||||||
.filter(preset => preset !== null);
|
.filter(preset => preset !== null);
|
||||||
};
|
};
|
||||||
|
|
||||||
function ToolbarLayoutSelectorWithServices({ commandsManager, servicesManager, ...props }) {
|
function ToolbarLayoutSelectorWithServices({
|
||||||
|
commandsManager,
|
||||||
|
servicesManager,
|
||||||
|
...props
|
||||||
|
}: withAppTypes) {
|
||||||
const [isDisabled, setIsDisabled] = useState(false);
|
const [isDisabled, setIsDisabled] = useState(false);
|
||||||
|
|
||||||
const handleMouseEnter = () => {
|
const handleMouseEnter = () => {
|
||||||
@ -129,24 +132,32 @@ function LayoutSelector({
|
|||||||
servicesManager,
|
servicesManager,
|
||||||
tooltipDisabled,
|
tooltipDisabled,
|
||||||
...rest
|
...rest
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
const dropdownRef = useRef(null);
|
||||||
|
|
||||||
const { customizationService } = servicesManager.services;
|
const { customizationService } = servicesManager.services;
|
||||||
const commonPresets = customizationService.get('commonPresets') || defaultCommonPresets;
|
const commonPresets = customizationService.get('commonPresets') || defaultCommonPresets;
|
||||||
const advancedPresets =
|
const advancedPresets =
|
||||||
customizationService.get('advancedPresets') || generateAdvancedPresets({ servicesManager });
|
customizationService.get('advancedPresets') || generateAdvancedPresets({ servicesManager });
|
||||||
|
|
||||||
const closeOnOutsideClick = () => {
|
const closeOnOutsideClick = event => {
|
||||||
if (isOpen) {
|
if (isOpen && dropdownRef.current) {
|
||||||
setIsOpen(false);
|
setIsOpen(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
window.addEventListener('click', closeOnOutsideClick);
|
if (!isOpen) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
window.addEventListener('click', closeOnOutsideClick);
|
||||||
|
}, 0);
|
||||||
return () => {
|
return () => {
|
||||||
window.removeEventListener('click', closeOnOutsideClick);
|
window.removeEventListener('click', closeOnOutsideClick);
|
||||||
|
dropdownRef.current = null;
|
||||||
};
|
};
|
||||||
}, [isOpen]);
|
}, [isOpen]);
|
||||||
|
|
||||||
@ -166,7 +177,10 @@ function LayoutSelector({
|
|||||||
disableToolTip={tooltipDisabled}
|
disableToolTip={tooltipDisabled}
|
||||||
dropdownContent={
|
dropdownContent={
|
||||||
DropdownContent !== null && (
|
DropdownContent !== null && (
|
||||||
<div className="flex ">
|
<div
|
||||||
|
className="flex"
|
||||||
|
ref={dropdownRef}
|
||||||
|
>
|
||||||
<div className="bg-secondary-dark flex flex-col gap-2.5 p-2">
|
<div className="bg-secondary-dark flex flex-col gap-2.5 p-2">
|
||||||
<div className="text-aqua-pale text-xs">Common</div>
|
<div className="text-aqua-pale text-xs">Common</div>
|
||||||
|
|
||||||
@ -225,7 +239,7 @@ LayoutSelector.propTypes = {
|
|||||||
rows: PropTypes.number,
|
rows: PropTypes.number,
|
||||||
columns: PropTypes.number,
|
columns: PropTypes.number,
|
||||||
onLayoutChange: PropTypes.func,
|
onLayoutChange: PropTypes.func,
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager),
|
servicesManager: PropTypes.object.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
LayoutSelector.defaultProps = {
|
LayoutSelector.defaultProps = {
|
||||||
|
|||||||
@ -10,7 +10,7 @@ function ToolbarSplitButtonWithServices({
|
|||||||
renderer,
|
renderer,
|
||||||
onInteraction,
|
onInteraction,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
}) {
|
}: withAppTypes) {
|
||||||
const { toolbarService } = servicesManager?.services;
|
const { toolbarService } = servicesManager?.services;
|
||||||
|
|
||||||
/* Bubbles up individual item clicks */
|
/* Bubbles up individual item clicks */
|
||||||
|
|||||||
@ -10,7 +10,12 @@ import { Toolbar } from '../Toolbar/Toolbar';
|
|||||||
|
|
||||||
const { availableLanguages, defaultLanguage, currentLanguage } = i18n;
|
const { availableLanguages, defaultLanguage, currentLanguage } = i18n;
|
||||||
|
|
||||||
function ViewerHeader({ hotkeysManager, extensionManager, servicesManager, appConfig }) {
|
function ViewerHeader({
|
||||||
|
hotkeysManager,
|
||||||
|
extensionManager,
|
||||||
|
servicesManager,
|
||||||
|
appConfig,
|
||||||
|
}: withAppTypes) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import React, { useEffect, useState, useCallback } from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { ErrorBoundary, LoadingIndicatorProgress, InvestigationalUseDialog } from '@ohif/ui';
|
import { ErrorBoundary, LoadingIndicatorProgress, InvestigationalUseDialog } from '@ohif/ui';
|
||||||
import { ServicesManager, HangingProtocolService, CommandsManager } from '@ohif/core';
|
import { HangingProtocolService, CommandsManager } from '@ohif/core';
|
||||||
import { useAppConfig } from '@state';
|
import { useAppConfig } from '@state';
|
||||||
import ViewerHeader from './ViewerHeader';
|
import ViewerHeader from './ViewerHeader';
|
||||||
import SidePanelWithServices from '../Components/SidePanelWithServices';
|
import SidePanelWithServices from '../Components/SidePanelWithServices';
|
||||||
@ -18,7 +18,7 @@ function ViewerLayout({
|
|||||||
ViewportGridComp,
|
ViewportGridComp,
|
||||||
leftPanelClosed = false,
|
leftPanelClosed = false,
|
||||||
rightPanelClosed = false,
|
rightPanelClosed = false,
|
||||||
}): React.FunctionComponent {
|
}: withAppTypes): React.FunctionComponent {
|
||||||
const [appConfig] = useAppConfig();
|
const [appConfig] = useAppConfig();
|
||||||
|
|
||||||
const { panelService, hangingProtocolService } = servicesManager.services;
|
const { panelService, hangingProtocolService } = servicesManager.services;
|
||||||
@ -167,7 +167,7 @@ ViewerLayout.propTypes = {
|
|||||||
getModuleEntry: PropTypes.func.isRequired,
|
getModuleEntry: PropTypes.func.isRequired,
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
commandsManager: PropTypes.instanceOf(CommandsManager),
|
commandsManager: PropTypes.instanceOf(CommandsManager),
|
||||||
servicesManager: PropTypes.instanceOf(ServicesManager),
|
servicesManager: PropTypes.object.isRequired,
|
||||||
// From modes
|
// From modes
|
||||||
leftPanels: PropTypes.array,
|
leftPanels: PropTypes.array,
|
||||||
rightPanels: PropTypes.array,
|
rightPanels: PropTypes.array,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ServicesManager, utils, Types } from '@ohif/core';
|
import { utils, Types } from '@ohif/core';
|
||||||
|
|
||||||
import { ContextMenuController, defaultContextMenu } from './CustomizableContextMenu';
|
import { ContextMenuController, defaultContextMenu } from './CustomizableContextMenu';
|
||||||
import DicomTagBrowser from './DicomTagBrowser/DicomTagBrowser';
|
import DicomTagBrowser from './DicomTagBrowser/DicomTagBrowser';
|
||||||
@ -12,7 +12,6 @@ import { NavigateHistory } from './types/commandModuleTypes';
|
|||||||
import { history } from '@ohif/app';
|
import { history } from '@ohif/app';
|
||||||
|
|
||||||
const { subscribeToNextViewportGridChange } = utils;
|
const { subscribeToNextViewportGridChange } = utils;
|
||||||
|
|
||||||
export type HangingProtocolParams = {
|
export type HangingProtocolParams = {
|
||||||
protocolId?: string;
|
protocolId?: string;
|
||||||
stageIndex?: number;
|
stageIndex?: number;
|
||||||
@ -38,7 +37,7 @@ const commandsModule = ({
|
|||||||
viewportGridService,
|
viewportGridService,
|
||||||
displaySetService,
|
displaySetService,
|
||||||
stateSyncService,
|
stateSyncService,
|
||||||
} = (servicesManager as ServicesManager).services;
|
} = servicesManager.services;
|
||||||
|
|
||||||
// Define a context menu controller for use with any context menus
|
// Define a context menu controller for use with any context menus
|
||||||
const contextMenuController = new ContextMenuController(servicesManager, commandsManager);
|
const contextMenuController = new ContextMenuController(servicesManager, commandsManager);
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
export { default } from './ProgressDropdownWithService';
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import { CustomizationService } from '@ohif/core';
|
import { CustomizationService } from '@ohif/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import DataSourceSelector from './Panels/DataSourceSelector';
|
import DataSourceSelector from './Panels/DataSourceSelector';
|
||||||
import ProgressDropdownWithService from './components/ProgressDropdownWithService';
|
import { ProgressDropdownWithService } from './Components/ProgressDropdownWithService';
|
||||||
import DataSourceConfigurationComponent from './Components/DataSourceConfigurationComponent';
|
import DataSourceConfigurationComponent from './Components/DataSourceConfigurationComponent';
|
||||||
import { GoogleCloudDataSourceConfigurationAPI } from './DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI';
|
import { GoogleCloudDataSourceConfigurationAPI } from './DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI';
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
import { createDicomWebApi } from './DicomWebDataSource/index.js';
|
import { createDicomWebApi } from './DicomWebDataSource/index.js';
|
||||||
import { createDicomJSONApi } from './DicomJSONDataSource/index.js';
|
import { createDicomJSONApi } from './DicomJSONDataSource/index.js';
|
||||||
import { createDicomLocalApi } from './DicomLocalDataSource/index.js';
|
import { createDicomLocalApi } from './DicomLocalDataSource/index.js';
|
||||||
import { createDicomWebProxyApi } from './DicomWebProxyDataSource/index.js';
|
import { createDicomWebProxyApi } from './DicomWebProxyDataSource/index';
|
||||||
import { createMergeDataSourceApi } from './MergeDataSource/index';
|
import { createMergeDataSourceApi } from './MergeDataSource/index';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import ToolbarLayoutSelectorWithServices from './Toolbar/ToolbarLayoutSelector';
|
|||||||
import ToolbarSplitButtonWithServices from './Toolbar/ToolbarSplitButtonWithServices';
|
import ToolbarSplitButtonWithServices from './Toolbar/ToolbarSplitButtonWithServices';
|
||||||
import ToolbarButtonGroupWithServices from './Toolbar/ToolbarButtonGroupWithServices';
|
import ToolbarButtonGroupWithServices from './Toolbar/ToolbarButtonGroupWithServices';
|
||||||
import { ToolbarButton } from '@ohif/ui';
|
import { ToolbarButton } from '@ohif/ui';
|
||||||
import ProgressDropdownWithService from './components/ProgressDropdownWithService';
|
import { ProgressDropdownWithService } from './Components/ProgressDropdownWithService';
|
||||||
|
|
||||||
const getClassName = isToggled => {
|
const getClassName = isToggled => {
|
||||||
return {
|
return {
|
||||||
@ -13,7 +13,7 @@ const getClassName = isToggled => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function getToolbarModule({ commandsManager, servicesManager }) {
|
export default function getToolbarModule({ commandsManager, servicesManager }: withAppTypes) {
|
||||||
const { cineService } = servicesManager.services;
|
const { cineService } = servicesManager.services;
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ServicesManager, CommandsManager, ExtensionManager } from '@ohif/core';
|
import { CommandsManager, ExtensionManager } from '@ohif/core';
|
||||||
import LineChartViewport from './Components/LineChartViewport/index';
|
import LineChartViewport from './Components/LineChartViewport/index';
|
||||||
|
|
||||||
const getViewportModule = ({
|
const getViewportModule = ({
|
||||||
@ -6,7 +6,7 @@ const getViewportModule = ({
|
|||||||
commandsManager,
|
commandsManager,
|
||||||
extensionManager,
|
extensionManager,
|
||||||
}: {
|
}: {
|
||||||
servicesManager: ServicesManager;
|
servicesManager: AppTypes.ServicesManager;
|
||||||
commandsManager: CommandsManager;
|
commandsManager: CommandsManager;
|
||||||
extensionManager: ExtensionManager;
|
extensionManager: ExtensionManager;
|
||||||
}) => {
|
}) => {
|
||||||
|
|||||||
@ -10,7 +10,11 @@ const metadataProvider = classes.MetadataProvider;
|
|||||||
* @param {Object} servicesManager
|
* @param {Object} servicesManager
|
||||||
* @param {Object} configuration
|
* @param {Object} configuration
|
||||||
*/
|
*/
|
||||||
export default function init({ servicesManager, configuration = {}, commandsManager }): void {
|
export default function init({
|
||||||
|
servicesManager,
|
||||||
|
configuration = {},
|
||||||
|
commandsManager,
|
||||||
|
}: withAppTypes): void {
|
||||||
const { stateSyncService, toolbarService, cineService, viewportGridService } =
|
const { stateSyncService, toolbarService, cineService, viewportGridService } =
|
||||||
servicesManager.services;
|
servicesManager.services;
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,57 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [3.8.5](https://github.com/OHIF/Viewers/compare/v3.8.4...v3.8.5) (2024-10-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.4](https://github.com/OHIF/Viewers/compare/v3.8.3...v3.8.4) (2024-10-18)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.3](https://github.com/OHIF/Viewers/compare/v3.8.2...v3.8.3) (2024-06-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.2](https://github.com/OHIF/Viewers/compare/v3.8.1...v3.8.2) (2024-06-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [3.8.1](https://github.com/OHIF/Viewers/compare/v3.8.0...v3.8.1) (2024-06-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **typings:** Enhance typing support with withAppTypes and custom services throughout OHIF ([#4090](https://github.com/OHIF/Viewers/issues/4090)) ([3539e04](https://github.com/OHIF/Viewers/commit/3539e040193369b8011254d0c67804ef67d83a6c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [3.8.0](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.93...v3.8.0) (2024-04-29)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
# [3.8.0-beta.93](https://github.com/OHIF/Viewers/compare/v3.8.0-beta.92...v3.8.0-beta.93) (2024-04-29)
|
||||||
|
|
||||||
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user