From bc2d5463ff49e68da11d7504f3235e68830002dc Mon Sep 17 00:00:00 2001
From: wangxiaoshuang <825034831@qq.com>
Date: Mon, 30 Mar 2026 16:10:56 +0800
Subject: [PATCH] =?UTF-8?q?MPR=E8=A7=86=E5=9B=BE=E7=9A=84=EF=BC=9A?=
=?UTF-8?q?=E5=8D=81=E5=AD=97=E7=BA=BF=E5=92=8C=E7=AA=97=E5=AE=BD=E7=AA=97?=
=?UTF-8?q?=E4=BD=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dicoms3D/components/MPRViewport.vue | 14 ++---
.../reading/dicoms3D/components/ReadPage.vue | 51 +++++++++++++++++--
.../dicoms3D/components/VolumeViewport.vue | 10 ++--
3 files changed, 59 insertions(+), 16 deletions(-)
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue
index dd7ce476..89cd93ee 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue
@@ -40,10 +40,10 @@
Location: {{
`${Number(imageInfo.location).toFixed(digitPlaces)} mm`
- }}
+ }}
Slice Thickness: {{
`${Number(imageInfo.sliceThickness).toFixed(digitPlaces)} mm`
- }}
+ }}
@@ -276,6 +276,7 @@ export default {
let imageIds = viewport.getImageIds(this.volumeId)
let imageId = imageIds[0]
let volume = cache.getVolume(this.volumeId)
+ console.log(volume, 'volume')
let spacing = volume ? volume.spacing : []
// if (this.series.orientation === 'AXIAL') imageId = viewport.getCurrentImageId()
if (imageId && volume) {
@@ -467,13 +468,13 @@ export default {
this.loading = true
try {
return await createImageIdsAndCacheMetaData({
- modality: obj.Modality,
- imageIds: obj.ImageIds
+ modality: obj.Modality,
+ imageIds: obj.ImageIds
})
} finally {
this.loading = false
}
- },
+ },
async setSeriesInfo(obj, isLocate = false) {
try {
let data = obj
@@ -501,7 +502,8 @@ export default {
DicomEvent.$emit("isloaded", {})
}
}]).then(r => {
- if (data.isLocation) {
+ console.log(this.imageInfo.zoom, 'this.imageInfo.zoom')
+ if (data.isLocation || !this.imageInfo.zoom) {
setTimeout(() => { csUtils.jumpToSlice(viewport.element, { imageIndex: data.SliceIndex }); })
}
})
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
index 6810f7fc..4eeabe3f 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
@@ -1401,7 +1401,9 @@ export default {
toolGroup.addTool(WindowLevelTool.toolName, {
targetViewportIds: volumeViewportIds
})
- toolGroup.addTool(CrosshairsTool.toolName);
+ toolGroup.addTool(CrosshairsTool.toolName, {
+ getReferenceLineColor: this.setCrosshairsToolLineColor
+ });
} else {
toolGroup.addTool(WindowLevelTool.toolName)
}
@@ -2037,6 +2039,21 @@ export default {
const viewport = renderingEngine.getViewport(viewportId)
viewport.render()
},
+ setCrosshairsToolLineColor(viewportId) {
+ let colors = [
+ '#0ca8df',
+ '#ffd10a',
+ '#b6d634',
+ '#3fbe95',
+ '#785db0',
+ '#5070dd',
+ '#505372',
+ '#ff994d',
+ '#fb628b',
+ ]
+ let index = viewportId.split("-").pop()
+ return colors[colors.length - 1 - Number(index)] || colors[0]
+ },
getLengthToolTextLines(data, targetId) {
const cachedVolumeStats = data.cachedStats[targetId]
const { length, unit } = cachedVolumeStats
@@ -2519,6 +2536,9 @@ export default {
viewport.resetProperties()
viewport.render()
renderingEngine.render()
+ if (this.readingTool === 3) {
+ DicomEvent.$emit('isloaded', {})
+ }
},
// 更改视图布局
async changeLayout(v) {
@@ -2797,6 +2817,18 @@ export default {
toggleFullScreen(e, index) {
this.fullScreenIndex = this.fullScreenIndex === index ? null : index
this.activeViewportIndex = index
+ if (this.readingTool === 3 || this.isMPR) {
+ // this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series)
+ this.$nextTick(() => {
+ const renderingEngine = getRenderingEngine(renderingEngineId)
+ renderingEngine.resize(true, false)
+ renderingEngine.render()
+ if (this.readingTool === 3) {
+ DicomEvent.$emit('isloaded', {})
+ }
+ })
+
+ }
if (this.isFusion) {
const viewportIds = [`${this.viewportKey}-0`, `${this.viewportKey}-1`, `${this.viewportKey}-2`]
viewportIds.forEach(id => {
@@ -2899,7 +2931,16 @@ export default {
this.activeViewportIndex = 0
this.fullScreenIndex = null
this.isMPR = false
- return this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(obj)
+ this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(obj)
+ return this.$nextTick(() => {
+ const renderingEngine = getRenderingEngine(renderingEngineId)
+ renderingEngine.resize(true, false)
+ renderingEngine.render()
+ if (this.readingTool === 3) {
+ DicomEvent.$emit('isloaded', {})
+ }
+ })
+
}
if (!obj.IsDicom) {
return this.previewNoneDicoms(obj)
@@ -3523,9 +3564,9 @@ export default {
syncColormap: false
})
let viewportIds = [
- `viewport-volume-0`,
- `viewport-volume-1`,
- `viewport-volume-2`
+ `viewport-MPR-0`,
+ `viewport-MPR-1`,
+ `viewport-MPR-2`
]
viewportIds.forEach((viewportId) => {
MPRVoiSynchronizer.add({
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/VolumeViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/VolumeViewport.vue
index 91ae1046..10ea8748 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/VolumeViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/VolumeViewport.vue
@@ -40,10 +40,10 @@
Location: {{
`${Number(imageInfo.location).toFixed(digitPlaces)} mm`
- }}
+ }}
Slice Thickness: {{
`${Number(imageInfo.sliceThickness).toFixed(digitPlaces)} mm`
- }}
+ }}
@@ -234,7 +234,7 @@ export default {
// 如果行向量主要在 X-Y 平面 (rowZ 很小),则为 Axial。
// 如果行向量主要在 X-Z 平面 (rowY 很小),则为 Sagittal。
// 为了简化,我们可以直接根据视线方向(法线)来判断。
- // 法线方向 = 行向量 × 列向量
+ // 法线方向 = 行向量 × 列向量
const [colX, colY, colZ] = imageOrientationPatient.slice(3);
const normalX = rowY * colZ - rowZ * colY;
const normalY = rowZ * colX - rowX * colZ;
@@ -488,8 +488,8 @@ export default {
this.loading = true
try {
return await createImageIdsAndCacheMetaData({
- modality: obj.Modality,
- imageIds: obj.ImageIds
+ modality: obj.Modality,
+ imageIds: obj.ImageIds
})
} finally {
this.loading = false