Merge pull request #2369 from Punzo/IDC2361
Re #2361: fix seg combobox filling
This commit is contained in:
commit
274342a5e1
@ -155,7 +155,9 @@ const SegmentationPanel = ({
|
||||
|
||||
const brushStackState = getBrushStackState();
|
||||
brushStackState.activeLabelmapIndex = newLabelmapIndex;
|
||||
setState(state => ({ ...state, selectedSegmentation }));
|
||||
if (selectedSegmentation) {
|
||||
setState(state => ({ ...state, selectedSegmentation }));
|
||||
}
|
||||
|
||||
refreshViewports();
|
||||
|
||||
@ -189,10 +191,9 @@ const SegmentationPanel = ({
|
||||
'extensiondicomsegmentationsegloaded',
|
||||
refreshSegmentations
|
||||
);
|
||||
|
||||
document.addEventListener(
|
||||
'extensiondicomsegmentationsegloadingfailed',
|
||||
cleanSegmentationComboBox
|
||||
'extensiondicomsegmentationsegselected',
|
||||
updateSegmentationComboBox
|
||||
);
|
||||
|
||||
/*
|
||||
@ -213,8 +214,8 @@ const SegmentationPanel = ({
|
||||
refreshSegmentations
|
||||
);
|
||||
document.removeEventListener(
|
||||
'extensiondicomsegmentationsegloadingfailed',
|
||||
cleanSegmentationComboBox
|
||||
'extensiondicomsegmentationsegselected',
|
||||
updateSegmentationComboBox
|
||||
);
|
||||
cornerstoneTools.store.state.enabledElements.forEach(enabledElement =>
|
||||
enabledElement.removeEventListener(
|
||||
@ -225,6 +226,15 @@ const SegmentationPanel = ({
|
||||
};
|
||||
}, [activeIndex, viewports]);
|
||||
|
||||
const updateSegmentationComboBox = (e) => {
|
||||
const index = e.detail.activatedLabelmapIndex;
|
||||
if (index !== -1) {
|
||||
setState(state => ({ ...state, selectedSegmentation: index }));
|
||||
} else {
|
||||
cleanSegmentationComboBox();
|
||||
}
|
||||
}
|
||||
|
||||
const cleanSegmentationComboBox = () => {
|
||||
setState(state => ({
|
||||
...state,
|
||||
@ -233,6 +243,7 @@ const SegmentationPanel = ({
|
||||
labelMapList: [],
|
||||
segmentList: [],
|
||||
isDisabled: true,
|
||||
selectedSegmentation: -1,
|
||||
}));
|
||||
}
|
||||
|
||||
@ -298,7 +309,7 @@ const SegmentationPanel = ({
|
||||
);
|
||||
|
||||
const filteredReferencedSegDisplaysets = referencedSegDisplaysets.filter(
|
||||
(segDisplay => segDisplay.loadError !== true && segDisplay.isLoaded));
|
||||
(segDisplay => segDisplay.loadError !== true));
|
||||
|
||||
return filteredReferencedSegDisplaysets.map((displaySet, index) => {
|
||||
const {
|
||||
|
||||
@ -3,7 +3,7 @@ import Select from 'react-select';
|
||||
|
||||
const SegmentationSelect = ({ value, formatOptionLabel, options }) => (
|
||||
<Select
|
||||
value={value}
|
||||
value={value === undefined ? null : value}
|
||||
formatOptionLabel={formatOptionLabel}
|
||||
styles={segmentationSelectStyles}
|
||||
options={options}
|
||||
|
||||
@ -55,6 +55,7 @@ export default function getSopClassHandlerModule({ servicesManager }) {
|
||||
referencedDisplaySetUID: null, // Assigned when loaded.
|
||||
labelmapIndex: null, // Assigned when loaded.
|
||||
isLoaded: false,
|
||||
loadError: false,
|
||||
hasOverlapping: false,
|
||||
SeriesDate,
|
||||
SeriesTime,
|
||||
@ -68,7 +69,6 @@ export default function getSopClassHandlerModule({ servicesManager }) {
|
||||
};
|
||||
|
||||
segDisplaySet.load = async function(referencedDisplaySet, studies) {
|
||||
segDisplaySet.isLoading = true;
|
||||
segDisplaySet.isLoaded = true;
|
||||
const { StudyInstanceUID } = referencedDisplaySet;
|
||||
const segArrayBuffer = await DicomLoaderService.findDicomDataPromise(
|
||||
@ -129,7 +129,6 @@ export default function getSopClassHandlerModule({ servicesManager }) {
|
||||
}
|
||||
};
|
||||
|
||||
segDisplaySet.isLoading = false;
|
||||
return segDisplaySet;
|
||||
},
|
||||
};
|
||||
|
||||
@ -1,90 +1,16 @@
|
||||
import setActiveLabelmap from './utils/setActiveLabelMap';
|
||||
import { classes } from '@ohif/core';
|
||||
|
||||
const { ImageSet } = classes;
|
||||
import { getReferencedDisplaySet } from '../../../platform/core/src/classes/metadata/StudyMetadata.js';
|
||||
|
||||
export default function getSourceDisplaySet(studies, segDisplaySet, activateLabelMap = true, onDisplaySetLoadFailureHandler) {
|
||||
const referencedDisplaySet = _getReferencedDisplaySet(segDisplaySet, studies);
|
||||
const referencedDisplaySet = getReferencedDisplaySet(segDisplaySet, studies);
|
||||
|
||||
let activatedLabelmapPromise;
|
||||
if (activateLabelMap) {
|
||||
setActiveLabelmap(referencedDisplaySet, studies, segDisplaySet, undefined, onDisplaySetLoadFailureHandler);
|
||||
activatedLabelmapPromise = setActiveLabelmap(referencedDisplaySet, studies, segDisplaySet, undefined, onDisplaySetLoadFailureHandler);
|
||||
}
|
||||
|
||||
return referencedDisplaySet;
|
||||
}
|
||||
|
||||
const _getReferencedDisplaySet = (segDisplaySet, studies) => {
|
||||
let allDisplaySets = [];
|
||||
|
||||
studies.forEach(study => {
|
||||
allDisplaySets = allDisplaySets.concat(study.displaySets);
|
||||
});
|
||||
|
||||
const otherDisplaySets = allDisplaySets.filter(
|
||||
ds => ds.displaySetInstanceUID !== segDisplaySet.displaySetInstanceUID
|
||||
);
|
||||
|
||||
const { metadata } = segDisplaySet;
|
||||
|
||||
let referencedSeriesInstanceUIDs;
|
||||
|
||||
if (metadata.ReferencedSeriesSequence) {
|
||||
const ReferencedSeriesSequence = _toArray(
|
||||
metadata.ReferencedSeriesSequence
|
||||
);
|
||||
|
||||
referencedSeriesInstanceUIDs = ReferencedSeriesSequence.map(
|
||||
ReferencedSeries => ReferencedSeries.SeriesInstanceUID
|
||||
);
|
||||
} else {
|
||||
const { PerFrameFunctionalGroupsSequence } = metadata;
|
||||
|
||||
let SourceImageSequence;
|
||||
|
||||
if (metadata.SourceImageSequence) {
|
||||
SourceImageSequence = metadata.SourceImageSequence;
|
||||
} else {
|
||||
const firstFunctionalGroups = _toArray(
|
||||
PerFrameFunctionalGroupsSequence
|
||||
)[0];
|
||||
const { DerivationImageSequence } = firstFunctionalGroups;
|
||||
|
||||
SourceImageSequence = DerivationImageSequence;
|
||||
}
|
||||
|
||||
const firstSourceImage = _toArray(SourceImageSequence)[0];
|
||||
|
||||
const { ReferencedSOPInstanceUID } = firstSourceImage;
|
||||
|
||||
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID(
|
||||
otherDisplaySets,
|
||||
ReferencedSOPInstanceUID
|
||||
);
|
||||
}
|
||||
|
||||
const referencedDisplaySet = otherDisplaySets.find(ds =>
|
||||
referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID)
|
||||
);
|
||||
|
||||
return referencedDisplaySet;
|
||||
};
|
||||
|
||||
const _findReferencedSeriesInstanceUIDsFromSOPInstanceUID = (
|
||||
displaySets,
|
||||
SOPInstanceUID
|
||||
) => {
|
||||
const imageSets = displaySets.filter(ds => ds instanceof ImageSet);
|
||||
|
||||
for (let i = 0; i < imageSets.length; i++) {
|
||||
const { images } = imageSets[i];
|
||||
for (let j = 0; j < images.length; j++) {
|
||||
if (images[j].SOPInstanceUID === SOPInstanceUID) {
|
||||
return [images[j].getData().metadata.SeriesInstanceUID];
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function _toArray(arrayOrObject) {
|
||||
return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject];
|
||||
return {
|
||||
referencedDisplaySet : referencedDisplaySet,
|
||||
activatedLabelmapPromise : activatedLabelmapPromise
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,23 +47,15 @@ export default async function setActiveLabelmap(
|
||||
return labelmapIndex;
|
||||
}
|
||||
|
||||
if (displaySet.isLoading) {
|
||||
return activeLabelmapIndex;
|
||||
}
|
||||
|
||||
if (!displaySet.isLoaded) {
|
||||
try {
|
||||
await displaySet.load(referencedDisplaySet, studies);
|
||||
} catch (error) {
|
||||
displaySet.isLoaded = false;
|
||||
displaySet.isLoading = false;
|
||||
displaySet.loadError = true;
|
||||
onDisplaySetLoadFailure(error);
|
||||
|
||||
const event = new CustomEvent('extensiondicomsegmentationsegloadingfailed');
|
||||
document.dispatchEvent(event);
|
||||
|
||||
return activeLabelmapIndex;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,8 +66,11 @@ export default async function setActiveLabelmap(
|
||||
|
||||
// This might have just been created, so need to use the non-cached value.
|
||||
state = cornerstoneTools.getModule('segmentation').state;
|
||||
|
||||
brushStackState = state.series[firstImageId];
|
||||
brushStackState.activeLabelmapIndex = labelmapIndex;
|
||||
if (brushStackState) {
|
||||
brushStackState.activeLabelmapIndex = labelmapIndex;
|
||||
}
|
||||
|
||||
refreshViewports();
|
||||
callback();
|
||||
|
||||
@ -13,7 +13,7 @@ import { isDisplaySetReconstructable, isSpacingUniform } from '../../utils/isDis
|
||||
import errorHandler from '../../errorHandler';
|
||||
import isLowPriorityModality from '../../utils/isLowPriorityModality';
|
||||
|
||||
export class StudyMetadata extends Metadata {
|
||||
class StudyMetadata extends Metadata {
|
||||
constructor(data, uid) {
|
||||
super(data, uid);
|
||||
// Initialize Private Properties
|
||||
@ -252,20 +252,7 @@ export class StudyMetadata extends Metadata {
|
||||
if (referencedSeriesInstanceUID) {
|
||||
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
||||
displaySet => {
|
||||
if (!displaySet.metadata.ReferencedSeriesSequence) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const ReferencedSeriesSequence = Array.isArray(
|
||||
displaySet.metadata.ReferencedSeriesSequence
|
||||
)
|
||||
? displaySet.metadata.ReferencedSeriesSequence
|
||||
: [displaySet.metadata.ReferencedSeriesSequence];
|
||||
|
||||
return ReferencedSeriesSequence.some(
|
||||
ReferencedSeries =>
|
||||
ReferencedSeries.SeriesInstanceUID === referencedSeriesInstanceUID
|
||||
);
|
||||
return getReferencedDisplaySet(displaySet, [this]).SeriesInstanceUID === referencedSeriesInstanceUID;
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -273,7 +260,7 @@ export class StudyMetadata extends Metadata {
|
||||
if (referencedFrameOfReferenceUID) {
|
||||
filteredDerivedDisplaySets = filteredDerivedDisplaySets.filter(
|
||||
displaySet =>
|
||||
displaySet.ReferencedFrameOfReferenceUID ===
|
||||
displaySet.FrameOfReferenceUID ===
|
||||
referencedFrameOfReferenceUID
|
||||
);
|
||||
}
|
||||
@ -916,3 +903,184 @@ function _getDisplaySetFromSopClassModule(
|
||||
}
|
||||
return displaySet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the source display set of the derivated display set.
|
||||
* @param {object} derivatedDisplaySet
|
||||
* @param {array[StudyMetadata]} studies
|
||||
* @return {object} source display set.
|
||||
*/
|
||||
function getReferencedDisplaySet(derivatedDisplaySet, studies) {
|
||||
let allDisplaySets = [];
|
||||
|
||||
studies.forEach(study => {
|
||||
allDisplaySets = allDisplaySets.concat(study.displaySets);
|
||||
});
|
||||
|
||||
const otherDisplaySets = allDisplaySets.filter(
|
||||
ds => ds.displaySetInstanceUID !== derivatedDisplaySet.displaySetInstanceUID
|
||||
);
|
||||
|
||||
const { metadata } = derivatedDisplaySet;
|
||||
|
||||
let referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSourceImageSequence
|
||||
(metadata, otherDisplaySets);
|
||||
|
||||
let noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs ||
|
||||
referencedSeriesInstanceUIDs.length === 0;
|
||||
if (noReferencedSeriesAvailable) {
|
||||
referencedSeriesInstanceUIDs =
|
||||
_findReferencedSeriesInstanceUIDsFromReferencedSeriesSequence
|
||||
(metadata);
|
||||
}
|
||||
|
||||
noReferencedSeriesAvailable = !referencedSeriesInstanceUIDs ||
|
||||
referencedSeriesInstanceUIDs.length === 0;
|
||||
if (noReferencedSeriesAvailable) {
|
||||
referencedSeriesInstanceUIDs =
|
||||
_findReferencedSeriesInstanceUIDsFromReferencedImageSequence
|
||||
(metadata, otherDisplaySets);
|
||||
}
|
||||
|
||||
const referencedSeriesAvailable = referencedSeriesInstanceUIDs &&
|
||||
referencedSeriesInstanceUIDs.length !== 0;
|
||||
if (referencedSeriesAvailable) {
|
||||
const referencedDisplaySet = otherDisplaySets.find(ds =>
|
||||
referencedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID)
|
||||
);
|
||||
;
|
||||
return referencedDisplaySet;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 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
|
||||
);
|
||||
|
||||
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 (
|
||||
metadata,
|
||||
displaySets
|
||||
) {
|
||||
if (!metadata.ReferencedImageSequence) {
|
||||
return;
|
||||
}
|
||||
|
||||
let referencedSeriesInstanceUIDs;
|
||||
const referencedImageArray = _toArray(metadata.ReferencedImageSequence);
|
||||
for (let i = 0; i < referencedImageArray.length; i++) {
|
||||
const { ReferencedSOPInstanceUID } = referencedImageArray[i];
|
||||
|
||||
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID(
|
||||
displaySets,
|
||||
ReferencedSOPInstanceUID
|
||||
);
|
||||
|
||||
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 (
|
||||
metadata,
|
||||
displaySets
|
||||
) {
|
||||
let SourceImageSequence;
|
||||
|
||||
if (metadata.SourceImageSequence) {
|
||||
SourceImageSequence = metadata.SourceImageSequence;
|
||||
} else {
|
||||
const { PerFrameFunctionalGroupsSequence } = metadata;
|
||||
const firstFunctionalGroups = _toArray(
|
||||
PerFrameFunctionalGroupsSequence
|
||||
)[0];
|
||||
const { DerivationImageSequence } = firstFunctionalGroups;
|
||||
SourceImageSequence = DerivationImageSequence;
|
||||
}
|
||||
|
||||
if (!SourceImageSequence) {
|
||||
return;
|
||||
}
|
||||
|
||||
const sourceImageArray = _toArray(SourceImageSequence);
|
||||
|
||||
let referencedSeriesInstanceUIDs;
|
||||
for (let i = 0; i < sourceImageArray.length; i++) {
|
||||
const { ReferencedSOPInstanceUID } = sourceImageArray[i];
|
||||
referencedSeriesInstanceUIDs = _findReferencedSeriesInstanceUIDsFromSOPInstanceUID(
|
||||
displaySets,
|
||||
ReferencedSOPInstanceUID
|
||||
);
|
||||
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 (
|
||||
displaySets,
|
||||
SOPInstanceUID
|
||||
) {
|
||||
const imageSets = displaySets.filter(ds => ds instanceof ImageSet);
|
||||
|
||||
for (let i = 0; i < imageSets.length; i++) {
|
||||
const { images } = imageSets[i];
|
||||
for (let j = 0; j < images.length; j++) {
|
||||
if (images[j].SOPInstanceUID === SOPInstanceUID) {
|
||||
return [images[j].getData().metadata.SeriesInstanceUID];
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function _toArray(arrayOrObject) {
|
||||
return Array.isArray(arrayOrObject) ? arrayOrObject : [arrayOrObject];
|
||||
}
|
||||
|
||||
export {StudyMetadata, getReferencedDisplaySet};
|
||||
|
||||
@ -106,11 +106,11 @@ async function loadAndCacheDerivedDisplaySets(referencedDisplaySet, studies, log
|
||||
}
|
||||
});
|
||||
|
||||
recentDisplaySet.isLoading = true;
|
||||
|
||||
try {
|
||||
await recentDisplaySet.load(referencedDisplaySet, studies);
|
||||
} catch (error) {
|
||||
recentDisplaySet.isLoaded = false;
|
||||
recentDisplaySet.loadError = true;
|
||||
logger.error({ error, message: error.message });
|
||||
snackbar.show({
|
||||
title: 'Error loading derived display set:',
|
||||
|
||||
@ -61,7 +61,20 @@ const mapDispatchToProps = (dispatch, ownProps) => {
|
||||
});
|
||||
};
|
||||
|
||||
displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata, true, onDisplaySetLoadFailureHandler);
|
||||
const {referencedDisplaySet, activatedLabelmapPromise} = displaySet.getSourceDisplaySet(
|
||||
ownProps.studyMetadata,
|
||||
true,
|
||||
onDisplaySetLoadFailureHandler
|
||||
);
|
||||
displaySet = referencedDisplaySet;
|
||||
|
||||
activatedLabelmapPromise.then((activatedLabelmapIndex) => {
|
||||
const selectionFired = new CustomEvent("extensiondicomsegmentationsegselected", {
|
||||
"detail": {"activatedLabelmapIndex":activatedLabelmapIndex}
|
||||
});
|
||||
document.dispatchEvent(selectionFired);
|
||||
});
|
||||
|
||||
} else {
|
||||
displaySet = displaySet.getSourceDisplaySet(ownProps.studyMetadata);
|
||||
}
|
||||
|
||||
@ -433,8 +433,12 @@ const _checkForSeriesInconsistencesWarnings = async function (displaySet, studie
|
||||
return warningsList;
|
||||
}
|
||||
|
||||
const sourceDisplaySet = displaySet.getSourceDisplaySet(studies, false);
|
||||
const imageIds = sourceDisplaySet.images.map(image => image.getImageId());
|
||||
const { referencedDisplaySet } = displaySet.getSourceDisplaySet(studies, false);
|
||||
if (!referencedDisplaySet) {
|
||||
return warningsList;
|
||||
}
|
||||
|
||||
const imageIds = referencedDisplaySet.images.map(image => image.getImageId());
|
||||
if (!imageIds || imageIds.length === 0) {
|
||||
return warningsList;
|
||||
}
|
||||
|
||||
@ -153,7 +153,13 @@ class ViewerMain extends Component {
|
||||
});
|
||||
};
|
||||
|
||||
displaySet = displaySet.getSourceDisplaySet(this.props.studies, true, onDisplaySetLoadFailureHandler);
|
||||
const {referencedDisplaySet} = displaySet.getSourceDisplaySet(
|
||||
this.props.studies,
|
||||
true,
|
||||
onDisplaySetLoadFailureHandler
|
||||
);
|
||||
displaySet = referencedDisplaySet;
|
||||
|
||||
} else {
|
||||
displaySet = displaySet.getSourceDisplaySet(this.props.studies);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user