Compare commits

..
Author SHA1 Message Date
ohif-bot 35ed82e161 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.12.3
 - @ohif/extension-debugging@0.3.1
 - @ohif/extension-dicom-html@1.3.14
 - @ohif/extension-dicom-pdf@1.1.1
 - @ohif/extension-dicom-rt@0.7.4
 - @ohif/extension-dicom-segmentation@0.7.5
 - @ohif/extension-dicom-tag-browser@0.2.15
 - @ohif/extension-vtk@1.12.7
 - @ohif/core@2.16.3
 - @ohif/viewer@4.12.7
2021-12-02 11:57:19 +00:00
Davide Punzo d0ccc22fd9 Update cornerstone deps (#2628)
* update cornerstone deps
2021-12-02 12:53:41 +01:00
ohif-bot 31841c495f chore(release): publish [skip ci]
- @ohif/extension-dicom-tag-browser@0.2.14
 - @ohif/extension-vtk@1.12.6
 - @ohif/core@2.16.2
 - @ohif/ui@1.10.5
 - @ohif/viewer@4.12.6
2021-11-30 14:20:06 +00:00
Davide Punzo 65505d9bce Re IDC #2604: show series (with unsupported modalities) on slides panel and on tag explorer (#2621)
* Re IDC #2604: show series (with unsupported modalities) on slides panel and on tag explorer
2021-11-30 15:15:51 +01:00
ohif-bot 460fdeb534 chore(release): publish [skip ci]
- @ohif/extension-dicom-segmentation@0.7.4
 - @ohif/viewer@4.12.5
2021-10-27 13:10:24 +00:00
Igor Octaviano f4b7091ae4 Merge pull request #2596 from OHIF/fix/ohif-2590
Re #2590: Fix segments visibility handler
2021-10-27 10:06:35 -03:00
Davide Punzo 1e72684455 Re #2590: Fix segments visibility handler 2021-10-26 13:00:01 +02:00
ohif-bot 5b0b6301b9 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.12.2
 - @ohif/extension-dicom-html@1.3.13
 - @ohif/extension-dicom-rt@0.7.3
 - @ohif/extension-dicom-segmentation@0.7.3
 - @ohif/extension-dicom-tag-browser@0.2.13
 - @ohif/extension-vtk@1.12.5
 - @ohif/core@2.16.1
 - @ohif/ui@1.10.4
 - @ohif/viewer@4.12.4
2021-10-26 08:23:03 +00:00
Igor OctavianoandDavide Punzo 03a34a75a1 Add checks for study metadata in rt and seg panels + bump dcmjs to fix circular references issues naturalizing datasets (#2588)
Co-authored-by: Davide Punzo <punzodavide@hotmail.it>
2021-10-26 10:19:12 +02:00
ohif-bot 729272a985 chore(release): publish [skip ci]
- @ohif/extension-dicom-html@1.3.12
 - @ohif/viewer@4.12.3
2021-10-25 15:11:00 +00:00
Bill Wallace 9194ec2404 fix(OHIF):The header depth was too deep for display SR files. (#2594) 2021-10-25 17:08:10 +02:00
ohif-bot 52c95a1209 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.12.4
 - @ohif/ui@1.10.3
 - @ohif/viewer@4.12.2
2021-10-15 11:37:07 +00:00
Davide Punzo 8903adaea7 Re #2571: thumbnail footer remove instance number and add link icon if any derived display set is present (#2582)
* Re #2571, thumbnail footer layout modifications: remove instance number and add link icon if any derived display set is present.
2021-10-15 13:29:36 +02:00
ohif-bot 9481e2a99e chore(release): publish [skip ci]
- @ohif/extension-dicom-rt@0.7.2
 - @ohif/extension-dicom-segmentation@0.7.2
 - @ohif/viewer@4.12.1
2021-10-06 21:01:00 +00:00
Igor Octaviano f783fd7650 Merge pull request #2575 from OHIF/fix/ohif-2570
OHIF-2570: Update badge number based on active ds
2021-10-06 17:53:07 -03:00
Igor Octaviano 79afee7615 Merge branch 'master' into fix/ohif-2570 2021-10-05 09:40:49 -03:00
igoroctaviano 073be065cf Update badge number based on active ds 2021-10-01 18:09:48 -03:00
40 changed files with 756 additions and 259 deletions

No files matched your search

+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
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)
**Note:** Version bump only for package @ohif/extension-cornerstone
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-cornerstone",
"version": "2.12.1",
"version": "2.12.3",
"description": "OHIF extension for Cornerstone",
"author": "OHIF",
"license": "MIT",
@@ -32,12 +32,12 @@
"peerDependencies": {
"@ohif/core": "^0.50.0",
"@ohif/ui": "^0.50.0",
"cornerstone-core": "^2.5.0",
"cornerstone-core": "^2.6.1",
"cornerstone-math": "^0.1.9",
"cornerstone-tools": "^6.0.0",
"cornerstone-wado-image-loader": "^4.0.3",
"dcmjs": "0.18.9",
"dicom-parser": "^1.8.9",
"cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.1.0",
"dcmjs": "0.19.1",
"dicom-parser": "^1.8.11",
"hammerjs": "^2.0.8",
"prop-types": "^15.6.2",
"react": "^16.8.6",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
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)
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-debugging",
"version": "0.3.0",
"version": "0.3.1",
"description": "OHIF extension for debugging.",
"author": "OHIF",
"license": "MIT",
@@ -28,12 +28,12 @@
},
"peerDependencies": {
"@ohif/core": "^2.6.0",
"dicom-parser": "^1.8.9"
"dicom-parser": "^1.8.11"
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"detect-browser": "5.1.1",
"dicomweb-client": "^0.8.1",
"dicomweb-client": "^0.8.3",
"file-saver": "^2.0.2",
"jszip": "^3.2.2"
}
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
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)
**Note:** Version bump only for package @ohif/extension-dicom-html
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-html",
"version": "1.3.11",
"version": "1.3.14",
"description": "OHIF extension for rendering structured reports to HTML",
"author": "OHIF",
"license": "MIT",
@@ -29,7 +29,7 @@
},
"peerDependencies": {
"@ohif/core": "^0.50.0",
"dcmjs": "0.18.9",
"dcmjs": "0.19.1",
"prop-types": "^15.6.2",
"react": "^16.8.6",
"react-dom": "^16.8.6"
@@ -160,7 +160,7 @@ const getContentSequence = (data, level = 1) => {
const root = [];
if (header) {
const HeaderDynamicLevel = `h${level}`;
const HeaderDynamicLevel = `h${Math.min(level, 6)}`;
root.push(<HeaderDynamicLevel key={header}>{header}</HeaderDynamicLevel>);
}
@@ -170,7 +170,7 @@ const getContentSequence = (data, level = 1) => {
if (key === '_meta') {
const HeaderDynamicLevel = `h3`;
root.push(<hr />);
root.push(<hr key={root.length} />);
root.push(
<HeaderDynamicLevel key="Metadata">
DICOM File Meta Information
@@ -217,7 +217,7 @@ class DicomHtmlViewport extends Component {
};
componentDidMount() {
const dataSet = this.setContentFromByteArray(this.props.byteArray);
this.setContentFromByteArray(this.props.byteArray);
}
setContentFromByteArray(byteArray) {
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
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)
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-pdf",
"version": "1.1.0",
"version": "1.1.1",
"description": "OHIF extension for Dicom PDF",
"author": "OHIF",
"license": "MIT",
@@ -29,7 +29,7 @@
},
"peerDependencies": {
"@ohif/core": "^0.50.0",
"dicom-parser": "^1.8.9",
"dicom-parser": "^1.8.11",
"prop-types": "^15.6.2",
"react": "^16.8.6",
"react-dom": "^16.8.6"
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
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)
**Note:** Version bump only for package @ohif/extension-dicom-rt
+4 -4
View File
@@ -1,6 +1,6 @@
{
"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.",
"author": "OHIF",
"license": "MIT",
@@ -29,9 +29,9 @@
},
"peerDependencies": {
"@ohif/core": "^0.50.0",
"cornerstone-core": "^2.5.0",
"cornerstone-tools": "^6.0.0",
"dcmjs": "0.18.9",
"cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.6",
"dcmjs": "0.19.1",
"gl-matrix": "^3.3.0",
"prop-types": "^15.6.2",
"react": "^16.8.6",
+7 -8
View File
@@ -91,17 +91,12 @@ export default {
}
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(
activeViewport.StudyInstanceUID
);
if (!studyMetadata) {
return;
}
const referencedDisplaySets = studyMetadata.getDerivedDatasets({
referencedSeriesInstanceUID: activeViewport.SeriesInstanceUID,
Modality: 'RTSTRUCT',
@@ -112,6 +107,10 @@ export default {
['RTSTRUCT'].includes(ds.Modality)
)
) {
triggerRTPanelUpdatedEvent({
badgeNumber: referencedDisplaySets.length,
target: 'rt-panel',
});
return false;
}
}
@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
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)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-segmentation",
"version": "0.7.1",
"version": "0.7.5",
"description": "OHIF extension for viewing segmentations in the 2D MPR view",
"author": "OHIF",
"license": "MIT",
@@ -29,9 +29,9 @@
},
"peerDependencies": {
"@ohif/core": "^0.50.0",
"cornerstone-core": "^2.5.0",
"cornerstone-tools": "^6.0.0",
"dcmjs": "0.18.9",
"cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.6",
"dcmjs": "0.19.1",
"prop-types": "^15.6.2",
"react": "^16.8.6",
"react-dom": "^16.8.6"
@@ -24,6 +24,7 @@ const SegmentItem = ({
onClick,
itemClass,
color,
labelmap3D,
visible,
onVisibilityChange,
}) => {
@@ -39,7 +40,7 @@ const SegmentItem = ({
event.stopPropagation();
const newVisibility = !isVisible;
setIsVisible(newVisibility);
onVisibilityChange(newVisibility, index);
onVisibilityChange(newVisibility, index, labelmap3D);
};
return (
@@ -431,23 +431,43 @@ const SegmentationPanel = ({
return enabledElements[activeIndex].element;
};
const onSegmentVisibilityChangeHandler = (isVisible, segmentNumber) => {
/** Get all labelmaps with this segmentNumber (overlapping segments) */
const { labelmaps3D } = getBrushStackState();
const possibleLabelMaps3D = labelmaps3D.filter(({ labelmaps2D }) => {
return labelmaps2D.some(({ segmentsOnLabelmap }) =>
segmentsOnLabelmap.includes(segmentNumber)
);
});
const onSegmentVisibilityChangeHandler = (
isVisible,
segmentNumber,
labelmap3D
) => {
let segmentsHidden = [];
possibleLabelMaps3D.forEach(labelmap3D => {
labelmap3D.segmentsHidden[segmentNumber] = !isVisible;
if (labelmap3D.metadata.hasOverlapping) {
/** Get all labelmaps with this segmentNumber and that
* are from the same series (overlapping segments) */
const { labelmaps3D } = getBrushStackState();
segmentsHidden = [
...new Set([...segmentsHidden, ...labelmap3D.segmentsHidden]),
];
});
const sameSeriesLabelMaps3D = labelmaps3D.filter(({ metadata }) => {
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 }));
@@ -514,6 +534,7 @@ const SegmentationPanel = ({
label={segmentLabel}
index={segmentNumber}
color={color}
labelmap3D={labelmap3D}
visible={!labelmap3D.segmentsHidden[segmentIndex]}
onVisibilityChange={onSegmentVisibilityChangeHandler}
/>
@@ -64,8 +64,17 @@ export default function getSopClassHandlerModule({ servicesManager }) {
metadata,
};
segDisplaySet.getSourceDisplaySet = function(studies, activateLabelMap = true, onDisplaySetLoadFailureHandler) {
return getSourceDisplaySet(studies, segDisplaySet, activateLabelMap, onDisplaySetLoadFailureHandler);
segDisplaySet.getSourceDisplaySet = function(
studies,
activateLabelMap = true,
onDisplaySetLoadFailureHandler
) {
return getSourceDisplaySet(
studies,
segDisplaySet,
activateLabelMap,
onDisplaySetLoadFailureHandler
);
};
segDisplaySet.load = async function(referencedDisplaySet, studies) {
@@ -98,6 +107,9 @@ export default function getSopClassHandlerModule({ servicesManager }) {
if (labelmapBufferArray.length > 1) {
let labelmapIndexes = [];
for (let i = 0; i < labelmapBufferArray.length; ++i) {
segMetadata.segmentationSeriesInstanceUID =
segDisplaySet.SeriesInstanceUID;
segMetadata.hasOverlapping = true;
labelmapIndexes.push(
await loadSegmentation(
imageIds,
@@ -118,6 +130,9 @@ export default function getSopClassHandlerModule({ servicesManager }) {
labelmapIndex = labelmapIndexes[0];
console.warn('Overlapping segments!');
} else {
segMetadata.segmentationSeriesInstanceUID =
segDisplaySet.SeriesInstanceUID;
segMetadata.hasOverlapping = false;
labelmapIndex = await loadSegmentation(
imageIds,
segDisplaySet,
+18 -1
View File
@@ -126,7 +126,7 @@ export default {
label: 'Segmentations',
target: 'segmentation-panel',
stateEvent: SegmentationPanelTabUpdatedEvent,
isDisabled: studies => {
isDisabled: (studies, activeViewport) => {
if (!studies) {
return true;
}
@@ -139,6 +139,23 @@ export default {
const series = study.series[j];
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;
}
}
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
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)
**Note:** Version bump only for package @ohif/extension-dicom-tag-browser
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-tag-browser",
"version": "0.2.12",
"version": "0.2.15",
"description": "OHIF extension for checking DICOM headers.",
"author": "OHIF",
"license": "MIT",
@@ -28,12 +28,12 @@
},
"peerDependencies": {
"@ohif/core": "^2.6.0",
"dcmjs": "0.18.9",
"dcmjs": "0.19.1",
"react": "^16.8.6"
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"dicomweb-client": "^0.8.1",
"dicomweb-client": "^0.8.3",
"moment": "2.24.0",
"react-select": "^3.0.8"
}
@@ -57,9 +57,10 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
});
let metadata;
const isImageStack = activeDisplaySet instanceof ImageSet;
const isImageStack =
activeDisplaySet instanceof ImageSet &&
activeDisplaySet.isModalitySupported === true;
let selectedInstanceValue;
let instanceList;
if (isImageStack) {
@@ -91,7 +92,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
setInstanceList(instanceList);
setDisplaySetList(newDisplaySetList);
setIsImageStack(isImageStack);
}, [activeDisplaySetInstanceUID, activeInstance]);
}, [activeDisplaySetInstanceUID, activeInstance, displaySets]);
const selectedDisplaySetValue = displaySetList.find(
ds => ds.value === activeDisplaySetInstanceUID
+32
View File
@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
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
+11 -11
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-vtk",
"version": "1.12.3",
"version": "1.12.7",
"description": "OHIF extension for VTK.js",
"author": "OHIF",
"license": "MIT",
@@ -32,11 +32,11 @@
"@ohif/core": "^0.50.0",
"@ohif/i18n": "^0.50.0",
"@ohif/ui": "^0.50.0",
"cornerstone-core": "^2.5.0",
"cornerstone-tools": "^6.0.0",
"cornerstone-wado-image-loader": "^4.0.3",
"dcmjs": "0.18.9",
"dicom-parser": "^1.8.9",
"cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.1.0",
"dcmjs": "0.19.1",
"dicom-parser": "^1.8.11",
"i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1",
"prop-types": "^15.7.2",
@@ -53,11 +53,11 @@
"react-vtkjs-viewport": "^0.14.4"
},
"devDependencies": {
"@ohif/core": "^2.16.0",
"@ohif/ui": "^1.10.2",
"cornerstone-tools": "^6.0.0",
"cornerstone-wado-image-loader": "^4.0.3",
"dicom-parser": "^1.8.9",
"@ohif/core": "^2.16.3",
"@ohif/ui": "^1.10.5",
"cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.1.0",
"dicom-parser": "^1.8.11",
"gh-pages": "^2.0.1",
"i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1",
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
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)
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/core",
"version": "2.16.0",
"version": "2.16.3",
"description": "Generic business logic for web-based medical imaging applications",
"author": "OHIF Core Team",
"license": "MIT",
@@ -31,16 +31,16 @@
"test:unit:ci": "jest --ci --runInBand --collectCoverage"
},
"peerDependencies": {
"cornerstone-core": "^2.5.0",
"cornerstone-tools": "^6.0.0",
"cornerstone-wado-image-loader": "^4.0.3",
"dicom-parser": "^1.8.9"
"cornerstone-core": "^2.6.1",
"cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.1.0",
"dicom-parser": "^1.8.11"
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"ajv": "^6.10.0",
"dcmjs": "0.18.9",
"dicomweb-client": "^0.8.1",
"dcmjs": "0.19.1",
"dicomweb-client": "^0.8.3",
"immer": "6.0.2",
"isomorphic-base64": "^1.0.2",
"lodash.clonedeep": "^4.5.0",
+10 -4
View File
@@ -1,6 +1,4 @@
import cornerstone from 'cornerstone-core';
import cornerstoneTools from 'cornerstone-tools';
import getImageId from '../utils/getImageId.js';
const noop = () => {};
@@ -94,7 +92,11 @@ export class StudyPrefetcher {
}
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.prefetchDisplaySets(displaySetInstanceUID);
@@ -114,7 +116,11 @@ export class StudyPrefetcher {
* @param {number} 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;
clearTimeout(this.prefetchDisplaySetsHandler);
this.prefetchDisplaySetsHandler = setTimeout(() => {
@@ -9,7 +9,10 @@ import { SeriesMetadata } from './SeriesMetadata';
import { api } from 'dicomweb-client';
// - createStacks
import { isImage } from '../../utils/isImage';
import { isDisplaySetReconstructable, isSpacingUniform } from '../../utils/isDisplaySetReconstructable';
import {
isDisplaySetReconstructable,
isSpacingUniform,
} from '../../utils/isDisplaySetReconstructable';
import errorHandler from '../../errorHandler';
import isLowPriorityModality from '../../utils/isLowPriorityModality';
import getXHRRetryRequestHook from '../../utils/xhrRetryRequestHook';
@@ -159,41 +162,64 @@ class StudyMetadata extends Metadata {
// series into another display set.
const stackableInstances = [];
series.forEachInstance(instance => {
let displaySet;
// All imaging modalities must have a valid value for SOPClassUID (x00080016) or Rows (x00280010)
if (
!isImage(instance.getTagValue('SOPClassUID')) &&
!instance.getTagValue('Rows')
) {
return;
}
let displaySet;
if (isMultiFrame(instance)) {
displaySet = makeDisplaySet(series, [instance]);
// 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([]);
const seriesData = series.getData();
displaySet.setAttributes({
sopClassUIDs,
isClip: true,
displaySetInstanceUID: displaySet.uid,
SeriesDate: seriesData.SeriesDate,
SeriesTime: seriesData.SeriesTime,
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,
SeriesNumber: instance.getTagValue('SeriesNumber'),
SeriesDescription: instance.getTagValue('SeriesDescription'),
numImageFrames: instance.getTagValue('NumberOfFrames'),
frameRate: instance.getTagValue('FrameTime'),
Modality: instance.getTagValue('Modality'),
isMultiFrame: false,
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
isReconstructable: false,
isModalitySupported: false,
metadata: instance.getData().metadata,
});
displaySets.push(displaySet);
} 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));
}
/**
* Returns the source display set of the derivated display set.
* @param {object} derivatedDisplaySet
@@ -242,40 +267,45 @@ class StudyMetadata extends Metadata {
});
const otherDisplaySets = allDisplaySets.filter(
ds => ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID
ds =>
ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID
);
const { metadata } = derivatedDisplaySet;
let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence
(metadata, otherDisplaySets);
let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence(
metadata,
otherDisplaySets
);
let noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs ||
let noReferencedSeriesAvailable =
!referencedSeriesInstanceUIDs ||
referencedSeriesInstanceUIDs.length === 0;
if (noReferencedSeriesAvailable) {
referencedSeriesInstanceUIDs =
_findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence
(metadata);
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence(
metadata
);
}
noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs ||
noReferencedSeriesAvailable =
!referencedSeriesInstanceUIDs ||
referencedSeriesInstanceUIDs.length === 0;
if (noReferencedSeriesAvailable) {
referencedSeriesInstanceUIDs =
_findReferencedSeriesInstanceUIDsFromReferencedImageSequence
(metadata, otherDisplaySets);
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromReferencedImageSequence(
metadata,
otherDisplaySets
);
}
const referencedSeriesAvailable = referencedSeriesInstanceUIDs &&
referencedSeriesInstanceUIDs.length !== 0;
const referencedSeriesAvailable =
referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0;
if (referencedSeriesAvailable) {
const referencedDisplaySet = otherDisplaySets.find(ds =>
referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID)
);
;
return referencedDisplaySet;
}
};
}
/**
* Returns a list of derived datasets in the study, filtered by the given filter.
@@ -303,7 +333,10 @@ class StudyMetadata extends Metadata {
if (referencedSeriesInstanceUID) {
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
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) {
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
displaySet =>
displaySet.FrameOfReferenceUID ===
referencedFrameOfReferenceUID
displaySet.FrameOfReferenceUID === referencedFrameOfReferenceUID
);
}
@@ -497,8 +529,10 @@ class StudyMetadata extends Metadata {
}
}
if (this._displaySets.some(ds =>
ds.displaySetInstanceUID === displaySet.displaySetInstanceUID)
if (
this._displaySets.some(
ds => ds.displaySetInstanceUID === displaySet.displaySetInstanceUID
)
) {
return;
}
@@ -867,8 +901,9 @@ const makeDisplaySet = (series, instances) => {
imageSet.sortByImagePositionPatient();
// check if the spacing is uniform and update isReconstructable
const datasetIs4D = displayReconstructableInfo.reconstructionIssues.find
(issue => issue === ReconstructionIssues.DATASET_4D);
const datasetIs4D = displayReconstructableInfo.reconstructionIssues.find(
issue => issue === ReconstructionIssues.DATASET_4D
);
displaySpacingInfo = isSpacingUniform(imageSet.images, datasetIs4D);
imageSet.isReconstructable = displaySpacingInfo.isUniform;
@@ -881,11 +916,15 @@ const makeDisplaySet = (series, instances) => {
if (!imageSet.displayReconstructableInfo) {
// It is not reconstrabale Save type of warning
imageSet.reconstructionIssues = displaySpacingInfo ?
displayReconstructableInfo.reconstructionIssues.concat(displaySpacingInfo.reconstructionIssues) :
displayReconstructableInfo.reconstructionIssues;
imageSet.reconstructionIssues = displaySpacingInfo
? displayReconstructableInfo.reconstructionIssues.concat(
displaySpacingInfo.reconstructionIssues
)
: displayReconstructableInfo.reconstructionIssues;
}
imageSet.isModalitySupported = true;
return imageSet;
};
@@ -963,38 +1002,36 @@ function _getDisplaySetFromSopClassModule(
}
/**
* Returns the referenced series instance UIDs by searching the information in the
* ReferencedSeriesSequence.
* @param {object} derivatedDisplaySet.metadata
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence (
metadata,
* Returns the referenced series instance UIDs by searching the information in the
* ReferencedSeriesSequence.
* @param {object} derivatedDisplaySet.metadata
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence(
metadata
) {
if (!metadata.ReferencedSeriesSequence) {
return;
}
let referencedSeriesInstanceUIDs;
const ReferencedSeriesSequence = _toArray(
metadata.ReferencedSeriesSequence
);
const ReferencedSeriesSequence = _toArray(metadata.ReferencedSeriesSequence);
referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map(
ReferencedSeries => ReferencedSeries.SeriesInstanceUID
);
return referencedSeriesInstanceUIDs;
};
}
/**
* Returns the referenced series instance UIDs by searching the information in the
* ReferencedImageSequence.
* @param {object} derivatedDisplaySet.metadata
* @param {array[object]} displaysets
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence (
* Returns the referenced series instance UIDs by searching the information in the
* ReferencedImageSequence.
* @param {object} derivatedDisplaySet.metadata
* @param {array[object]} displaysets
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence(
metadata,
displaySets
) {
@@ -1015,22 +1052,25 @@ function _findReferencedSeriesInstanceUIDsFromReferencedImageSequence (
ReferencedSOPInstanceUID
);
if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) {
if (
referencedSeriesInstanceUIDs &&
referencedSeriesInstanceUIDs.length !== 0
) {
break;
}
}
return referencedSeriesInstanceUIDs;
};
}
/**
* Returns the referenced series instance UIDs by searching the information in the
* SourceImageSequence.
* @param {object} derivatedDisplaySet.metadata
* @param {array[object]} displaysets
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
* Returns the referenced series instance UIDs by searching the information in the
* SourceImageSequence.
* @param {object} derivatedDisplaySet.metadata
* @param {array[object]} displaysets
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromSourceImageSequence(
metadata,
displaySets
) {
@@ -1040,9 +1080,7 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
SourceImageSequence = metadata.SourceImageSequence;
} else {
const { PerFrameFunctionalGroupsSequence } = metadata;
const firstFunctionalGroups = _toArray(
PerFrameFunctionalGroupsSequence
)[0];
const firstFunctionalGroups = _toArray(PerFrameFunctionalGroupsSequence)[0];
if (firstFunctionalGroups) {
const { DerivationImageSequence } = firstFunctionalGroups;
SourceImageSequence = DerivationImageSequence;
@@ -1062,22 +1100,25 @@ function _findReferencedSeriesInstanceUIDsFromSourceImageSequence (
displaySets,
ReferencedSOPInstanceUID
);
if (referencedSeriesInstanceUIDs && referencedSeriesInstanceUIDs.length !== 0) {
if (
referencedSeriesInstanceUIDs &&
referencedSeriesInstanceUIDs.length !== 0
) {
break;
}
}
return referencedSeriesInstanceUIDs;
};
}
/**
* Returns the referenced series instance UIDs by searching the information in the
* SOPInstanceUID of the displaySets.
* @param {array[object]} displaysets
* @param {string} SOPInstanceUID
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID (
* Returns the referenced series instance UIDs by searching the information in the
* SOPInstanceUID of the displaySets.
* @param {array[object]} displaysets
* @param {string} SOPInstanceUID
* @return {array[string]} referenced series instance UIDs.
*/
function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID(
displaySets,
SOPInstanceUID
) {
@@ -1098,10 +1139,10 @@ function _findReferencedSeriesInstanceUIDsFromSOPInstanceUID (
}
}
}
};
}
function _toArray(arrayOrObject) {
return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject];
}
export {StudyMetadata};
export { StudyMetadata };
@@ -1,6 +1,5 @@
import { ReconstructionIssues } from './../enums.js';
/**
* Checks if a series is reconstructable to a 3D volume.
*
@@ -78,7 +77,9 @@ function processSingleframe(instances) {
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESDIMENSIONS);
} else if (SamplesPerPixel !== firstImageSamplesPerPixel) {
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESCOMPONENTS);
} else if (!_isSameArray(ImageOrientationPatient, firstImageOrientationPatient)) {
} else if (
!_isSameArray(ImageOrientationPatient, firstImageOrientationPatient)
) {
reconstructionIssues.push(ReconstructionIssues.VARYING_IMAGESORIENTATION);
}
@@ -92,7 +93,10 @@ function processSingleframe(instances) {
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,
// Allow reconstruction, but pass back the number of missing frames.
if (n > 2) {
const lastIpp = instances[n - 1].getData().metadata
.ImagePositionPatient;
const lastIpp = instances[n - 1].getData().metadata.ImagePositionPatient;
// We can't reconstruct if we are missing ImagePositionPatient values
if (firstImagePositionPatient && lastIpp) {
const averageSpacingBetweenFrames =
_getPerpendicularDistance(firstImagePositionPatient, lastIpp) /
(n - 1);
_getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (n - 1);
let previousImagePositionPatient = firstImagePositionPatient;
@@ -136,7 +138,7 @@ function isSpacingUniform(instances, datasetIs4D) {
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
// checking the 4th dimension. Do not return, since we want still to
// 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.
*
@@ -181,7 +186,7 @@ function isSpacingUniform(instances, datasetIs4D) {
*
* @returns {boolean} dataset4D value.
*/
function _isDataset4D(instances) {
function _isDataset4D(instances) {
const n = instances.length;
for (let ii = 0; ii < n; ++ii) {
const instanceMetadataControl = instances[ii].getData().metadata;
@@ -204,7 +209,12 @@ function isSpacingUniform(instances, datasetIs4D) {
continue;
}
if (_isSameArray(instanceMetadataControl.ImagePositionPatient, instanceMetadata.ImagePositionPatient)) {
if (
_isSameArray(
instanceMetadataControl.ImagePositionPatient,
instanceMetadata.ImagePositionPatient
)
) {
return true;
}
}
@@ -265,11 +275,11 @@ function _getSpacingIssue(spacing, averageSpacing) {
function _getPerpendicularDistance(a, b) {
return Math.sqrt(
Math.pow(a[0] - b[0], 2) +
Math.pow(a[1] - b[1], 2) +
Math.pow(a[2] - b[2], 2)
Math.pow(a[1] - b[1], 2) +
Math.pow(a[2] - b[2], 2)
);
}
const constructableModalities = ['MR', 'CT', 'PT', 'NM'];
export {isDisplaySetReconstructable, isSpacingUniform};
export { isDisplaySetReconstructable, isSpacingUniform };
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
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 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/ui",
"version": "1.10.2",
"version": "1.10.5",
"description": "A set of React components for Medical Imaging Viewers",
"author": "OHIF Contributors",
"license": "MIT",
@@ -25,11 +25,12 @@ function StudyBrowser(props) {
altImageText,
displaySetInstanceUID,
imageId,
InstanceNumber,
derivedDisplaySetsNumber,
numImageFrames,
SeriesDescription,
SeriesNumber,
hasWarnings,
hasDerivedDisplaySets,
} = thumb;
return (
@@ -48,12 +49,13 @@ function StudyBrowser(props) {
// Thumb
altImageText={altImageText}
imageId={imageId}
InstanceNumber={InstanceNumber}
derivedDisplaySetsNumber={derivedDisplaySetsNumber}
displaySetInstanceUID={displaySetInstanceUID} // used by drop
numImageFrames={numImageFrames}
SeriesDescription={SeriesDescription}
SeriesNumber={SeriesNumber}
hasWarnings={hasWarnings}
hasDerivedDisplaySets={hasDerivedDisplaySets}
// Events
onClick={onThumbnailClick.bind(
undefined,
@@ -83,7 +85,7 @@ StudyBrowser.propTypes = {
altImageText: PropTypes.string,
displaySetInstanceUID: PropTypes.string.isRequired,
imageId: PropTypes.string,
InstanceNumber: PropTypes.number,
derivedDisplaySetsNumber: PropTypes.number,
numImageFrames: PropTypes.number,
SeriesDescription: PropTypes.string,
SeriesNumber: PropTypes.number,
@@ -15,11 +15,12 @@ const StudyLoadingListener = classes.StudyLoadingListener;
function ThumbnailFooter({
SeriesDescription,
SeriesNumber,
InstanceNumber,
numImageFrames,
hasWarnings,
hasDerivedDisplaySets,
}) {
const [inconsistencyWarnings, inconsistencyWarningsSet] = useState([]);
const [derivedDisplaySetsActive, derivedDisplaySetsActiveSet] = useState([]);
useEffect(() => {
let unmounted = false;
@@ -28,10 +29,15 @@ function ThumbnailFooter({
inconsistencyWarningsSet(response);
}
});
hasDerivedDisplaySets.then(response => {
if (!unmounted) {
derivedDisplaySetsActiveSet(response);
}
});
return () => {
unmounted = true;
};
}, [hasWarnings]);
}, [hasWarnings, hasDerivedDisplaySets]);
const infoOnly = !SeriesDescription;
@@ -88,20 +94,47 @@ function ThumbnailFooter({
</React.Fragment>
);
};
const getDerivedInfo = derivedDisplaySetsActive => {
return (
<React.Fragment>
{derivedDisplaySetsActive ? (
<div className="derived">
<Icon name="link" />
</div>
) : (
<React.Fragment></React.Fragment>
)}
</React.Fragment>
);
};
const getSeriesInformation = (
SeriesNumber,
InstanceNumber,
numImageFrames,
inconsistencyWarnings
inconsistencyWarnings,
derivedDisplaySetsActive
) => {
if (!SeriesNumber && !InstanceNumber && !numImageFrames) {
if (!SeriesNumber && !numImageFrames) {
return;
}
const seriesInformation = (
<div className="series-information">
{getInfo(SeriesNumber, 'S:')}
{getInfo(InstanceNumber, 'I:')}
{getInfo(numImageFrames, '', 'image-frames')}
<React.Fragment>
{SeriesNumber !== undefined ? (
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)}
</div>
);
@@ -114,9 +147,9 @@ function ThumbnailFooter({
<div className="series-description">{SeriesDescription}</div>
{getSeriesInformation(
SeriesNumber,
InstanceNumber,
numImageFrames,
inconsistencyWarnings
inconsistencyWarnings,
derivedDisplaySetsActive
)}
</div>
);
@@ -130,11 +163,6 @@ function Thumbnail(props) {
displaySetInstanceUID,
imageId,
imageSrc,
InstanceNumber,
numImageFrames,
SeriesDescription,
SeriesNumber,
hasWarnings,
StudyInstanceUID,
onClick,
onDoubleClick,
@@ -232,8 +260,8 @@ Thumbnail.propTypes = {
altImageText: PropTypes.string,
SeriesDescription: PropTypes.string,
SeriesNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
InstanceNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
hasWarnings: PropTypes.instanceOf(Promise),
hasDerivedDisplaySets: PropTypes.instanceOf(Promise),
numImageFrames: PropTypes.number,
onDoubleClick: PropTypes.func,
onClick: PropTypes.func,
@@ -41,7 +41,7 @@ const SnackbarProvider = ({ children, service }) => {
LogManager.subscribe(LogManager.EVENTS.OnLog, onLogHandler);
return () => {
LogManager.subscribe(LogManager.EVENTS.OnLog, onLogHandler);
LogManager.unsubscribe(LogManager.EVENTS.OnLog, onLogHandler);
};
}, [show]);
+56
View File
@@ -3,6 +3,62 @@
All notable changes to this project will be documented in this file.
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)
@@ -85,7 +85,7 @@ describe('OHIF Save Measurements', function() {
// 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
cy.addAngleMeasurement();
@@ -108,7 +108,7 @@ describe('OHIF Save Measurements', function() {
// Close Measurements panel
cy.get('@measurementsBtn').click();
});
});*/
/*it('checks if measurements of unsupported tools were not saved', function() {
// Add measurement for supported tool in the viewport
+16 -16
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/viewer",
"version": "4.12.0",
"version": "4.12.7",
"description": "OHIF Viewer",
"author": "OHIF Contributors",
"license": "MIT",
@@ -47,28 +47,28 @@
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"@ohif/core": "^2.16.0",
"@ohif/extension-cornerstone": "^2.12.1",
"@ohif/extension-debugging": "^0.3.0",
"@ohif/extension-dicom-html": "^1.3.11",
"@ohif/core": "^2.16.3",
"@ohif/extension-cornerstone": "^2.12.3",
"@ohif/extension-debugging": "^0.3.1",
"@ohif/extension-dicom-html": "^1.3.14",
"@ohif/extension-dicom-microscopy": "^0.52.0",
"@ohif/extension-dicom-pdf": "^1.1.0",
"@ohif/extension-dicom-rt": "^0.7.1",
"@ohif/extension-dicom-segmentation": "^0.7.1",
"@ohif/extension-dicom-pdf": "^1.1.1",
"@ohif/extension-dicom-rt": "^0.7.4",
"@ohif/extension-dicom-segmentation": "^0.7.5",
"@ohif/extension-lesion-tracker": "^0.2.1",
"@ohif/extension-vtk": "^1.12.3",
"@ohif/extension-vtk": "^1.12.7",
"@ohif/i18n": "^0.53.0",
"@ohif/ui": "^1.10.2",
"@ohif/ui": "^1.10.5",
"@tanem/react-nprogress": "^1.1.25",
"classnames": "^2.2.6",
"core-js": "^3.2.1",
"cornerstone-core": "^2.5.0",
"cornerstone-core": "^2.6.1",
"cornerstone-math": "^0.1.9",
"cornerstone-tools": "^6.0.0",
"cornerstone-wado-image-loader": "^4.0.3",
"dcmjs": "0.18.9",
"dicom-parser": "^1.8.9",
"dicomweb-client": "^0.8.1",
"cornerstone-tools": "^6.0.6",
"cornerstone-wado-image-loader": "^4.1.0",
"dcmjs": "0.19.1",
"dicom-parser": "^1.8.11",
"dicomweb-client": "^0.8.3",
"hammerjs": "^2.0.8",
"i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1",
@@ -14,13 +14,11 @@ const mapDispatchToProps = (dispatch, ownProps) => {
displaySetInstanceUID
);
const { LoggerService, UINotificationService } = servicesManager.services;
if (displaySet.isDerived) {
const { Modality } = displaySet;
if (Modality === 'SEG' && servicesManager) {
const {
LoggerService,
UINotificationService,
} = servicesManager.services;
const onDisplaySetLoadFailureHandler = error => {
LoggerService.error({ error, message: error.message });
UINotificationService.show({
@@ -55,14 +53,42 @@ const mapDispatchToProps = (dispatch, ownProps) => {
}
if (!displaySet) {
throw new Error(
const error = new Error(
`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) {
throw new Error('Source data not present');
}
if (!displaySet) {
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));
@@ -23,6 +23,8 @@ import './Viewer.css';
import StudyPrefetcher from '../components/StudyPrefetcher.js';
import StudyLoadingMonitor from '../components/StudyLoadingMonitor';
const { studyMetadataManager } = OHIF.utils;
class Viewer extends Component {
static propTypes = {
studies: PropTypes.arrayOf(
@@ -429,6 +431,31 @@ class Viewer extends Component {
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.
*
@@ -513,6 +540,10 @@ const _checkForSeriesInconsistencesWarnings = async function(
'The datasets is missing frames: ' + displaySet.missingFrames + '.'
);
}
if (displaySet.isModalitySupported === false) {
inconsistencyWarnings.push('The datasets modality is not supported.');
}
} else {
const segMetadata = displaySet.metadata;
if (!segMetadata) {
@@ -684,7 +715,6 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
const {
displaySetInstanceUID,
SeriesDescription,
InstanceNumber,
numImageFrames,
SeriesNumber,
} = displaySet;
@@ -709,6 +739,11 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
studies
);
const hasDerivedDisplaySets = _checkForDerivedDisplaySets(
displaySet,
study
);
return {
active: _isDisplaySetActive(
displaySet,
@@ -719,10 +754,10 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
altImageText,
displaySetInstanceUID,
SeriesDescription,
InstanceNumber,
numImageFrames,
SeriesNumber,
hasWarnings,
hasDerivedDisplaySets,
};
});
@@ -139,10 +139,11 @@ class ViewerMain extends Component {
displaySetInstanceUID
);
const { LoggerService, UINotificationService } = servicesManager.services;
if (displaySet.isDerived) {
const { Modality } = displaySet;
if (Modality === 'SEG' && servicesManager) {
const {LoggerService, UINotificationService} = servicesManager.services;
const onDisplaySetLoadFailureHandler = error => {
LoggerService.error({ error, message: error.message });
UINotificationService.show({
@@ -153,24 +154,41 @@ class ViewerMain extends Component {
});
};
const {referencedDisplaySet} = displaySet.getSourceDisplaySet(
const { referencedDisplaySet } = displaySet.getSourceDisplaySet(
this.props.studies,
true,
onDisplaySetLoadFailureHandler
);
displaySet = referencedDisplaySet;
} else {
displaySet = displaySet.getSourceDisplaySet(this.props.studies);
}
if (!displaySet) {
throw new Error(
`Referenced series for ${Modality} dataset 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',
});
}
this.props.setViewportSpecificData(viewportIndex, displaySet);
};
+25 -20
View File
@@ -6034,28 +6034,28 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
cornerstone-core@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/cornerstone-core/-/cornerstone-core-2.5.0.tgz#1051ffc34420ad7484e61d2f3bdbc41a5ebc1956"
integrity sha512-mJzvRJh8J7d5FJutjaL9cT8ZNnmj6l5PHROsyktZq1ojh4vkXfHECQ2izIQu8nmtJ9A6SyQRj4v5Uxn7hijzKw==
cornerstone-core@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/cornerstone-core/-/cornerstone-core-2.6.1.tgz#f9a29a49057f286e8c969c7020e979d567449d42"
integrity sha512-LAXjXwNnK2W65ZxpE7phVLjbijkYUrAQIGv5xqKjK8+dmIGlBxqvPHnyGwEqVDyKOWVrpXP6ymUPwrGGRwzgMg==
cornerstone-math@0.1.9, cornerstone-math@^0.1.9:
version "0.1.9"
resolved "https://registry.yarnpkg.com/cornerstone-math/-/cornerstone-math-0.1.9.tgz#7ce5509e8b9f465b01f7c548470725e7569859fc"
integrity sha512-NxdooV73asEQgav1S+0e+a4K+W3CXJdLXyFkVN24qqCtmIpzZzwtw3F9KWPCekzSAJmbhtQ3HicOQj3d4vRtuw==
cornerstone-tools@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-6.0.0.tgz#6840658f4508e60cd206b17d6e56160367f616f1"
integrity sha512-VU4MrsO2NcQK6CUxuYFdiNvdWjF/NV/fs8jCePazYCoFDDKIYcUM9UmoYXAapFE2mon65p4u9wUAvuIuLeBQwA==
cornerstone-tools@^6.0.6:
version "6.0.6"
resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-6.0.6.tgz#61db62a9eb3d197acea297f60fc610c918a38be0"
integrity sha512-t+yksdByljoP/X7CBHfSzmZmLk1o9QCg4CmzspIG6mkRRmZeMf5hxgaM3u0pBdjK1JyxZwzMbavbyl5DG7KxpA==
dependencies:
"@babel/runtime" "7.1.2"
cornerstone-math "0.1.9"
cornerstone-wado-image-loader@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-4.0.3.tgz#4848a238af9b10742af6d08e204527acf5260c25"
integrity sha512-0KuMC6+hEFsCwVOBH4idKwPpbLdccPzP7i5Ja4q7E/kfwCE71uL8AzHhx96XcLeFN8oR8T+nzv8X6j0lyY32SA==
cornerstone-wado-image-loader@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-4.1.0.tgz#a85c206eb23e188181ed3f1dcf3ec715e65efcb4"
integrity sha512-QRoMqBE5xEc1Jttg3eH6RB4jFY2aIEjd9rcbvJszefl0isow+JwcLv2kh1xkSvqGfHGozcz+F4mrORyTNNLuFQ==
dependencies:
"@cornerstonejs/codec-charls" "^0.1.1"
"@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"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
dcmjs@0.18.9:
version "0.18.9"
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.18.9.tgz#0e18fcff975aaae8ca01a96e781fa75c29ec97f3"
integrity sha512-aTu4fUo3TSgohJC+U509qdXL1per09XvlYdQva0BGtIZMr/iR5n8h/ojpcDTRJoVtSuaj331KJj1yCj8FMMK4Q==
dcmjs@0.19.1:
version "0.19.1"
resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.19.1.tgz#3a418f908e34cb80eb4efc1feaccc6268c7c5910"
integrity sha512-yCqccv0OwnteryNEcloXwKsY6RpQJNvSdsQPHhmggKxBb9w1uFwkBM9j3MboW4+xLL9JTm/q0+rhLS1WOjJSiA==
dependencies:
"@babel/polyfill" "^7.8.3"
"@babel/runtime" "^7.8.4"
@@ -6963,6 +6963,11 @@ dicom-microscopy-viewer@^0.6.1:
dicomweb-client "^0.5.2"
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:
version "1.8.9"
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"
integrity sha512-e11n2+g7HfBuMyopWq76W11eSZJ707g4U1XiO8URA+23aoe0g1kGAtlPB29NKXl7zX7RznTJ7wfRBxFkW6EJDA==
dicomweb-client@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.8.1.tgz#12bdf0e9698bcf82730f38829ac30158164bb3fd"
integrity sha512-5EbK8epfSuonSnCW3nr2tkA1CcO1aFT3grEVvKXqv0tVyHsBvbEcEmBcPEbu1m/cF6t7+3uQRLOQ4dw4CodxFg==
dicomweb-client@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.8.3.tgz#4a5ad49c76415ccc894bec57f9267197432e534b"
integrity sha512-24l6ZnU3y6QIb6LUOmT2wJaptvM+oxQQa1btcViwmIok0pi7jjZf8tGSSclOvTKuwX408/qlpg3uWcKU0Y/uDw==
diff-sequences@^24.9.0:
version "24.9.0"