This commit is contained in:
parent
64385485b6
commit
cedeb756c0
@ -59,7 +59,7 @@ const DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {
|
|||||||
let metadata;
|
let metadata;
|
||||||
const isImageStack =
|
const isImageStack =
|
||||||
activeDisplaySet instanceof ImageSet &&
|
activeDisplaySet instanceof ImageSet &&
|
||||||
activeDisplaySet.isModalitySupported === true;
|
activeDisplaySet.isSOPClassUIDSupported === true;
|
||||||
|
|
||||||
let instanceList;
|
let instanceList;
|
||||||
|
|
||||||
|
|||||||
@ -3,12 +3,12 @@ import DICOMWeb from './../../DICOMWeb';
|
|||||||
import ImageSet from './../ImageSet';
|
import ImageSet from './../ImageSet';
|
||||||
import { InstanceMetadata } from './InstanceMetadata';
|
import { InstanceMetadata } from './InstanceMetadata';
|
||||||
import { Metadata } from './Metadata';
|
import { Metadata } from './Metadata';
|
||||||
import OHIFError from '../OHIFError';
|
|
||||||
import { SeriesMetadata } from './SeriesMetadata';
|
import { SeriesMetadata } from './SeriesMetadata';
|
||||||
// - createStacks
|
// - createStacks
|
||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
// - createStacks
|
// - createStacks
|
||||||
import { isImage } from '../../utils/isImage';
|
import { isImage } from '../../utils/isImage';
|
||||||
|
import { naturalizeSOPClassUID } from '../../utils/naturalizeSOPClassUID';
|
||||||
import {
|
import {
|
||||||
isDisplaySetReconstructable,
|
isDisplaySetReconstructable,
|
||||||
isSpacingUniform,
|
isSpacingUniform,
|
||||||
@ -169,8 +169,12 @@ class StudyMetadata extends Metadata {
|
|||||||
!isImage(instance.getTagValue('SOPClassUID')) &&
|
!isImage(instance.getTagValue('SOPClassUID')) &&
|
||||||
!instance.getTagValue('Rows')
|
!instance.getTagValue('Rows')
|
||||||
) {
|
) {
|
||||||
// we set an empty display and we add a isModalitySupported variable to
|
// we set an empty display and we add a isSOPClassUIDSupported variable to
|
||||||
// print a warning that the modality is not supported in the thumbnail.
|
// print a warning that the series is not supported in the thumbnail.
|
||||||
|
// SOPClassUIDNaturalized is human readable name, since for non image series,
|
||||||
|
// we could have a mismatch between the SOPClassUID and the Modality.
|
||||||
|
// For example, in the Parametric map IOD Modality is expected to match
|
||||||
|
// the value for the series used to generate Parametric map, and there is no "PM" modality.
|
||||||
const displaySet = new ImageSet([]);
|
const displaySet = new ImageSet([]);
|
||||||
const seriesData = series.getData();
|
const seriesData = series.getData();
|
||||||
displaySet.setAttributes({
|
displaySet.setAttributes({
|
||||||
@ -188,7 +192,10 @@ class StudyMetadata extends Metadata {
|
|||||||
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,
|
isReconstructable: false,
|
||||||
isModalitySupported: false,
|
isSOPClassUIDSupported: false,
|
||||||
|
SOPClassUIDNaturalized: naturalizeSOPClassUID(
|
||||||
|
instance.getTagValue('SOPClassUID')
|
||||||
|
),
|
||||||
metadata: instance.getData().metadata,
|
metadata: instance.getData().metadata,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -923,7 +930,7 @@ const makeDisplaySet = (series, instances) => {
|
|||||||
: displayReconstructableInfo.reconstructionIssues;
|
: displayReconstructableInfo.reconstructionIssues;
|
||||||
}
|
}
|
||||||
|
|
||||||
imageSet.isModalitySupported = true;
|
imageSet.isSOPClassUIDSupported = true;
|
||||||
|
|
||||||
return imageSet;
|
return imageSet;
|
||||||
};
|
};
|
||||||
|
|||||||
200
platform/core/src/utils/naturalizeSOPClassUID.js
Normal file
200
platform/core/src/utils/naturalizeSOPClassUID.js
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
import { sopClassDictionary } from './sopClassDictionary';
|
||||||
|
import { isImage } from './isImage';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Naturalize SOP Class UID which do not have image data
|
||||||
|
* @param {string} SOPClassUID - SOP Class UID to be converted
|
||||||
|
* @returns {string} - human readable name
|
||||||
|
*/
|
||||||
|
export const naturalizeSOPClassUID = SOPClassUID => {
|
||||||
|
let naturalizedName = '';
|
||||||
|
if (!SOPClassUID) return naturalizedName;
|
||||||
|
if (!isImage) return naturalizedName;
|
||||||
|
|
||||||
|
if (sopClassDictionary.MRSpectroscopyStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'MRSpectroscopy';
|
||||||
|
} else if (sopClassDictionary.EnhancedUSVolumeStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'EnhancedUSVolume';
|
||||||
|
} else if (sopClassDictionary.Sop12LeadECGWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'Sop12LeadECGWaveform';
|
||||||
|
} else if (sopClassDictionary.GeneralECGWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'GeneralECGWaveform';
|
||||||
|
} else if (sopClassDictionary.AmbulatoryECGWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'AECAmbulatoryECGWaveformGW';
|
||||||
|
} else if (sopClassDictionary.HemodynamicWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'HemodynamicWaveform';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.CardiacElectrophysiologyWaveformStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'CardiacElectrophysiologyWaveform';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.BasicVoiceAudioWaveformStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'BasicVoiceAudioWaveform';
|
||||||
|
} else if (sopClassDictionary.GeneralAudioWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'GGeneralAudioWaveformAW';
|
||||||
|
} else if (sopClassDictionary.ArterialPulseWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'APArterialPulseWaveformW';
|
||||||
|
} else if (sopClassDictionary.RespiratoryWaveformStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RespiratoryWaveform';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.GrayscaleSoftcopyPresentationStateStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'GrayscaleSoftcopyPresentationState';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.ColorSoftcopyPresentationStateStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'ColorSoftcopyPresentationState';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.PseudoColorSoftcopyPresentationStateStorage ===
|
||||||
|
SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'PseudoColorSoftcopyPresentationState';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.BlendingSoftcopyPresentationStateStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'BlendingSoftcopyPresentationState';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.XAXRFGrayscaleSoftcopyPresentationStateStorage ===
|
||||||
|
SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'XAXRFGrayscaleSoftcopyPresentationState';
|
||||||
|
} else if (sopClassDictionary.RawDataStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RawData';
|
||||||
|
} else if (sopClassDictionary.SpatialRegistrationStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'SpatialRegistration';
|
||||||
|
} else if (sopClassDictionary.SpatialFiducialsStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'SpatialFiducials';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.DeformableSpatialRegistrationStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'DeformableSpatialRegistration';
|
||||||
|
} else if (sopClassDictionary.SegmentationStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'SEG';
|
||||||
|
} else if (sopClassDictionary.SurfaceSegmentationStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'SurfaceSEG';
|
||||||
|
} else if (sopClassDictionary.RealWorldValueMappingStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RealWorldValueMapping';
|
||||||
|
} else if (sopClassDictionary.SurfaceScanMeshStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'SurfaceScanMesh';
|
||||||
|
} else if (sopClassDictionary.SurfaceScanPointCloudStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'SurfaceScanPointCloud';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.StereometricRelationshipStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'StereometricRelationship';
|
||||||
|
} else if (sopClassDictionary.LensometryMeasurementsStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'LensometryMeasurements';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.AutorefractionMeasurementsStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'AutorefractionMeasurements';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.KeratometryMeasurementsStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'KeratometryMeasurements';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.SubjectiveRefractionMeasurementsStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'SubjectiveRefractionMeasurements';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.VisualAcuityMeasurementsStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'VisualAcuityMeasurements';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.SpectaclePrescriptionReportStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'SpectaclePrescriptionReport';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.OphthalmicAxialMeasurementsStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'OphthalmicAxialMeasurements';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.IntraocularLensCalculationsStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'IntraocularLensCalculations';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.MacularGridThicknessandVolumeReport === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'MacularGridThicknessandVolume';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.OphthalmicVisualFieldStaticPerimetryMeasurementsStorage ===
|
||||||
|
SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'OphthalmicVisualFieldStaticPerimetryMeasurements';
|
||||||
|
} else if (sopClassDictionary.OphthalmicThicknessMapStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'OphthalmicThicknessMap';
|
||||||
|
} else if (sopClassDictionary.CornealTopographyMapStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'CornealTopographyMap';
|
||||||
|
} else if (sopClassDictionary.BasicTextSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'BasicTextSR';
|
||||||
|
} else if (sopClassDictionary.EnhancedSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'EnhancedSR';
|
||||||
|
} else if (sopClassDictionary.ComprehensiveSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'ComprehensiveSR';
|
||||||
|
} else if (sopClassDictionary.Comprehensive3DSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'Comprehensive3DSR';
|
||||||
|
} else if (sopClassDictionary.ProcedureLog === SOPClassUID) {
|
||||||
|
naturalizedName = 'ProcedureLog';
|
||||||
|
} else if (sopClassDictionary.MammographyCADSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'MammographyCADSR';
|
||||||
|
} else if (sopClassDictionary.KeyObjectSelection === SOPClassUID) {
|
||||||
|
naturalizedName = 'KeyObject';
|
||||||
|
} else if (sopClassDictionary.ChestCADSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'ChestCADSR';
|
||||||
|
} else if (sopClassDictionary.XRayRadiationDoseSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'XRayRadiationDoseSR';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.RadiopharmaceuticalRadiationDoseSR === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'RadiopharmaceuticalRadiationDoseSR';
|
||||||
|
} else if (sopClassDictionary.ColonCADSR === SOPClassUID) {
|
||||||
|
naturalizedName = 'ColonCADSR';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.ImplantationPlanSRDocumentStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'ImplantationPlanSRDocument';
|
||||||
|
} else if (sopClassDictionary.EncapsulatedPDFStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'EncapsulatedPDF';
|
||||||
|
} else if (sopClassDictionary.EncapsulatedCDAStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'EncapsulatedCDA';
|
||||||
|
} else if (sopClassDictionary.BasicStructuredDisplayStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'BasicStructuredDisplay';
|
||||||
|
} else if (sopClassDictionary.RTDoseStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RTDose';
|
||||||
|
} else if (sopClassDictionary.RTStructureSetStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RTStructureSet';
|
||||||
|
} else if (sopClassDictionary.RTBeamsTreatmentRecordStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RTBeamsTreatmentRecord';
|
||||||
|
} else if (sopClassDictionary.RTPlanStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RTPlan';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.RTBrachyTreatmentRecordStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'RTBrachyTreatmentRecord';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.RTTreatmentSummaryRecordStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'RTTreatmentSummaryRecord';
|
||||||
|
} else if (sopClassDictionary.RTIonPlanStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'RTIonPlan';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.RTIonBeamsTreatmentRecordStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'RTIonBeamsTreatmentRecord';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.RTBeamsDeliveryInstructionStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'RTBeamsDeliveryInstruction';
|
||||||
|
} else if (sopClassDictionary.GenericImplantTemplateStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'GenericImplantTemplate';
|
||||||
|
} else if (
|
||||||
|
sopClassDictionary.ImplantAssemblyTemplateStorage === SOPClassUID
|
||||||
|
) {
|
||||||
|
naturalizedName = 'ImplantAssemblyTemplate';
|
||||||
|
} else if (sopClassDictionary.ImplantTemplateGroupStorage === SOPClassUID) {
|
||||||
|
naturalizedName = 'ImplantTemplateGroup';
|
||||||
|
}
|
||||||
|
|
||||||
|
return naturalizedName;
|
||||||
|
};
|
||||||
@ -25,7 +25,8 @@
|
|||||||
box-shadow: inset 0 0 0 1px var(--ui-border-color-dark);
|
box-shadow: inset 0 0 0 1px var(--ui-border-color-dark);
|
||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
height: 135px;
|
min-height: 135px;
|
||||||
|
max-height: 250px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -36,6 +37,11 @@
|
|||||||
h1
|
h1
|
||||||
text-align: center
|
text-align: center
|
||||||
color: var(--text-primary-color);
|
color: var(--text-primary-color);
|
||||||
|
max-width: 200px;
|
||||||
|
max-height: 250px;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
word-wrap: break-word;
|
||||||
|
hyphens: auto;
|
||||||
|
|
||||||
.series-details
|
.series-details
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@ -30,6 +30,7 @@ window.config = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
// Extensions should be able to suggest default values for these?
|
// Extensions should be able to suggest default values for these?
|
||||||
// Or we can require that these be explicitly set
|
// Or we can require that these be explicitly set
|
||||||
hotkeys: [
|
hotkeys: [
|
||||||
|
|||||||
@ -79,7 +79,7 @@ const mapDispatchToProps = (dispatch, ownProps) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (displaySet.isModalitySupported === false) {
|
if (displaySet.isSOPClassUIDSupported === false) {
|
||||||
const error = new Error('Modality not supported');
|
const error = new Error('Modality not supported');
|
||||||
const message = 'Modality not supported';
|
const message = 'Modality not supported';
|
||||||
LoggerService.error({ error, message });
|
LoggerService.error({ error, message });
|
||||||
|
|||||||
@ -563,8 +563,8 @@ const _checkForSeriesInconsistencesWarnings = async function(displaySet) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (displaySet.isModalitySupported === false) {
|
if (displaySet.isSOPClassUIDSupported === false) {
|
||||||
inconsistencyWarnings.push('The datasets modality is not supported.');
|
inconsistencyWarnings.push('The datasets is not supported.');
|
||||||
}
|
}
|
||||||
displaySet.inconsistencyWarnings = inconsistencyWarnings;
|
displaySet.inconsistencyWarnings = inconsistencyWarnings;
|
||||||
} else {
|
} else {
|
||||||
@ -668,6 +668,8 @@ const _mapStudiesToThumbnails = function(studies, activeDisplaySetInstanceUID) {
|
|||||||
} else if (displaySet.images && displaySet.images.length) {
|
} else if (displaySet.images && displaySet.images.length) {
|
||||||
const imageIndex = Math.floor(displaySet.images.length / 2);
|
const imageIndex = Math.floor(displaySet.images.length / 2);
|
||||||
imageId = displaySet.images[imageIndex].getImageId();
|
imageId = displaySet.images[imageIndex].getImageId();
|
||||||
|
} else if (displaySet.isSOPClassUIDSupported === false) {
|
||||||
|
altImageText = displaySet.SOPClassUIDNaturalized;
|
||||||
} else {
|
} else {
|
||||||
altImageText = displaySet.Modality ? displaySet.Modality : 'UN';
|
altImageText = displaySet.Modality ? displaySet.Modality : 'UN';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -190,7 +190,7 @@ class ViewerMain extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (displaySet.isModalitySupported === false) {
|
if (displaySet.isSOPClassUIDSupported === false) {
|
||||||
const error = new Error('Modality not supported');
|
const error = new Error('Modality not supported');
|
||||||
const message = 'Modality not supported';
|
const message = 'Modality not supported';
|
||||||
LoggerService.error({ error, message });
|
LoggerService.error({ error, message });
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user