This commit is contained in:
Leonardo Campos 2017-04-27 02:21:17 -03:00
parent 4055655c7a
commit 74d8cba5be

View File

@ -2,255 +2,255 @@ import { $ } from 'meteor/jquery';
import { Session } from 'meteor/session'; import { Session } from 'meteor/session';
class BaseLoadingListener { class BaseLoadingListener {
constructor(stack) { constructor(stack) {
this.id = BaseLoadingListener.getNewId(); this.id = BaseLoadingListener.getNewId();
this.stack = stack; this.stack = stack;
this.startListening(); this.startListening();
} }
_getProgressSessionId() { _getProgressSessionId() {
const displaySetInstanceUid = this.stack.displaySetInstanceUid; const displaySetInstanceUid = this.stack.displaySetInstanceUid;
return 'DisplaySetProgress:' + displaySetInstanceUid; return 'DisplaySetProgress:' + displaySetInstanceUid;
} }
_clearSession() { _clearSession() {
const progressSessionId = this._getProgressSessionId(); const progressSessionId = this._getProgressSessionId();
Session.set(progressSessionId, undefined) Session.set(progressSessionId, undefined);
delete Session.keys.progressSessionId; delete Session.keys.progressSessionId;
} }
startListening() { startListening() {
throw new Error('`startListening` must be implemented by child clases'); throw new Error('`startListening` must be implemented by child clases');
} }
stopListening() { stopListening() {
throw new Error('`stopListening` must be implemented by child clases'); throw new Error('`stopListening` must be implemented by child clases');
} }
destroy() { destroy() {
this.stopListening(); this.stopListening();
this._clearSession(); this._clearSession();
} }
static getNewId() { static getNewId() {
const timeSlice = (new Date()).getTime().toString().slice(-8); const timeSlice = (new Date()).getTime().toString().slice(-8);
const randomNumber = parseInt(Math.random() * 1000000000); const randomNumber = parseInt(Math.random() * 1000000000);
return timeSlice.toString() + randomNumber.toString(); return timeSlice.toString() + randomNumber.toString();
} }
} }
class DICOMFileLoadingListener extends BaseLoadingListener { class DICOMFileLoadingListener extends BaseLoadingListener {
constructor(stack) { constructor(stack) {
super(stack); super(stack);
this.dataSetUrls = this._getDataSetUrls(stack); this.dataSetUrls = this._getDataSetUrls(stack);
}
_getImageLoadProgressEventName() {
return 'CornerstoneImageLoadProgress.' + this.id;
}
startListening() {
const imageLoadProgressEventName = this._getImageLoadProgressEventName();
this.stopListening();
$(cornerstone).on(imageLoadProgressEventName, (e, eventData) => {
this._imageLoadProgressEventHandle(e, eventData);
});
}
stopListening() {
const imageLoadProgressEventName = this._getImageLoadProgressEventName();
$(cornerstone).off(imageLoadProgressEventName);
}
_imageLoadProgressEventHandle(e, eventData) {
var dataSetUrl = this._getDataSetUrl(eventData.imageId);
if (!this.dataSetUrls.has(dataSetUrl)) {
return;
} }
this._triggerProgress(eventData); _getImageLoadProgressEventName() {
} return 'CornerstoneImageLoadProgress.' + this.id;
_triggerProgress(eventData) {
const progressSessionId = this._getProgressSessionId();
Session.set(progressSessionId, {
percentComplete: eventData.percentComplete,
bytesLoaded: eventData.loaded,
bytesTotal: eventData.total
});
}
_getDataSetUrl(imageId) {
// Remove "frame=999&" from the imageId
imageId = imageId.replace(/frame=\d+&?/i, '');
// Remove the last "&" like in "dicomweb:...&serverId=GQGpJcb4CnYDdu53q&"
imageId = imageId.replace(/&$/, "");
return imageId;
}
_getDataSetUrls(stack) {
const dataSetUrls = new Set();
const imageIds = stack.imageIds;
const length = stack.imageIds.length;
for (let i = 0; i < length; i++) {
const dataSetUrl = this._getDataSetUrl(imageIds[i]);
dataSetUrls.add(dataSetUrl);
} }
return dataSetUrls; startListening() {
} const imageLoadProgressEventName = this._getImageLoadProgressEventName();
this.stopListening();
$(cornerstone).on(imageLoadProgressEventName, (e, eventData) => {
this._imageLoadProgressEventHandle(e, eventData);
});
}
stopListening() {
const imageLoadProgressEventName = this._getImageLoadProgressEventName();
$(cornerstone).off(imageLoadProgressEventName);
}
_imageLoadProgressEventHandle(e, eventData) {
const dataSetUrl = this._getDataSetUrl(eventData.imageId);
if (!this.dataSetUrls.has(dataSetUrl)) {
return;
}
this._triggerProgress(eventData);
}
_triggerProgress(eventData) {
const progressSessionId = this._getProgressSessionId();
Session.set(progressSessionId, {
percentComplete: eventData.percentComplete,
bytesLoaded: eventData.loaded,
bytesTotal: eventData.total
});
}
_getDataSetUrl(imageId) {
// Remove "frame=999&" from the imageId
imageId = imageId.replace(/frame=\d+&?/i, '');
// Remove the last "&" like in "dicomweb:...&serverId=GQGpJcb4CnYDdu53q&"
imageId = imageId.replace(/&$/, '');
return imageId;
}
_getDataSetUrls(stack) {
const dataSetUrls = new Set();
const imageIds = stack.imageIds;
const length = stack.imageIds.length;
for (let i = 0; i < length; i++) {
const dataSetUrl = this._getDataSetUrl(imageIds[i]);
dataSetUrls.add(dataSetUrl);
}
return dataSetUrls;
}
} }
class StackLoadingListener extends BaseLoadingListener { class StackLoadingListener extends BaseLoadingListener {
constructor(stack) { constructor(stack) {
super(stack); super(stack);
this.remainingImageIds = stack.imageIds.slice(); this.remainingImageIds = stack.imageIds.slice();
this.loadedImageIds = []; this.loadedImageIds = [];
}
_getImageLoadedEventName() {
return 'CornerstoneImageLoaded.' + this.id;
}
_getImageCachePromiseRemoveEventName() {
return 'CornerstoneImageCachePromiseRemoved.' + this.id;
}
startListening() {
const imageLoadedEventName = this._getImageLoadedEventName();
const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();
this.stopListening();
$(cornerstone).on(imageLoadedEventName, (e, eventData) => {
this._imageLoadedEventHandle(e, eventData);
});
$(cornerstone).on(imageCachePromiseRemovedEventName, (e, eventData) => {
this._imageCachePromiseRemovedEventHandle(e, eventData);
});
}
stopListening() {
const imageLoadedEventName = this._getImageLoadedEventName();
const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();
$(cornerstone).off(imageLoadedEventName);
$(cornerstone).off(imageCachePromiseRemovedEventName);
}
_moveImageId(imageId, srcImageIds, dstImageIds) {
const imageIdIndex = srcImageIds.indexOf(imageId);
if (imageIdIndex === -1) {
return;
} }
dstImageIds.push(imageId); _getImageLoadedEventName() {
srcImageIds.splice(imageIdIndex, 1); return 'CornerstoneImageLoaded.' + this.id;
this._triggerProgress(); }
}
_imageLoadedEventHandle(e, eventData) { _getImageCachePromiseRemoveEventName() {
const imageId = eventData.image.imageId; return 'CornerstoneImageCachePromiseRemoved.' + this.id;
this._moveImageId(imageId, this.remainingImageIds, this.loadedImageIds); }
}
_imageCachePromiseRemovedEventHandle(e, eventData) { startListening() {
const imageId = eventData.imageId; const imageLoadedEventName = this._getImageLoadedEventName();
this._moveImageId(imageId, this.loadedImageIds, this.remainingImageIds); const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();
}
_triggerProgress() { this.stopListening();
const loadedImagesCount = this.loadedImageIds.length;
const remainingImagesCount = this.remainingImageIds.length;
const totalImagesCount = loadedImagesCount + remainingImagesCount;
const percentComplete = Math.round(loadedImagesCount / totalImagesCount * 100);
const progressSessionId = this._getProgressSessionId();
Session.set(progressSessionId, { $(cornerstone).on(imageLoadedEventName, (e, eventData) => {
totalImagesCount, this._imageLoadedEventHandle(e, eventData);
loadedImagesCount, });
remainingImagesCount,
percentComplete $(cornerstone).on(imageCachePromiseRemovedEventName, (e, eventData) => {
}); this._imageCachePromiseRemovedEventHandle(e, eventData);
} });
}
stopListening() {
const imageLoadedEventName = this._getImageLoadedEventName();
const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();
$(cornerstone).off(imageLoadedEventName);
$(cornerstone).off(imageCachePromiseRemovedEventName);
}
_moveImageId(imageId, srcImageIds, dstImageIds) {
const imageIdIndex = srcImageIds.indexOf(imageId);
if (imageIdIndex === -1) {
return;
}
dstImageIds.push(imageId);
srcImageIds.splice(imageIdIndex, 1);
this._triggerProgress();
}
_imageLoadedEventHandle(e, eventData) {
const imageId = eventData.image.imageId;
this._moveImageId(imageId, this.remainingImageIds, this.loadedImageIds);
}
_imageCachePromiseRemovedEventHandle(e, eventData) {
const imageId = eventData.imageId;
this._moveImageId(imageId, this.loadedImageIds, this.remainingImageIds);
}
_triggerProgress() {
const loadedImagesCount = this.loadedImageIds.length;
const remainingImagesCount = this.remainingImageIds.length;
const totalImagesCount = loadedImagesCount + remainingImagesCount;
const percentComplete = Math.round(loadedImagesCount / totalImagesCount * 100);
const progressSessionId = this._getProgressSessionId();
Session.set(progressSessionId, {
totalImagesCount,
loadedImagesCount,
remainingImagesCount,
percentComplete
});
}
} }
class StudyLoadingListener { class StudyLoadingListener {
constructor() { constructor() {
this.listeners = {}; this.listeners = {};
}
addStack(stack, options) {
const displaySetInstanceUid = stack.displaySetInstanceUid;
if (!this.listeners[displaySetInstanceUid]) {
listener = this._createListener(stack, options);
if (listener) {
this.listeners[displaySetInstanceUid] = listener;
}
}
}
addStudy(study) {
study.displaySets.forEach(displaySet => {
const stack = OHIF.viewerbase.stackManager.findOrCreateStack(study, displaySet);
this.addStack(stack, {
isMultiFrame: displaySet.isMultiFrame
});
});
}
addStudies(studies) {
if (!studies || !studies.length) {
return;
} }
for (let i = 0; i < studies.length; i++) { addStack(stack, options) {
this.addStudy(studies[i]); const displaySetInstanceUid = stack.displaySetInstanceUid;
}
}
clear() { if (!this.listeners[displaySetInstanceUid]) {
const displaySetInstanceUids = Object.keys(this.listeners); listener = this._createListener(stack, options);
const length = displaySetInstanceUids.length; if (listener) {
this.listeners[displaySetInstanceUid] = listener;
for (let i = 0; i < length; i++) { }
const displaySetInstanceUid = displaySetInstanceUids[i]; }
const displaySet = this.listeners[displaySetInstanceUid]
displaySet.destroy();
} }
this.listeners = {}; addStudy(study) {
} study.displaySets.forEach(displaySet => {
const stack = OHIF.viewerbase.stackManager.findOrCreateStack(study, displaySet);
_createListener(stack, options) { this.addStack(stack, {
const schema = this._getSchema(stack); isMultiFrame: displaySet.isMultiFrame
});
if ((schema === 'wadors') || !options.isMultiFrame) { });
return new StackLoadingListener(stack)
} else if ((schema === 'dicomweb') || (schema === 'wadouri')) {
return new DICOMFileLoadingListener(stack);
} }
}
_getSchema(stack) { addStudies(studies) {
const imageId = stack.imageIds[0]; if (!studies || !studies.length) {
const colonIndex = imageId.indexOf(":"); return;
return imageId.substring(0, colonIndex); }
}
for (let i = 0; i < studies.length; i++) {
this.addStudy(studies[i]);
}
}
clear() {
const displaySetInstanceUids = Object.keys(this.listeners);
const length = displaySetInstanceUids.length;
for (let i = 0; i < length; i++) {
const displaySetInstanceUid = displaySetInstanceUids[i];
const displaySet = this.listeners[displaySetInstanceUid];
displaySet.destroy();
}
this.listeners = {};
}
_createListener(stack, options) {
const schema = this._getSchema(stack);
if ((schema === 'wadors') || !options.isMultiFrame) {
return new StackLoadingListener(stack);
} else if ((schema === 'dicomweb') || (schema === 'wadouri')) {
return new DICOMFileLoadingListener(stack);
}
}
_getSchema(stack) {
const imageId = stack.imageIds[0];
const colonIndex = imageId.indexOf(':');
return imageId.substring(0, colonIndex);
}
} }
// Singleton // Singleton
const studyLoadingListener = new StudyLoadingListener(); const studyLoadingListener = new StudyLoadingListener();
export { studyLoadingListener }; export { studyLoadingListener };