From 9892070cccc44c677d9355932d1f7586e8ce4746 Mon Sep 17 00:00:00 2001
From: caiyiling <1321909229@qq.com>
Date: Thu, 16 Jul 2026 11:43:10 +0800
Subject: [PATCH] =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=8A=9F=E8=83=BD=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dicoms3D/components/PetCtViewport.vue | 41 ++++++++++-
.../reading/dicoms3D/components/ReadPage.vue | 11 ++-
.../reading/dicoms3D/components/Viewport.vue | 73 +++++++++++++++++--
3 files changed, 115 insertions(+), 10 deletions(-)
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
index 527d9103..92fee015 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
@@ -187,6 +187,7 @@ export default {
originalMarkers: [],
markers: { top: '', right: '', bottom: '', left: '' },
playClipState: false,
+ clipFramesPerSecond: null,
wwwcIdx: 2,
presetName: '',
volumeId: null,
@@ -625,6 +626,22 @@ export default {
}
},
+ syncViewportStaticState() {
+ const renderingEngine = getRenderingEngine(this.renderingEngineId)
+ if (!renderingEngine) return
+ const viewport = renderingEngine.getViewport(this.viewportId)
+ if (!viewport) return
+
+ this.getOrientationMarker()
+ const toolGroup =
+ cornerstoneTools.ToolGroupManager.getToolGroupForViewport(
+ this.viewportId,
+ this.renderingEngineId
+ ) || cornerstoneTools.ToolGroupManager.getToolGroup(this.viewportId)
+ if (toolGroup) {
+ toolGroup.setToolEnabled('ScaleOverlay')
+ }
+ },
setFullScreen(index) {
setTimeout(() => {
const renderingEngine = getRenderingEngine(this.renderingEngineId)
@@ -727,14 +744,33 @@ export default {
}
},
toggleClipPlay(isPlay, framesPerSecond) {
- this.playClipState = isPlay
const renderingEngine = getRenderingEngine(this.renderingEngineId)
+ if (!renderingEngine) return
const viewport = renderingEngine.getViewport(this.viewportId)
+ if (!viewport?.element) return
+
+ const parsedFramesPerSecond = Number(framesPerSecond)
+ const nextFramesPerSecond = Number.isFinite(parsedFramesPerSecond)
+ ? parsedFramesPerSecond
+ : (this.clipFramesPerSecond || 15)
+ const isSameSpeedWhilePlaying = this.playClipState &&
+ isPlay &&
+ this.clipFramesPerSecond === nextFramesPerSecond
if (isPlay) {
- cornerstoneTools.utilities.cine.playClip(viewport.element, { framesPerSecond, loop: true })
+ if (isSameSpeedWhilePlaying) return
+
+ cornerstoneTools.utilities.cine.playClip(viewport.element, {
+ framesPerSecond: nextFramesPerSecond,
+ loop: true,
+ waitForRendered: 1
+ })
+ this.clipFramesPerSecond = nextFramesPerSecond
+ this.playClipState = true
} else {
cornerstoneTools.utilities.cine.stopClip(viewport.element)
+ this.clipFramesPerSecond = null
+ this.playClipState = false
}
},
scrollPage(type) {
@@ -1125,6 +1161,7 @@ export default {
}
viewport.render()
+ this.syncViewportStaticState()
if (this.currentVoiUpper > 0) {
this.voiChange(this.currentVoiUpper)
}
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 c5e212fd..a83444fb 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
@@ -284,7 +284,7 @@