From b31d7441eae98084cfa653fb7828893e7bbafc5f Mon Sep 17 00:00:00 2001 From: Leonardo Campos Date: Mon, 2 Jan 2017 23:36:39 -0200 Subject: [PATCH] OHIF-25: Multi-frame images should be loaded one frame at a time --- .../server/services/wado/retrieveMetadata.js | 4 +- .../imageThumbnail/imageThumbnail.js | 13 +++-- .../imageViewerViewport.js | 3 +- .../ohif-viewerbase/client/lib/getImageId.js | 2 +- .../client/lib/getWADORSImageId.js | 16 +++++- config/dcm4cheeDICOMWeb.json | 52 +++++++++++++++++++ 6 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 config/dcm4cheeDICOMWeb.json diff --git a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js index d606cbdc1..1b2a46b10 100644 --- a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js +++ b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js @@ -227,11 +227,9 @@ 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', server.requestOptions); } else { - instanceSummary.wadorsuri = server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1'; + instanceSummary.wadorsuri = WADOProxy.convertURL(server.wadoRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1'); } - 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 b441198cc..e830d57bf 100644 --- a/Packages/ohif-viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js +++ b/Packages/ohif-viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js @@ -13,9 +13,16 @@ Template.imageThumbnail.onCreated(() => { // Get the image ID for current thumbnail instance.getThumbnailImageId = () => { const stack = instance.data.thumbnail.stack; - const lastIndex = (stack.images.length || 1) - 1; - const imageIndex = Math.floor(lastIndex / 2) !== 0 ? 0 : 0; - const imageInstance = stack.images[imageIndex]; + const lastIndex = (stack.numImageFrames || stack.images.length || 1) - 1; + let imageIndex = Math.floor(lastIndex / 2); + let imageInstance; + + if(stack.isMultiFrame) { + imageInstance = stack.images[0]; + } else { + imageInstance = stack.images[imageIndex]; + imageIndex = 0; + } return imageInstance.getImageId(); }; diff --git a/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js b/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js index 53c1f016d..c70ecae52 100644 --- a/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js +++ b/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport/imageViewerViewport.js @@ -105,7 +105,8 @@ const loadDisplaySetIntoViewport = (data, templateData) => { // Enable Cornerstone for the viewport element const options = { - renderer: 'webgl' + // TODO: It's not working with WADO-RS requests (see getWADORSImageId) + // renderer: 'webgl' }; // NOTE: This uses the experimental WebGL renderer for Cornerstone! diff --git a/Packages/ohif-viewerbase/client/lib/getImageId.js b/Packages/ohif-viewerbase/client/lib/getImageId.js index 466f4158b..fd796f568 100644 --- a/Packages/ohif-viewerbase/client/lib/getImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getImageId.js @@ -25,6 +25,6 @@ export function getImageId(instance, frame) { return imageId; } else { // TODO= Check multiframe image support with WADO-RS - return getWADORSImageId(instance); // WADO-RS Retrieve Frame + return getWADORSImageId(instance, frame); // WADO-RS Retrieve Frame } } diff --git a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js index a9ad70fd3..226926e42 100644 --- a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js @@ -42,14 +42,26 @@ class ImageMetadataBuilder { } } +formatWADOREImageUrl = function(wadorsuri, frame) { + // We need to sum 1 because WADO-RS frame number is 1-based + frame = (frame || 0) + 1; + + // Replaces /frame/1 by /frame/{frame} + // TODO: Maybe should be better to export the WADOProxy to be able to use it on client + // Example: WADOProxy.convertURL(baseWadoRsUri + '/frame/' + frame) + wadorsuri = wadorsuri.replace(/(%2Fframes%2F)(\d+)/, `$1${frame}`); + + return Meteor.absoluteUrl(wadorsuri); +} + /** * Obtain an imageId for Cornerstone based on the WADO-RS scheme * * @param {object} instanceMetada metadata object (InstanceMetadata) * @returns {string} The imageId to be used by Cornerstone */ -export function getWADORSImageId(instance) { - const uri = Meteor.absoluteUrl(instance.wadorsuri); +export function getWADORSImageId(instance, frame) { + const uri = formatWADOREImageUrl(instance.wadorsuri, frame); const imageId = `wadors:${uri}`; const imageMetadata = new ImageMetadataBuilder() diff --git a/config/dcm4cheeDICOMWeb.json b/config/dcm4cheeDICOMWeb.json new file mode 100644 index 000000000..91ab01a49 --- /dev/null +++ b/config/dcm4cheeDICOMWeb.json @@ -0,0 +1,52 @@ +{ + "servers": { + "dicomWeb": [ + { + "name": "DCM4CHEE", + "wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado", + "qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs", + "wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs", + "qidoSupportsIncludeField": false, + "imageRendering": "wadors", + "requestOptions": { + "auth": "admin:admin", + "logRequests": true, + "logResponses": false, + "logTiming": true + } + }], + "dimse": [{ + "name": "DCM4CHEE_DIMSE", + "wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado", + "requestOptions": { + "auth": "admin:admin", + "logRequests": true, + "logResponses": false, + "logTiming": true + }, + "peers": [ + { + "host": "localhost", + "port": 4242, + "aeTitle": "DCM4CHEE", + "default": true, + "supportsInstanceRetrievalByStudyUid": false + }, + { + "host": "0.0.0.0", + "port": 11112, + "aeTitle": "DCM4CHEE", + "default": true, + "server": true + } + ] + }] + }, + "defaultServiceType": "dicomWeb", + "public": { + "verifyEmail": false, + "ui": { + "studyListFunctionsEnabled": true + } + } +}