import * as Cesium from 'cesium'; import { VIEWER_OPTIONS_FN } from '../helper/_VIEWER_OPTIONS'; import { configureCesium } from '../helper/configureCesium'; import { configureTimeLine } from '../helper/configureTimeLine'; // Cesium Ion Token 和全局配置,暂时保留在此处,也可考虑移至更全局的初始化位置 Cesium.Ion.defaultAccessToken = import.meta.env.VITE_CESIUM_ION_TOKEN; Object.assign(globalThis, { Cesium }); configureCesium(); export class HCesiumManager { viewer: Cesium.Viewer | null = null; /** * 初始化 Cesium Viewer。 * @param container - 用于承载 Cesium Viewer 的 DOM 元素或其 ID。 * @returns 返回创建的 Viewer 实例,如果失败则返回 null。 */ init(container: ConstructorParameters[0]): Cesium.Viewer | null { if (this.viewer) { console.warn('Cesium Viewer 已初始化,请先销毁再重新初始化。'); return this.viewer; } try { this.viewer = new Cesium.Viewer(container, VIEWER_OPTIONS_FN()); if (__DEV__) Object.assign(globalThis, { viewer: this.viewer }); configureTimeLine(this.viewer); // 可以在这里添加其他 Viewer 级别的配置 this.viewer.scene.debugShowFramesPerSecond = true; // 例如 FPS 显示 console.log('Cesium Viewer 初始化成功。'); return this.viewer; } catch (error) { console.error('Cesium Viewer 初始化失败:', error); this.viewer = null; return null; } } /** * 销毁 Cesium Viewer 实例。 */ destroy(): void { if (this.viewer && !this.viewer.isDestroyed()) { try { // 在销毁 Viewer 前,确保所有通过此 Manager 添加的实体或数据源已被移除 // (或者依赖各个子 Manager 在销毁前自行清理) // this.viewer.entities.removeAll(); // 谨慎使用,可能会移除不应移除的实体 // this.viewer.dataSources.removeAll(true); // 谨慎使用 this.viewer.destroy(); console.log('Cesium Viewer 已销毁。'); } catch (error) { console.error('销毁 Cesium Viewer 时出错:', error); } finally { this.viewer = null; } } else { // console.log('Cesium Viewer 未初始化或已被销毁,无需再次销毁。'); this.viewer = null; // 确保 viewer 为 null } } /** * 向 Viewer 添加一个实体。 * @param entity - 要添加的 Cesium 实体。 * @returns 返回添加的实体,如果 Viewer 未初始化则返回 null。 */ addEntity(entity: Cesium.Entity): Cesium.Entity | null { console.debug(`[HCesiumManager] 添加实体: ${entity.name}`); if (!this.viewer) { console.error('Viewer 未初始化,无法添加实体。'); return null; } try { return this.viewer.entities.add(entity); } catch (error) { console.error('添加实体时出错:', error, entity); return null; } } /** * 根据 ID 从 Viewer 移除一个实体。 * @param entityId - 要移除的实体的 ID。 * @returns 如果成功移除则返回 true,否则返回 false。 */ removeEntityById(entityId: string): boolean { if (!this.viewer) { console.error('Viewer 未初始化,无法移除实体。'); return false; } try { return this.viewer.entities.removeById(entityId); } catch (error) { console.error(`移除 ID 为 "${entityId}" 的实体时出错:`, error); return false; } } /** * 根据实体对象从 Viewer 移除一个实体。 * @param entity - 要移除的实体对象。 * @returns 如果成功移除则返回 true,否则返回 false。 */ removeEntity(entity: Cesium.Entity): boolean { if (!this.viewer) { console.error('Viewer 未初始化,无法移除实体。'); return false; } try { return this.viewer.entities.remove(entity); } catch (error) { console.error('移除实体时出错:', error, entity); return false; } } /** * 根据 ID 获取 Viewer 中的实体。 * @param entityId - 要获取的实体的 ID。 * @returns 返回找到的实体,如果未找到或 Viewer 未初始化则返回 undefined。 */ getEntityById(entityId: string): Cesium.Entity | undefined { if (!this.viewer) { console.error('Viewer 未初始化,无法获取实体。'); return undefined; } try { return this.viewer.entities.getById(entityId); } catch (error) { console.error(`获取 ID 为 "${entityId}" 的实体时出错:`, error); return undefined; } } /** * 获取当前的 Cesium Viewer 实例。 * @returns 返回 Viewer 实例,如果未初始化则返回 null。 */ getViewer(): Cesium.Viewer | null { return this.viewer; } }