import type { MaybeRefOrGetter } from 'vue'; import type { HCesiumManager } from './managers/HCesiumManager'; import type { I卫星 } from './managers/HCesiumManager.types'; import type { HCesiumManagerSatelliteState } from './useHCesiumManager.types'; // 导入状态类型 import { SatelliteCalculator } from './calculators/SatelliteCalculator'; // 导入计算器 import { HCesiumSatelliteManager } from './managers/HCesiumManager.卫星'; // 导入 Satellite Manager /** * 管理 Cesium Viewer 中的卫星实体,根据选中的 ID 列表进行同步。 */ export function useHCesiumManagerSatellite( hCesiumViewerManager: MaybeRefOrGetter, state: MaybeRefOrGetter, // 接收整个状态对象 ) { // SatelliteManager 和 Calculator 实例引用 const satelliteManager = ref(null); // Calculator 通常是无状态的,可以在 setup 作用域创建一次 const satelliteCalculator = new SatelliteCalculator(); // 创建一个从 ID 到卫星选项的映射,方便查找 const satelliteMap = computed(() => { const map = new Map(); const list = toValue(state)?.satellites ?? []; // 从状态对象获取列表 for (const satellite of list) { map.set(satellite.id, satellite); } return map; }); // 使用 watchEffect 自动追踪依赖项 watchEffect(() => { const viewerManagerInstance = toValue(hCesiumViewerManager); if (!viewerManagerInstance || !viewerManagerInstance.getViewer()) { satelliteManager.value?.destroy(); satelliteManager.value = null; return; } if (!satelliteManager.value) { // 创建 SatelliteManager 时传入 ViewerManager 和 Calculator satelliteManager.value = new HCesiumSatelliteManager(viewerManagerInstance, satelliteCalculator); } const manager = satelliteManager.value; // 使用 manager 实例 const selectedIdsSet = toValue(state)?.selectedIds ?? new Set(); // 从状态对象获取选中 ID const currentEntityIds = new Set(manager.getCurrentSatelliteEntities().keys()); // 从 manager 获取当前实体 ID // 1. 移除不再选中的卫星 for (const entityId of currentEntityIds) { if (!selectedIdsSet.has(entityId)) { manager.removeSatellite(entityId); // 使用 manager 的移除方法 } } // 2. 添加新增的选中卫星 for (const selectedId of selectedIdsSet) { if (!currentEntityIds.has(selectedId)) { const satelliteToAdd = satelliteMap.value.get(selectedId); if (satelliteToAdd) { manager.addOrUpdateSatellite(satelliteToAdd); // 使用 manager 的添加/更新方法 } else { // 如果在 satelliteList 中找不到对应的卫星信息,发出警告 console.warn(`无法找到 ID 为 "${selectedId}" 的卫星信息,无法添加到地图。`); } } } }); // watchEffect 结束 // 组件卸载时确保最终清理 onBeforeUnmount(() => { satelliteManager.value?.destroy(); satelliteManager.value = null; // 明确置空 }); // 返回 satelliteMap 可能在某些场景下有用 return { satelliteMap, }; }