diff --git a/Packages/ohif-lesiontracker/client/lib/MeasurementValidation.js b/Packages/ohif-lesiontracker/client/lib/MeasurementValidation.js index 437bf043c..0f90bf47a 100644 --- a/Packages/ohif-lesiontracker/client/lib/MeasurementValidation.js +++ b/Packages/ohif-lesiontracker/client/lib/MeasurementValidation.js @@ -223,7 +223,9 @@ function validateSingleMeasurement(measurementData) { }).map(function(criteria) { return criteria.id; }); - var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, measurementData.imageId); + + const imageId = OHIF.viewerbase.getImageIdForImagePath(measurementData.imagePath); + var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, imageId); // If we have no relevant constraints, stop here if (!currentConstraints) { @@ -320,7 +322,8 @@ function validateAll() { currentMeasurement._id = measurement._id; // Criteria for the specific image are retrieved from the general set of criteria. - var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, currentMeasurement.imageId); + const imageId = OHIF.viewerbase.getImageIdForImagePath(currentMeasurement.imagePath); + var currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes, imageId); if (!currentConstraints) { return; } diff --git a/Packages/ohif-measurements/both/configuration/measurements.js b/Packages/ohif-measurements/both/configuration/measurements.js index ada7fef88..9bd34137b 100644 --- a/Packages/ohif-measurements/both/configuration/measurements.js +++ b/Packages/ohif-measurements/both/configuration/measurements.js @@ -318,8 +318,9 @@ class MeasurementApi { const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState(); _.each(entries, entry => { - if (toolState[entry.imageId]) { - const toolData = toolState[entry.imageId][entry.toolType]; + const imageId = OHIF.viewerbase.getImageIdForImagePath(entry.imagePath); + if (toolState[imageId]) { + const toolData = toolState[imageId][entry.toolType]; const measurementsData = toolData && toolData.data; const measurementEntry = _.findWhere(measurementsData, { _id: entry._id diff --git a/Packages/ohif-measurements/both/schema/measurements.js b/Packages/ohif-measurements/both/schema/measurements.js index aac2f34ff..862532662 100644 --- a/Packages/ohif-measurements/both/schema/measurements.js +++ b/Packages/ohif-measurements/both/schema/measurements.js @@ -177,11 +177,9 @@ const FrameLevelMeasurement = new SimpleSchema([ min: 0, label: 'Frame index in Instance' }, - // TODO: In the future we should remove this in favour of searching OHIF.viewer.Studies and display sets when - // re-displaying measurements. Otherwise if a study moves servers the measurements will not be displayed correctly - imageId: { + imagePath: { type: String, - label: 'Cornerstone Image Id' + label: 'Identifier for the measurement\'s image' // studyInstanceUid_seriesInstanceUid_sopInstanceUid_frameIndex } } ]); diff --git a/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js b/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js index 902bd1206..64dfe0d03 100644 --- a/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js +++ b/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js @@ -145,7 +145,8 @@ class ConformanceCriteria { const measurements = this.measurementApi.fetch(measurementType); measurements.forEach(measurement => { - const { studyInstanceUid, imageId } = measurement; + const imageId = OHIF.viewerbase.getImageIdForImagePath(measurement.imagePath); + const { studyInstanceUid } = measurement; const timepointId = measurement.timepointId; const timepoint = timepointId && this.timepointApi.timepoints.findOne({ timepointId }); diff --git a/Packages/ohif-measurements/client/lib/MeasurementHandlers.js b/Packages/ohif-measurements/client/lib/MeasurementHandlers.js index 7d8a1b080..a8c4c076b 100644 --- a/Packages/ohif-measurements/client/lib/MeasurementHandlers.js +++ b/Packages/ohif-measurements/client/lib/MeasurementHandlers.js @@ -35,14 +35,15 @@ class MeasurementHandlers { OHIF.log.info('CornerstoneToolsMeasurementAdded'); + const imagePath = [studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex].join('_'); let measurement = $.extend({ userId: Meteor.userId(), - patientId: patientId, - studyInstanceUid: studyInstanceUid, - seriesInstanceUid: seriesInstanceUid, - sopInstanceUid: sopInstanceUid, - frameIndex: frameIndex, - imageId: imageId // TODO: In the future we should consider removing this + patientId, + studyInstanceUid, + seriesInstanceUid, + sopInstanceUid, + frameIndex, + imagePath }, measurementData); // Get the related timepoint by the measurement number and use its location if defined diff --git a/Packages/ohif-measurements/client/lib/activateMeasurements.js b/Packages/ohif-measurements/client/lib/activateMeasurements.js index 8933e1799..fbd77dcda 100644 --- a/Packages/ohif-measurements/client/lib/activateMeasurements.js +++ b/Packages/ohif-measurements/client/lib/activateMeasurements.js @@ -9,7 +9,7 @@ import { OHIF } from 'meteor/ohif:core'; */ function activateTool(measurementData) { const toolType = measurementData.toolType; - const imageId = measurementData.imageId; + const imageId = OHIF.viewerbase.getImageIdForImagePath(measurementData.imagePath); const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState(); const toolData = toolState[imageId][toolType]; @@ -25,8 +25,7 @@ function activateTool(measurementData) { } cornerstoneTools.globalImageIdSpecificToolStateManager.restoreToolState(toolState); -}; - +} /** * Switch to the image of the correct image index @@ -68,11 +67,12 @@ OHIF.measurements.activateMeasurements = (element, measurementData) => { const enabledElement = cornerstone.getEnabledElement(element); const currentImageId = enabledElement.image.imageId; const toolData = cornerstoneTools.getToolState(element, 'stack'); - const imageIdIndex = toolData.data[0].imageIds.indexOf(measurementData.imageId); + const imageId = OHIF.viewerbase.getImageIdForImagePath(measurementData.imagePath); + const imageIdIndex = toolData.data[0].imageIds.indexOf(imageId); // If we aren't currently displaying the image that this tool is on, // scroll to it now. - if (currentImageId !== measurementData.imageId) { + if (currentImageId !== imageId) { cornerstoneTools.scrollToIndex(element, imageIdIndex); } @@ -89,7 +89,7 @@ OHIF.measurements.activateMeasurements = (element, measurementData) => { // or maybe just remove the 'error' this throws? let ee; try { - ee = cornerstone.getEnabledElement(element) + ee = cornerstone.getEnabledElement(element); } catch(error) { OHIF.log.warn(error); return; @@ -99,6 +99,6 @@ OHIF.measurements.activateMeasurements = (element, measurementData) => { return; } - cornerstone.updateImage(element) + cornerstone.updateImage(element); }); -}; \ No newline at end of file +}; diff --git a/Packages/ohif-measurements/client/lib/exportPdf.js b/Packages/ohif-measurements/client/lib/exportPdf.js index c17722545..1d22f41af 100644 --- a/Packages/ohif-measurements/client/lib/exportPdf.js +++ b/Packages/ohif-measurements/client/lib/exportPdf.js @@ -18,8 +18,9 @@ OHIF.measurements.exportPdf = (measurementApi, timepointApi) => { const printMeasurement = (measurement, callback) => { OHIF.measurements.getImageDataUrl({ measurement }).then(imageDataUrl => { - const series = cornerstoneTools.metaData.get('series', measurement.imageId); - const instance = cornerstoneTools.metaData.get('instance', measurement.imageId); + const imageId = OHIF.viewerbase.getImageIdForImagePath(measurement.imagePath); + const series = cornerstoneTools.metaData.get('series', imageId); + const instance = cornerstoneTools.metaData.get('instance', imageId); let info = measurement.response; if (!info) { diff --git a/Packages/ohif-measurements/client/lib/getImageDataUrl.js b/Packages/ohif-measurements/client/lib/getImageDataUrl.js index 2f5632310..2284cd7d9 100644 --- a/Packages/ohif-measurements/client/lib/getImageDataUrl.js +++ b/Packages/ohif-measurements/client/lib/getImageDataUrl.js @@ -7,10 +7,11 @@ OHIF.measurements.getImageDataUrl = ({ width=512, height=512, cacheImage=true, - imageId, + imagePath, measurement }) => { - imageId = imageId || measurement.imageId; + imagePath = imagePath || measurement.imagePath; + const imageId = OHIF.viewerbase.getImageIdForImagePath(imagePath); return new Promise((resolve, reject) => { const loadMethod = cacheImage ? 'loadAndCacheImage' : 'loadImage'; diff --git a/Packages/ohif-measurements/client/lib/syncMeasurementAndToolData.js b/Packages/ohif-measurements/client/lib/syncMeasurementAndToolData.js index a1611cba6..b7681bfb5 100644 --- a/Packages/ohif-measurements/client/lib/syncMeasurementAndToolData.js +++ b/Packages/ohif-measurements/client/lib/syncMeasurementAndToolData.js @@ -5,7 +5,7 @@ OHIF.measurements.syncMeasurementAndToolData = measurement => { OHIF.log.info('syncMeasurementAndToolData'); const toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.saveToolState(); - const imageId = measurement.imageId; + const imageId = OHIF.viewerbase.getImageIdForImagePath(measurement.imagePath); const toolType = measurement.toolType; // If no tool state exists for this imageId, create an empty object to store it diff --git a/Packages/ohif-viewerbase/client/index.js b/Packages/ohif-viewerbase/client/index.js index e30cb933c..c58655b72 100644 --- a/Packages/ohif-viewerbase/client/index.js +++ b/Packages/ohif-viewerbase/client/index.js @@ -31,6 +31,10 @@ Viewerbase.switchToImageByIndex = switchToImageByIndex; import { getFrameOfReferenceUID } from './lib/getFrameOfReferenceUID'; Viewerbase.getFrameOfReferenceUID = getFrameOfReferenceUID; +// getImageIdForImagePath +import { getImageIdForImagePath } from './lib/getImageIdForImagePath'; +Viewerbase.getImageIdForImagePath = getImageIdForImagePath; + // updateCrosshairsSynchronizer import { updateCrosshairsSynchronizer } from './lib/updateCrosshairsSynchronizer'; Viewerbase.updateCrosshairsSynchronizer = updateCrosshairsSynchronizer; diff --git a/Packages/ohif-viewerbase/client/lib/getImageId.js b/Packages/ohif-viewerbase/client/lib/getImageId.js index 42f043454..16dc2db9e 100644 --- a/Packages/ohif-viewerbase/client/lib/getImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getImageId.js @@ -2,13 +2,12 @@ import { getWADORSImageId } from './getWADORSImageId'; // https://stackoverflow.com/a/6021027/3895126 function updateQueryStringParameter(uri, key, value) { - var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); - var separator = uri.indexOf('?') !== -1 ? "&" : "?"; - if (uri.match(re)) { - return uri.replace(re, '$1' + key + "=" + value + '$2'); - } - else { - return uri + separator + key + "=" + value; + const regex = new RegExp('([?&])' + key + '=.*?(&|$)', 'i'); + const separator = uri.indexOf('?') !== -1 ? '&' : '?'; + if (uri.match(regex)) { + return uri.replace(regex, '$1' + key + '=' + value + '$2'); + } else { + return uri + separator + key + '=' + value; } } @@ -25,6 +24,10 @@ export function getImageId(instance, frame, thumbnail) { return; } + if (typeof instance.getImageId === 'function') { + return instance.getImageId(); + } + if (instance.url) { if (frame !== undefined) { instance.url = updateQueryStringParameter(instance.url, 'frame', frame); @@ -36,7 +39,7 @@ export function getImageId(instance, frame, thumbnail) { const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering'; if (!instance[renderingAttr] || instance[renderingAttr] === 'wadouri' || !instance.wadorsuri) { - var imageId = 'dicomweb:' + instance.wadouri; + let imageId = 'dicomweb:' + instance.wadouri; if (frame !== undefined) { imageId += '&frame=' + frame; } diff --git a/Packages/ohif-viewerbase/client/lib/getImageIdForImagePath.js b/Packages/ohif-viewerbase/client/lib/getImageIdForImagePath.js new file mode 100644 index 000000000..9a219c833 --- /dev/null +++ b/Packages/ohif-viewerbase/client/lib/getImageIdForImagePath.js @@ -0,0 +1,17 @@ +import { OHIF } from 'meteor/ohif:core'; + +/** + * Obtain an imageId for the given imagePath + * + * @param {String} imagePath Path containing study, series and instance UIDs and frame index + * @returns {String} The resulting imageId for the given imagePath + */ + +export const getImageIdForImagePath = (imagePath, thumbnail=false) => { + const [studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex] = imagePath.split('_'); + const study = OHIF.viewer.Studies.findBy({ studyInstanceUid }); + const series = study.getSeriesByUID(seriesInstanceUid); + const instance = series.getInstanceByUID(sopInstanceUid); + const imageId = OHIF.viewerbase.getImageId(instance, frameIndex, thumbnail); + return imageId; +};