diff --git a/extensions/dicom-tag-browser/CHANGELOG.md b/extensions/dicom-tag-browser/CHANGELOG.md index f9fb6503f9a..d680e6f9629 100644 --- a/extensions/dicom-tag-browser/CHANGELOG.md +++ b/extensions/dicom-tag-browser/CHANGELOG.md @@ -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.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 diff --git a/extensions/dicom-tag-browser/package.json b/extensions/dicom-tag-browser/package.json index 44b22c6e20e..a0e8a8b7544 100644 --- a/extensions/dicom-tag-browser/package.json +++ b/extensions/dicom-tag-browser/package.json @@ -1,6 +1,6 @@ { "name": "@ohif/extension-dicom-tag-browser", - "version": "0.2.13", + "version": "0.2.14", "description": "OHIF extension for checking DICOM headers.", "author": "OHIF", "license": "MIT", diff --git a/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js b/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js index 8a358d308ab..52f24c18d39 100644 --- a/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js +++ b/extensions/dicom-tag-browser/src/components/DicomTagBrowser.js @@ -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 diff --git a/extensions/vtk/CHANGELOG.md b/extensions/vtk/CHANGELOG.md index b4f572b5321..b8a5fcfe13d 100644 --- a/extensions/vtk/CHANGELOG.md +++ b/extensions/vtk/CHANGELOG.md @@ -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.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 diff --git a/extensions/vtk/package.json b/extensions/vtk/package.json index d6c1b3455d8..260ba0208b7 100644 --- a/extensions/vtk/package.json +++ b/extensions/vtk/package.json @@ -1,6 +1,6 @@ { "name": "@ohif/extension-vtk", - "version": "1.12.5", + "version": "1.12.6", "description": "OHIF extension for VTK.js", "author": "OHIF", "license": "MIT", @@ -53,8 +53,8 @@ "react-vtkjs-viewport": "^0.14.4" }, "devDependencies": { - "@ohif/core": "^2.16.1", - "@ohif/ui": "^1.10.4", + "@ohif/core": "^2.16.2", + "@ohif/ui": "^1.10.5", "cornerstone-tools": "^6.0.0", "cornerstone-wado-image-loader": "^4.0.3", "dicom-parser": "^1.8.9", diff --git a/platform/core/CHANGELOG.md b/platform/core/CHANGELOG.md index 126653a00d9..515b219fe50 100644 --- a/platform/core/CHANGELOG.md +++ b/platform/core/CHANGELOG.md @@ -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. +## [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 diff --git a/platform/core/package.json b/platform/core/package.json index e585d8be104..254b6f73753 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -1,6 +1,6 @@ { "name": "@ohif/core", - "version": "2.16.1", + "version": "2.16.2", "description": "Generic business logic for web-based medical imaging applications", "author": "OHIF Core Team", "license": "MIT", diff --git a/platform/core/src/classes/StudyPrefetcher.js b/platform/core/src/classes/StudyPrefetcher.js index 83f84ed9cd5..de7a6b9d911 100644 --- a/platform/core/src/classes/StudyPrefetcher.js +++ b/platform/core/src/classes/StudyPrefetcher.js @@ -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(() => { diff --git a/platform/core/src/classes/metadata/StudyMetadata.js b/platform/core/src/classes/metadata/StudyMetadata.js index 78d0bf202b7..2789bcdf2d4 100644 --- a/platform/core/src/classes/metadata/StudyMetadata.js +++ b/platform/core/src/classes/metadata/StudyMetadata.js @@ -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 }; diff --git a/platform/core/src/utils/isDisplaySetReconstructable.js b/platform/core/src/utils/isDisplaySetReconstructable.js index bb583c23c5b..7461d53a163 100644 --- a/platform/core/src/utils/isDisplaySetReconstructable.js +++ b/platform/core/src/utils/isDisplaySetReconstructable.js @@ -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 }; diff --git a/platform/ui/CHANGELOG.md b/platform/ui/CHANGELOG.md index 9b25d58b8d8..5a7663d6aa7 100644 --- a/platform/ui/CHANGELOG.md +++ b/platform/ui/CHANGELOG.md @@ -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.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 diff --git a/platform/ui/package.json b/platform/ui/package.json index a9852d6746e..2e8814b3c59 100644 --- a/platform/ui/package.json +++ b/platform/ui/package.json @@ -1,6 +1,6 @@ { "name": "@ohif/ui", - "version": "1.10.4", + "version": "1.10.5", "description": "A set of React components for Medical Imaging Viewers", "author": "OHIF Contributors", "license": "MIT", diff --git a/platform/ui/src/components/studyBrowser/Thumbnail.js b/platform/ui/src/components/studyBrowser/Thumbnail.js index edde866da8a..926e49e1fbd 100644 --- a/platform/ui/src/components/studyBrowser/Thumbnail.js +++ b/platform/ui/src/components/studyBrowser/Thumbnail.js @@ -163,11 +163,6 @@ function Thumbnail(props) { displaySetInstanceUID, imageId, imageSrc, - numImageFrames, - SeriesDescription, - SeriesNumber, - hasWarnings, - hasDerivedDisplaySets, StudyInstanceUID, onClick, onDoubleClick, diff --git a/platform/viewer/CHANGELOG.md b/platform/viewer/CHANGELOG.md index b184ba3379c..2eddd021da7 100644 --- a/platform/viewer/CHANGELOG.md +++ b/platform/viewer/CHANGELOG.md @@ -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. +## [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 diff --git a/platform/viewer/package.json b/platform/viewer/package.json index a971eae1b8b..6aad36e3365 100644 --- a/platform/viewer/package.json +++ b/platform/viewer/package.json @@ -1,6 +1,6 @@ { "name": "@ohif/viewer", - "version": "4.12.5", + "version": "4.12.6", "description": "OHIF Viewer", "author": "OHIF Contributors", "license": "MIT", @@ -47,7 +47,7 @@ }, "dependencies": { "@babel/runtime": "^7.5.5", - "@ohif/core": "^2.16.1", + "@ohif/core": "^2.16.2", "@ohif/extension-cornerstone": "^2.12.2", "@ohif/extension-debugging": "^0.3.0", "@ohif/extension-dicom-html": "^1.3.13", @@ -56,9 +56,9 @@ "@ohif/extension-dicom-rt": "^0.7.3", "@ohif/extension-dicom-segmentation": "^0.7.4", "@ohif/extension-lesion-tracker": "^0.2.1", - "@ohif/extension-vtk": "^1.12.5", + "@ohif/extension-vtk": "^1.12.6", "@ohif/i18n": "^0.53.0", - "@ohif/ui": "^1.10.4", + "@ohif/ui": "^1.10.5", "@tanem/react-nprogress": "^1.1.25", "classnames": "^2.2.6", "core-js": "^3.2.1", diff --git a/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js b/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js index 0f6a129ce53..43992632b83 100644 --- a/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js +++ b/platform/viewer/src/connectedComponents/ConnectedStudyBrowser.js @@ -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)); diff --git a/platform/viewer/src/connectedComponents/Viewer.js b/platform/viewer/src/connectedComponents/Viewer.js index 9178c98fc7c..2ed2e1ee065 100644 --- a/platform/viewer/src/connectedComponents/Viewer.js +++ b/platform/viewer/src/connectedComponents/Viewer.js @@ -540,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) { diff --git a/platform/viewer/src/connectedComponents/ViewerMain.js b/platform/viewer/src/connectedComponents/ViewerMain.js index 978b4d52935..640864d01bc 100644 --- a/platform/viewer/src/connectedComponents/ViewerMain.js +++ b/platform/viewer/src/connectedComponents/ViewerMain.js @@ -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); };