添加按钮 控制左右画面是否同步

This commit is contained in:
huangchenhao 2025-11-29 15:09:50 +08:00
parent 0a780eb608
commit 539f1b16db
2 changed files with 90 additions and 9 deletions

View File

@ -1,4 +1,4 @@
import { ref, onUnmounted } from 'vue' import { ref, onUnmounted, watch } from 'vue'
import * as Cesium from 'cesium' import * as Cesium from 'cesium'
import { use3DTiles } from './use3DTiles' import { use3DTiles } from './use3DTiles'
import { useMapMarkers } from '../composables/useMapMarkers' import { useMapMarkers } from '../composables/useMapMarkers'
@ -19,6 +19,26 @@ export function useDualMapCompare() {
/** 对比模式是否激活 */ /** 对比模式是否激活 */
const isCompareMode = ref(false) const isCompareMode = ref(false)
/** 相机同步是否启用 */
const isCameraSyncEnabled = ref(false)
watch(isCameraSyncEnabled, (newValue) => {
console.log(`[useDualMapCompare] 相机同步状态变化: ${newValue}`)
if (newValue) {
// 启用同步
if (leftViewer.value && rightViewer.value && !leftViewer.value.isDestroyed() && !rightViewer.value.isDestroyed()) {
console.log('[useDualMapCompare] 自动启动相机同步')
startCameraSync(rightViewer.value, leftViewer.value)
} else {
console.warn('[useDualMapCompare] 无法自动启动相机同步Viewer未初始化或已销毁')
}
} else {
// 禁用同步
console.log('[useDualMapCompare] 自动停止相机同步')
stopCameraSync()
}
})
/** 相机同步监听器移除函数 */ /** 相机同步监听器移除函数 */
let cameraSyncRemover = null let cameraSyncRemover = null
@ -344,6 +364,40 @@ export function useDualMapCompare() {
console.log('[useDualMapCompare] 智能同步设置完成') console.log('[useDualMapCompare] 智能同步设置完成')
} }
/**
* 启动相机同步
* @param {Cesium.Viewer} rightViewerInstance - 右侧Viewer主地图驱动者
* @param {Cesium.Viewer} leftViewerInstance - 左侧Viewer对比地图跟随者
*/
const startCameraSync = (rightViewerInstance, leftViewerInstance) => {
if (isCameraSyncEnabled.value) {
setupCameraSync(rightViewerInstance, leftViewerInstance)
console.log('[useDualMapCompare] 相机同步已启用')
} else {
console.warn('[useDualMapCompare] 尝试启用相机同步,但同步开关未开启')
}
}
/**
* 停止相机同步
*/
const stopCameraSync = () => {
if (cameraSyncRemover) {
cameraSyncRemover()
cameraSyncRemover = null
console.log('[useDualMapCompare] 相机同步已停止')
}
}
/**
* 切换相机同步开关
* @param {boolean} active - true启用false禁用
*/
const toggleCameraSync = (active) => {
console.log(`[useDualMapCompare] 手动切换相机同步: ${active}`)
isCameraSyncEnabled.value = active
}
/** /**
* 启用对比模式 * 启用对比模式
* @param {Cesium.Viewer} rightViewerInstance - 右侧Viewer实例主地图灾后场景 * @param {Cesium.Viewer} rightViewerInstance - 右侧Viewer实例主地图灾后场景
@ -533,8 +587,10 @@ export function useDualMapCompare() {
leftViewerInstance.scene.requestRender() leftViewerInstance.scene.requestRender()
leftViewerInstance.camera.changed.raiseEvent() leftViewerInstance.camera.changed.raiseEvent()
// 设置相机同步(单向:右→左) // 设置相机同步(单向:右→左),根据开关状态来决定是否启动
setupCameraSync(rightViewerInstance, leftViewerInstance) if (isCameraSyncEnabled.value) {
startCameraSync(rightViewerInstance, leftViewerInstance)
}
// 根据选项决定是否加载左侧模型 // 根据选项决定是否加载左侧模型
if (!skipLeftModelLoad) { if (!skipLeftModelLoad) {
@ -578,10 +634,7 @@ export function useDualMapCompare() {
console.log('[useDualMapCompare] 禁用对比模式...') console.log('[useDualMapCompare] 禁用对比模式...')
// 移除相机同步 // 移除相机同步
if (cameraSyncRemover) { stopCameraSync()
cameraSyncRemover()
cameraSyncRemover = null
}
// 销毁左侧Viewer // 销毁左侧Viewer
if (leftViewer.value && !leftViewer.value.isDestroyed()) { if (leftViewer.value && !leftViewer.value.isDestroyed()) {
@ -666,9 +719,13 @@ export function useDualMapCompare() {
leftViewer, leftViewer,
rightViewer, rightViewer,
isCompareMode, isCompareMode,
isCameraSyncEnabled,
enableCompareMode, enableCompareMode,
disableCompareMode, disableCompareMode,
toggleCompareMode toggleCompareMode,
toggleCameraSync,
startCameraSync,
stopCameraSync
} }
} }

View File

@ -36,6 +36,14 @@
<!-- 场景标签层 - 独立层级显示在遮罩层之上 --> <!-- 场景标签层 - 独立层级显示在遮罩层之上 -->
<div class="situational-awareness__scene-labels-layer"> <div class="situational-awareness__scene-labels-layer">
<ActionButton
type="primary"
v-if="isCompareMode"
class="situational-awareness__sync-btn"
@click="toggleCameraSync"
:text="isCameraSyncEnabled ? '同步' : '不同步'"
>
</ActionButton>
<!-- 灾前现场实景标签 - 在中间分割线左侧 --> <!-- 灾前现场实景标签 - 在中间分割线左侧 -->
<SceneLabel <SceneLabel
v-if="isCompareMode" v-if="isCompareMode"
@ -325,7 +333,14 @@ const {
// ==================== // ====================
// //
const { isCompareMode, toggleCompareMode } = useDualMapCompare(); const { isCompareMode, toggleCompareMode, isCameraSyncEnabled } =
useDualMapCompare();
const toggleCameraSync = () => {
ElMessage.success(isCameraSyncEnabled.value ? "画面同步已关闭" : "画面同步已启用");
console.log("[index.vue] 切换相机同步状态");
isCameraSyncEnabled.value = !isCameraSyncEnabled.value;
};
// //
const { const {
@ -1806,6 +1821,15 @@ provide("triggerJump", (duration = 5, height = 30) => {
inset: 0; inset: 0;
z-index: 10; z-index: 10;
pointer-events: none; // pointer-events: none; //
.situational-awareness__sync-btn {
position: absolute;
left: 40%;
top: 133px;
height: 31px;
transform: translateX(calc(-100% - vw(10)));
pointer-events: auto; //
}
} }
// - 使 // - 使