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 { class DICOMFileLoadingListener extends BaseLoadingListener {
constructor(stack) { constructor(stack) {
super(stack); super(stack);
this.dataSetUrls = this._getDataSetUrls(stack); this._dataSetUrl = this._getDataSetUrl(stack);
this._lastLoaded = 0; 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() { _getImageLoadProgressEventName() {
@ -110,10 +127,10 @@ class DICOMFileLoadingListener extends BaseLoadingListener {
} }
_imageLoadProgressEventHandle(e, eventData) { _imageLoadProgressEventHandle(e, eventData) {
const dataSetUrl = this._getDataSetUrl(eventData.imageId); const dataSetUrl = this._convertImageIdToDataSetUrl(eventData.imageId);
const bytesDiff = eventData.loaded - this._lastLoaded; const bytesDiff = eventData.loaded - this._lastLoaded;
if (!this.dataSetUrls.has(dataSetUrl)) { if (!this._dataSetUrl === dataSetUrl) {
return; 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 // Remove "frame=999&" from the imageId
imageId = imageId.replace(/frame=\d+&?/i, ''); 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(/&$/, ''); imageId = imageId.replace(/&$/, '');
return imageId; return imageId;
} }
_getDataSetUrls(stack) { _getDataSetUrl(stack) {
const dataSetUrls = new Set(); const imageId = stack.imageIds[0];
const imageIds = stack.imageIds; return this._convertImageIdToDataSetUrl(imageId);
const length = stack.imageIds.length;
for (let i = 0; i < length; i++) {
const dataSetUrl = this._getDataSetUrl(imageIds[i]);
dataSetUrls.add(dataSetUrl);
}
return dataSetUrls;
} }
} }
@ -170,6 +182,9 @@ class StackLoadingListener extends BaseLoadingListener {
this.imageDataMap = this._convertImageIdsArrayToMap(stack.imageIds); this.imageDataMap = this._convertImageIdsArrayToMap(stack.imageIds);
this.framesStatus = this._createArray(stack.imageIds.length, false); this.framesStatus = this._createArray(stack.imageIds.length, false);
this.loadedCount = 0; this.loadedCount = 0;
// Check how many instances has already been download (cached)
this._checkCachedData();
} }
_convertImageIdsArrayToMap(imageIds) { _convertImageIdsArrayToMap(imageIds) {
@ -197,6 +212,19 @@ class StackLoadingListener extends BaseLoadingListener {
return array; 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() { _getImageLoadedEventName() {
return 'CornerstoneImageLoaded.' + this.id; return 'CornerstoneImageLoaded.' + this.id;
} }
@ -225,7 +253,7 @@ class StackLoadingListener extends BaseLoadingListener {
$(cornerstone).off(imageCachePromiseRemovedEventName); $(cornerstone).off(imageCachePromiseRemovedEventName);
} }
_updateImageStatus(imageId, loaded) { _updateFrameStatus(imageId, loaded) {
const imageData = this.imageDataMap.get(imageId); const imageData = this.imageDataMap.get(imageId);
if (!imageData || (imageData.loaded === loaded)) { if (!imageData || (imageData.loaded === loaded)) {
@ -245,12 +273,12 @@ class StackLoadingListener extends BaseLoadingListener {
_imageLoadedEventHandle(e, eventData) { _imageLoadedEventHandle(e, eventData) {
const imageId = eventData.image.imageId; const imageId = eventData.image.imageId;
this._updateImageStatus(imageId, true); this._updateFrameStatus(imageId, true);
} }
_imageCachePromiseRemovedEventHandle(e, eventData) { _imageCachePromiseRemovedEventHandle(e, eventData) {
const imageId = eventData.imageId; const imageId = eventData.imageId;
this._updateImageStatus(imageId, false); this._updateFrameStatus(imageId, false);
} }
_updateProgress() { _updateProgress() {
@ -291,11 +319,11 @@ class StudyLoadingListener {
this.listeners = {}; this.listeners = {};
} }
addStack(stack, options) { addStack(stack, stackMetaData) {
const displaySetInstanceUid = stack.displaySetInstanceUid; const displaySetInstanceUid = stack.displaySetInstanceUid;
if (!this.listeners[displaySetInstanceUid]) { if (!this.listeners[displaySetInstanceUid]) {
listener = this._createListener(stack, options); listener = this._createListener(stack, stackMetaData);
if (listener) { if (listener) {
this.listeners[displaySetInstanceUid] = listener; this.listeners[displaySetInstanceUid] = listener;
} }
@ -335,10 +363,15 @@ class StudyLoadingListener {
this.listeners = {}; this.listeners = {};
} }
_createListener(stack, options) { _createListener(stack, stackMetaData) {
const schema = this._getSchema(stack); 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); return new StackLoadingListener(stack);
} else if ((schema === 'dicomweb') || (schema === 'wadouri')) { } else if ((schema === 'dicomweb') || (schema === 'wadouri')) {
return new DICOMFileLoadingListener(stack); return new DICOMFileLoadingListener(stack);