OHIF-27: auto-play :: looking for cached files/instances

This commit is contained in:
Leonardo Campos 2017-05-03 17:48:59 -03:00
parent 72c08147d4
commit 8ae26c38e9

View File

@ -87,8 +87,25 @@ class BaseLoadingListener {
class DICOMFileLoadingListener extends BaseLoadingListener {
constructor(stack) {
super(stack);
this.dataSetUrls = this._getDataSetUrls(stack);
this._dataSetUrl = this._getDataSetUrl(stack);
this._lastLoaded = 0;
// Check how many instances has already been download (cached)
this._checkCachedData();
}
_checkCachedData() {
const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(this._dataSetUrl);
if (dataSet) {
const dataSetLength = dataSet.byteArray.length;
this._updateProgress({
percentComplete: 100,
loaded: dataSetLength,
total: dataSetLength
});
}
}
_getImageLoadProgressEventName() {
@ -110,10 +127,10 @@ class DICOMFileLoadingListener extends BaseLoadingListener {
}
_imageLoadProgressEventHandle(e, eventData) {
const dataSetUrl = this._getDataSetUrl(eventData.imageId);
const dataSetUrl = this._convertImageIdToDataSetUrl(eventData.imageId);
const bytesDiff = eventData.loaded - this._lastLoaded;
if (!this.dataSetUrls.has(dataSetUrl)) {
if (!this._dataSetUrl === dataSetUrl) {
return;
}
@ -140,27 +157,22 @@ class DICOMFileLoadingListener extends BaseLoadingListener {
});
}
_getDataSetUrl(imageId) {
_convertImageIdToDataSetUrl(imageId) {
// Remove the prefix ("dicomweb:" or "wadouri:"")
imageId = imageId.replace(/^(dicomweb:|wadouri:)/i, '');
// Remove "frame=999&" from the imageId
imageId = imageId.replace(/frame=\d+&?/i, '');
// Remove the last "&" like in "dicomweb:...&serverId=GQGpJcb4CnYDdu53q&"
// Remove the last "&" like in "http://...?foo=1&bar=2&"
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;
_getDataSetUrl(stack) {
const imageId = stack.imageIds[0];
return this._convertImageIdToDataSetUrl(imageId);
}
}
@ -170,6 +182,9 @@ class StackLoadingListener extends BaseLoadingListener {
this.imageDataMap = this._convertImageIdsArrayToMap(stack.imageIds);
this.framesStatus = this._createArray(stack.imageIds.length, false);
this.loadedCount = 0;
// Check how many instances has already been download (cached)
this._checkCachedData();
}
_convertImageIdsArrayToMap(imageIds) {
@ -197,6 +212,19 @@ class StackLoadingListener extends BaseLoadingListener {
return array;
}
_checkCachedData() {
const imageIds = this.stack.imageIds;
for(let i = 0; i < imageIds.length; i++) {
const imageId = imageIds[i];
const imagePromise = cornerstone.imageCache.getImagePromise(imageId);
if (imagePromise && (imagePromise.state() === 'resolved')) {
this._updateFrameStatus(imageId, true);
}
}
}
_getImageLoadedEventName() {
return 'CornerstoneImageLoaded.' + this.id;
}
@ -225,7 +253,7 @@ class StackLoadingListener extends BaseLoadingListener {
$(cornerstone).off(imageCachePromiseRemovedEventName);
}
_updateImageStatus(imageId, loaded) {
_updateFrameStatus(imageId, loaded) {
const imageData = this.imageDataMap.get(imageId);
if (!imageData || (imageData.loaded === loaded)) {
@ -245,12 +273,12 @@ class StackLoadingListener extends BaseLoadingListener {
_imageLoadedEventHandle(e, eventData) {
const imageId = eventData.image.imageId;
this._updateImageStatus(imageId, true);
this._updateFrameStatus(imageId, true);
}
_imageCachePromiseRemovedEventHandle(e, eventData) {
const imageId = eventData.imageId;
this._updateImageStatus(imageId, false);
this._updateFrameStatus(imageId, false);
}
_updateProgress() {
@ -291,11 +319,11 @@ class StudyLoadingListener {
this.listeners = {};
}
addStack(stack, options) {
addStack(stack, stackMetaData) {
const displaySetInstanceUid = stack.displaySetInstanceUid;
if (!this.listeners[displaySetInstanceUid]) {
listener = this._createListener(stack, options);
listener = this._createListener(stack, stackMetaData);
if (listener) {
this.listeners[displaySetInstanceUid] = listener;
}
@ -335,10 +363,15 @@ class StudyLoadingListener {
this.listeners = {};
}
_createListener(stack, options) {
_createListener(stack, stackMetaData) {
const schema = this._getSchema(stack);
if ((schema === 'wadors') || !options.isMultiFrame) {
// A StackLoadingListener can be created if it's wadors or not a multiframe
// wadouri instance (single file) that means "N" files will have to be
// downloaded where "N" is the number of frames. DICOMFileLoadingListener
// is created only if it's a single DICOM file and there's no way to know
// how many frames has already been loaded (bytes/s instead of frames/s).
if ((schema === 'wadors') || !stackMetaData.isMultiFrame) {
return new StackLoadingListener(stack);
} else if ((schema === 'dicomweb') || (schema === 'wadouri')) {
return new DICOMFileLoadingListener(stack);