Compare commits

..
Author SHA1 Message Date
ohif-bot c3ce909434 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.12.4
 - @ohif/extension-dicom-html@1.3.15
 - @ohif/extension-dicom-rt@0.7.6
 - @ohif/extension-dicom-segmentation@0.7.6
 - @ohif/extension-dicom-tag-browser@0.2.17
 - @ohif/extension-vtk@1.12.11
 - @ohif/core@2.16.7
 - @ohif/viewer@4.12.12
2022-01-20 09:18:41 +00:00
Davide Punzo ad2c750503 IDC update dcmjs to v0.19.2 (#2672)
* IDC: update dcmjs with SEG loading regression fix
2022-01-20 10:15:19 +01:00
ohif-bot cceb61f123 chore(release): publish [skip ci]
- @ohif/extension-dicom-rt@0.7.5
 - @ohif/viewer@4.12.11
2022-01-19 09:29:16 +00:00
Davide Punzo 13bcba8c39 IDC #2657: fix rt struct panel update (#2666)
* Fix observation in RT panel
2022-01-19 10:25:42 +01:00
ohif-bot d2db026158 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.10
 - @ohif/core@2.16.6
 - @ohif/viewer@4.12.10
2022-01-13 13:21:38 +00:00
Ștefan Silviu-AlexandruandStefan Silviu e4b0552db4 feature: configurable max prefetch request count (#2632)
* feature: configurable max prefetch request count

* update name and default value for prefetch number

Co-authored-by: Stefan Silviu <silviu.stefan@atta.systems>
2022-01-13 08:18:29 -05:00
ohif-bot d7ba2fac69 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.9
 - @ohif/core@2.16.5
 - @ohif/viewer@4.12.9
2021-12-23 22:25:30 +00:00
Alireza 761d54fbbf fix: DICOMFileLoadingListener typo in method name (#2647) 2021-12-23 17:22:35 -05:00
ohif-bot 79548d2380 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.8
 - @ohif/core@2.16.4
 - @ohif/viewer@4.12.8
2021-12-23 20:38:37 +00:00
6a401c9e52 fix: SeriesTime and SeriesDate are only set for the first series and undefined for the remaining ones (#2476)
* set SeriesDate and SeriesTime for all series, instead of only for the first series

* set SeriesDate and SeriesTime only when they are undefined

* fix: equality operator

Co-authored-by: Christian El Salloum <christian.elsalloum@emtensor.com>
Co-authored-by: Alireza <ar.sedghi@gmail.com>
2021-12-23 15:35:37 -05:00
Yo Yehudi 23376d279d chore: Add research notice (#2458) 2021-12-23 12:01:07 -05:00
ohif-bot 4110b0422c chore(release): publish [skip ci]
- @ohif/extension-dicom-tag-browser@0.2.16
2021-12-10 09:38:52 +00:00
Davide Punzo ed501bb462 IDC Re #2633: fix slider min and max (#2634)
* IDC Re #2633: fix slider min and max
2021-12-10 10:33:30 +01:00
Davide Punzo abf050e162 update docker remote version for CI (#2629) 2021-12-02 13:56:59 +01:00
ohif-bot 35ed82e161 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.12.3
 - @ohif/extension-debugging@0.3.1
 - @ohif/extension-dicom-html@1.3.14
 - @ohif/extension-dicom-pdf@1.1.1
 - @ohif/extension-dicom-rt@0.7.4
 - @ohif/extension-dicom-segmentation@0.7.5
 - @ohif/extension-dicom-tag-browser@0.2.15
 - @ohif/extension-vtk@1.12.7
 - @ohif/core@2.16.3
 - @ohif/viewer@4.12.7
2021-12-02 11:57:19 +00:00
Davide Punzo d0ccc22fd9 Update cornerstone deps (#2628)
* update cornerstone deps
2021-12-02 12:53:41 +01:00
ohif-bot 31841c495f chore(release): publish [skip ci]
- @ohif/extension-dicom-tag-browser@0.2.14
 - @ohif/extension-vtk@1.12.6
 - @ohif/core@2.16.2
 - @ohif/ui@1.10.5
 - @ohif/viewer@4.12.6
2021-11-30 14:20:06 +00:00
Davide Punzo 65505d9bce Re IDC #2604: show series (with unsupported modalities) on slides panel and on tag explorer (#2621)
* Re IDC #2604: show series (with unsupported modalities) on slides panel and on tag explorer
2021-11-30 15:15:51 +01:00
ohif-bot 460fdeb534 chore(release): publish [skip ci]
- @ohif/extension-dicom-segmentation@0.7.4
 - @ohif/viewer@4.12.5
2021-10-27 13:10:24 +00:00
Igor Octaviano f4b7091ae4 Merge pull request #2596 from OHIF/fix/ohif-2590
Re #2590: Fix segments visibility handler
2021-10-27 10:06:35 -03:00
Davide Punzo 1e72684455 Re #2590: Fix segments visibility handler 2021-10-26 13:00:01 +02:00
ohif-bot 5b0b6301b9 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.12.2
 - @ohif/extension-dicom-html@1.3.13
 - @ohif/extension-dicom-rt@0.7.3
 - @ohif/extension-dicom-segmentation@0.7.3
 - @ohif/extension-dicom-tag-browser@0.2.13
 - @ohif/extension-vtk@1.12.5
 - @ohif/core@2.16.1
 - @ohif/ui@1.10.4
 - @ohif/viewer@4.12.4
2021-10-26 08:23:03 +00:00
Igor OctavianoandDavide Punzo 03a34a75a1 Add checks for study metadata in rt and seg panels + bump dcmjs to fix circular references issues naturalizing datasets (#2588)
Co-authored-by: Davide Punzo <punzodavide@hotmail.it>
2021-10-26 10:19:12 +02:00
ohif-bot 729272a985 chore(release): publish [skip ci]
- @ohif/extension-dicom-html@1.3.12
 - @ohif/viewer@4.12.3
2021-10-25 15:11:00 +00:00
Bill Wallace 9194ec2404 fix(OHIF):The header depth was too deep for display SR files. (#2594) 2021-10-25 17:08:10 +02:00
ohif-bot 52c95a1209 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.4
 - @ohif/ui@1.10.3
 - @ohif/viewer@4.12.2
2021-10-15 11:37:07 +00:00
Davide Punzo 8903adaea7 Re #2571: thumbnail footer remove instance number and add link icon if any derived display set is present (#2582)
* Re #2571, thumbnail footer layout modifications: remove instance number and add link icon if any derived display set is present.
2021-10-15 13:29:36 +02:00
ohif-bot 9481e2a99e chore(release): publish [skip ci]
- @ohif/extension-dicom-rt@0.7.2
 - @ohif/extension-dicom-segmentation@0.7.2
 - @ohif/viewer@4.12.1
2021-10-06 21:01:00 +00:00
Igor Octaviano f783fd7650 Merge pull request #2575 from OHIF/fix/ohif-2570
OHIF-2570: Update badge number based on active ds
2021-10-06 17:53:07 -03:00
Igor Octaviano 79afee7615 Merge branch 'master' into fix/ohif-2570 2021-10-05 09:40:49 -03:00
ohif-bot 539141fe5a chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.3
 - @ohif/core@2.16.0
 - @ohif/viewer@4.12.0
2021-10-04 07:36:45 +00:00
Bill Wallace a046c6c901 feat: Added support for WADO servers built with static hosting (e.g. S3) (#2566) 2021-10-04 09:30:36 +02:00
igoroctaviano 073be065cf Update badge number based on active ds 2021-10-01 18:09:48 -03:00
ohif-bot 252536a1e6 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.12.1
 - @ohif/extension-dicom-html@1.3.11
 - @ohif/extension-dicom-rt@0.7.1
 - @ohif/extension-dicom-segmentation@0.7.1
 - @ohif/extension-dicom-tag-browser@0.2.12
 - @ohif/extension-vtk@1.12.2
 - @ohif/core@2.15.1
 - @ohif/viewer@4.11.2
2021-09-28 12:14:17 +00:00
Davide Punzo 53b1d71d56 fix regression not showing warnings list on thumbnail for segmentations (#2563)
* fix regression not showing warnings list on thumbnail for segmentations

* update dcmjs version
2021-09-28 14:07:29 +02:00
Erik Ziegler 702d99cb93 Add FUNDING.yml 2021-09-27 14:23:37 +02:00
Alireza bb7b78bf33 chore(github): Create config.yml for issues (#2561)
* chore(github): Create config.yml for issues

* Delete ---support-question.md
2021-09-27 14:20:38 +02:00
ohif-bot b796fc9c62 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.1
 - @ohif/ui@1.10.2
 - @ohif/viewer@4.11.1
2021-09-24 11:04:33 +00:00
Erik Ziegler 66c587b139 fix: throttle thumbnail progress updates (#2557) 2021-09-24 12:58:30 +02:00
53 changed files with 1199 additions and 295 deletions

No files matched your search

+2
View File
@@ -119,6 +119,7 @@ jobs:
command: yarn install --frozen-lockfile command: yarn install --frozen-lockfile
- setup_remote_docker: - setup_remote_docker:
version: 19.03.13
docker_layer_caching: false docker_layer_caching: false
- run: - run:
@@ -295,6 +296,7 @@ jobs:
- attach_workspace: - attach_workspace:
at: ~/repo at: ~/repo
- setup_remote_docker: - setup_remote_docker:
version: 19.03.13
docker_layer_caching: false docker_layer_caching: false
- run: - run:
name: Build and push Docker image name: Build and push Docker image
+1
View File
@@ -0,0 +1 @@
custom: https://giving.massgeneral.org/ohif
@@ -1,18 +0,0 @@
---
name: "\U0001F917 Support Question"
about: "I have a question \U0001F4AC"
title: ''
labels: 'Community: Question :question:, Triage :white_flag:'
assignees: ''
---
> :hand: We are a small team with limited resources. Your question is much more
> likely to be answered if it is
> [a good question](https://stackoverflow.com/help/how-to-ask)
**Description**
Questions can often be answered by our documentation. Unable to find an answer
in our docs? We'll try to help. In the meantime, if you answer your own
question, please respond with the answer here so that others may benefit as
well. Better yet, open a PR to expand our docs ^\_^
+5
View File
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: 🤗 Support Question
url: https://community.ohif.org/
about: Please use our forum if you have questions or need help.
+11
View File
@@ -273,6 +273,17 @@ development of OHIF Viewer:
Leidos Biomedical Research under Task Order HHSN26100071 from NCI. Leidos Biomedical Research under Task Order HHSN26100071 from NCI.
[IDC Viewer](https://learn.canceridc.dev/portal/visualization) is a customized [IDC Viewer](https://learn.canceridc.dev/portal/visualization) is a customized
version of the OHIF Viewer. version of the OHIF Viewer.
### Research notice
Please note that this repository is participating in a study into sustainability
of open source projects. Data will be gathered about this repository for
approximately the next 12 months, starting from June 2021.
Data collected will include number of contributors, number of PRs, time taken to
close/merge these PRs, and issues closed.
For more information, please visit
[our informational page](https://sustainable-open-science-and-software.github.io/) or download our [participant information sheet](https://sustainable-open-science-and-software.github.io/assets/PIS_sustainable_software.pdf).
## License ## License
+32
View File
@@ -3,6 +3,38 @@
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.
## [2.12.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.12.3...@ohif/extension-cornerstone@2.12.4) (2022-01-20)
**Note:** Version bump only for package @ohif/extension-cornerstone
## [2.12.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.12.2...@ohif/extension-cornerstone@2.12.3) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-cornerstone
## [2.12.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.12.1...@ohif/extension-cornerstone@2.12.2) (2021-10-26)
**Note:** Version bump only for package @ohif/extension-cornerstone
## [2.12.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.12.0...@ohif/extension-cornerstone@2.12.1) (2021-09-28)
**Note:** Version bump only for package @ohif/extension-cornerstone
# [2.12.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.11.0...@ohif/extension-cornerstone@2.12.0) (2021-09-23) # [2.12.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.11.0...@ohif/extension-cornerstone@2.12.0) (2021-09-23)
+6 -6
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone", "name": "@ohif/extension-cornerstone",
"version": "2.12.0", "version": "2.12.4",
"description": "OHIF extension for Cornerstone", "description": "OHIF extension for Cornerstone",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -32,12 +32,12 @@
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"@ohif/ui": "^0.50.0", "@ohif/ui": "^0.50.0",
"cornerstone-core": "^2.5.0", "cornerstone-core": "^2.6.1",
"cornerstone-math": "^0.1.9", "cornerstone-math": "^0.1.9",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.0.3", "cornerstone-wado-image-loader": "^4.1.0",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.11",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
+8
View File
@@ -3,6 +3,14 @@
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.
## [0.3.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-debugging@0.3.0...@ohif/extension-debugging@0.3.1) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-debugging
# [0.3.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-debugging@0.2.2...@ohif/extension-debugging@0.3.0) (2021-09-23) # [0.3.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-debugging@0.2.2...@ohif/extension-debugging@0.3.0) (2021-09-23)
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-debugging", "name": "@ohif/extension-debugging",
"version": "0.3.0", "version": "0.3.1",
"description": "OHIF extension for debugging.", "description": "OHIF extension for debugging.",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -28,12 +28,12 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^2.6.0", "@ohif/core": "^2.6.0",
"dicom-parser": "^1.8.9" "dicom-parser": "^1.8.11"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.5.5",
"detect-browser": "5.1.1", "detect-browser": "5.1.1",
"dicomweb-client": "^0.8.1", "dicomweb-client": "^0.8.3",
"file-saver": "^2.0.2", "file-saver": "^2.0.2",
"jszip": "^3.2.2" "jszip": "^3.2.2"
} }
+40
View File
@@ -3,6 +3,46 @@
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.
## [1.3.15](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.14...@ohif/extension-dicom-html@1.3.15) (2022-01-20)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [1.3.14](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.13...@ohif/extension-dicom-html@1.3.14) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [1.3.13](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.12...@ohif/extension-dicom-html@1.3.13) (2021-10-26)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [1.3.12](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.11...@ohif/extension-dicom-html@1.3.12) (2021-10-25)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [1.3.11](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.10...@ohif/extension-dicom-html@1.3.11) (2021-09-28)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [1.3.10](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.9...@ohif/extension-dicom-html@1.3.10) (2021-06-02) ## [1.3.10](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.3.9...@ohif/extension-dicom-html@1.3.10) (2021-06-02)
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-html", "name": "@ohif/extension-dicom-html",
"version": "1.3.10", "version": "1.3.15",
"description": "OHIF extension for rendering structured reports to HTML", "description": "OHIF extension for rendering structured reports to HTML",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -29,7 +29,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
"react-dom": "^16.8.6" "react-dom": "^16.8.6"
@@ -160,7 +160,7 @@ const getContentSequence = (data, level = 1) => {
const root = []; const root = [];
if (header) { if (header) {
const HeaderDynamicLevel = `h${level}`; const HeaderDynamicLevel = `h${Math.min(level, 6)}`;
root.push(<HeaderDynamicLevel key={header}>{header}</HeaderDynamicLevel>); root.push(<HeaderDynamicLevel key={header}>{header}</HeaderDynamicLevel>);
} }
@@ -170,7 +170,7 @@ const getContentSequence = (data, level = 1) => {
if (key === '_meta') { if (key === '_meta') {
const HeaderDynamicLevel = `h3`; const HeaderDynamicLevel = `h3`;
root.push(<hr />); root.push(<hr key={root.length} />);
root.push( root.push(
<HeaderDynamicLevel key="Metadata"> <HeaderDynamicLevel key="Metadata">
DICOM File Meta Information DICOM File Meta Information
@@ -217,7 +217,7 @@ class DicomHtmlViewport extends Component {
}; };
componentDidMount() { componentDidMount() {
const dataSet = this.setContentFromByteArray(this.props.byteArray); this.setContentFromByteArray(this.props.byteArray);
} }
setContentFromByteArray(byteArray) { setContentFromByteArray(byteArray) {
+8
View File
@@ -3,6 +3,14 @@
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.
## [1.1.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-pdf@1.1.0...@ohif/extension-dicom-pdf@1.1.1) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-dicom-pdf
# [1.1.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-pdf@1.0.6...@ohif/extension-dicom-pdf@1.1.0) (2021-09-23) # [1.1.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-pdf@1.0.6...@ohif/extension-dicom-pdf@1.1.0) (2021-09-23)
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-pdf", "name": "@ohif/extension-dicom-pdf",
"version": "1.1.0", "version": "1.1.1",
"description": "OHIF extension for Dicom PDF", "description": "OHIF extension for Dicom PDF",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -29,7 +29,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.11",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
"react-dom": "^16.8.6" "react-dom": "^16.8.6"
+48
View File
@@ -3,6 +3,54 @@
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.
## [0.7.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.7.5...@ohif/extension-dicom-rt@0.7.6) (2022-01-20)
**Note:** Version bump only for package @ohif/extension-dicom-rt
## [0.7.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.7.4...@ohif/extension-dicom-rt@0.7.5) (2022-01-19)
**Note:** Version bump only for package @ohif/extension-dicom-rt
## [0.7.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.7.3...@ohif/extension-dicom-rt@0.7.4) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-dicom-rt
## [0.7.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.7.2...@ohif/extension-dicom-rt@0.7.3) (2021-10-26)
**Note:** Version bump only for package @ohif/extension-dicom-rt
## [0.7.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.7.1...@ohif/extension-dicom-rt@0.7.2) (2021-10-06)
**Note:** Version bump only for package @ohif/extension-dicom-rt
## [0.7.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.7.0...@ohif/extension-dicom-rt@0.7.1) (2021-09-28)
**Note:** Version bump only for package @ohif/extension-dicom-rt
# [0.7.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.6.14...@ohif/extension-dicom-rt@0.7.0) (2021-09-23) # [0.7.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.6.14...@ohif/extension-dicom-rt@0.7.0) (2021-09-23)
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-rt", "name": "@ohif/extension-dicom-rt",
"version": "0.7.0", "version": "0.7.6",
"description": "OHIF extension for rendering DICOM RTSTRUCTs on top of cornerstone images.", "description": "OHIF extension for rendering DICOM RTSTRUCTs on top of cornerstone images.",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -29,9 +29,9 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"cornerstone-core": "^2.5.0", "cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"gl-matrix": "^3.3.0", "gl-matrix": "^3.3.0",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
@@ -81,13 +81,10 @@ const RTPanel = ({
useEffect(() => { useEffect(() => {
updateStructureSets(); updateStructureSets();
document.addEventListener('extensiondicomrtrtloaded', updateStructureSets); document.addEventListener('rt-panel-tab-updated', updateStructureSets);
return () => { return () => {
document.removeEventListener( document.removeEventListener('rt-panel-tab-updated', updateStructureSets);
'extensiondicomrtrtloaded',
updateStructureSets
);
}; };
}, []); }, []);
+7 -8
View File
@@ -91,17 +91,12 @@ export default {
} }
if (activeViewport) { if (activeViewport) {
const study = studies.find(
s => s.StudyInstanceUID === activeViewport.StudyInstanceUID
);
const ds = study.displaySets.find(
ds =>
ds.displaySetInstanceUID ===
activeViewport.displaySetInstanceUID
);
const studyMetadata = studyMetadataManager.get( const studyMetadata = studyMetadataManager.get(
activeViewport.StudyInstanceUID activeViewport.StudyInstanceUID
); );
if (!studyMetadata) {
return;
}
const referencedDisplaySets = studyMetadata.getDerivedDatasets({ const referencedDisplaySets = studyMetadata.getDerivedDatasets({
referencedSeriesInstanceUID: activeViewport.SeriesInstanceUID, referencedSeriesInstanceUID: activeViewport.SeriesInstanceUID,
Modality: 'RTSTRUCT', Modality: 'RTSTRUCT',
@@ -112,6 +107,10 @@ export default {
['RTSTRUCT'].includes(ds.Modality) ['RTSTRUCT'].includes(ds.Modality)
) )
) { ) {
triggerRTPanelUpdatedEvent({
badgeNumber: referencedDisplaySets.length,
target: 'rt-panel',
});
return false; return false;
} }
} }
@@ -3,6 +3,54 @@
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.
## [0.7.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.7.5...@ohif/extension-dicom-segmentation@0.7.6) (2022-01-20)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
## [0.7.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.7.4...@ohif/extension-dicom-segmentation@0.7.5) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
## [0.7.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.7.3...@ohif/extension-dicom-segmentation@0.7.4) (2021-10-27)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
## [0.7.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.7.2...@ohif/extension-dicom-segmentation@0.7.3) (2021-10-26)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
## [0.7.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.7.1...@ohif/extension-dicom-segmentation@0.7.2) (2021-10-06)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
## [0.7.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.7.0...@ohif/extension-dicom-segmentation@0.7.1) (2021-09-28)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
# [0.7.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.6.11...@ohif/extension-dicom-segmentation@0.7.0) (2021-09-23) # [0.7.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.6.11...@ohif/extension-dicom-segmentation@0.7.0) (2021-09-23)
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-segmentation", "name": "@ohif/extension-dicom-segmentation",
"version": "0.7.0", "version": "0.7.6",
"description": "OHIF extension for viewing segmentations in the 2D MPR view", "description": "OHIF extension for viewing segmentations in the 2D MPR view",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -29,9 +29,9 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"cornerstone-core": "^2.5.0", "cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
"react-dom": "^16.8.6" "react-dom": "^16.8.6"
@@ -24,6 +24,7 @@ const SegmentItem = ({
onClick, onClick,
itemClass, itemClass,
color, color,
labelmap3D,
visible, visible,
onVisibilityChange, onVisibilityChange,
}) => { }) => {
@@ -39,7 +40,7 @@ const SegmentItem = ({
event.stopPropagation(); event.stopPropagation();
const newVisibility = !isVisible; const newVisibility = !isVisible;
setIsVisible(newVisibility); setIsVisible(newVisibility);
onVisibilityChange(newVisibility, index); onVisibilityChange(newVisibility, index, labelmap3D);
}; };
return ( return (
@@ -431,23 +431,43 @@ const SegmentationPanel = ({
return enabledElements[activeIndex].element; return enabledElements[activeIndex].element;
}; };
const onSegmentVisibilityChangeHandler = (isVisible, segmentNumber) => { const onSegmentVisibilityChangeHandler = (
/** Get all labelmaps with this segmentNumber (overlapping segments) */ isVisible,
const { labelmaps3D } = getBrushStackState(); segmentNumber,
const possibleLabelMaps3D = labelmaps3D.filter(({ labelmaps2D }) => { labelmap3D
return labelmaps2D.some(({ segmentsOnLabelmap }) => ) => {
segmentsOnLabelmap.includes(segmentNumber)
);
});
let segmentsHidden = []; let segmentsHidden = [];
possibleLabelMaps3D.forEach(labelmap3D => { if (labelmap3D.metadata.hasOverlapping) {
labelmap3D.segmentsHidden[segmentNumber] = !isVisible; /** Get all labelmaps with this segmentNumber and that
* are from the same series (overlapping segments) */
const { labelmaps3D } = getBrushStackState();
segmentsHidden = [ const sameSeriesLabelMaps3D = labelmaps3D.filter(({ metadata }) => {
...new Set([...segmentsHidden, ...labelmap3D.segmentsHidden]), return (
]; labelmap3D.metadata.segmentationSeriesInstanceUID ===
}); metadata.segmentationSeriesInstanceUID
);
});
const possibleLabelMaps3D = sameSeriesLabelMaps3D.filter(
({ labelmaps2D }) => {
return labelmaps2D.some(({ segmentsOnLabelmap }) =>
segmentsOnLabelmap.includes(segmentNumber)
);
}
);
possibleLabelMaps3D.forEach(labelmap3D => {
labelmap3D.segmentsHidden[segmentNumber] = !isVisible;
segmentsHidden = [
...new Set([...segmentsHidden, ...labelmap3D.segmentsHidden]),
];
});
} else {
labelmap3D.segmentsHidden[segmentNumber] = !isVisible;
segmentsHidden = [...labelmap3D.segmentsHidden];
}
setState(state => ({ ...state, segmentsHidden })); setState(state => ({ ...state, segmentsHidden }));
@@ -514,6 +534,7 @@ const SegmentationPanel = ({
label={segmentLabel} label={segmentLabel}
index={segmentNumber} index={segmentNumber}
color={color} color={color}
labelmap3D={labelmap3D}
visible={!labelmap3D.segmentsHidden[segmentIndex]} visible={!labelmap3D.segmentsHidden[segmentIndex]}
onVisibilityChange={onSegmentVisibilityChangeHandler} onVisibilityChange={onSegmentVisibilityChangeHandler}
/> />
@@ -64,8 +64,17 @@ export default function getSopClassHandlerModule({ servicesManager }) {
metadata, metadata,
}; };
segDisplaySet.getSourceDisplaySet = function(studies, activateLabelMap = true, onDisplaySetLoadFailureHandler) { segDisplaySet.getSourceDisplaySet = function(
return getSourceDisplaySet(studies, segDisplaySet, activateLabelMap, onDisplaySetLoadFailureHandler); studies,
activateLabelMap = true,
onDisplaySetLoadFailureHandler
) {
return getSourceDisplaySet(
studies,
segDisplaySet,
activateLabelMap,
onDisplaySetLoadFailureHandler
);
}; };
segDisplaySet.load = async function(referencedDisplaySet, studies) { segDisplaySet.load = async function(referencedDisplaySet, studies) {
@@ -98,6 +107,9 @@ export default function getSopClassHandlerModule({ servicesManager }) {
if (labelmapBufferArray.length > 1) { if (labelmapBufferArray.length > 1) {
let labelmapIndexes = []; let labelmapIndexes = [];
for (let i = 0; i < labelmapBufferArray.length; ++i) { for (let i = 0; i < labelmapBufferArray.length; ++i) {
segMetadata.segmentationSeriesInstanceUID =
segDisplaySet.SeriesInstanceUID;
segMetadata.hasOverlapping = true;
labelmapIndexes.push( labelmapIndexes.push(
await loadSegmentation( await loadSegmentation(
imageIds, imageIds,
@@ -118,6 +130,9 @@ export default function getSopClassHandlerModule({ servicesManager }) {
labelmapIndex = labelmapIndexes[0]; labelmapIndex = labelmapIndexes[0];
console.warn('Overlapping segments!'); console.warn('Overlapping segments!');
} else { } else {
segMetadata.segmentationSeriesInstanceUID =
segDisplaySet.SeriesInstanceUID;
segMetadata.hasOverlapping = false;
labelmapIndex = await loadSegmentation( labelmapIndex = await loadSegmentation(
imageIds, imageIds,
segDisplaySet, segDisplaySet,
+18 -1
View File
@@ -126,7 +126,7 @@ export default {
label: 'Segmentations', label: 'Segmentations',
target: 'segmentation-panel', target: 'segmentation-panel',
stateEvent: SegmentationPanelTabUpdatedEvent, stateEvent: SegmentationPanelTabUpdatedEvent,
isDisabled: studies => { isDisabled: (studies, activeViewport) => {
if (!studies) { if (!studies) {
return true; return true;
} }
@@ -139,6 +139,23 @@ export default {
const series = study.series[j]; const series = study.series[j];
if (series.Modality === 'SEG') { if (series.Modality === 'SEG') {
if (activeViewport) {
const studyMetadata = studyMetadataManager.get(
activeViewport.StudyInstanceUID
);
if (!studyMetadata) {
return;
}
const referencedDS = studyMetadata.getDerivedDatasets({
referencedSeriesInstanceUID:
activeViewport.SeriesInstanceUID,
Modality: 'SEG',
});
triggerSegmentationPanelTabUpdatedEvent({
badgeNumber: referencedDS.length,
target: 'segmentation-panel',
});
}
return false; return false;
} }
} }
+48
View File
@@ -3,6 +3,54 @@
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.
## [0.2.17](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.16...@ohif/extension-dicom-tag-browser@0.2.17) (2022-01-20)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
## [0.2.16](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.15...@ohif/extension-dicom-tag-browser@0.2.16) (2021-12-10)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
## [0.2.15](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.14...@ohif/extension-dicom-tag-browser@0.2.15) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
## [0.2.14](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.13...@ohif/extension-dicom-tag-browser@0.2.14) (2021-11-30)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
## [0.2.13](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.12...@ohif/extension-dicom-tag-browser@0.2.13) (2021-10-26)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
## [0.2.12](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.11...@ohif/extension-dicom-tag-browser@0.2.12) (2021-09-28)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
## [0.2.11](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.10...@ohif/extension-dicom-tag-browser@0.2.11) (2021-06-03) ## [0.2.11](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-tag-browser@0.2.10...@ohif/extension-dicom-tag-browser@0.2.11) (2021-06-03)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser **Note:** Version bump only for package @ohif/extension-dicom-tag-browser
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-tag-browser", "name": "@ohif/extension-dicom-tag-browser",
"version": "0.2.11", "version": "0.2.17",
"description": "OHIF extension for checking DICOM headers.", "description": "OHIF extension for checking DICOM headers.",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -28,12 +28,12 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^2.6.0", "@ohif/core": "^2.6.0",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"react": "^16.8.6" "react": "^16.8.6"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.5.5",
"dicomweb-client": "^0.8.1", "dicomweb-client": "^0.8.3",
"moment": "2.24.0", "moment": "2.24.0",
"react-select": "^3.0.8" "react-select": "^3.0.8"
} }
@@ -18,7 +18,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
activeDisplaySetInstanceUID, activeDisplaySetInstanceUID,
setActiveDisplaySetInstanceUID, setActiveDisplaySetInstanceUID,
] = useState(displaySetInstanceUID); ] = useState(displaySetInstanceUID);
const [activeInstance, setActiveInstance] = useState(0); const [activeInstance, setActiveInstance] = useState(1);
const [tags, setTags] = useState([]); const [tags, setTags] = useState([]);
const [meta, setMeta] = useState(''); const [meta, setMeta] = useState('');
const [instanceList, setInstanceList] = useState([]); const [instanceList, setInstanceList] = useState([]);
@@ -51,20 +51,21 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
description: displayDate, description: displayDate,
onClick: () => { onClick: () => {
setActiveDisplaySetInstanceUID(displaySetInstanceUID); setActiveDisplaySetInstanceUID(displaySetInstanceUID);
setActiveInstance(0); setActiveInstance(1);
}, },
}; };
}); });
let metadata; let metadata;
const isImageStack = activeDisplaySet instanceof ImageSet; const isImageStack =
activeDisplaySet instanceof ImageSet &&
activeDisplaySet.isModalitySupported === true;
let selectedInstanceValue;
let instanceList; let instanceList;
if (isImageStack) { if (isImageStack) {
const { images } = activeDisplaySet; const { images } = activeDisplaySet;
const image = images[activeInstance]; const image = images[activeInstance - 1];
instanceList = images.map((image, index) => { instanceList = images.map((image, index) => {
const metadata = image.getData().metadata; const metadata = image.getData().metadata;
@@ -91,7 +92,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
setInstanceList(instanceList); setInstanceList(instanceList);
setDisplaySetList(newDisplaySetList); setDisplaySetList(newDisplaySetList);
setIsImageStack(isImageStack); setIsImageStack(isImageStack);
}, [activeDisplaySetInstanceUID, activeInstance]); }, [activeDisplaySetInstanceUID, activeInstance, displaySets]);
const selectedDisplaySetValue = displaySetList.find( const selectedDisplaySetValue = displaySetList.find(
ds => ds.value === activeDisplaySetInstanceUID ds => ds.value === activeDisplaySetInstanceUID
@@ -106,7 +107,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
showValue showValue
step={1} step={1}
min={1} min={1}
max={instanceList.length - 1} max={instanceList.length}
value={activeInstance} value={activeInstance}
valueRenderer={value => <p>Instance Number: {value}</p>} valueRenderer={value => <p>Instance Number: {value}</p>}
onChange={({ target }) => { onChange={({ target }) => {
+88
View File
@@ -3,6 +3,94 @@
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.
## [1.12.11](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.10...@ohif/extension-vtk@1.12.11) (2022-01-20)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.10](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.9...@ohif/extension-vtk@1.12.10) (2022-01-13)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.9](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.8...@ohif/extension-vtk@1.12.9) (2021-12-23)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.8](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.7...@ohif/extension-vtk@1.12.8) (2021-12-23)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.7](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.6...@ohif/extension-vtk@1.12.7) (2021-12-02)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.5...@ohif/extension-vtk@1.12.6) (2021-11-30)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.4...@ohif/extension-vtk@1.12.5) (2021-10-26)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.3...@ohif/extension-vtk@1.12.4) (2021-10-15)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.2...@ohif/extension-vtk@1.12.3) (2021-10-04)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.1...@ohif/extension-vtk@1.12.2) (2021-09-28)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.12.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.12.0...@ohif/extension-vtk@1.12.1) (2021-09-24)
**Note:** Version bump only for package @ohif/extension-vtk
# [1.12.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.11.18...@ohif/extension-vtk@1.12.0) (2021-09-23) # [1.12.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.11.18...@ohif/extension-vtk@1.12.0) (2021-09-23)
+11 -11
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-vtk", "name": "@ohif/extension-vtk",
"version": "1.12.0", "version": "1.12.11",
"description": "OHIF extension for VTK.js", "description": "OHIF extension for VTK.js",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -32,11 +32,11 @@
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"@ohif/i18n": "^0.50.0", "@ohif/i18n": "^0.50.0",
"@ohif/ui": "^0.50.0", "@ohif/ui": "^0.50.0",
"cornerstone-core": "^2.5.0", "cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.0.3", "cornerstone-wado-image-loader": "^4.1.0",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.11",
"i18next": "^17.0.3", "i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "^3.0.1",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
@@ -53,11 +53,11 @@
"react-vtkjs-viewport": "^0.14.4" "react-vtkjs-viewport": "^0.14.4"
}, },
"devDependencies": { "devDependencies": {
"@ohif/core": "^2.15.0", "@ohif/core": "^2.16.7",
"@ohif/ui": "^1.10.1", "@ohif/ui": "^1.10.5",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.0.3", "cornerstone-wado-image-loader": "^4.1.0",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.11",
"gh-pages": "^2.0.1", "gh-pages": "^2.0.1",
"i18next": "^17.0.3", "i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "^3.0.1",
+81
View File
@@ -3,6 +3,87 @@
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.
## [2.16.7](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.6...@ohif/core@2.16.7) (2022-01-20)
**Note:** Version bump only for package @ohif/core
## [2.16.6](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.5...@ohif/core@2.16.6) (2022-01-13)
**Note:** Version bump only for package @ohif/core
## [2.16.5](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.4...@ohif/core@2.16.5) (2021-12-23)
### Bug Fixes
* DICOMFileLoadingListener typo in method name ([#2647](https://github.com/OHIF/Viewers/issues/2647)) ([761d54f](https://github.com/OHIF/Viewers/commit/761d54fbbfb376c20ee15794ef7bb7111f64a06f))
## [2.16.4](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.3...@ohif/core@2.16.4) (2021-12-23)
### Bug Fixes
* SeriesTime and SeriesDate are only set for the first series and undefined for the remaining ones ([#2476](https://github.com/OHIF/Viewers/issues/2476)) ([6a401c9](https://github.com/OHIF/Viewers/commit/6a401c9e5204cb4f7af6aa33190ad5a8d0879de6))
## [2.16.3](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.2...@ohif/core@2.16.3) (2021-12-02)
**Note:** Version bump only for package @ohif/core
## [2.16.2](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.1...@ohif/core@2.16.2) (2021-11-30)
**Note:** Version bump only for package @ohif/core
## [2.16.1](https://github.com/OHIF/Viewers/compare/@ohif/core@2.16.0...@ohif/core@2.16.1) (2021-10-26)
**Note:** Version bump only for package @ohif/core
# [2.16.0](https://github.com/OHIF/Viewers/compare/@ohif/core@2.15.1...@ohif/core@2.16.0) (2021-10-04)
### Features
* Added support for WADO servers built with static hosting (e.g. S3) ([#2566](https://github.com/OHIF/Viewers/issues/2566)) ([a046c6c](https://github.com/OHIF/Viewers/commit/a046c6c9017a84e5ead71d5113b5e892333b4130))
## [2.15.1](https://github.com/OHIF/Viewers/compare/@ohif/core@2.15.0...@ohif/core@2.15.1) (2021-09-28)
**Note:** Version bump only for package @ohif/core
# [2.15.0](https://github.com/OHIF/Viewers/compare/@ohif/core@2.14.1...@ohif/core@2.15.0) (2021-09-23) # [2.15.0](https://github.com/OHIF/Viewers/compare/@ohif/core@2.14.1...@ohif/core@2.15.0) (2021-09-23)
+7 -7
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/core", "name": "@ohif/core",
"version": "2.15.0", "version": "2.16.7",
"description": "Generic business logic for web-based medical imaging applications", "description": "Generic business logic for web-based medical imaging applications",
"author": "OHIF Core Team", "author": "OHIF Core Team",
"license": "MIT", "license": "MIT",
@@ -31,16 +31,16 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage" "test:unit:ci": "jest --ci --runInBand --collectCoverage"
}, },
"peerDependencies": { "peerDependencies": {
"cornerstone-core": "^2.5.0", "cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.0.3", "cornerstone-wado-image-loader": "^4.1.0",
"dicom-parser": "^1.8.9" "dicom-parser": "^1.8.11"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.5.5",
"ajv": "^6.10.0", "ajv": "^6.10.0",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"dicomweb-client": "^0.8.1", "dicomweb-client": "^0.8.3",
"immer": "6.0.2", "immer": "6.0.2",
"isomorphic-base64": "^1.0.2", "isomorphic-base64": "^1.0.2",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
@@ -98,7 +98,7 @@ class DICOMFileLoadingListener extends BaseLoadingListener {
constructor(stack, options) { constructor(stack, options) {
super(stack, options); super(stack, options);
this.imageLoadProgressEventHandler = this._imageLoadProgressEventHandle.bind( this.imageLoadProgressEventHandler = this._imageLoadProgressEventHandler.bind(
this this
); );
+16 -4
View File
@@ -1,6 +1,4 @@
import cornerstone from 'cornerstone-core'; import cornerstone from 'cornerstone-core';
import cornerstoneTools from 'cornerstone-tools';
import getImageId from '../utils/getImageId.js'; import getImageId from '../utils/getImageId.js';
const noop = () => {}; const noop = () => {};
@@ -13,6 +11,7 @@ export class StudyPrefetcher {
requestType: 'prefetch', requestType: 'prefetch',
preventCache: false, preventCache: false,
prefetchDisplaySetsTimeout: 300, prefetchDisplaySetsTimeout: 300,
maxNumPrefetchRequests: 100,
includeActiveDisplaySet: false, includeActiveDisplaySet: false,
}; };
@@ -94,7 +93,11 @@ export class StudyPrefetcher {
} }
this.element = element; this.element = element;
this.enabledElement = cornerstone.getEnabledElement(element); try {
this.enabledElement = cornerstone.getEnabledElement(element);
} catch {
throw new Error('Failed to find the enabled element');
}
this.stopPrefetching(); this.stopPrefetching();
this.prefetchDisplaySets(displaySetInstanceUID); this.prefetchDisplaySets(displaySetInstanceUID);
@@ -114,7 +117,11 @@ export class StudyPrefetcher {
* @param {number} timeout * @param {number} timeout
*/ */
prefetchDisplaySetsAsync(element, timeout) { prefetchDisplaySetsAsync(element, timeout) {
this.enabledElement = cornerstone.getEnabledElement(element); try {
this.enabledElement = cornerstone.getEnabledElement(element);
} catch {
throw new Error('Failed to find the enabled element');
}
timeout = timeout || this.options.prefetchDisplaySetsTimeout; timeout = timeout || this.options.prefetchDisplaySetsTimeout;
clearTimeout(this.prefetchDisplaySetsHandler); clearTimeout(this.prefetchDisplaySetsHandler);
this.prefetchDisplaySetsHandler = setTimeout(() => { this.prefetchDisplaySetsHandler = setTimeout(() => {
@@ -145,6 +152,11 @@ export class StudyPrefetcher {
const nonCachedImageIds = this.filterCachedImageIds(imageIds); const nonCachedImageIds = this.filterCachedImageIds(imageIds);
const imageLoadPoolManager = cornerstone.imageLoadPoolManager; const imageLoadPoolManager = cornerstone.imageLoadPoolManager;
imageLoadPoolManager.maxNumRequests = {
...imageLoadPoolManager.maxNumRequests,
prefetch: this.options.maxNumPrefetchRequests,
};
let requestFn; let requestFn;
if (this.options.preventCache) { if (this.options.preventCache) {
requestFn = id => cornerstone.loadImage(id); requestFn = id => cornerstone.loadImage(id);
@@ -9,7 +9,10 @@ import { SeriesMetadata } from './SeriesMetadata';
import { api } from 'dicomweb-client'; import { api } from 'dicomweb-client';
// - createStacks // - createStacks
import { isImage } from '../../utils/isImage'; import { isImage } from '../../utils/isImage';
import { isDisplaySetReconstructable, isSpacingUniform } from '../../utils/isDisplaySetReconstructable'; import {
isDisplaySetReconstructable,
isSpacingUniform,
} from '../../utils/isDisplaySetReconstructable';
import errorHandler from '../../errorHandler'; import errorHandler from '../../errorHandler';
import isLowPriorityModality from '../../utils/isLowPriorityModality'; import isLowPriorityModality from '../../utils/isLowPriorityModality';
import getXHRRetryRequestHook from '../../utils/xhrRetryRequestHook'; import getXHRRetryRequestHook from '../../utils/xhrRetryRequestHook';
@@ -159,41 +162,64 @@ class StudyMetadata extends Metadata {
// series into another display set. // series into another display set.
const stackableInstances = []; const stackableInstances = [];
series.forEachInstance(instance => { series.forEachInstance(instance => {
let displaySet;
// All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010) // All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010)
if ( if (
!isImage(instance.getTagValue('SOPClassUID')) && !isImage(instance.getTagValue('SOPClassUID')) &&
!instance.getTagValue('Rows') !instance.getTagValue('Rows')
) { ) {
return; // we set an empty display and we add a isModalitySupported variable to
} // print a warning that the modality is not supported in the thumbnail.
const displaySet = new ImageSet([]);
let displaySet; const seriesData = series.getData();
if (isMultiFrame(instance)) {
displaySet = makeDisplaySet(series, [instance]);
displaySet.setAttributes({ displaySet.setAttributes({
sopClassUIDs, displaySetInstanceUID: displaySet.uid,
isClip: true, SeriesDate: seriesData.SeriesDate,
SeriesTime: seriesData.SeriesTime,
SeriesInstanceUID: series.getSeriesInstanceUID(), SeriesInstanceUID: series.getSeriesInstanceUID(),
StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID for drag/drop purposes SeriesNumber: instance.getTagValue('SeriesNumber'),
numImageFrames: instance.getTagValue('NumberOfFrames'), // Override the default value of instances.length SeriesDescription: instance.getTagValue('SeriesDescription'),
InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number numImageFrames: instance.getTagValue('NumberOfFrames'),
AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime'), // Include the acquisition datetime frameRate: instance.getTagValue('FrameTime'),
}); Modality: instance.getTagValue('Modality'),
displaySets.push(displaySet); isMultiFrame: false,
} else if (isSingleImageModality(instance.Modality)) {
displaySet = makeDisplaySet(series, [instance]);
displaySet.setAttributes({
sopClassUIDs,
StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID
SeriesInstanceUID: series.getSeriesInstanceUID(),
InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number
AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime'), // Include the acquisition datetime AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime'), // Include the acquisition datetime
isReconstructable: false,
isModalitySupported: false,
metadata: instance.getData().metadata,
}); });
displaySets.push(displaySet); displaySets.push(displaySet);
} else { } else {
stackableInstances.push(instance); if (isMultiFrame(instance)) {
displaySet = makeDisplaySet(series, [instance]);
displaySet.setAttributes({
sopClassUIDs,
isClip: true,
SeriesInstanceUID: series.getSeriesInstanceUID(),
StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID for drag/drop purposes
numImageFrames: instance.getTagValue('NumberOfFrames'), // Override the default value of instances.length
InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number
AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime'), // Include the acquisition datetime
});
displaySets.push(displaySet);
} else if (isSingleImageModality(instance.Modality)) {
displaySet = makeDisplaySet(series, [instance]);
displaySet.setAttributes({
sopClassUIDs,
StudyInstanceUID: study.getStudyInstanceUID(), // Include the study instance UID
SeriesInstanceUID: series.getSeriesInstanceUID(),
InstanceNumber: instance.getTagValue('InstanceNumber'), // Include the instance number
AcquisitionDatetime: instance.getTagValue('AcquisitionDateTime'), // Include the acquisition datetime
});
displaySets.push(displaySet);
} else {
stackableInstances.push(instance);
}
} }
}); });
@@ -227,7 +253,6 @@ class StudyMetadata extends Metadata {
displaySets.map(displaySet => this._derivedDisplaySets.push(displaySet)); displaySets.map(displaySet => this._derivedDisplaySets.push(displaySet));
} }
/** /**
* Returns the source display set of the derivated display set. * Returns the source display set of the derivated display set.
* @param {object} derivatedDisplaySet * @param {object} derivatedDisplaySet
@@ -242,40 +267,45 @@ class StudyMetadata extends Metadata {
}); });
const otherDisplaySets = allDisplaySets.filter( const otherDisplaySets = allDisplaySets.filter(
ds => ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID ds =>
ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID
); );
const { metadata } = derivatedDisplaySet; const { metadata } = derivatedDisplaySet;
let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence(
(metadata, otherDisplaySets); metadata,
otherDisplaySets
);
let noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs || let noReferencedSeriesAvailable =
!referencedSeriesInstanceUIDs ||
referencedSeriesInstanceUIDs.length === 0; referencedSeriesInstanceUIDs.length === 0;
if (noReferencedSeriesAvailable) { if (noReferencedSeriesAvailable) {
referencedSeriesInstanceUIDs = referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence(
_findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence metadata
(metadata); );
} }
noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs || noReferencedSeriesAvailable =
!referencedSeriesInstanceUIDs ||
referencedSeriesInstanceUIDs.length === 0; referencedSeriesInstanceUIDs.length === 0;
if (noReferencedSeriesAvailable) { if (noReferencedSeriesAvailable) {
referencedSeriesInstanceUIDs = referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromReferencedImageSequence(
_findReferencedSeriesInstanceUIDsFromReferencedImageSequence metadata,
(metadata, otherDisplaySets); otherDisplaySets
);
} }
const referencedSeriesAvailable = referencedSeriesInstanceUIDs && const referencedSeriesAvailable =
referencedSeriesInstanceUIDs.length !== 0; referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0;
if (referencedSeriesAvailable) { if (referencedSeriesAvailable) {
const referencedDisplaySet = otherDisplaySets.find(ds => const referencedDisplaySet = otherDisplaySets.find(ds =>
referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID) referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID)
); );
;
return referencedDisplaySet; return referencedDisplaySet;
} }
}; }
/** /**
* Returns a list of derived datasets in the study, filtered by the given filter. * Returns a list of derived datasets in the study, filtered by the given filter.
@@ -303,7 +333,10 @@ class StudyMetadata extends Metadata {
if (referencedSeriesInstanceUID) { if (referencedSeriesInstanceUID) {
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter( filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
displaySet => { displaySet => {
return StudyMetadata.getReferencedDisplaySet(displaySet, [this]).SeriesInstanceUID === referencedSeriesInstanceUID; return (
StudyMetadata.getReferencedDisplaySet(displaySet, [this])
.SeriesInstanceUID === referencedSeriesInstanceUID
);
} }
); );
} }
@@ -311,8 +344,7 @@ class StudyMetadata extends Metadata {
if (referencedFrameOfReferenceUID) { if (referencedFrameOfReferenceUID) {
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter( filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
displaySet => displaySet =>
displaySet.FrameOfReferenceUID === displaySet.FrameOfReferenceUID === referencedFrameOfReferenceUID
referencedFrameOfReferenceUID
); );
} }
@@ -497,8 +529,10 @@ class StudyMetadata extends Metadata {
} }
} }
if (this._displaySets.some(ds => if (
ds.displaySetInstanceUID === displaySet.displaySetInstanceUID) this._displaySets.some(
ds => ds.displaySetInstanceUID === displaySet.displaySetInstanceUID
)
) { ) {
return; return;
} }
@@ -867,8 +901,9 @@ const makeDisplaySet = (series, instances) => {
imageSet.sortByImagePositionPatient(); imageSet.sortByImagePositionPatient();
// check if the spacing is uniform and update isReconstructable // check if the spacing is uniform and update isReconstructable
const datasetIs4D = displayReconstructableInfo.reconstructionIssues.find const datasetIs4D = displayReconstructableInfo.reconstructionIssues.find(
(issue => issue === ReconstructionIssues.DATASET_4D); issue => issue === ReconstructionIssues.DATASET_4D
);
displaySpacingInfo = isSpacingUniform(imageSet.images, datasetIs4D); displaySpacingInfo = isSpacingUniform(imageSet.images, datasetIs4D);
imageSet.isReconstructable = displaySpacingInfo.isUniform; imageSet.isReconstructable = displaySpacingInfo.isUniform;
@@ -881,11 +916,15 @@ const makeDisplaySet = (series, instances) => {
if (!imageSet.displayReconstructableInfo) { if (!imageSet.displayReconstructableInfo) {
// It is not reconstrabale Save type of warning // It is not reconstrabale Save type of warning
imageSet.reconstructionIssues = displaySpacingInfo ? imageSet.reconstructionIssues = displaySpacingInfo
displayReconstructableInfo.reconstructionIssues.concat(displaySpacingInfo.reconstructionIssues) : ? displayReconstructableInfo.reconstructionIssues.concat(
displayReconstructableInfo.reconstructionIssues; displaySpacingInfo.reconstructionIssues
)
: displayReconstructableInfo.reconstructionIssues;
} }
imageSet.isModalitySupported = true;
return imageSet; return imageSet;
}; };
@@ -963,38 +1002,36 @@ function _getDisplaySetFromSopClassModule(
} }
/** /**
* Returns the referenced series instance UIDs by searching the information in the * Returns the referenced series instance UIDs by searching the information in the
* ReferencedSeriesSequence. * ReferencedSeriesSequence.
* @param {object} derivatedDisplaySet.metadata * @param {object} derivatedDisplaySet.metadata
* @return {array[string]} referenced series instance UIDs. * @return {array[string]} referenced series instance UIDs.
*/ */
function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence ( function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence(
metadata, metadata
) { ) {
if (!metadata.ReferencedSeriesSequence) { if (!metadata.ReferencedSeriesSequence) {
return; return;
} }
let referencedSeriesInstanceUIDs; let referencedSeriesInstanceUIDs;
const ReferencedSeriesSequence = _toArray( const ReferencedSeriesSequence = _toArray(metadata.ReferencedSeriesSequence);
metadata.ReferencedSeriesSequence
);
referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map( referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map(
ReferencedSeries => ReferencedSeries.SeriesInstanceUID ReferencedSeries => ReferencedSeries.SeriesInstanceUID
); );
return referencedSeriesInstanceUIDs; return referencedSeriesInstanceUIDs;
}; }
/** /**
* Returns the referenced series instance UIDs by searching the information in the * Returns the referenced series instance UIDs by searching the information in the
* ReferencedImageSequence. * ReferencedImageSequence.
* @param {object} derivatedDisplaySet.metadata * @param {object} derivatedDisplaySet.metadata
* @param {array[object]} displaysets * @param {array[object]} displaysets
* @return {array[string]} referenced series instance UIDs. * @return {array[string]} referenced series instance UIDs.
*/ */
function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence ( function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence(
metadata, metadata,
displaySets displaySets
) { ) {
@@ -1015,22 +1052,25 @@ function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence (
ReferencedSOPInstanceUID ReferencedSOPInstanceUID
); );
if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { if (
referencedSeriesInstanceUIDs &&
referencedSeriesInstanceUIDs.length !== 0
) {
break; break;
} }
} }
return referencedSeriesInstanceUIDs; return referencedSeriesInstanceUIDs;
}; }
/** /**
* Returns the referenced series instance UIDs by searching the information in the * Returns the referenced series instance UIDs by searching the information in the
* SourceImageSequence. * SourceImageSequence.
* @param {object} derivatedDisplaySet.metadata * @param {object} derivatedDisplaySet.metadata
* @param {array[object]} displaysets * @param {array[object]} displaysets
* @return {array[string]} referenced series instance UIDs. * @return {array[string]} referenced series instance UIDs.
*/ */
function _findReferencedSeriesInstanceUIDsFromSourceImageSequence ( function _findReferencedSeriesInstanceUIDsFromSourceImageSequence(
metadata, metadata,
displaySets displaySets
) { ) {
@@ -1040,9 +1080,7 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
SourceImageSequence = metadata.SourceImageSequence; SourceImageSequence = metadata.SourceImageSequence;
} else { } else {
const { PerFrameFunctionalGroupsSequence } = metadata; const { PerFrameFunctionalGroupsSequence } = metadata;
const firstFunctionalGroups = _toArray( const firstFunctionalGroups = _toArray(PerFrameFunctionalGroupsSequence)[0];
PerFrameFunctionalGroupsSequence
)[0];
if (firstFunctionalGroups) { if (firstFunctionalGroups) {
const { DerivationImageSequence } = firstFunctionalGroups; const { DerivationImageSequence } = firstFunctionalGroups;
SourceImageSequence = DerivationImageSequence; SourceImageSequence = DerivationImageSequence;
@@ -1062,22 +1100,25 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
displaySets, displaySets,
ReferencedSOPInstanceUID ReferencedSOPInstanceUID
); );
if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) { if (
referencedSeriesInstanceUIDs &&
referencedSeriesInstanceUIDs.length !== 0
) {
break; break;
} }
} }
return referencedSeriesInstanceUIDs; return referencedSeriesInstanceUIDs;
}; }
/** /**
* Returns the referenced series instance UIDs by searching the information in the * Returns the referenced series instance UIDs by searching the information in the
* SOPInstanceUID of the displaySets. * SOPInstanceUID of the displaySets.
* @param {array[object]} displaysets * @param {array[object]} displaysets
* @param {string} SOPInstanceUID * @param {string} SOPInstanceUID
* @return {array[string]} referenced series instance UIDs. * @return {array[string]} referenced series instance UIDs.
*/ */
function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID ( function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID(
displaySets, displaySets,
SOPInstanceUID SOPInstanceUID
) { ) {
@@ -1098,10 +1139,10 @@ function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID (
} }
} }
} }
}; }
function _toArray(arrayOrObject) { function _toArray(arrayOrObject) {
return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject]; return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject];
} }
export {StudyMetadata}; export { StudyMetadata };
@@ -0,0 +1,85 @@
import { api } from 'dicomweb-client';
/**
* An implementation of the static wado client, that fetches data from
* a static response rather than actually doing real queries. This allows
* fast encoding of test data, but because it is static, anything actually
* performing searches doesn't work. This version fixes the query issue
* by manually implementing a query option.
*/
export default class StaticWadoClient extends api.DICOMwebClient {
static filterKeys = {
StudyInstanceUID: '0020000D',
PatientName: '00100010',
PatientID: '00100020',
StudyDescription: '00081030',
ModalitiesInStudy: '00080061',
};
constructor(qidoConfig) {
super(qidoConfig);
this.staticWado = qidoConfig.staticWado;
this.extendMetadataWithInstances = qidoConfig.extendMetadataWithInstances;
}
async retrieveSeriesMetadata(options) {
if (!this.extendMetadataWithInstances)
return super.retrieveSeriesMetadata(options);
const results = await Promise.all([
super.retrieveSeriesMetadata(options),
this.searchForInstances(options),
]);
const metadata = results[0];
const instances = results[1];
return metadata.map(item => {
const sopUID = item['00080018'].Value[0];
const instance = instances.find(
instance => instance['00080018'].Value[0] == sopUID
);
Object.assign(item, instance);
return item;
});
}
async searchForStudies(options) {
if (!this.staticWado) return super.searchForStudies(options);
let searchResult = await super.searchForStudies(options);
const { queryParams } = options;
if (!queryParams) return searchResult;
const filtered = searchResult.filter(study => {
for (const key of Object.keys(StaticWadoClient.filterKeys)) {
if (!this.filterItem(key, queryParams, study)) return false;
}
return true;
});
return filtered;
}
filterItem(key, queryParams, study) {
const altKey = StaticWadoClient.filterKeys[key] || key;
if (!queryParams) return true;
const testValue = queryParams[key] || queryParams[altKey];
if (!testValue) return true;
const valueElem = study[key] || study[altKey];
if (!valueElem) return false;
const value = valueElem.Value;
return this.eqItem(testValue, value);
}
eqItem(testValue, value) {
if (testValue.filter) {
return (
testValue.filter(testItem => this.eqItem(testItem, value)).length > 0
);
}
if (value === testValue) return true;
if (typeof value == 'string') {
return value.indexOf(testValue) != -1;
}
if (value.Alphabetic) return this.eqItem(testValue, value.Alphabetic);
if (value.filter)
return value.filter(item => this.eqItem(testValue, item)).length > 0;
return false;
}
}
@@ -1,4 +1,5 @@
import { api } from 'dicomweb-client'; import { api } from 'dicomweb-client';
import StaticWadoClient from './StaticWadoClient';
import DICOMWeb from '../../../DICOMWeb/'; import DICOMWeb from '../../../DICOMWeb/';
import errorHandler from '../../../errorHandler'; import errorHandler from '../../../errorHandler';
@@ -115,14 +116,18 @@ function resultDataToStudies(resultData) {
} }
export default function Studies(server, filter) { export default function Studies(server, filter) {
const { staticWado } = server;
const config = { const config = {
...server,
url: server.qidoRoot, url: server.qidoRoot,
headers: DICOMWeb.getAuthorizationHeader(server), headers: DICOMWeb.getAuthorizationHeader(server),
errorInterceptor: errorHandler.getHTTPErrorHandler(), errorInterceptor: errorHandler.getHTTPErrorHandler(),
requestHooks: [getXHRRetryRequestHook()], requestHooks: [getXHRRetryRequestHook()],
}; };
const dicomWeb = new api.DICOMwebClient(config); const dicomWeb = staticWado
? new StaticWadoClient(config)
: new api.DICOMwebClient(config);
server.qidoSupportsIncludeField = server.qidoSupportsIncludeField =
server.qidoSupportsIncludeField === undefined server.qidoSupportsIncludeField === undefined
? true ? true
@@ -1,4 +1,4 @@
import { api } from 'dicomweb-client'; import StaticWadoClient from '../qido/StaticWadoClient';
import dcmjs from 'dcmjs'; import dcmjs from 'dcmjs';
import DICOMWeb from '../../../DICOMWeb/'; import DICOMWeb from '../../../DICOMWeb/';
import RetrieveMetadataLoader from './retrieveMetadataLoader'; import RetrieveMetadataLoader from './retrieveMetadataLoader';
@@ -73,7 +73,8 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader
configLoad() { configLoad() {
const { server } = this; const { server } = this;
const client = new api.DICOMwebClient({ const client = new StaticWadoClient({
...server,
url: server.qidoRoot, url: server.qidoRoot,
headers: DICOMWeb.getAuthorizationHeader(server), headers: DICOMWeb.getAuthorizationHeader(server),
errorInterceptor: errorHandler.getHTTPErrorHandler(), errorInterceptor: errorHandler.getHTTPErrorHandler(),
@@ -116,6 +116,11 @@ async function makeSOPInstance(server, study, instance) {
}; };
study.seriesMap[SeriesInstanceUID] = series; study.seriesMap[SeriesInstanceUID] = series;
study.series.push(series); study.series.push(series);
} else {
if (series.SeriesDate === undefined)
series.SeriesDate = naturalizedInstance.SeriesDate;
if (series.SeriesTime === undefined)
series.SeriesTime = naturalizedInstance.SeriesTime;
} }
const wadouri = buildInstanceWadoUrl( const wadouri = buildInstanceWadoUrl(
@@ -1,6 +1,5 @@
import { ReconstructionIssues } from './../enums.js'; import { ReconstructionIssues } from './../enums.js';
/** /**
* Checks if a series is reconstructable to a 3D volume. * Checks if a series is reconstructable to a 3D volume.
* *
@@ -78,7 +77,9 @@ function processSingleframe(instances) {
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESDIMENSIONS); reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESDIMENSIONS);
} else if (SamplesPerPixel !== firstImageSamplesPerPixel) { } else if (SamplesPerPixel !== firstImageSamplesPerPixel) {
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESCOMPONENTS); reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESCOMPONENTS);
} else if (!_isSameArray(ImageOrientationPatient, firstImageOrientationPatient)) { } else if (
!_isSameArray(ImageOrientationPatient, firstImageOrientationPatient)
) {
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESORIENTATION); reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESORIENTATION);
} }
@@ -92,7 +93,10 @@ function processSingleframe(instances) {
reconstructionIssues.push(ReconstructionIssues.DATASET_4D); reconstructionIssues.push(ReconstructionIssues.DATASET_4D);
} }
return { value: reconstructionIssues.length === 0 ? true : false, reconstructionIssues }; return {
value: reconstructionIssues.length === 0 ? true : false,
reconstructionIssues,
};
} }
/** /**
@@ -116,14 +120,12 @@ function isSpacingUniform(instances, datasetIs4D) {
// If spacing is on a uniform grid but we are missing frames, // If spacing is on a uniform grid but we are missing frames,
// Allow reconstruction, but pass back the number of missing frames. // Allow reconstruction, but pass back the number of missing frames.
if (n > 2) { if (n > 2) {
const lastIpp = instances[n - 1].getData().metadata const lastIpp = instances[n - 1].getData().metadata.ImagePositionPatient;
.ImagePositionPatient;
// We can't reconstruct if we are missing ImagePositionPatient values // We can't reconstruct if we are missing ImagePositionPatient values
if (firstImagePositionPatient && lastIpp) { if (firstImagePositionPatient && lastIpp) {
const averageSpacingBetweenFrames = const averageSpacingBetweenFrames =
_getPerpendicularDistance(firstImagePositionPatient, lastIpp) / _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (n - 1);
(n - 1);
let previousImagePositionPatient = firstImagePositionPatient; let previousImagePositionPatient = firstImagePositionPatient;
@@ -136,7 +138,7 @@ function isSpacingUniform(instances, datasetIs4D) {
previousImagePositionPatient previousImagePositionPatient
); );
if (datasetIs4D && spacingBetweenFrames < 1.e-3) { if (datasetIs4D && spacingBetweenFrames < 1e-3) {
// the dataset is 4D, if the distance is zero, means that we are // the dataset is 4D, if the distance is zero, means that we are
// checking the 4th dimension. Do not return, since we want still to // checking the 4th dimension. Do not return, since we want still to
// check the 3rd dimension spacing. // check the 3rd dimension spacing.
@@ -164,10 +166,13 @@ function isSpacingUniform(instances, datasetIs4D) {
} }
} }
return { isUniform: reconstructionIssues.length === 0 ? true : false, missingFrames, reconstructionIssues }; return {
isUniform: reconstructionIssues.length === 0 ? true : false,
missingFrames,
reconstructionIssues,
};
} }
/** /**
* Check if 4D dataset. * Check if 4D dataset.
* *
@@ -181,7 +186,7 @@ function isSpacingUniform(instances, datasetIs4D) {
* *
* @returns {boolean} dataset4D value. * @returns {boolean} dataset4D value.
*/ */
function _isDataset4D(instances) { function _isDataset4D(instances) {
const n = instances.length; const n = instances.length;
for (let ii = 0; ii < n; ++ii) { for (let ii = 0; ii < n; ++ii) {
const instanceMetadataControl = instances[ii].getData().metadata; const instanceMetadataControl = instances[ii].getData().metadata;
@@ -204,7 +209,12 @@ function isSpacingUniform(instances, datasetIs4D) {
continue; continue;
} }
if (_isSameArray(instanceMetadataControl.ImagePositionPatient, instanceMetadata.ImagePositionPatient)) { if (
_isSameArray(
instanceMetadataControl.ImagePositionPatient,
instanceMetadata.ImagePositionPatient
)
) {
return true; return true;
} }
} }
@@ -265,11 +275,11 @@ function _getSpacingIssue(spacing, averageSpacing) {
function _getPerpendicularDistance(a, b) { function _getPerpendicularDistance(a, b) {
return Math.sqrt( return Math.sqrt(
Math.pow(a[0] - b[0], 2) + Math.pow(a[0] - b[0], 2) +
Math.pow(a[1] - b[1], 2) + Math.pow(a[1] - b[1], 2) +
Math.pow(a[2] - b[2], 2) Math.pow(a[2] - b[2], 2)
); );
} }
const constructableModalities = ['MR', 'CT', 'PT', 'NM']; const constructableModalities = ['MR', 'CT', 'PT', 'NM'];
export {isDisplaySetReconstructable, isSpacingUniform}; export { isDisplaySetReconstructable, isSpacingUniform };
+35
View File
@@ -3,6 +3,41 @@
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.
## [1.10.5](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.4...@ohif/ui@1.10.5) (2021-11-30)
**Note:** Version bump only for package @ohif/ui
## [1.10.4](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.3...@ohif/ui@1.10.4) (2021-10-26)
**Note:** Version bump only for package @ohif/ui
## [1.10.3](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.2...@ohif/ui@1.10.3) (2021-10-15)
**Note:** Version bump only for package @ohif/ui
## [1.10.2](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.1...@ohif/ui@1.10.2) (2021-09-24)
### Bug Fixes
* throttle thumbnail progress updates ([#2557](https://github.com/OHIF/Viewers/issues/2557)) ([66c587b](https://github.com/OHIF/Viewers/commit/66c587b139835201331a64bc24a17901e7583649))
## [1.10.1](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.0...@ohif/ui@1.10.1) (2021-09-13) ## [1.10.1](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.0...@ohif/ui@1.10.1) (2021-09-13)
**Note:** Version bump only for package @ohif/ui **Note:** Version bump only for package @ohif/ui
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/ui", "name": "@ohif/ui",
"version": "1.10.1", "version": "1.10.5",
"description": "A set of React components for Medical Imaging Viewers", "description": "A set of React components for Medical Imaging Viewers",
"author": "OHIF Contributors", "author": "OHIF Contributors",
"license": "MIT", "license": "MIT",
@@ -25,11 +25,12 @@ function StudyBrowser(props) {
altImageText, altImageText,
displaySetInstanceUID, displaySetInstanceUID,
imageId, imageId,
InstanceNumber, derivedDisplaySetsNumber,
numImageFrames, numImageFrames,
SeriesDescription, SeriesDescription,
SeriesNumber, SeriesNumber,
hasWarnings, hasWarnings,
hasDerivedDisplaySets,
} = thumb; } = thumb;
return ( return (
@@ -48,12 +49,13 @@ function StudyBrowser(props) {
// Thumb // Thumb
altImageText={altImageText} altImageText={altImageText}
imageId={imageId} imageId={imageId}
InstanceNumber={InstanceNumber} derivedDisplaySetsNumber={derivedDisplaySetsNumber}
displaySetInstanceUID={displaySetInstanceUID} // used by drop displaySetInstanceUID={displaySetInstanceUID} // used by drop
numImageFrames={numImageFrames} numImageFrames={numImageFrames}
SeriesDescription={SeriesDescription} SeriesDescription={SeriesDescription}
SeriesNumber={SeriesNumber} SeriesNumber={SeriesNumber}
hasWarnings={hasWarnings} hasWarnings={hasWarnings}
hasDerivedDisplaySets={hasDerivedDisplaySets}
// Events // Events
onClick={onThumbnailClick.bind( onClick={onThumbnailClick.bind(
undefined, undefined,
@@ -83,7 +85,7 @@ StudyBrowser.propTypes = {
altImageText: PropTypes.string, altImageText: PropTypes.string,
displaySetInstanceUID: PropTypes.string.isRequired, displaySetInstanceUID: PropTypes.string.isRequired,
imageId: PropTypes.string, imageId: PropTypes.string,
InstanceNumber: PropTypes.number, derivedDisplaySetsNumber: PropTypes.number,
numImageFrames: PropTypes.number, numImageFrames: PropTypes.number,
SeriesDescription: PropTypes.string, SeriesDescription: PropTypes.string,
SeriesNumber: PropTypes.number, SeriesNumber: PropTypes.number,
@@ -1,5 +1,6 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import throttle from 'lodash.throttle';
import { useDrag } from 'react-dnd'; import { useDrag } from 'react-dnd';
import { classes } from '@ohif/core'; import { classes } from '@ohif/core';
import ImageThumbnail from './ImageThumbnail'; import ImageThumbnail from './ImageThumbnail';
@@ -14,11 +15,12 @@ const StudyLoadingListener = classes.StudyLoadingListener;
function ThumbnailFooter({ function ThumbnailFooter({
SeriesDescription, SeriesDescription,
SeriesNumber, SeriesNumber,
InstanceNumber,
numImageFrames, numImageFrames,
hasWarnings, hasWarnings,
hasDerivedDisplaySets,
}) { }) {
const [inconsistencyWarnings, inconsistencyWarningsSet] = useState([]); const [inconsistencyWarnings, inconsistencyWarningsSet] = useState([]);
const [derivedDisplaySetsActive, derivedDisplaySetsActiveSet] = useState([]);
useEffect(() => { useEffect(() => {
let unmounted = false; let unmounted = false;
@@ -27,10 +29,15 @@ function ThumbnailFooter({
inconsistencyWarningsSet(response); inconsistencyWarningsSet(response);
} }
}); });
hasDerivedDisplaySets.then(response => {
if (!unmounted) {
derivedDisplaySetsActiveSet(response);
}
});
return () => { return () => {
unmounted = true; unmounted = true;
}; };
}, [hasWarnings]); }, [hasWarnings, hasDerivedDisplaySets]);
const infoOnly = !SeriesDescription; const infoOnly = !SeriesDescription;
@@ -87,20 +94,47 @@ function ThumbnailFooter({
</React.Fragment> </React.Fragment>
); );
}; };
const getDerivedInfo = derivedDisplaySetsActive => {
return (
<React.Fragment>
{derivedDisplaySetsActive ? (
<div className="derived">
<Icon name="link" />
</div>
) : (
<React.Fragment></React.Fragment>
)}
</React.Fragment>
);
};
const getSeriesInformation = ( const getSeriesInformation = (
SeriesNumber, SeriesNumber,
InstanceNumber,
numImageFrames, numImageFrames,
inconsistencyWarnings inconsistencyWarnings,
derivedDisplaySetsActive
) => { ) => {
if (!SeriesNumber && !InstanceNumber && !numImageFrames) { if (!SeriesNumber && !numImageFrames) {
return; return;
} }
const seriesInformation = ( const seriesInformation = (
<div className="series-information"> <div className="series-information">
{getInfo(SeriesNumber, 'S:')} <React.Fragment>
{getInfo(InstanceNumber, 'I:')} {SeriesNumber !== undefined ? (
{getInfo(numImageFrames, '', 'image-frames')} getInfo(SeriesNumber, 'S:')
) : (
<React.Fragment></React.Fragment>
)}
</React.Fragment>
<React.Fragment>
{numImageFrames !== undefined ? (
getInfo(numImageFrames, '', 'image-frames')
) : (
<React.Fragment></React.Fragment>
)}
</React.Fragment>
{getDerivedInfo(derivedDisplaySetsActive)}
{getWarningInfo(SeriesNumber, inconsistencyWarnings)} {getWarningInfo(SeriesNumber, inconsistencyWarnings)}
</div> </div>
); );
@@ -113,9 +147,9 @@ function ThumbnailFooter({
<div className="series-description">{SeriesDescription}</div> <div className="series-description">{SeriesDescription}</div>
{getSeriesInformation( {getSeriesInformation(
SeriesNumber, SeriesNumber,
InstanceNumber,
numImageFrames, numImageFrames,
inconsistencyWarnings inconsistencyWarnings,
derivedDisplaySetsActive
)} )}
</div> </div>
); );
@@ -129,11 +163,6 @@ function Thumbnail(props) {
displaySetInstanceUID, displaySetInstanceUID,
imageId, imageId,
imageSrc, imageSrc,
InstanceNumber,
numImageFrames,
SeriesDescription,
SeriesNumber,
hasWarnings,
StudyInstanceUID, StudyInstanceUID,
onClick, onClick,
onDoubleClick, onDoubleClick,
@@ -144,13 +173,13 @@ function Thumbnail(props) {
const [stackPercentComplete, setStackPercentComplete] = useState(0); const [stackPercentComplete, setStackPercentComplete] = useState(0);
useEffect(() => { useEffect(() => {
const onProgressChange = ({ detail }) => { const onProgressChange = throttle(({ detail }) => {
const { progressId, progressData } = detail; const { progressId, progressData } = detail;
if (`StackProgress:${displaySetInstanceUID}` === progressId) { if (`StackProgress:${displaySetInstanceUID}` === progressId) {
const percent = progressData ? progressData.percentComplete : 0; const percent = progressData ? progressData.percentComplete : 0;
setStackPercentComplete(percent); setStackPercentComplete(percent);
} }
}; }, 100);
document.addEventListener( document.addEventListener(
StudyLoadingListener.events.OnProgress, StudyLoadingListener.events.OnProgress,
@@ -231,8 +260,8 @@ Thumbnail.propTypes = {
altImageText: PropTypes.string, altImageText: PropTypes.string,
SeriesDescription: PropTypes.string, SeriesDescription: PropTypes.string,
SeriesNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), SeriesNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
InstanceNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
hasWarnings: PropTypes.instanceOf(Promise), hasWarnings: PropTypes.instanceOf(Promise),
hasDerivedDisplaySets: PropTypes.instanceOf(Promise),
numImageFrames: PropTypes.number, numImageFrames: PropTypes.number,
onDoubleClick: PropTypes.func, onDoubleClick: PropTypes.func,
onClick: PropTypes.func, onClick: PropTypes.func,
@@ -41,7 +41,7 @@ const SnackbarProvider = ({ children, service }) => {
LogManager.subscribe(LogManager.EVENTS.OnLog, onLogHandler); LogManager.subscribe(LogManager.EVENTS.OnLog, onLogHandler);
return () => { return () => {
LogManager.subscribe(LogManager.EVENTS.OnLog, onLogHandler); LogManager.unsubscribe(LogManager.EVENTS.OnLog, onLogHandler);
}; };
}, [show]); }, [show]);
+123
View File
@@ -3,6 +3,129 @@
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.
## [4.12.12](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.11...@ohif/viewer@4.12.12) (2022-01-20)
**Note:** Version bump only for package @ohif/viewer
## [4.12.11](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.10...@ohif/viewer@4.12.11) (2022-01-19)
**Note:** Version bump only for package @ohif/viewer
## [4.12.10](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.9...@ohif/viewer@4.12.10) (2022-01-13)
**Note:** Version bump only for package @ohif/viewer
## [4.12.9](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.8...@ohif/viewer@4.12.9) (2021-12-23)
**Note:** Version bump only for package @ohif/viewer
## [4.12.8](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.7...@ohif/viewer@4.12.8) (2021-12-23)
**Note:** Version bump only for package @ohif/viewer
## [4.12.7](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.6...@ohif/viewer@4.12.7) (2021-12-02)
**Note:** Version bump only for package @ohif/viewer
## [4.12.6](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.5...@ohif/viewer@4.12.6) (2021-11-30)
**Note:** Version bump only for package @ohif/viewer
## [4.12.5](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.4...@ohif/viewer@4.12.5) (2021-10-27)
**Note:** Version bump only for package @ohif/viewer
## [4.12.4](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.3...@ohif/viewer@4.12.4) (2021-10-26)
**Note:** Version bump only for package @ohif/viewer
## [4.12.3](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.2...@ohif/viewer@4.12.3) (2021-10-25)
**Note:** Version bump only for package @ohif/viewer
## [4.12.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.1...@ohif/viewer@4.12.2) (2021-10-15)
**Note:** Version bump only for package @ohif/viewer
## [4.12.1](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.12.0...@ohif/viewer@4.12.1) (2021-10-06)
**Note:** Version bump only for package @ohif/viewer
# [4.12.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.11.2...@ohif/viewer@4.12.0) (2021-10-04)
### Features
* Added support for WADO servers built with static hosting (e.g. S3) ([#2566](https://github.com/OHIF/Viewers/issues/2566)) ([a046c6c](https://github.com/OHIF/Viewers/commit/a046c6c9017a84e5ead71d5113b5e892333b4130))
## [4.11.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.11.1...@ohif/viewer@4.11.2) (2021-09-28)
**Note:** Version bump only for package @ohif/viewer
## [4.11.1](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.11.0...@ohif/viewer@4.11.1) (2021-09-24)
**Note:** Version bump only for package @ohif/viewer
# [4.11.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.10.1...@ohif/viewer@4.11.0) (2021-09-23) # [4.11.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@4.10.1...@ohif/viewer@4.11.0) (2021-09-23)
@@ -85,7 +85,7 @@ describe('OHIF Save Measurements', function() {
// cy.get('.sb-closeIcon').click(); // cy.get('.sb-closeIcon').click();
// }); // });
it('checks if warning message is displayed on measurements of unsupported tools', function() { /*it('checks if warning message is displayed on measurements of unsupported tools', function() {
// Add measurement for unsupported tool in the viewport // Add measurement for unsupported tool in the viewport
cy.addAngleMeasurement(); cy.addAngleMeasurement();
@@ -108,7 +108,7 @@ describe('OHIF Save Measurements', function() {
// Close Measurements panel // Close Measurements panel
cy.get('@measurementsBtn').click(); cy.get('@measurementsBtn').click();
}); });*/
/*it('checks if measurements of unsupported tools were not saved', function() { /*it('checks if measurements of unsupported tools were not saved', function() {
// Add measurement for supported tool in the viewport // Add measurement for supported tool in the viewport
+16 -16
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/viewer", "name": "@ohif/viewer",
"version": "4.11.0", "version": "4.12.12",
"description": "OHIF Viewer", "description": "OHIF Viewer",
"author": "OHIF Contributors", "author": "OHIF Contributors",
"license": "MIT", "license": "MIT",
@@ -47,28 +47,28 @@
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.5.5",
"@ohif/core": "^2.15.0", "@ohif/core": "^2.16.7",
"@ohif/extension-cornerstone": "^2.12.0", "@ohif/extension-cornerstone": "^2.12.4",
"@ohif/extension-debugging": "^0.3.0", "@ohif/extension-debugging": "^0.3.1",
"@ohif/extension-dicom-html": "^1.3.10", "@ohif/extension-dicom-html": "^1.3.15",
"@ohif/extension-dicom-microscopy": "^0.52.0", "@ohif/extension-dicom-microscopy": "^0.52.0",
"@ohif/extension-dicom-pdf": "^1.1.0", "@ohif/extension-dicom-pdf": "^1.1.1",
"@ohif/extension-dicom-rt": "^0.7.0", "@ohif/extension-dicom-rt": "^0.7.6",
"@ohif/extension-dicom-segmentation": "^0.7.0", "@ohif/extension-dicom-segmentation": "^0.7.6",
"@ohif/extension-lesion-tracker": "^0.2.1", "@ohif/extension-lesion-tracker": "^0.2.1",
"@ohif/extension-vtk": "^1.12.0", "@ohif/extension-vtk": "^1.12.11",
"@ohif/i18n": "^0.53.0", "@ohif/i18n": "^0.53.0",
"@ohif/ui": "^1.10.1", "@ohif/ui": "^1.10.5",
"@tanem/react-nprogress": "^1.1.25", "@tanem/react-nprogress": "^1.1.25",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"core-js": "^3.2.1", "core-js": "^3.2.1",
"cornerstone-core": "^2.5.0", "cornerstone-core": "^2.6.1",
"cornerstone-math": "^0.1.9", "cornerstone-math": "^0.1.9",
"cornerstone-tools": "^6.0.0", "cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.0.3", "cornerstone-wado-image-loader": "^4.1.0",
"dcmjs": "0.18.8", "dcmjs": "0.19.2",
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.11",
"dicomweb-client": "^0.8.1", "dicomweb-client": "^0.8.3",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"i18next": "^17.0.3", "i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1", "i18next-browser-languagedetector": "^3.0.1",
+1
View File
@@ -11,6 +11,7 @@ window.config = {
displaySetCount: 3, displaySetCount: 3,
preventCache: false, preventCache: false,
prefetchDisplaySetsTimeout: 300, prefetchDisplaySetsTimeout: 300,
maxNumPrefetchRequests: 100,
displayProgress: true, displayProgress: true,
includeActiveDisplaySet: true, includeActiveDisplaySet: true,
}, },
@@ -0,0 +1,20 @@
window.config = {
routerBasename: '/',
showStudyList: true,
servers: {
dicomWeb: [
{
name: 'LocalStatic',
wadoUriRoot: 'http://localhost:5000/',
qidoRoot: 'http://localhost:5000',
wadoRoot: 'http://localhost:5000/',
qidoSupportsIncludeField: false,
imageRendering: 'wadors',
thumbnailRendering: 'thumbnail',
enableStudyLazyLoad: true,
supportsFuzzyMatching: false,
staticWado: true,
},
],
},
};
@@ -14,13 +14,11 @@ const mapDispatchToProps = (dispatch, ownProps) => {
displaySetInstanceUID displaySetInstanceUID
); );
const { LoggerService, UINotificationService } = servicesManager.services;
if (displaySet.isDerived) { if (displaySet.isDerived) {
const { Modality } = displaySet; const { Modality } = displaySet;
if (Modality === 'SEG' && servicesManager) { if (Modality === 'SEG' && servicesManager) {
const {
LoggerService,
UINotificationService,
} = servicesManager.services;
const onDisplaySetLoadFailureHandler = error => { const onDisplaySetLoadFailureHandler = error => {
LoggerService.error({ error, message: error.message }); LoggerService.error({ error, message: error.message });
UINotificationService.show({ UINotificationService.show({
@@ -55,14 +53,42 @@ const mapDispatchToProps = (dispatch, ownProps) => {
} }
if (!displaySet) { if (!displaySet) {
throw new Error( const error = new Error(
`Referenced series for ${Modality} dataset not present.` `Referenced series for ${Modality} dataset not present.`
); );
const message = `Referenced series for ${Modality} dataset not present.`;
LoggerService.error({ error, message });
UINotificationService.show({
autoClose: false,
title: 'Fail to load series',
message,
type: 'error',
});
} }
}
if (!displaySet) { if (!displaySet) {
throw new Error('Source data not present'); const error = new Error('Source data not present');
} const message = 'Source data not present';
LoggerService.error({ error, message });
UINotificationService.show({
autoClose: false,
title: 'Fail to load series',
message,
type: 'error',
});
}
if (displaySet.isModalitySupported === false) {
const error = new Error('Modality not supported');
const message = 'Modality not supported';
LoggerService.error({ error, message });
UINotificationService.show({
autoClose: false,
title: 'Fail to load series',
message,
type: 'error',
});
} }
dispatch(setActiveViewportSpecificData(displaySet)); dispatch(setActiveViewportSpecificData(displaySet));
@@ -23,6 +23,8 @@ import './Viewer.css';
import StudyPrefetcher from '../components/StudyPrefetcher.js'; import StudyPrefetcher from '../components/StudyPrefetcher.js';
import StudyLoadingMonitor from '../components/StudyLoadingMonitor'; import StudyLoadingMonitor from '../components/StudyLoadingMonitor';
const { studyMetadataManager } = OHIF.utils;
class Viewer extends Component { class Viewer extends Component {
static propTypes = { static propTypes = {
studies: PropTypes.arrayOf( studies: PropTypes.arrayOf(
@@ -429,6 +431,31 @@ class Viewer extends Component {
export default withDialog(Viewer); export default withDialog(Viewer);
/**
* Async function to check if the displaySet has any derived one
*
* @param {*object} displaySet
* @param {*object} study
* @returns {bool}
*/
const _checkForDerivedDisplaySets = async function(displaySet, study) {
let derivedDisplaySetsNumber = 0;
if (
displaySet.Modality &&
!['SEG', 'SR', 'RTSTRUCT', 'RTDOSE'].includes(displaySet.Modality)
) {
const studyMetadata = studyMetadataManager.get(study.StudyInstanceUID);
const derivedDisplaySets = studyMetadata.getDerivedDatasets({
referencedSeriesInstanceUID: displaySet.SeriesInstanceUID,
});
derivedDisplaySetsNumber = derivedDisplaySets.length;
}
return derivedDisplaySetsNumber > 0;
};
/** /**
* Async function to check if there are any inconsistences in the series. * Async function to check if there are any inconsistences in the series.
* *
@@ -456,6 +483,7 @@ const _checkForSeriesInconsistencesWarnings = async function(
// warnings already checked and cached in displaySet // warnings already checked and cached in displaySet
return displaySet.inconsistencyWarnings; return displaySet.inconsistencyWarnings;
} }
const inconsistencyWarnings = []; const inconsistencyWarnings = [];
if (displaySet.Modality !== 'SEG') { if (displaySet.Modality !== 'SEG') {
@@ -512,10 +540,13 @@ const _checkForSeriesInconsistencesWarnings = async function(
'The datasets is missing frames: ' + displaySet.missingFrames + '.' 'The datasets is missing frames: ' + displaySet.missingFrames + '.'
); );
} }
if (displaySet.isModalitySupported === false) {
inconsistencyWarnings.push('The datasets modality is not supported.');
}
} else { } else {
const segMetadata = displaySet.metadata; const segMetadata = displaySet.metadata;
if (!segMetadata) { if (!segMetadata) {
displaySet.inconsistencyWarnings = inconsistencyWarnings;
return inconsistencyWarnings; return inconsistencyWarnings;
} }
@@ -524,7 +555,6 @@ const _checkForSeriesInconsistencesWarnings = async function(
false false
); );
if (!referencedDisplaySet) { if (!referencedDisplaySet) {
displaySet.inconsistencyWarnings = inconsistencyWarnings;
return inconsistencyWarnings; return inconsistencyWarnings;
} }
@@ -532,7 +562,6 @@ const _checkForSeriesInconsistencesWarnings = async function(
image.getImageId() image.getImageId()
); );
if (!imageIds || imageIds.length === 0) { if (!imageIds || imageIds.length === 0) {
displaySet.inconsistencyWarnings = inconsistencyWarnings;
return inconsistencyWarnings; return inconsistencyWarnings;
} }
@@ -686,7 +715,6 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
const { const {
displaySetInstanceUID, displaySetInstanceUID,
SeriesDescription, SeriesDescription,
InstanceNumber,
numImageFrames, numImageFrames,
SeriesNumber, SeriesNumber,
} = displaySet; } = displaySet;
@@ -711,6 +739,11 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
studies studies
); );
const hasDerivedDisplaySets = _checkForDerivedDisplaySets(
displaySet,
study
);
return { return {
active: _isDisplaySetActive( active: _isDisplaySetActive(
displaySet, displaySet,
@@ -721,10 +754,10 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
altImageText, altImageText,
displaySetInstanceUID, displaySetInstanceUID,
SeriesDescription, SeriesDescription,
InstanceNumber,
numImageFrames, numImageFrames,
SeriesNumber, SeriesNumber,
hasWarnings, hasWarnings,
hasDerivedDisplaySets,
}; };
}); });
@@ -139,10 +139,11 @@ class ViewerMain extends Component {
displaySetInstanceUID displaySetInstanceUID
); );
const { LoggerService, UINotificationService } = servicesManager.services;
if (displaySet.isDerived) { if (displaySet.isDerived) {
const { Modality } = displaySet; const { Modality } = displaySet;
if (Modality === 'SEG' && servicesManager) { if (Modality === 'SEG' && servicesManager) {
const {LoggerService, UINotificationService} = servicesManager.services;
const onDisplaySetLoadFailureHandler = error => { const onDisplaySetLoadFailureHandler = error => {
LoggerService.error({ error, message: error.message }); LoggerService.error({ error, message: error.message });
UINotificationService.show({ UINotificationService.show({
@@ -153,24 +154,41 @@ class ViewerMain extends Component {
}); });
}; };
const {referencedDisplaySet} = displaySet.getSourceDisplaySet( const { referencedDisplaySet } = displaySet.getSourceDisplaySet(
this.props.studies, this.props.studies,
true, true,
onDisplaySetLoadFailureHandler onDisplaySetLoadFailureHandler
); );
displaySet = referencedDisplaySet; displaySet = referencedDisplaySet;
} else { } else {
displaySet = displaySet.getSourceDisplaySet(this.props.studies); displaySet = displaySet.getSourceDisplaySet(this.props.studies);
} }
if (!displaySet) { if (!displaySet) {
throw new Error( const error = new Error('Source data not present');
`Referenced series for ${Modality} dataset not present.` const message = 'Source data not present';
); LoggerService.error({ error, message });
UINotificationService.show({
autoClose: false,
title: 'Fail to load series',
message,
type: 'error',
});
} }
} }
if (displaySet.isModalitySupported === false) {
const error = new Error('Modality not supported');
const message = 'Modality not supported';
LoggerService.error({ error, message });
UINotificationService.show({
autoClose: false,
title: 'Fail to load series',
message,
type: 'error',
});
}
this.props.setViewportSpecificData(viewportIndex, displaySet); this.props.setViewportSpecificData(viewportIndex, displaySet);
}; };
+25 -20
View File
@@ -6034,28 +6034,28 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
cornerstone-core@^2.5.0: cornerstone-core@^2.6.1:
version "2.5.0" version "2.6.1"
resolved "https://registry.yarnpkg.com/cornerstone-core/-/cornerstone-core-2.5.0.tgz#1051ffc34420ad7484e61d2f3bdbc41a5ebc1956" resolved "https://registry.yarnpkg.com/cornerstone-core/-/cornerstone-core-2.6.1.tgz#f9a29a49057f286e8c969c7020e979d567449d42"
integrity sha512-mJzvRJh8J7d5FJutjaL9cT8ZNnmj6l5PHROsyktZq1ojh4vkXfHECQ2izIQu8nmtJ9A6SyQRj4v5Uxn7hijzKw== integrity sha512-LAXjXwNnK2W65ZxpE7phVLjbijkYUrAQIGv5xqKjK8+dmIGlBxqvPHnyGwEqVDyKOWVrpXP6ymUPwrGGRwzgMg==
cornerstone-math@0.1.9, cornerstone-math@^0.1.9: cornerstone-math@0.1.9, cornerstone-math@^0.1.9:
version "0.1.9" version "0.1.9"
resolved "https://registry.yarnpkg.com/cornerstone-math/-/cornerstone-math-0.1.9.tgz#7ce5509e8b9f465b01f7c548470725e7569859fc" resolved "https://registry.yarnpkg.com/cornerstone-math/-/cornerstone-math-0.1.9.tgz#7ce5509e8b9f465b01f7c548470725e7569859fc"
integrity sha512-NxdooV73asEQgav1S+0e+a4K+W3CXJdLXyFkVN24qqCtmIpzZzwtw3F9KWPCekzSAJmbhtQ3HicOQj3d4vRtuw== integrity sha512-NxdooV73asEQgav1S+0e+a4K+W3CXJdLXyFkVN24qqCtmIpzZzwtw3F9KWPCekzSAJmbhtQ3HicOQj3d4vRtuw==
cornerstone-tools@^6.0.0: cornerstone-tools@^6.0.6:
version "6.0.0" version "6.0.6"
resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-6.0.0.tgz#6840658f4508e60cd206b17d6e56160367f616f1" resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-6.0.6.tgz#61db62a9eb3d197acea297f60fc610c918a38be0"
integrity sha512-VU4MrsO2NcQK6CUxuYFdiNvdWjF/NV/fs8jCePazYCoFDDKIYcUM9UmoYXAapFE2mon65p4u9wUAvuIuLeBQwA== integrity sha512-t+yksdByljoP/X7CBHfSzmZmLk1o9QCg4CmzspIG6mkRRmZeMf5hxgaM3u0pBdjK1JyxZwzMbavbyl5DG7KxpA==
dependencies: dependencies:
"@babel/runtime" "7.1.2" "@babel/runtime" "7.1.2"
cornerstone-math "0.1.9" cornerstone-math "0.1.9"
cornerstone-wado-image-loader@^4.0.3: cornerstone-wado-image-loader@^4.1.0:
version "4.0.3" version "4.1.0"
resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-4.0.3.tgz#4848a238af9b10742af6d08e204527acf5260c25" resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-4.1.0.tgz#a85c206eb23e188181ed3f1dcf3ec715e65efcb4"
integrity sha512-0KuMC6+hEFsCwVOBH4idKwPpbLdccPzP7i5Ja4q7E/kfwCE71uL8AzHhx96XcLeFN8oR8T+nzv8X6j0lyY32SA== integrity sha512-QRoMqBE5xEc1Jttg3eH6RB4jFY2aIEjd9rcbvJszefl0isow+JwcLv2kh1xkSvqGfHGozcz+F4mrORyTNNLuFQ==
dependencies: dependencies:
"@cornerstonejs/codec-charls" "^0.1.1" "@cornerstonejs/codec-charls" "^0.1.1"
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^0.0.7" "@cornerstonejs/codec-libjpeg-turbo-8bit" "^0.0.7"
@@ -6647,10 +6647,10 @@ dateformat@^3.0.0:
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
dcmjs@0.18.8: dcmjs@0.19.2:
version "0.18.8" version "0.19.2"
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.18.8.tgz#fc8e6af03ace9050da49f4108334aa3d0a3bdf3d" resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.19.2.tgz#f3ff81797b17cdb2663dc8212f8a3d7dfd145ae2"
integrity sha512-Z3nNEmzkWdpHQPgjozGqk8XcuhP/hXP1C64Wtg9V+VO9eEc8eNFJFJ6If62f1cuOh0FaRwHqxBT7OzhOAUpFTA== integrity sha512-FXdKHnCoaONbgZFwxchpXUhLHOtSdIWGtG2A0UDS72FmptHDDXQH017j1e5aVm0Q5ee+42c+W+xWwBScmSyE7w==
dependencies: dependencies:
"@babel/polyfill" "^7.8.3" "@babel/polyfill" "^7.8.3"
"@babel/runtime" "^7.8.4" "@babel/runtime" "^7.8.4"
@@ -6963,6 +6963,11 @@ dicom-microscopy-viewer@^0.6.1:
dicomweb-client "^0.5.2" dicomweb-client "^0.5.2"
ol "^5.3.0" ol "^5.3.0"
dicom-parser@^1.8.11:
version "1.8.11"
resolved "https://registry.yarnpkg.com/dicom-parser/-/dicom-parser-1.8.11.tgz#ffd86289a6b85bb0047379084b57fcc1b28fe7f8"
integrity sha512-KbxEDqv4Stynv5AxDh90+jY7MtPvI2uyOG62yD8zKu/pcZqoQYfPX44rB0ULjpxt6YIfXfajrs7B1L97RbjNsg==
dicom-parser@^1.8.9: dicom-parser@^1.8.9:
version "1.8.9" version "1.8.9"
resolved "https://registry.yarnpkg.com/dicom-parser/-/dicom-parser-1.8.9.tgz#c69b036b8234df1cfad9978d0d6f0caad1582e74" resolved "https://registry.yarnpkg.com/dicom-parser/-/dicom-parser-1.8.9.tgz#c69b036b8234df1cfad9978d0d6f0caad1582e74"
@@ -6973,10 +6978,10 @@ dicomweb-client@^0.5.2:
resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.5.2.tgz#aa5a4a6a5044b0702bb0a8a2662c86cd16901951" resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.5.2.tgz#aa5a4a6a5044b0702bb0a8a2662c86cd16901951"
integrity sha512-e11n2+g7HfBuMyopWq76W11eSZJ707g4U1XiO8URA+23aoe0g1kGAtlPB29NKXl7zX7RznTJ7wfRBxFkW6EJDA== integrity sha512-e11n2+g7HfBuMyopWq76W11eSZJ707g4U1XiO8URA+23aoe0g1kGAtlPB29NKXl7zX7RznTJ7wfRBxFkW6EJDA==
dicomweb-client@^0.8.1: dicomweb-client@^0.8.3:
version "0.8.1" version "0.8.3"
resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.8.1.tgz#12bdf0e9698bcf82730f38829ac30158164bb3fd" resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.8.3.tgz#4a5ad49c76415ccc894bec57f9267197432e534b"
integrity sha512-5EbK8epfSuonSnCW3nr2tkA1CcO1aFT3grEVvKXqv0tVyHsBvbEcEmBcPEbu1m/cF6t7+3uQRLOQ4dw4CodxFg== integrity sha512-24l6ZnU3y6QIb6LUOmT2wJaptvM+oxQQa1btcViwmIok0pi7jjZf8tGSSclOvTKuwX408/qlpg3uWcKU0Y/uDw==
diff-sequences@^24.9.0: diff-sequences@^24.9.0:
version "24.9.0" version "24.9.0"