From fe32c40832a1e4a2f58e17bb207560d4d9a61717 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Mon, 8 Aug 2016 18:37:32 +0200 Subject: [PATCH] Move server-side functions from viewerbase to worklist. Split multi-frame and single-image modalities into separate display sets (OHIF-36) --- OHIFViewer/client/components/viewer/viewer.js | 3 +- Packages/dimseservice/server/DIMSE.js | 1 + .../protocolEditor/protocolEditor.js | 4 + .../hangingprotocols/client/protocolEngine.js | 21 +- .../lesionTableRow/lesionTableRow.js | 6 +- .../lesionTableView/lesionTableView.js | 4 +- .../studySeriesQuickSwitch.html | 2 +- .../studyTimepointStudy.js | 1 + .../client/components/viewer/viewer.js | 1 + Packages/viewerbase/assets/sprites.svg | 699 ------------------ .../imageThumbnail/imageThumbnail.js | 4 +- .../thumbnailEntry/thumbnailEntry.html | 4 +- .../thumbnailEntry/thumbnailEntry.js | 4 +- .../imageViewerViewport.js | 62 +- .../viewer/viewportOverlay/viewportOverlay.js | 39 + Packages/viewerbase/lib/createStacks.js | 97 ++- ...sSeriesActive.js => isDisplaySetActive.js} | 4 +- .../viewerbase/lib/helpers/studyThumbnails.js | 4 +- Packages/viewerbase/lib/layoutManager.js | 20 +- Packages/viewerbase/package.js | 15 +- .../both/collections.js | 0 .../worklist/client/components/worklist.styl | 2 + .../client}/lib/importStudies.js | 0 .../client}/lib/queryStudies.js | 0 Packages/worklist/client/lib/switchToTab.js | 1 - Packages/worklist/package.js | 8 +- .../server/collections.js | 0 .../server/methods/importStudies.js | 0 .../server/services/dimse/retrieveMetadata.js | 1 + .../server/services/wado/retrieveMetadata.js | 1 + config/dcm4cheeDIMSE.json | 8 +- config/orthancDIMSE.json | 8 +- 32 files changed, 231 insertions(+), 793 deletions(-) delete mode 100644 Packages/viewerbase/assets/sprites.svg rename Packages/viewerbase/lib/helpers/{isSeriesActive.js => isDisplaySetActive.js} (78%) rename Packages/{viewerbase => worklist}/both/collections.js (100%) rename Packages/{viewerbase => worklist/client}/lib/importStudies.js (100%) rename Packages/{viewerbase => worklist/client}/lib/queryStudies.js (100%) rename Packages/{viewerbase => worklist}/server/collections.js (100%) rename Packages/{viewerbase => worklist}/server/methods/importStudies.js (100%) diff --git a/OHIFViewer/client/components/viewer/viewer.js b/OHIFViewer/client/components/viewer/viewer.js index 8af6dccbc..17762810d 100644 --- a/OHIFViewer/client/components/viewer/viewer.js +++ b/OHIFViewer/client/components/viewer/viewer.js @@ -1,7 +1,5 @@ import { OHIF } from 'meteor/ohif:core'; -//test2 - OHIF.viewer = OHIF.viewer || {}; OHIF.viewer.loadIndicatorDelay = 500; OHIF.viewer.defaultTool = 'wwwc'; @@ -58,6 +56,7 @@ Template.viewer.onCreated(() => { ViewerData[contentId].studyInstanceUids = []; instance.data.studies.forEach(study => { study.selected = true; + study.displaySets = createStacks(study); ViewerStudies.insert(study); ViewerData[contentId].studyInstanceUids.push(study.studyInstanceUid); }); diff --git a/Packages/dimseservice/server/DIMSE.js b/Packages/dimseservice/server/DIMSE.js index d006a06cc..9c180b002 100755 --- a/Packages/dimseservice/server/DIMSE.js +++ b/Packages/dimseservice/server/DIMSE.js @@ -23,6 +23,7 @@ var getInstanceRetrievalParams = function(studyInstanceUID, seriesInstanceUID) { 0x00200011: '', 0x00080016: '', // sopClassUid 0x00080018: '', // sopInstanceUid + 0x00080060: '', // modality 0x00200013: '', // instanceNumber 0x00280010: '', // rows 0x00280011: '', // columns diff --git a/Packages/hangingprotocols/client/components/protocolEditor/protocolEditor.js b/Packages/hangingprotocols/client/components/protocolEditor/protocolEditor.js index 78523bee7..292f3cde8 100644 --- a/Packages/hangingprotocols/client/components/protocolEditor/protocolEditor.js +++ b/Packages/hangingprotocols/client/components/protocolEditor/protocolEditor.js @@ -2,6 +2,10 @@ * Updates the Hanging Protocol Select2 Input */ function updateProtocolSelect() { + if (!ProtocolEngine) { + return; + } + // Loop through the available HangingProtocols // to create an array with the protocols that includes // a property labelled 'text', so that Select2 has something diff --git a/Packages/hangingprotocols/client/protocolEngine.js b/Packages/hangingprotocols/client/protocolEngine.js index 70a38fc6f..c76ff1749 100644 --- a/Packages/hangingprotocols/client/protocolEngine.js +++ b/Packages/hangingprotocols/client/protocolEngine.js @@ -401,7 +401,7 @@ HP.ProtocolEngine = class ProtocolEngine { if (!alreadyLoaded) { getStudyMetadata(priorStudy.studyInstanceUid, study => { study.abstractPriorValue = abstractPriorValue; - + study.displaySets = createStacks(study); ViewerStudies.insert(study); this.studies.push(study); this.matchImages(viewport); @@ -586,6 +586,23 @@ HP.ProtocolEngine = class ProtocolEngine { currentViewportData.currentImageIdIndex = details.bestMatch.currentImageIdIndex; } + const study = ViewerStudies.findOne({ + studyInstanceUid: details.bestMatch.studyInstanceUid + }); + + // Find the best matched display set. TODO: Fix this to actually + // find the most appropriate display set + study.displaySets.forEach(displaySet => { + if (displaySet.seriesInstanceUid === details.bestMatch.seriesInstanceUid) { + currentViewportData.displaySetInstanceUid = displaySet.displaySetInstanceUid; + return false; + } + }) + + if (!currentViewportData.displaySetInstanceUid) { + throw "No matching display set found?"; + } + viewportData.push(currentViewportData); }); @@ -594,7 +611,7 @@ HP.ProtocolEngine = class ProtocolEngine { this.LayoutManager.viewportData = viewportData; if (viewportIndex !== undefined && viewportData[viewportIndex]) { - this.LayoutManager.rerenderViewportWithNewSeries(viewportIndex, viewportData[viewportIndex]); + this.LayoutManager.rerenderViewportWithNewDisplaySet(viewportIndex, viewportData[viewportIndex]); } else { this.LayoutManager.updateViewports(); } diff --git a/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.js b/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.js index 5b3799e43..816ca99a8 100644 --- a/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.js +++ b/Packages/lesiontracker/client/components/lesionTableRow/lesionTableRow.js @@ -23,6 +23,7 @@ Template.lesionTableRow.events({ $row.closest('.lesionTableView').find('.lesionTableRow').not($row).removeClass('active'); $row.toggleClass('active'); }, + 'dblclick .location': function() { log.info('Double clicked on Lesion Location cell'); @@ -33,6 +34,7 @@ Template.lesionTableRow.events({ changeLesionLocationCallback(measurementData, null, doneCallback); }, + 'keydown .location': function(e) { var keyCode = e.which; @@ -45,8 +47,8 @@ Template.lesionTableRow.events({ text: 'Are you sure you would like to remove the entire measurement?' }; - showConfirmDialog(function() { - Meteor.call('removeMeasurement', currentMeasurement._id, function(error, response) { + showConfirmDialog(() => { + Meteor.call('removeMeasurement', currentMeasurement._id, (error, response) => { if (error) { log.warn(error); } diff --git a/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js b/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js index 4df919501..628ed1a99 100644 --- a/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js +++ b/Packages/lesiontracker/client/components/lesionTableView/lesionTableView.js @@ -9,8 +9,8 @@ Template.lesionTableView.helpers({ } }); }, + nonTargets() { - // All Targets shall be listed first followed by Non-Targets return Measurements.find({ isTarget: false }, { @@ -19,8 +19,8 @@ Template.lesionTableView.helpers({ } }); }, + newLesions() { - // All Targets shall be listed first followed by Non-Targets return Measurements.find({ saved: false }, { diff --git a/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html index 7cc722b93..ae0cf7444 100644 --- a/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html +++ b/Packages/lesiontracker/client/components/studySeriesQuickSwitch/studySeriesQuickSwitch.html @@ -18,7 +18,7 @@
{{#each thumbnail in thumbnailsList}} {{#if lt @index 8}} -
+
{{else}} {{#if eq @index 8}}
{{thumbnailsList.length}}
diff --git a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js index b0552699a..7a095bfa7 100644 --- a/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js +++ b/Packages/lesiontracker/client/components/studyTimepointBrowser/studyTimepointStudy.js @@ -66,6 +66,7 @@ Template.studyTimepointStudy.events({ if (!alreadyLoaded) { $study.addClass('loading'); getStudyMetadata(studyInstanceUid, studyData => { + study.displaySets = createStacks(study); ViewerStudies.insert(studyData); instance.select(isQuickSwitch); }); diff --git a/Packages/lesiontracker/client/components/viewer/viewer.js b/Packages/lesiontracker/client/components/viewer/viewer.js index d2c526f51..079e7fdef 100644 --- a/Packages/lesiontracker/client/components/viewer/viewer.js +++ b/Packages/lesiontracker/client/components/viewer/viewer.js @@ -72,6 +72,7 @@ Template.viewer.onCreated(() => { instance.data.studies.forEach(study => { study.selected = true; + study.displaySets = createStacks(study); ViewerStudies.insert(study); }); diff --git a/Packages/viewerbase/assets/sprites.svg b/Packages/viewerbase/assets/sprites.svg deleted file mode 100644 index 426f99ade..000000000 --- a/Packages/viewerbase/assets/sprites.svg +++ /dev/null @@ -1,699 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js b/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js index 36a3291cf..0e00de0f8 100644 --- a/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js +++ b/Packages/viewerbase/client/components/studyBrowser/imageThumbnail/imageThumbnail.js @@ -16,7 +16,7 @@ Template.imageThumbnail.onRendered(() => { cornerstone.enable(element); // Get the image ID - const imageInstance = instance.data.thumbnail.stack.instances[0]; + const imageInstance = instance.data.thumbnail.stack.images[0]; const imageId = getImageId(imageInstance); // Activate the loading state @@ -50,7 +50,7 @@ Template.imageThumbnail.onRendered(() => { } // Wait for the new data and reresh the image thumbnail - Meteor.setTimeout(() => { + Meteor.defer(() => { instance.refreshImage(); }); }); diff --git a/Packages/viewerbase/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html b/Packages/viewerbase/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html index e890c6669..55d5d2220 100644 --- a/Packages/viewerbase/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html +++ b/Packages/viewerbase/client/components/studyBrowser/thumbnailEntry/thumbnailEntry.html @@ -1,5 +1,5 @@