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 1/5] =?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`
- }}
+ }}
WW/WL: {{ imageInfo.wwwc }}
@@ -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`
- }}
+ }}
WW/WL: {{ imageInfo.wwwc }}
@@ -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
From 3fe16b4166ce44e882a8d9b1889d1c68fcc28212 Mon Sep 17 00:00:00 2001
From: wangxiaoshuang <825034831@qq.com>
Date: Mon, 30 Mar 2026 16:19:05 +0800
Subject: [PATCH 2/5] =?UTF-8?q?=E4=BD=93=E6=95=B0=E6=8D=AE=E9=98=85?=
=?UTF-8?q?=E7=89=87=E5=9B=9B=E8=A7=92=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../reading/dicoms3D/components/MPRViewport.vue | 7 +++----
.../reading/dicoms3D/components/VolumeViewport.vue | 4 ++++
2 files changed, 7 insertions(+), 4 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 89cd93ee..93bb25c6 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`
- }}
+ }}
WW/WL: {{ imageInfo.wwwc }}
@@ -127,7 +127,6 @@ export default {
sliceThickness: null,
wwwc: null,
total: 0,
- sliceThickness: 0
},
digitPlaces: 2,
orientationMarkers: [],
@@ -276,8 +275,8 @@ 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 : []
+ console.log(spacing, 'spacing')
// if (this.series.orientation === 'AXIAL') imageId = viewport.getCurrentImageId()
if (imageId && volume) {
this.$emit('setMPRInfo', { type: this.series.orientation, key: "imageNum", value: detail.numberOfSlices })
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 10ea8748..c6ba91af 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/VolumeViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/VolumeViewport.vue
@@ -281,6 +281,10 @@ export default {
this.imageInfo.size = `${imagePlaneModule.columns}*${imagePlaneModule.rows}`
this.imageInfo.location = imagePlaneModule.sliceLocation
this.imageInfo.total = detail.numberOfSlices
+ let type = this.determineImagePlane(imagePlaneModule.imageOrientationPatient)
+ let volume = cache.getVolume(this.volumeId)
+ let spacing = volume ? volume.spacing : []
+ this.imageInfo.sliceThickness = type === 'AXIAL' ? spacing[2] : spacing[0]
this.getOrientationMarker()
if (this.series && this.series.Id) {
let annotations = cornerstoneTools.annotation.state.getAllAnnotations().filter(item => item.metadata.toolName !== 'ScaleOverlay' && item.metadata.volumeId !== this.volumeId && !item.metadata.segmentationId && item.seriesId !== this.series.Id)
From 920d0b21c6494953c72a041140fbce3a6a85fdcf Mon Sep 17 00:00:00 2001
From: wangxiaoshuang <825034831@qq.com>
Date: Mon, 30 Mar 2026 16:50:25 +0800
Subject: [PATCH 3/5] =?UTF-8?q?=E3=80=90dicom=E5=88=86=E5=89=B2=E3=80=91?=
=?UTF-8?q?=E5=BD=93=E5=89=8D=E5=88=86=E7=BB=84=E9=80=89=E6=8B=A9=E4=B8=BA?=
=?UTF-8?q?=E5=88=86=E7=BB=842=EF=BC=8C=E5=88=86=E7=BB=842=E6=B2=A1?=
=?UTF-8?q?=E6=9C=89=E6=A0=87=E8=AE=B0=E6=95=B0=E6=8D=AE=EF=BC=8C=E5=BD=93?=
=?UTF-8?q?=E5=88=87=E5=85=A5mpr=E6=A8=A1=E5=BC=8F=E6=97=B6=EF=BC=8C?=
=?UTF-8?q?=E6=AD=A4=E6=97=B6=E6=98=BE=E7=A4=BA=E4=BA=86=E5=88=86=E7=BB=84?=
=?UTF-8?q?1=E7=9A=84=E6=A0=87=E8=AE=B0=EF=BC=8C=E8=BF=99=E9=87=8C?=
=?UTF-8?q?=E5=BD=B1=E5=83=8F=E6=A0=87=E8=AE=B0=E5=BA=94=E8=AF=A5=E4=B8=8E?=
=?UTF-8?q?=E5=8F=B3=E4=BE=A7=E5=88=86=E5=89=B2=E9=80=89=E6=8B=A9=E7=BB=84?=
=?UTF-8?q?=E5=90=8C=E6=AD=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../reading/dicoms3D/components/Segmentations.vue | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
index 7cd876d5..06f0e03c 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
@@ -559,7 +559,7 @@ export default {
let item = arr[j]
let bidirectional = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
item.bidirectionalView = view
- if (!bidirectional) return false
+ if (!bidirectional) continue
annotation.visibility.setAnnotationVisibility(bidirectional.annotationUID, view)
}
this.resetViewport()
@@ -720,7 +720,7 @@ export default {
segmentIndex: segmentIndex,
segmentationId: this.segmentationId,
SegmentLabel: `Segment ${segmentIndex}`,
- color: item.segments.length > this.colors.length ? this.colors[0] : this.colors[item.segments.length],
+ color: item.segments.length >= this.colors.length ? this.colors[0] : this.colors[item.segments.length],
stats: null,
bidirectional: null,
bidirectionalView: true,
@@ -1485,6 +1485,7 @@ export default {
})
}
this.isloaded = false
+ this.readingSegmentByConfig()
}
} catch (err) {
this.loading = false
From c5c9e4364c8db55a80465f7f02f84ce541e1f989 Mon Sep 17 00:00:00 2001
From: wangxiaoshuang <825034831@qq.com>
Date: Mon, 30 Mar 2026 17:17:17 +0800
Subject: [PATCH 4/5] =?UTF-8?q?=E3=80=90dicom=E5=88=86=E5=89=B2=E3=80=91?=
=?UTF-8?q?=E5=88=86=E6=AE=B5=E8=8F=9C=E5=8D=95=E6=8C=89=E9=92=AE=E7=82=B9?=
=?UTF-8?q?=E5=87=BB=E5=90=8E=EF=BC=8C=E5=86=8D=E7=82=B9=E5=87=BB=E5=8F=A6?=
=?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=88=86=E6=AE=B5=E8=8F=9C=E5=8D=95=E6=8C=89?=
=?UTF-8?q?=E9=92=AE=EF=BC=8C=E4=B8=8A=E4=B8=80=E4=B8=AA=E5=B1=95=E7=A4=BA?=
=?UTF-8?q?=E7=9A=84=E5=BC=B9=E7=AA=97=E5=BA=94=E8=AF=A5=E6=B6=88=E5=A4=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../reading/dicoms3D/components/Segmentations.vue | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
index 06f0e03c..60ed03ee 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
@@ -205,7 +205,9 @@
-
+
{{ $t('trials:reading:Segmentations:button:renameSegmentGroup') }}
@@ -352,7 +354,8 @@ export default {
drawing: false, // 是否正在分割
isDel: false,
digitPlaces: 2,
- isloaded: false
+ isloaded: false,
+ popoverId: null
}
},
mounted() {
@@ -376,6 +379,9 @@ export default {
})
const digitPlaces = Number(localStorage.getItem('digitPlaces'))
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
+ // document.addEventListener("click", () => {
+ // this.popoverId = null
+ // });
},
computed: {
curSegmentGroup() {
@@ -411,6 +417,9 @@ export default {
}
},
methods: {
+ handleClickPopover(item) {
+ this.popoverId = `popover-${item.segmentationId}_${item.segmentIndex}`
+ },
initThreshold() {
if (!this.ThresholdTools.includes(this.activeTool)) {
this.setToolActive(this.ThresholdTools[0])
From 76e6ef087fda8aefb0f201a898968cd14d4cc7e5 Mon Sep 17 00:00:00 2001
From: wangxiaoshuang <825034831@qq.com>
Date: Mon, 30 Mar 2026 17:33:52 +0800
Subject: [PATCH 5/5] =?UTF-8?q?=E5=88=86=E5=89=B2=E6=A0=87=E8=AE=B0?=
=?UTF-8?q?=E7=9A=84=E9=A2=9C=E8=89=B2=E9=9C=80=E8=A6=81=E9=9A=8F=E6=9C=BA?=
=?UTF-8?q?=EF=BC=8C=E4=B8=8D=E8=83=BD=E9=87=8D=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dicoms3D/components/Segmentations.vue | 95 ++++++++++++++++++-
1 file changed, 91 insertions(+), 4 deletions(-)
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
index 60ed03ee..a58bd948 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
@@ -120,7 +120,7 @@
{{
$t('trials:reading:Segmentations:title:InactiveSegmentationsShow')
- }}
+ }}