diff --git a/Packages/ohif-metadata/client/OHIFInstanceMetadata.js b/Packages/ohif-metadata/client/OHIFInstanceMetadata.js index 5c3ba72c3..cc73cca70 100644 --- a/Packages/ohif-metadata/client/OHIFInstanceMetadata.js +++ b/Packages/ohif-metadata/client/OHIFInstanceMetadata.js @@ -88,10 +88,10 @@ export class OHIFInstanceMetadata extends InstanceMetadata { } // Override - getImageId(frame) { + getImageId(frame, thumbnail) { // If _imageID is not cached, create it if (this._imageId === null) { - this._imageId = Viewerbase.getImageId(this.getData(), frame); + this._imageId = Viewerbase.getImageId(this.getData(), frame, thumbnail); } return this._imageId; diff --git a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js index 045de799e..99e289f20 100644 --- a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js +++ b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js @@ -48,6 +48,37 @@ function buildUrl(server, studyInstanceUid) { return server.wadoRoot + '/studies/' + studyInstanceUid + '/metadata'; } +/** Returns a WADO url for an instance + * + * @param studyInstanceUid + * @param seriesInstanceUid + * @param sopInstanceUid + * @returns {string} + */ +function buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid) { + const params = []; + + params.push('requestType=WADO'); + params.push(`studyUID=${studyInstanceUid}`); + params.push(`seriesUID=${seriesInstanceUid}`); + params.push(`objectUID=${sopInstanceUid}`); + params.push('contentType=application%2Fdicom'); + params.push('transferSyntax=*'); + + return `${server.wadoUriRoot}?${params.join('&')}`; +} + +function buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid) { + return `${server.wadoRoot}/studies/${studyInstanceUid}/series/${seriesInstanceUid}/instances/${sopInstanceUid}` +} + +function buildInstanceFrameWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid, frame) { + const baseWadoRsUri = buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid); + frame = frame != null || 1; + + return `${baseWadoRsUri}/frames/${frame}` +} + /** * Parses the SourceImageSequence, if it exists, in order * to return a ReferenceSOPInstanceUID. The ReferenceSOPInstanceUID @@ -174,6 +205,10 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { var sopInstanceUid = DICOMWeb.getString(instance['00080018']); + const wadouri = buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid); + const baseWadoRsUri = buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid); + const wadorsuri = buildInstanceFrameWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid); + var instanceSummary = { imageType: DICOMWeb.getString(instance['00080008']), sopClassUid: DICOMWeb.getString(instance['00080016']), @@ -217,7 +252,11 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { lossyImageCompressionMethod: DICOMWeb.getString(instance['00282114']), echoNumber: DICOMWeb.getString(instance['00180086']), contrastBolusAgent: DICOMWeb.getString(instance['00180010']), - baseWadoRsUri: server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + baseWadoRsUri: baseWadoRsUri, + wadouri: WADOProxy.convertURL(wadouri, server.requestOptions), + wadorsuri: WADOProxy.convertURL(wadorsuri), + imageRendering: server.imageRendering, + thumbnailRendering: server.thumbnailRendering, }; // Get additional information if the instance uses "PALETTE COLOR" photometric interpretation @@ -236,12 +275,6 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { } } - if (server.imageRendering === 'wadouri') { - instanceSummary.wadouri = WADOProxy.convertURL(server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + '&contentType=application%2Fdicom&transferSyntax=*', server.requestOptions); - } else { - instanceSummary.wadorsuri = WADOProxy.convertURL(server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1'); - } - series.instances.push(instanceSummary); }); diff --git a/Packages/ohif-viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js b/Packages/ohif-viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js index e830d57bf..d24304458 100644 --- a/Packages/ohif-viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js +++ b/Packages/ohif-viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js @@ -24,7 +24,7 @@ Template.imageThumbnail.onCreated(() => { imageIndex = 0; } - return imageInstance.getImageId(); + return imageInstance.getImageId(imageIndex, true); }; }); diff --git a/Packages/ohif-viewerbase/client/lib/getImageId.js b/Packages/ohif-viewerbase/client/lib/getImageId.js index fd796f568..38942f05a 100644 --- a/Packages/ohif-viewerbase/client/lib/getImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getImageId.js @@ -4,10 +4,11 @@ import { getWADORSImageId } from './getWADORSImageId'; * Obtain an imageId for Cornerstone from an image instance * * @param instance + * @param frame + * #param thumbnail * @returns {string} The imageId to be used by Cornerstone */ -export function getImageId(instance, frame) { - +export function getImageId(instance, frame, thumbnail) { if (!instance) { return; } @@ -16,15 +17,17 @@ export function getImageId(instance, frame) { return instance.url; } - if (instance.wadouri) { + const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering'; + + if (instance[renderingAttr] === 'wadouri') { var imageId = 'dicomweb:' + instance.wadouri; + if (frame !== undefined) { imageId += '&frame=' + frame; } return imageId; } else { - // TODO= Check multiframe image support with WADO-RS - return getWADORSImageId(instance, frame); // WADO-RS Retrieve Frame + return getWADORSImageId(instance, frame, thumbnail); // WADO-RS Retrieve Frame } } diff --git a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js index 226926e42..2488954ed 100644 --- a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js @@ -42,7 +42,7 @@ class ImageMetadataBuilder { } } -formatWADOREImageUrl = function(wadorsuri, frame) { +formatWADORSImageUrl = function(wadorsuri, frame) { // We need to sum 1 because WADO-RS frame number is 1-based frame = (frame || 0) + 1; @@ -61,7 +61,7 @@ formatWADOREImageUrl = function(wadorsuri, frame) { * @returns {string} The imageId to be used by Cornerstone */ export function getWADORSImageId(instance, frame) { - const uri = formatWADOREImageUrl(instance.wadorsuri, frame); + const uri = formatWADORSImageUrl(instance.wadorsuri, frame); const imageId = `wadors:${uri}`; const imageMetadata = new ImageMetadataBuilder() diff --git a/config/dcm4cheeDICOMWeb.json b/config/dcm4cheeDICOMWeb.json index 91ab01a49..15a356048 100644 --- a/config/dcm4cheeDICOMWeb.json +++ b/config/dcm4cheeDICOMWeb.json @@ -8,6 +8,7 @@ "wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs", "qidoSupportsIncludeField": false, "imageRendering": "wadors", + "thumbnailRendering": "wadors", "requestOptions": { "auth": "admin:admin", "logRequests": true,