Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
35ed82e161 | ||
|
|
d0ccc22fd9 | ||
|
|
31841c495f | ||
|
|
65505d9bce | ||
|
|
460fdeb534 | ||
|
|
f4b7091ae4 | ||
|
|
1e72684455 | ||
|
|
5b0b6301b9 | ||
|
|
03a34a75a1 | ||
|
|
729272a985 | ||
|
|
9194ec2404 | ||
|
|
52c95a1209 | ||
|
|
8903adaea7 | ||
|
|
9481e2a99e | ||
|
|
f783fd7650 | ||
|
|
79afee7615 | ||
|
|
539141fe5a | ||
|
|
a046c6c901 | ||
|
|
073be065cf |
No files matched your search
@@ -3,6 +3,22 @@
|
|||||||
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.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)
|
## [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
|
**Note:** Version bump only for package @ohif/extension-cornerstone
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-cornerstone",
|
"name": "@ohif/extension-cornerstone",
|
||||||
"version": "2.12.1",
|
"version": "2.12.3",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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",
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,30 @@
|
|||||||
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.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)
|
## [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
|
**Note:** Version bump only for package @ohif/extension-dicom-html
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-html",
|
"name": "@ohif/extension-dicom-html",
|
||||||
"version": "1.3.11",
|
"version": "1.3.14",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -3,6 +3,30 @@
|
|||||||
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.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)
|
## [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
|
**Note:** Version bump only for package @ohif/extension-dicom-rt
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-rt",
|
"name": "@ohif/extension-dicom-rt",
|
||||||
"version": "0.7.1",
|
"version": "0.7.4",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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",
|
||||||
|
|||||||
@@ -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,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.
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-segmentation",
|
"name": "@ohif/extension-dicom-segmentation",
|
||||||
"version": "0.7.1",
|
"version": "0.7.5",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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 (
|
||||||
|
|||||||
+36
-15
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,30 @@
|
|||||||
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.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)
|
## [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
|
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-dicom-tag-browser",
|
"name": "@ohif/extension-dicom-tag-browser",
|
||||||
"version": "0.2.12",
|
"version": "0.2.15",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,9 +57,10 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
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) {
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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.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)
|
## [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
|
**Note:** Version bump only for package @ohif/extension-vtk
|
||||||
|
|||||||
+11
-11
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/extension-vtk",
|
"name": "@ohif/extension-vtk",
|
||||||
"version": "1.12.2",
|
"version": "1.12.7",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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.1",
|
"@ohif/core": "^2.16.3",
|
||||||
"@ohif/ui": "^1.10.2",
|
"@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",
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @ohif/core
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/core",
|
"name": "@ohif/core",
|
||||||
"version": "2.15.1",
|
"version": "2.16.3",
|
||||||
"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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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",
|
||||||
|
|||||||
@@ -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 = () => {};
|
||||||
@@ -94,7 +92,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 +116,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(() => {
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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 };
|
||||||
@@ -3,6 +3,30 @@
|
|||||||
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)
|
## [1.10.2](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.10.1...@ohif/ui@1.10.2) (2021-09-24)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/ui",
|
"name": "@ohif/ui",
|
||||||
"version": "1.10.2",
|
"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,
|
||||||
|
|||||||
@@ -15,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;
|
||||||
@@ -28,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;
|
||||||
|
|
||||||
@@ -88,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>
|
||||||
);
|
);
|
||||||
@@ -114,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>
|
||||||
);
|
);
|
||||||
@@ -130,11 +163,6 @@ function Thumbnail(props) {
|
|||||||
displaySetInstanceUID,
|
displaySetInstanceUID,
|
||||||
imageId,
|
imageId,
|
||||||
imageSrc,
|
imageSrc,
|
||||||
InstanceNumber,
|
|
||||||
numImageFrames,
|
|
||||||
SeriesDescription,
|
|
||||||
SeriesNumber,
|
|
||||||
hasWarnings,
|
|
||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
onClick,
|
onClick,
|
||||||
onDoubleClick,
|
onDoubleClick,
|
||||||
@@ -232,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]);
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,73 @@
|
|||||||
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.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)
|
## [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
|
**Note:** Version bump only for package @ohif/viewer
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ohif/viewer",
|
"name": "@ohif/viewer",
|
||||||
"version": "4.11.2",
|
"version": "4.12.7",
|
||||||
"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.1",
|
"@ohif/core": "^2.16.3",
|
||||||
"@ohif/extension-cornerstone": "^2.12.1",
|
"@ohif/extension-cornerstone": "^2.12.3",
|
||||||
"@ohif/extension-debugging": "^0.3.0",
|
"@ohif/extension-debugging": "^0.3.1",
|
||||||
"@ohif/extension-dicom-html": "^1.3.11",
|
"@ohif/extension-dicom-html": "^1.3.14",
|
||||||
"@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.1",
|
"@ohif/extension-dicom-rt": "^0.7.4",
|
||||||
"@ohif/extension-dicom-segmentation": "^0.7.1",
|
"@ohif/extension-dicom-segmentation": "^0.7.5",
|
||||||
"@ohif/extension-lesion-tracker": "^0.2.1",
|
"@ohif/extension-lesion-tracker": "^0.2.1",
|
||||||
"@ohif/extension-vtk": "^1.12.2",
|
"@ohif/extension-vtk": "^1.12.7",
|
||||||
"@ohif/i18n": "^0.53.0",
|
"@ohif/i18n": "^0.53.0",
|
||||||
"@ohif/ui": "^1.10.2",
|
"@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.9",
|
"dcmjs": "0.19.1",
|
||||||
"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",
|
||||||
|
|||||||
@@ -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.
|
||||||
*
|
*
|
||||||
@@ -513,6 +540,10 @@ 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) {
|
||||||
@@ -684,7 +715,6 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
|
|||||||
const {
|
const {
|
||||||
displaySetInstanceUID,
|
displaySetInstanceUID,
|
||||||
SeriesDescription,
|
SeriesDescription,
|
||||||
InstanceNumber,
|
|
||||||
numImageFrames,
|
numImageFrames,
|
||||||
SeriesNumber,
|
SeriesNumber,
|
||||||
} = displaySet;
|
} = displaySet;
|
||||||
@@ -709,6 +739,11 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
|
|||||||
studies
|
studies
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const hasDerivedDisplaySets = _checkForDerivedDisplaySets(
|
||||||
|
displaySet,
|
||||||
|
study
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
active: _isDisplaySetActive(
|
active: _isDisplaySetActive(
|
||||||
displaySet,
|
displaySet,
|
||||||
@@ -719,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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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.9:
|
dcmjs@0.19.1:
|
||||||
version "0.18.9"
|
version "0.19.1"
|
||||||
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.18.9.tgz#0e18fcff975aaae8ca01a96e781fa75c29ec97f3"
|
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.19.1.tgz#3a418f908e34cb80eb4efc1feaccc6268c7c5910"
|
||||||
integrity sha512-aTu4fUo3TSgohJC+U509qdXL1per09XvlYdQva0BGtIZMr/iR5n8h/ojpcDTRJoVtSuaj331KJj1yCj8FMMK4Q==
|
integrity sha512-yCqccv0OwnteryNEcloXwKsY6RpQJNvSdsQPHhmggKxBb9w1uFwkBM9j3MboW4+xLL9JTm/q0+rhLS1WOjJSiA==
|
||||||
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"
|
||||||
|
|||||||
Reference in new issue
Block a user