246 lines
7.3 KiB
JavaScript
246 lines
7.3 KiB
JavaScript
import { Template } from 'meteor/templating';
|
|
import { Session } from 'meteor/session';
|
|
import { _ } from 'meteor/underscore';
|
|
import { OHIF } from 'meteor/ohif:core';
|
|
import { cornerstone } from 'meteor/ohif:cornerstone';
|
|
import { viewportOverlayUtils } from '../../../lib/viewportOverlayUtils';
|
|
import { getElementIfNotEmpty } from '../../../lib/getElementIfNotEmpty';
|
|
import { getStackDataIfNotEmpty } from '../../../lib/getStackDataIfNotEmpty';
|
|
|
|
Template.viewportOverlay.onCreated(() => {
|
|
const instance = Template.instance();
|
|
|
|
instance.getImageIndex = () => {
|
|
const stack = getStackDataIfNotEmpty(instance.data.viewportIndex);
|
|
if (!stack || stack.currentImageIdIndex === undefined) return;
|
|
|
|
return stack.currentImageIdIndex;
|
|
};
|
|
});
|
|
|
|
Template.viewportOverlay.helpers({
|
|
wwwc() {
|
|
Session.get('CornerstoneImageRendered' + this.viewportIndex);
|
|
|
|
const element = getElementIfNotEmpty(this.viewportIndex);
|
|
if (!element) {
|
|
return '';
|
|
}
|
|
|
|
const viewport = cornerstone.getViewport(element);
|
|
if (!viewport) {
|
|
return '';
|
|
}
|
|
|
|
return 'W ' + viewport.voi.windowWidth.toFixed(0) + ' L ' + viewport.voi.windowCenter.toFixed(0);
|
|
},
|
|
|
|
zoom() {
|
|
Session.get('CornerstoneImageRendered' + this.viewportIndex);
|
|
|
|
const element = getElementIfNotEmpty(this.viewportIndex);
|
|
if (!element) {
|
|
return;
|
|
}
|
|
|
|
const viewport = cornerstone.getViewport(element);
|
|
if (!viewport) {
|
|
return;
|
|
}
|
|
|
|
return (viewport.scale * 100.0);
|
|
},
|
|
|
|
imageDimensions() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
const image = viewportOverlayUtils.getImage(this.viewportIndex);
|
|
if (!image) {
|
|
return '';
|
|
}
|
|
|
|
return image.width + ' x ' + image.height;
|
|
},
|
|
|
|
patientName() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getPatient.call(this, 'name');
|
|
},
|
|
|
|
patientId() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getPatient.call(this, 'id');
|
|
},
|
|
|
|
patientBirthDate() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getPatient.call(this, 'birthDate');
|
|
},
|
|
|
|
patientSex() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getPatient.call(this, 'sex');
|
|
},
|
|
|
|
studyDate() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getStudy.call(this, 'studyDate');
|
|
},
|
|
|
|
studyTime() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getStudy.call(this, 'studyTime');
|
|
},
|
|
|
|
studyDescription() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getStudy.call(this, 'studyDescription');
|
|
},
|
|
|
|
seriesDescription() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getSeries.call(this, 'seriesDescription');
|
|
},
|
|
|
|
frameRate() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
const frameTime = viewportOverlayUtils.getInstance.call(this, 'frameTime');
|
|
if (!frameTime) {
|
|
return;
|
|
}
|
|
|
|
const frameRate = 1000 / frameTime;
|
|
return frameRate.toFixed(1);
|
|
},
|
|
|
|
seriesNumber() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getSeries.call(this, 'seriesNumber');
|
|
},
|
|
|
|
instanceNumber() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getInstance.call(this, 'instanceNumber');
|
|
},
|
|
|
|
thickness() {
|
|
// Displays Slice Thickness (0018,0050)
|
|
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getInstance.call(this, 'sliceThickness');
|
|
},
|
|
|
|
location() {
|
|
// Displays Slice Location (0020,1041), if present.
|
|
// - Otherwise, displays Table Position (0018,9327)
|
|
// - TODO: Otherwise, displays a value derived from Image Position (Patient) (0020,0032)
|
|
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
const sliceLocation = viewportOverlayUtils.getInstance.call(this, 'sliceLocation');
|
|
if (sliceLocation !== '') {
|
|
return sliceLocation;
|
|
}
|
|
|
|
const tablePosition = viewportOverlayUtils.getInstance.call(this, 'tablePosition');
|
|
if (tablePosition !== '') {
|
|
return tablePosition;
|
|
}
|
|
|
|
return viewportOverlayUtils.getInstance.call(this, 'imagePositionPatient');
|
|
},
|
|
|
|
spacingBetweenSlices() {
|
|
// Displays Spacing Between Slices (0018,0088), if present.
|
|
|
|
// TODO: Otherwise, displays a value derived from successive values
|
|
// of Image Position (Patient) (0020,0032) perpendicular to
|
|
// the Image Orientation (Patient) (0020,0037)
|
|
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getInstance.call(this, 'spacingBetweenSlices');
|
|
},
|
|
|
|
compression() {
|
|
// Displays whether or not lossy compression has been applied:
|
|
//
|
|
// - Checks Lossy Image Compression (0028,2110)
|
|
// - If so, displays the value of Lossy Image Compression Ratio (0028,2112)
|
|
// and Lossy Image Compression Method (0028,2114)
|
|
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
if (!this.imageId) {
|
|
return false;
|
|
}
|
|
|
|
const instance = cornerstone.metaData.get('instance', this.imageId);
|
|
if (!instance) {
|
|
return '';
|
|
}
|
|
|
|
if (instance.lossyImageCompression === '01' &&
|
|
instance.lossyImageCompressionRatio !== '') {
|
|
const compressionMethod = instance.lossyImageCompressionMethod || 'Lossy: ';
|
|
const compressionRatio = parseFloat(instance.lossyImageCompressionRatio).toFixed(2);
|
|
return compressionMethod + compressionRatio + ' : 1';
|
|
}
|
|
|
|
return 'Lossless / Uncompressed';
|
|
},
|
|
|
|
tagDisplayLeftOnly() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getTagDisplay.call(this, 'side') === 'L';
|
|
},
|
|
|
|
tagDisplayRightOnly() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getTagDisplay.call(this, 'side') === 'R';
|
|
},
|
|
|
|
tagDisplaySpecified() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getTagDisplay.call(this, 'side');
|
|
},
|
|
|
|
imageNumber() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
return viewportOverlayUtils.getInstance.call(this, 'number');
|
|
},
|
|
|
|
imageIndex() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
const imageIndex = Template.instance().getImageIndex();
|
|
return _.isUndefined(imageIndex) ? 0 : imageIndex + 1;
|
|
},
|
|
|
|
numImages() {
|
|
Session.get('CornerstoneNewImage' + this.viewportIndex);
|
|
|
|
const stack = getStackDataIfNotEmpty(this.viewportIndex);
|
|
if (!stack || !stack.imageIds) {
|
|
return;
|
|
}
|
|
|
|
return stack.imageIds.length;
|
|
},
|
|
});
|