feat(measurement-table) Display support for measurements from DICOM Structured Reports (#225)
This commit is contained in:
1 parent
e9832f62f7
commit
d94f0eec16
64 files changed
+1797
-78
No files matched your search
@@ -0,0 +1,95 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { cornerstone } from 'meteor/ohif:cornerstone';
|
||||
|
||||
function getInstanceMetadata (displaySets, sopInstanceUid) {
|
||||
let instance;
|
||||
|
||||
// Use Array.some so that this loop stops when the internal loop
|
||||
// has found the correct instance
|
||||
displaySets.some(displaySet => {
|
||||
// Search the display set to find the instance metadata for
|
||||
return displaySet.images.find(instanceMetadata => {
|
||||
if (instanceMetadata._sopInstanceUID === sopInstanceUid) {
|
||||
instance = instanceMetadata;
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return instance;
|
||||
};
|
||||
|
||||
export default function getLengthMeasurementData(lengthMeasurementContent, displaySets) {
|
||||
let lengthStates = [];
|
||||
|
||||
lengthMeasurementContent.forEach(groupItemContent => {
|
||||
const lengthContent = groupItemContent.ContentSequence;
|
||||
const reference = lengthContent.ContentSequence.ReferencedSOPSequence;
|
||||
const lengthState = {};
|
||||
|
||||
lengthState.measuredValue = groupItemContent.MeasuredValueSequence.NumericValue;
|
||||
lengthState.handles = {start: {}, end: {}};
|
||||
[lengthState.handles.start.x,
|
||||
lengthState.handles.start.y,
|
||||
lengthState.handles.end.x,
|
||||
lengthState.handles.end.y] = lengthContent.GraphicData;
|
||||
|
||||
// TODO: Save textbox position in GraphicData?
|
||||
lengthState.handles.textBox = {
|
||||
hasMoved: false,
|
||||
movesIndependently: false,
|
||||
drawnIndependently: true,
|
||||
allowedOutsideImage: true,
|
||||
hasBoundingBox: true
|
||||
}
|
||||
|
||||
lengthState.ReferencedInstanceUID = reference.ReferencedSOPInstanceUID;
|
||||
if (reference.ReferencedFrameNumber && reference.ReferencedFrameNumber !== 'NaN') {
|
||||
lengthState.ReferencedFrameNumber = reference.ReferencedFrameNumber;
|
||||
} else {
|
||||
lengthState.ReferencedFrameNumber = 0;
|
||||
}
|
||||
|
||||
lengthStates.push(lengthState);
|
||||
});
|
||||
|
||||
const lengthMeasurementData = [];
|
||||
|
||||
let measurementNumber = 0;
|
||||
lengthStates.forEach(lengthState => {
|
||||
const sopInstanceUid = lengthState.ReferencedInstanceUID;
|
||||
const instanceMetadata = getInstanceMetadata(displaySets, sopInstanceUid);
|
||||
const imageId = OHIF.viewerbase.getImageId(instanceMetadata);
|
||||
if (!imageId) {
|
||||
return;
|
||||
}
|
||||
|
||||
const studyInstanceUid = cornerstone.metaData.get('study', imageId).studyInstanceUid;
|
||||
const seriesInstanceUid = cornerstone.metaData.get('series', imageId).seriesInstanceUid;
|
||||
const patientId = instanceMetadata._study.patientId;
|
||||
const frameIndex = lengthState.ReferencedFrameNumber;
|
||||
const imagePath = [studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex].join('_');
|
||||
const measurement = {
|
||||
handles: lengthState.handles,
|
||||
length: lengthState.measuredValue,
|
||||
imageId,
|
||||
imagePath,
|
||||
sopInstanceUid,
|
||||
seriesInstanceUid,
|
||||
studyInstanceUid,
|
||||
patientId,
|
||||
frameIndex,
|
||||
measurementNumber: ++measurementNumber,
|
||||
userId: 'UserID',
|
||||
timepointId: OHIF.viewer.data.currentTimepointId,
|
||||
toolType: 'length',
|
||||
_id: imageId + measurementNumber,
|
||||
};
|
||||
|
||||
lengthMeasurementData.push(measurement);
|
||||
});
|
||||
|
||||
|
||||
return lengthMeasurementData;
|
||||
};
|
||||
Reference in new issue
Block a user