Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 1x 1x 5x 5x 5x 5x 5x 3x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x | import { getEnabledElement, StackViewport, Enums } from '@cornerstonejs/core';
import { getToolState } from './state';
export const requestType = Enums.RequestType.Prefetch;
export const priority = 0;
export function range(lowEnd, highEnd) {
// Javascript version of Python's range function
// http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl
lowEnd = Math.round(lowEnd) || 0;
highEnd = Math.round(highEnd) || 0;
const arr = [];
let c = highEnd - lowEnd + 1;
if (c <= 0) {
return arr;
}
while (c--) {
arr[c] = highEnd--;
}
return arr;
}
export function nearestIndex(arr, x) {
// Return index of nearest values in array
// http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array
let low = 0;
let high = arr.length - 1;
arr.forEach((v, idx) => {
if (v < x) {
low = Math.max(idx, low);
} else if (v > x) {
high = Math.min(idx, high);
}
});
return { low, high };
}
export function getStackData(element) {
const enabledElement = getEnabledElement(element);
Iif (!enabledElement) {
// Can be not valid if the data is changed part way through prefetch
return null;
}
const { viewport } = enabledElement;
Iif (!(viewport instanceof StackViewport)) {
// we shouldn't throw error here, since the viewport might have
// changed from stack to volume during prefetch
console.warn(
'stackPrefetch: element must be a StackViewport, VolumeViewport stackPrefetch not yet implemented'
);
return null;
}
return {
currentImageIdIndex: viewport.getCurrentImageIdIndex(),
imageIds: viewport.getImageIds(),
};
}
export function getPromiseRemovedHandler(element) {
return function (e) {
const eventData = e.detail;
// When an imagePromise has been pushed out of the cache, re-add its index
// It to the indicesToRequest list so that it will be retrieved later if the
// CurrentImageIdIndex is changed to an image nearby
let stackData;
try {
// It will throw an exception in some cases (eg: thumbnails)
stackData = getStackData(element);
} catch (error) {
return;
}
Iif (!stackData || !stackData.imageIds || stackData.imageIds.length === 0) {
return;
}
const stack = stackData;
const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);
// Make sure the image that was removed is actually in this stack
// Before adding it to the indicesToRequest array
Iif (imageIdIndex < 0) {
return;
}
const stackPrefetchData = getToolState(element);
Eif (
!stackPrefetchData ||
!stackPrefetchData.data ||
!stackPrefetchData.data.length
) {
return;
}
stackPrefetchData.indicesToRequest.push(imageIdIndex);
};
}
export const clearFromImageIds = (stack) => {
const imageIdSet = new Set<string>(stack.imageIds);
return (requestDetails) =>
requestDetails.type !== requestType ||
!imageIdSet.has(requestDetails.additionalDetails.imageId);
};
|