Move server-side functions from viewerbase to worklist. Split multi-frame and single-image modalities into separate display sets (OHIF-36)

This commit is contained in:
Erik Ziegler committed 2016-08-08 18:37:32 +02:00
1 parent 9d8c039ffc
commit fe32c40832
32 files changed
+231 -793

No files matched your search

@@ -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();
});
});
@@ -1,5 +1,5 @@
<template name="thumbnailEntry">
<div class="thumbnailEntry m-t-1 m-b-2 {{draggableClass}} {{#if isSeriesActive this.thumbnail.stack.seriesInstanceUid viewportIndex}}active{{/if}}">
<div class="thumbnailEntry m-t-1 m-b-2 {{draggableClass}} {{#if isDisplaySetActive this.thumbnail.stack.displaySetInstanceUid viewportIndex}}active{{/if}}">
<div class="p-x-1">
{{>imageThumbnail (clone this)}}
</div>
@@ -14,7 +14,7 @@
</div>
<div class="seriesInformationNumbers">
<div>{{this.thumbnail.stack.seriesNumber}}</div>
<div>{{this.thumbnail.stack.instances.length}}</div>
<div>{{this.thumbnail.stack.numImageFrames}}</div>
</div>
</div>
</div>
@@ -193,7 +193,7 @@ const thumbnailDragEndHandler = (event, data, handlers) => {
const viewportIndex = $('.imageViewerViewport').index(element);
// Rerender the viewport using the dragged thumbnail data
layoutManager.rerenderViewportWithNewSeries(viewportIndex, data);
window.layoutManager.rerenderViewportWithNewDisplaySet(viewportIndex, data);
return false;
};
@@ -226,7 +226,7 @@ Template.thumbnailEntry.events({
const data = instance.data.thumbnail.stack;
// Rerender the viewport using the clicked thumbnail data
layoutManager.rerenderViewportWithNewSeries(instance.data.viewportIndex, data);
window.layoutManager.rerenderViewportWithNewDisplaySet(instance.data.viewportIndex, data);
}
});
@@ -11,11 +11,12 @@ var allCornerstoneEvents = 'CornerstoneToolsMouseDown CornerstoneToolsMouseDownA
*
* @param data {object} Object containing the study, series, and viewport element to be used
*/
function loadSeriesIntoViewport(data, templateData) {
log.info('imageViewerViewport loadSeriesIntoViewport');
function loadDisplaySetIntoViewport(data, templateData) {
log.info('imageViewerViewport loadDisplaySetIntoViewport');
// Make sure we have all the data required to render the series
if (!data.study || !data.series || !data.element) {
if (!data.study || !data.displaySet || !data.element) {
log.warn('loadDisplaySetIntoViewport: No Study, Display Set, or Element provided');
return;
}
@@ -53,30 +54,30 @@ function loadSeriesIntoViewport(data, templateData) {
// Loop through the current series and add metadata to the
// Cornerstone meta data provider. This will be used to fill information
// into the viewport overlays, and to calculate reference lines and orientation markers
var series = data.series;
var numImages = series.instances.length;
var displaySet = data.displaySet;
var numImages = displaySet.images.length;
var imageId;
series.instances.forEach(function(instance, imageIndex) {
displaySet.images.forEach(function(image, imageIndex) {
var metaData = {
instance: instance,
series: series,
instance: image,
series: displaySet, // TODO: Check this
study: data.study,
numImages: numImages,
imageIndex: imageIndex + 1
};
var numFrames = instance.numFrames;
var numFrames = image.numImageFrames;
if (numFrames > 1) {
log.info('Multiframe image detected');
for (var i = 0; i < numFrames; i++) {
metaData.frame = i;
imageId = getImageId(instance, i);
imageId = getImageId(image, i);
imageIds.push(imageId);
addMetaData(imageId, metaData);
}
} else {
imageId = getImageId(instance);
imageId = getImageId(image);
imageIds.push(imageId);
addMetaData(imageId, metaData);
}
@@ -161,11 +162,11 @@ function loadSeriesIntoViewport(data, templateData) {
enabledElement.viewport = cornerstone.getDefaultViewport(enabledElement.canvas, image);
// Check if there are default viewport settings for this sopClassUid
if (!series.instances || !series.instances.length) {
if (!displaySet.images || !displaySet.images.length) {
return;
}
var instance = series.instances[0];
var instance = displaySet.images[0];
var instanceClassViewport = getInstanceClassDefaultViewport(instance, enabledElement, image.imageId);
// If there are sopClassUid-specific viewport settings, apply them
@@ -227,7 +228,7 @@ function loadSeriesIntoViewport(data, templateData) {
cornerstoneTools.addToolState(element, 'stack', stack);
// Set the default CINE settings
var frameRate = 1000 / series.instances[0].frameTime;
var frameRate = 1000 / displaySet.images[0].frameTime;
var cineToolData = {
loop: OHIF.viewer.cine.loop,
framesPerSecond: frameRate || OHIF.viewer.cine.framesPerSecond
@@ -415,22 +416,23 @@ function loadSeriesIntoViewport(data, templateData) {
}
/**
* This function sets series for the study and calls LoadSeriesIntoViewport function
* This function sets the display set for the study and calls LoadDisplaySetIntoViewport function
*
* @param data includes study data
* @param seriesInstanceUid series information which is loaded in Template
* @param displaySetInstanceUid Display set information which is loaded in Template
* @param templateData currentData of Template
*
*/
function setSeries(data, seriesInstanceUid, templateData) {
function setDisplaySet(data, displaySetInstanceUid, templateData) {
var study = data.study;
if (!study || !study.seriesList) {
if (!study || !study.displaySets) {
throw "Study does not exist or has no display sets";
return;
}
study.seriesList.every(function(series) {
if (series.seriesInstanceUid === seriesInstanceUid) {
data.series = series;
study.displaySets.every(displaySet => {
if (displaySet.displaySetInstanceUid === displaySetInstanceUid) {
data.displaySet = displaySet;
return false;
}
@@ -438,12 +440,13 @@ function setSeries(data, seriesInstanceUid, templateData) {
});
// If we didn't find anything, stop here
if (!data.series) {
if (!data.displaySet) {
throw "Display set not found in specified study!";
return;
}
// Otherwise, load pass the data object into loadSeriesIntoViewport
loadSeriesIntoViewport(data, templateData);
loadDisplaySetIntoViewport(data, templateData);
}
/**
@@ -490,10 +493,6 @@ Meteor.startup(function() {
cornerstoneTools.magnify.setConfiguration(config);
});
Template.imageViewerViewport.onCreated(function() {
log.info('imageViewerViewport onCreated');
});
Template.imageViewerViewport.onRendered(function() {
var templateData = Template.currentData();
log.info('imageViewerViewport onRendered');
@@ -513,15 +512,16 @@ Template.imageViewerViewport.onRendered(function() {
element: element,
viewport: this.data.viewport,
currentImageIdIndex: this.data.currentImageIdIndex,
displaySetInstanceUid: this.data.displaySetInstanceUid,
studyInstanceUid: this.data.studyInstanceUid,
seriesInstanceUid: this.data.seriesInstanceUid,
renderedCallback: this.data.renderedCallback,
activeViewport: activeViewport
};
// If no seriesInstanceUid or studyInstanceUid were supplied, display the drag/drop
// If no displaySetInstanceUid was supplied, display the drag/drop
// instructions and then stop here since we don't know what to display in the viewport.
if (!this.data.seriesInstanceUid || !this.data.studyInstanceUid) {
if (!this.data.displaySetInstanceUid) {
element.classList.add('empty');
$(element).siblings('.imageViewerLoadingIndicator').css('display', 'none');
$(element).siblings('.viewportInstructions').show();
@@ -533,10 +533,10 @@ Template.imageViewerViewport.onRendered(function() {
var study = ViewerStudies.findOne({
studyInstanceUid: this.data.studyInstanceUid
});
var seriesInstanceUid = this.data.seriesInstanceUid;
var displaySetInstanceUid = this.data.displaySetInstanceUid;
data.study = study;
setSeries(data, seriesInstanceUid, templateData);
setDisplaySet(data, displaySetInstanceUid, templateData);
});
Template.imageViewerViewport.onDestroyed(function() {
@@ -24,6 +24,27 @@ function getElementIfNotEmpty(viewportIndex) {
return element;
}
function getStackDataIfNotEmpty(viewportIndex) {
const element = getElementIfNotEmpty(viewportIndex);
if (!element) {
return;
}
const stackToolData = cornerstoneTools.getToolState(element, 'stack');
if (!stackToolData ||
!stackToolData.data ||
!stackToolData.data.length) {
return;
}
const stack = stackToolData.data[0];
if (!stack) {
return;
}
return stack;
}
function getPatient(property) {
Session.get('CornerstoneNewImage' + this.viewportIndex);
if (!this.imageId) {
@@ -201,6 +222,24 @@ Template.viewportOverlay.helpers({
numImages: function() {
return getSeries.call(this, 'numImages');
},
imageIndex: function() {
Session.get('CornerstoneNewImage' + this.viewportIndex);
var stack = getStackDataIfNotEmpty(this.viewportIndex);
if (!stack || stack.currentImageIdIndex === undefined) {
return;
}
return stack.currentImageIdIndex + 1;
},
numImages: function() {
Session.get('CornerstoneNewImage' + this.viewportIndex);
var stack = getStackDataIfNotEmpty(this.viewportIndex);
if (!stack || !stack.imageIds) {
return;
}
return stack.imageIds.length;
},
prior: function() {
// This helper is updated whenever a new image is displayed in the viewport
Session.get('CornerstoneNewImage' + this.viewportIndex);