diff --git a/src/components/Dicom/DicomCanvas.vue b/src/components/Dicom/DicomCanvas.vue index 68d8a4c7..cbba347f 100644 --- a/src/components/Dicom/DicomCanvas.vue +++ b/src/components/Dicom/DicomCanvas.vue @@ -80,7 +80,7 @@ import * as cornerstone from 'cornerstone-core' import * as cornerstoneMath from 'cornerstone-math' import * as cornerstoneTools from 'cornerstone-tools' -import metaDataProvider from '@/utils/metaDataProvider' +import metaDataProvider, { registerImageSharedCacheKey, unregisterImageSharedCacheKeys } from '@/utils/metaDataProvider' const scroll = cornerstoneTools.import('util/scrollToIndex') import Hammer from 'hammerjs' @@ -211,6 +211,9 @@ export default { this.stackScrollCallback ) }, + beforeDestroy() { + unregisterImageSharedCacheKeys(this.stack?.imageIds) + }, methods: { loadImageStack(dicomSeries, text = '') { @@ -400,6 +403,10 @@ export default { }, onNewImage(e) { e.detail.enabledElement.options = {} + registerImageSharedCacheKey( + e.detail.image?.imageId, + e.detail.image?.sharedCacheKey + ) var data = e.detail.image.data this.dicomInfo.hospital = data.string('x00080080') // let instanceInfo = this.series.instanceInfoList.find(item => item.ImageId === e.detail.image.imageId) diff --git a/src/utils/metaDataProvider.js b/src/utils/metaDataProvider.js index c5c59ae8..e07504de 100644 --- a/src/utils/metaDataProvider.js +++ b/src/utils/metaDataProvider.js @@ -119,6 +119,25 @@ function parseImageId(imageId) { return { scheme, url, frame }; } + +const imageIdToSharedCacheKey = new Map(); + +export function registerImageSharedCacheKey(imageId, sharedCacheKey) { + if (!imageId || !sharedCacheKey) { + return; + } + imageIdToSharedCacheKey.set(imageId, sharedCacheKey); +} +export function unregisterImageSharedCacheKeys(imageIds) { + if (!Array.isArray(imageIds) || imageIds.length === 0) { + return; + } + imageIds.forEach((imageId) => { + if (imageId) { + imageIdToSharedCacheKey.delete(imageId); + } + }); +} function getNumberValues(dataSet, tag, minimumLength) { const values = []; const valueAsString = dataSet.string(tag); @@ -257,10 +276,20 @@ function getSpacingBetweenSlices(dataSet) { } function metaDataProvider(type, imageId) { const parsedImageId = parseImageId(imageId); - const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get( + let dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get( parsedImageId.url ); + if (!dataSet) { + const sharedCacheKey = imageIdToSharedCacheKey.get(imageId); + + if (sharedCacheKey) { + dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get( + sharedCacheKey + ); + } + } + if (!dataSet) { return; } @@ -421,7 +450,6 @@ function metaDataProvider(type, imageId) { let columnPixelSpacing = null; let rowPixelSpacing = null; - if (pixelSpacing) { rowPixelSpacing = pixelSpacing[0]; columnPixelSpacing = pixelSpacing[1]; diff --git a/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue b/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue index bcaa42bb..75cbd5f1 100644 --- a/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue +++ b/src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue @@ -133,7 +133,7 @@ import { mapGetters } from 'vuex' import Contextmenu from 'vue-contextmenujs' Vue.use(Contextmenu) import * as cornerstone from 'cornerstone-core' -import metaDataProvider from '@/utils/metaDataProvider' +import metaDataProvider, { registerImageSharedCacheKey, unregisterImageSharedCacheKeys } from '@/utils/metaDataProvider' import * as cornerstoneMath from 'cornerstone-math' import * as cornerstoneTools from 'cornerstone-tools' @@ -480,6 +480,7 @@ export default { }, beforeDestroy() { // Store.$off('getMeasureData') + unregisterImageSharedCacheKeys(this.stack?.imageIds) DicomEvent.$off('setReadingState') }, methods: { @@ -1279,6 +1280,7 @@ export default { this.resetHideMeasureArr() } const { image } = e.detail + registerImageSharedCacheKey(image?.imageId, image?.sharedCacheKey) const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager const imageId = image.imageId ToolStateManager.clearImageIdToolState(imageId) diff --git a/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue b/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue index 92e832e6..7c424a68 100644 --- a/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue +++ b/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue @@ -126,7 +126,7 @@ import { mapGetters } from 'vuex' import Contextmenu from 'vue-contextmenujs' Vue.use(Contextmenu) import * as cornerstone from 'cornerstone-core' -import metaDataProvider from '@/utils/metaDataProvider' +import metaDataProvider, { registerImageSharedCacheKey, unregisterImageSharedCacheKeys } from '@/utils/metaDataProvider' import * as cornerstoneMath from 'cornerstone-math' import * as cornerstoneTools from 'cornerstone-tools' @@ -473,6 +473,7 @@ export default { }, beforeDestroy() { // Store.$off('getMeasureData') + unregisterImageSharedCacheKeys(this.stack?.imageIds) DicomEvent.$off('setReadingState') DicomEvent.$off('updateImage') }, @@ -1186,6 +1187,7 @@ export default { this.resetHideMeasureArr() } const { image } = e.detail + registerImageSharedCacheKey(image?.imageId, image?.sharedCacheKey) const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager const imageId = image.imageId ToolStateManager.clearImageIdToolState(imageId)