阅片页面视角信息更改
parent
1e6ec0df27
commit
76e328dcca
|
@ -295,6 +295,7 @@
|
||||||
<ul style="width:100px;" v-if="readingTaskState < 2">
|
<ul style="width:100px;" v-if="readingTaskState < 2">
|
||||||
<li v-for="i in customizeStandards" :key="i.toolName" style="text-align:left;">
|
<li v-for="i in customizeStandards" :key="i.toolName" style="text-align:left;">
|
||||||
<a href="#" @click.prevent="setMoreToolActive(i.toolName)">
|
<a href="#" @click.prevent="setMoreToolActive(i.toolName)">
|
||||||
|
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;"/>
|
||||||
{{ $t(i.i18nKey) }}
|
{{ $t(i.i18nKey) }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
HU: {{ mousePosition.value }}
|
HU: {{ mousePosition.value }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="(series.Modality === 'PT' && mousePosition.value)">
|
<div v-else-if="(series.Modality === 'PT' && mousePosition.value)">
|
||||||
SUVbw(g/ml): {{ digitPlaces === -1 ?mousePosition.value.toFixed(3) :mousePosition.value.toFixed(digitPlaces) }}
|
{{mousePosition.modalityUnit}}: {{ digitPlaces === -1 ?mousePosition.value.toFixed(3) :mousePosition.value.toFixed(digitPlaces) }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="mousePosition.value">
|
<div v-else-if="mousePosition.value">
|
||||||
Density: {{ mousePosition.value }}
|
Density: {{ mousePosition.value }}
|
||||||
|
@ -74,6 +74,9 @@
|
||||||
<div v-show="imageInfo.size">
|
<div v-show="imageInfo.size">
|
||||||
W*H: {{ imageInfo.size }}
|
W*H: {{ imageInfo.size }}
|
||||||
</div>
|
</div>
|
||||||
|
<div v-show="imageInfo.zoom">
|
||||||
|
Zoom: {{ imageInfo.zoom }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="series" class="right-bottom-text">
|
<div v-if="series" class="right-bottom-text">
|
||||||
<div v-show="imageInfo.location">Location: {{ `${Number(imageInfo.location).toFixed(digitPlaces)} mm` }}</div>
|
<div v-show="imageInfo.location">Location: {{ `${Number(imageInfo.location).toFixed(digitPlaces)} mm` }}</div>
|
||||||
|
@ -111,9 +114,12 @@ import {
|
||||||
} from '@cornerstonejs/core'
|
} from '@cornerstonejs/core'
|
||||||
import * as cornerstoneTools from '@cornerstonejs/tools'
|
import * as cornerstoneTools from '@cornerstonejs/tools'
|
||||||
import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader'
|
import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader'
|
||||||
const {
|
import {
|
||||||
ToolGroupManager
|
utilities as csToolsUtils
|
||||||
} = cornerstoneTools
|
} from '@cornerstonejs/tools'
|
||||||
|
import { getPTImageIdInstanceMetadata } from '@/views/trials/trials-panel/reading/dicoms/components/Fusion/js/getPTImageIdInstanceMetadata'
|
||||||
|
import ptScalingMetaDataProvider from '@/views/trials/trials-panel/reading/dicoms/components/Fusion/js/ptScalingMetaDataProvider'
|
||||||
|
import { calculateSUVScalingFactors } from '@cornerstonejs/calculate-suv'
|
||||||
import { vec3 } from 'gl-matrix'
|
import { vec3 } from 'gl-matrix'
|
||||||
export default {
|
export default {
|
||||||
name: 'ImageViewport',
|
name: 'ImageViewport',
|
||||||
|
@ -188,6 +194,7 @@ export default {
|
||||||
this.element.addEventListener('CORNERSTONE_TOOLS_MOUSE_MOVE', this.cornerstoneToolsMouseMove)
|
this.element.addEventListener('CORNERSTONE_TOOLS_MOUSE_MOVE', this.cornerstoneToolsMouseMove)
|
||||||
this.element.addEventListener('mouseleave', () => {
|
this.element.addEventListener('mouseleave', () => {
|
||||||
this.mousePosition.index = []
|
this.mousePosition.index = []
|
||||||
|
this.mousePosition.value = null
|
||||||
})
|
})
|
||||||
// console.log(cornerstoneTools)
|
// console.log(cornerstoneTools)
|
||||||
// element.addEventListener('CORNERSTONE_STACK_NEW_IMAGE', this.stackNewImage)
|
// element.addEventListener('CORNERSTONE_STACK_NEW_IMAGE', this.stackNewImage)
|
||||||
|
@ -339,16 +346,31 @@ export default {
|
||||||
viewport.render()
|
viewport.render()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async prefetchMetadataInformation(imageIdsToPrefetch) {
|
async prefetchMetadataInformation(imageIdsToPrefetch, modality) {
|
||||||
let taskPromises = []
|
let taskPromises = []
|
||||||
for (let i = 0; i < imageIdsToPrefetch.length; i++) {
|
for (let i = 0; i < imageIdsToPrefetch.length; i++) {
|
||||||
taskPromises.push(cornerstoneDICOMImageLoader.wadouri.loadImage(imageIdsToPrefetch[i]).promise)
|
taskPromises.push(cornerstoneDICOMImageLoader.wadouri.loadImage(imageIdsToPrefetch[i]).promise)
|
||||||
if (taskPromises.length >= 6 || i === imageIdsToPrefetch.length - 1) {
|
if (taskPromises.length >= 6 || i === imageIdsToPrefetch.length - 1) {
|
||||||
await Promise.all(taskPromises)
|
let res = await Promise.all(taskPromises)
|
||||||
|
if (modality === 'PT') {
|
||||||
|
this.cachePTMetadata(res)
|
||||||
|
}
|
||||||
taskPromises = []
|
taskPromises = []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
cachePTMetadata(images) {
|
||||||
|
images.map(i=>{
|
||||||
|
const instanceMetadata = getPTImageIdInstanceMetadata(i.imageId)
|
||||||
|
if (typeof instanceMetadata.CorrectedImage === 'string') {
|
||||||
|
instanceMetadata.CorrectedImage = instanceMetadata.CorrectedImage.split('\\')
|
||||||
|
}
|
||||||
|
if (instanceMetadata) {
|
||||||
|
const suvScalingFactors = calculateSUVScalingFactors([instanceMetadata])
|
||||||
|
ptScalingMetaDataProvider.addInstance(i.imageId, suvScalingFactors[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
async setSeriesInfo(obj, isLocate = false) {
|
async setSeriesInfo(obj, isLocate = false) {
|
||||||
try {
|
try {
|
||||||
if (this.series && obj.Id === this.series.Id && obj.Description === this.series.Description && !isLocate) {
|
if (this.series && obj.Id === this.series.Id && obj.Description === this.series.Description && !isLocate) {
|
||||||
|
@ -359,9 +381,12 @@ export default {
|
||||||
this.series = { ...obj }
|
this.series = { ...obj }
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
const viewport = renderingEngine.getViewport(this.viewportId)
|
const viewport = renderingEngine.getViewport(this.viewportId)
|
||||||
this.prefetchMetadataInformation(obj.ImageIds)
|
const image = await cornerstoneDICOMImageLoader.wadouri.loadImage(obj.ImageIds[obj.SliceIndex]).promise
|
||||||
|
if (obj.Modality === 'PT') {
|
||||||
|
this.cachePTMetadata([image])
|
||||||
|
}
|
||||||
|
this.prefetchMetadataInformation(obj.ImageIds, obj.Modality)
|
||||||
await viewport.setStack(this.series.Stack, obj.SliceIndex)
|
await viewport.setStack(this.series.Stack, obj.SliceIndex)
|
||||||
// cornerstoneTools.utilities.stackContextPrefetch.enable(viewport.element)
|
|
||||||
viewport.render()
|
viewport.render()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
|
@ -372,13 +397,48 @@ export default {
|
||||||
const worldPoint = currentPoints.world
|
const worldPoint = currentPoints.world
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
const viewport = renderingEngine.getViewport(this.viewportId)
|
const viewport = renderingEngine.getViewport(this.viewportId)
|
||||||
const imageData = viewport.getImageData()
|
let referencedImageId = viewport.getCurrentImageId()
|
||||||
if (!imageData) return
|
const data = viewport.getImageData()
|
||||||
const index = imageData.imageData.worldToIndex(worldPoint)
|
if (!data) return
|
||||||
|
const { dimensions, imageData, metadata, voxelManager } = data
|
||||||
|
const index = imageData.worldToIndex(worldPoint)
|
||||||
index[0] = Math.floor(index[0])
|
index[0] = Math.floor(index[0])
|
||||||
index[1] = Math.floor(index[1])
|
index[1] = Math.floor(index[1])
|
||||||
index[2] = Math.floor(index[2])
|
index[2] = Math.floor(index[2])
|
||||||
this.mousePosition.index = index
|
this.mousePosition.index = index
|
||||||
|
const modality = metadata.Modality
|
||||||
|
let ijk = csUtils.transformWorldToIndex(imageData, worldPoint)
|
||||||
|
ijk = vec3.round(ijk, ijk);
|
||||||
|
if (csUtils.indexWithinDimensions(ijk, dimensions)) {
|
||||||
|
this.isHandleOutsideImage = false
|
||||||
|
let value = voxelManager.getAtIJKPoint(ijk)
|
||||||
|
ijk[2] = viewport.getCurrentImageIdIndex()
|
||||||
|
let modalityUnit
|
||||||
|
if (modality === 'US') {
|
||||||
|
const calibratedResults = csToolsUtils.getCalibratedProbeUnitsAndValue(image, [ijk])
|
||||||
|
const hasEnhancedRegionValues = calibratedResults.values.every(
|
||||||
|
(value) => value !== null
|
||||||
|
)
|
||||||
|
value = (hasEnhancedRegionValues ? calibratedResults.values : value)
|
||||||
|
modalityUnit = hasEnhancedRegionValues
|
||||||
|
? calibratedResults.units
|
||||||
|
: 'raw';
|
||||||
|
} else {
|
||||||
|
const scalingModule = referencedImageId && metaData.get('scalingModule', referencedImageId)
|
||||||
|
const isSuvScaled = typeof scalingModule?.suvbw === 'number'
|
||||||
|
const pixelUnitsOptions = {
|
||||||
|
isPreScaled: csToolsUtils.viewport.isViewportPreScaled(viewport, referencedImageId),
|
||||||
|
isSuvScaled: isSuvScaled,
|
||||||
|
}
|
||||||
|
modalityUnit = csToolsUtils.getPixelValueUnits(
|
||||||
|
modality,
|
||||||
|
referencedImageId,
|
||||||
|
pixelUnitsOptions
|
||||||
|
);
|
||||||
|
}
|
||||||
|
this.mousePosition.value = value
|
||||||
|
this.mousePosition.modalityUnit = modalityUnit
|
||||||
|
}
|
||||||
},
|
},
|
||||||
toggleTask(evt, visitTaskNum, i) {
|
toggleTask(evt, visitTaskNum, i) {
|
||||||
this.$emit('activeViewport', this.viewportIndex)
|
this.$emit('activeViewport', this.viewportIndex)
|
||||||
|
|
Loading…
Reference in New Issue