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 @@