feat: upgrade iflow-engine-base to v1.0.5, add pause/resume rendering API

- Update iflow-engine-base from 1.0.1 to 1.0.5
- Change default engine version from v1 to v2
- Add pauseRendering() and resumeRendering() methods
- Add switch model feature in demos
- Update model URLs in demos
- Add new documentation files
This commit is contained in:
yuding
2026-01-23 16:27:04 +08:00
parent 31b60e84ce
commit 89ae01ffd7
15 changed files with 3167 additions and 16 deletions

502
docs/ARCHITECTURE.md Normal file
View File

@@ -0,0 +1,502 @@
# iflow-engine SDK 架构文档
## 概述
iflow-engine 是一个面向开发者的 BIM 3D 引擎 SDK采用分层架构设计提供模型查看、测量、剖切、漫游等功能。
## 架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ BimEngine │
│ (主入口 / 门面模式) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ManagerRegistry │ │
│ │ (单例 / 全局注册表) │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ EventEmitter (事件总线) │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Managers Layer │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │EngineManager │ │ToolbarManager│ │ DialogManager│ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │MeasureDialog │ │SectionDialog │ │WalkControl │ │ │
│ │ │Manager │ │Manager │ │Manager │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ ... (15 个管理器) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Components Layer │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ Engine │ │ Dialog │ │ Tree │ │ Menu │ │ButtonGr│ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │Collapse│ │ Tab │ │Descript│ │Measure │ │Section │ │ │
│ │ │ │ │ │ │ │ │Panel │ │Panel │ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ │ ... (20+ 个组件) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Services Layer │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ LocaleManager │ │ ThemeManager │ │ │
│ │ │ (国际化服务) │ │ (主题服务) │ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Core Layer │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ EventEmitter │ │ BaseManager │ │BaseDialog │ │ │
│ │ │ │ │ │ │Manager │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ External Dependencies │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ iflow-engine-base │ │ Three.js │ │
│ │ (第三方 3D 引擎核心) │ │ (3D 渲染库) │ │
│ └──────────────────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
## 分层说明
### 1. BimEngine (入口层)
**职责**: 作为 SDK 的唯一入口,整合所有功能,提供简洁的公开 API。
**设计模式**: 门面模式 (Facade Pattern)
**核心 API**:
- 初始化引擎和容器
- 设置主题和语言
- 访问各个管理器
```typescript
const engine = new BimEngine('container', {
locale: 'zh-CN',
theme: 'dark'
});
// 访问管理器
engine.engine.loadModel('model.gltf');
engine.toolbar.show();
engine.measure.show();
```
### 2. ManagerRegistry (注册表层)
**职责**: 全局单例,集中管理所有 Manager 实例,提供跨 Manager 通信。
**设计模式**: 单例模式 (Singleton) + 服务定位器 (Service Locator)
**特点**:
- 避免 Manager 之间的循环依赖
- 提供类型安全的事件系统
- 支持动态访问任意 Manager
```typescript
const registry = ManagerRegistry.getInstance();
registry.toolbar?.show();
registry.emit('engine:model-loaded', { url: 'model.gltf' });
```
### 3. Managers Layer (管理器层)
**职责**: 处理业务逻辑,协调组件交互,管理组件生命周期。
**设计模式**: 模板方法模式 (Template Method)
**管理器分类**:
| 类别 | 管理器 | 职责 |
|------|--------|------|
| 核心 | EngineManager | 3D 引擎管理 |
| UI 容器 | ToolbarManager, DialogManager, ButtonGroupManager | 容器组件管理 |
| 交互 | RightKeyManager, PropertyPanelManager, ConstructTreeManagerBtn | 用户交互 |
| 工具 | MeasureDialogManager, SectionPlaneDialogManager, SectionAxisDialogManager, SectionBoxDialogManager | 3D 操作工具 |
| 漫游 | WalkControlManager, WalkPathDialogManager, WalkPlanViewDialogManager, MapDialogManager | 漫游功能 |
### 4. Components Layer (组件层)
**职责**: 纯 UI 渲染,不包含业务逻辑。
**设计模式**: 组合模式 (Composite Pattern)
**组件接口**:
```typescript
interface IBimComponent {
element: HTMLElement;
init(): void;
setTheme(theme: ThemeConfig): void;
setLocales?(): void;
destroy(): void;
}
```
**组件分类**:
| 类别 | 组件 | 说明 |
|------|------|------|
| 核心 | Engine | 3D 视口容器 |
| 容器 | Dialog, Tree, Menu, ButtonGroup | 承载内容的容器组件 |
| 面板 | MeasurePanel, SectionPlanePanel, WalkControlPanel | 功能面板 |
| 展示 | Collapse, Tab, Description | 数据展示组件 |
### 5. Services Layer (服务层)
**职责**: 提供横切关注点的全局服务。
**设计模式**: 单例模式 + 观察者模式
| 服务 | 职责 |
|------|------|
| LocaleManager | 国际化,多语言支持 |
| ThemeManager | 主题管理,明暗切换 |
### 6. Core Layer (核心层)
**职责**: 提供基础设施和抽象。
| 类 | 职责 |
|-----|------|
| EventEmitter | 事件发布/订阅 |
| BaseManager | Manager 基类,提供注册表访问和事件管理 |
| BaseDialogManager | 对话框 Manager 基类,封装对话框生命周期 |
## 设计模式详解
### 1. 单例模式 (Singleton)
**应用**: ManagerRegistry, LocaleManager, ThemeManager
**目的**: 确保全局唯一实例,提供全局访问点。
```typescript
export class ManagerRegistry {
private static instance: ManagerRegistry | null = null;
public static getInstance(): ManagerRegistry {
if (!ManagerRegistry.instance) {
ManagerRegistry.instance = new ManagerRegistry();
}
return ManagerRegistry.instance;
}
public static reset(): void {
ManagerRegistry.instance = null;
}
}
```
### 2. 观察者模式 (Observer)
**应用**: EventEmitter, 服务订阅
**目的**: 解耦事件发送者和接收者,支持多对多通信。
```typescript
// 订阅
const unsubscribe = registry.on('engine:model-loaded', (payload) => {
console.log('Model loaded:', payload.url);
});
// 发布
registry.emit('engine:model-loaded', { url: 'model.gltf' });
// 取消订阅
unsubscribe();
```
### 3. 模板方法模式 (Template Method)
**应用**: BaseManager, BaseDialogManager
**目的**: 定义算法骨架,允许子类重写特定步骤。
```typescript
export abstract class BaseDialogManager extends BaseManager {
// 模板方法
public show(): void {
this.destroyDialog();
const content = this.createContent(); // 抽象方法
this.createDialog(content);
this.onDialogCreated(); // 钩子方法
}
// 抽象方法 - 子类必须实现
protected abstract createContent(): HTMLElement;
// 钩子方法 - 子类可选重写
protected onDialogCreated(): void {}
protected onDialogClose(): void {}
}
```
### 4. 工厂模式 (Factory)
**应用**: BimEngine 初始化
**目的**: 封装对象创建逻辑,统一创建流程。
```typescript
private init() {
this.engine = new EngineManager(this.wrapper);
this.dialog = new DialogManager(this.wrapper);
this.toolbar = new ToolbarManager(this.wrapper);
// ... 创建其他管理器
}
```
## 数据流
### 1. 用户交互流
```
用户操作 (点击按钮)
Toolbar 组件捕获事件
ToolbarManager 处理
发送事件到 Registry
目标 Manager 响应
更新相关组件 UI
```
### 2. 主题变更流
```
用户调用 setTheme('dark')
ThemeManager.setTheme()
更新内部状态
通知所有订阅者
各组件 setTheme() 被调用
更新 CSS 变量和样式
```
### 3. 国际化变更流
```
用户调用 setLocale('en-US')
LocaleManager.setLocale()
更新内部状态
通知所有订阅者
各组件 setLocales() 被调用
重新渲染文本内容
```
## 模块依赖关系
```mermaid
graph TD
BimEngine --> ManagerRegistry
BimEngine --> LocaleManager
BimEngine --> ThemeManager
ManagerRegistry --> EventEmitter
EngineManager --> BaseManager
ToolbarManager --> BaseManager
DialogManager --> BaseManager
MeasureDialogManager --> BaseDialogManager
SectionPlaneDialogManager --> BaseDialogManager
WalkControlManager --> BaseManager
BaseDialogManager --> BaseManager
BaseManager --> ManagerRegistry
Engine --> ThemeManager
Dialog --> ThemeManager
Tree --> ThemeManager
Tree --> LocaleManager
Menu --> ThemeManager
Menu --> LocaleManager
ThemeManager --> darkTheme
ThemeManager --> lightTheme
LocaleManager --> zhCN
LocaleManager --> enUS
```
## 扩展点
### 1. 添加新 Manager
```typescript
import { BaseManager } from '../core/base-manager';
export class CustomManager extends BaseManager {
constructor() {
super();
}
public initialize(): void {
this.subscribe('engine:model-loaded', this.onModelLoaded.bind(this));
}
private onModelLoaded(payload: any): void {
// 处理逻辑
}
public destroy(): void {
super.destroy();
}
}
```
### 2. 添加新对话框 Manager
```typescript
import { BaseDialogManager } from '../core/base-dialog-manager';
export class CustomDialogManager extends BaseDialogManager {
protected get dialogId(): string {
return 'custom-dialog';
}
protected get dialogTitle(): string {
return 'custom.dialogTitle';
}
protected createContent(): HTMLElement {
const div = document.createElement('div');
// 创建内容
return div;
}
}
```
### 3. 添加新组件
```typescript
import type { ThemeConfig } from '../themes/types';
export class CustomComponent {
public element: HTMLElement;
constructor(private options: CustomOptions) {
this.element = document.createElement('div');
}
public init(): void {
// 初始化
}
public setTheme(theme: ThemeConfig): void {
// 应用主题
}
public destroy(): void {
this.element.remove();
}
}
```
### 4. 添加新语言
1. 创建语言文件 `src/locales/ja-JP.ts`
2. 更新类型 `src/locales/types.ts`
3. 注册到 LocaleManager
### 5. 添加新主题
```typescript
import { createThemeFromPartial, lightTheme } from 'iflow-engine';
const customTheme = createThemeFromPartial(lightTheme, {
name: 'custom',
primary: '#ff6b6b',
// 其他自定义属性
});
themeManager.setCustomTheme(customTheme);
```
## 事件系统
### 事件类型
| 类别 | 事件 | 数据 |
|------|------|------|
| UI | `ui:open-dialog` | `{ id: string; data?: any }` |
| UI | `ui:close-dialog` | `{ id: string }` |
| 引擎 | `engine:model-loaded` | `{ url: string }` |
| 引擎 | `engine:object-clicked` | `{ objectId: string; position: Point3D }` |
| 树 | `ui:tree-node-check` | `{ id: string; checked: boolean; node: any }` |
| 树 | `ui:tree-node-select` | `{ id: string; selected: boolean; node: any }` |
| 系统 | `sys:theme-changed` | `{ theme: string }` |
| 系统 | `sys:locale-changed` | `{ locale: string }` |
| 漫游 | `walk:speed-change` | `{ speed: number }` |
| 漫游 | `walk:path-mode-toggle` | `{ isActive: boolean }` |
| 地图 | `map:opened` | `{}` |
| 地图 | `map:closed` | `{}` |
### 事件使用
```typescript
// 发送事件
registry.emit('engine:model-loaded', { url: 'model.gltf' });
// 订阅事件
const unsubscribe = registry.on('engine:model-loaded', (payload) => {
console.log('Model loaded:', payload.url);
});
// 在 Manager 中使用
this.subscribe('engine:model-loaded', this.handleModelLoaded.bind(this));
this.emit('custom:action', { data: 'value' });
```
## 性能考虑
### 1. 懒加载
- 组件按需创建,不预先实例化
- 对话框在首次 show() 时才创建 DOM
### 2. 事件清理
- BaseManager 自动追踪订阅destroy 时统一清理
- 避免内存泄漏
### 3. DOM 操作优化
- 使用 requestAnimationFrame 节流拖拽/缩放
- 批量 DOM 更新
### 4. 主题切换
- 使用 CSS 变量,避免重绘整个组件树
- 订阅机制确保只更新必要的组件
---
**文档生成时间**: 2026-01-23
**文档版本**: 1.0.0

388
docs/GETTING_STARTED.md Normal file
View File

@@ -0,0 +1,388 @@
# iflow-engine SDK 快速开始
## 安装
### NPM
```bash
npm install iflow-engine
```
### Yarn
```bash
yarn add iflow-engine
```
### PNPM
```bash
pnpm add iflow-engine
```
## 基础使用
### 1. 创建 HTML 容器
```html
<div id="bim-container" style="width: 100%; height: 100vh;"></div>
```
### 2. 初始化引擎
```typescript
import { BimEngine } from 'iflow-engine';
// 创建引擎实例
const engine = new BimEngine('bim-container', {
locale: 'zh-CN', // 语言:'zh-CN' | 'en-US'
theme: 'light' // 主题:'light' | 'dark'
});
```
### 3. 加载模型
```typescript
// 初始化 3D 引擎
engine.engine?.initialize();
// 加载模型
engine.engine?.loadModel('https://example.com/model.gltf', {
autoFit: true // 自动适配视角
});
```
## 完整示例
### Vue 3
```vue
<template>
<div ref="containerRef" class="bim-container"></div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import { BimEngine } from 'iflow-engine';
const containerRef = ref<HTMLElement | null>(null);
let engine: BimEngine | null = null;
onMounted(() => {
if (containerRef.value) {
engine = new BimEngine(containerRef.value, {
locale: 'zh-CN',
theme: 'light'
});
// 初始化 3D 引擎
engine.engine?.initialize();
// 加载模型
engine.engine?.loadModel('/models/building.gltf');
}
});
onUnmounted(() => {
engine?.destroy();
});
</script>
<style scoped>
.bim-container {
width: 100%;
height: 100vh;
}
</style>
```
### React
```tsx
import { useRef, useEffect } from 'react';
import { BimEngine } from 'iflow-engine';
export function BimViewer() {
const containerRef = useRef<HTMLDivElement>(null);
const engineRef = useRef<BimEngine | null>(null);
useEffect(() => {
if (containerRef.current && !engineRef.current) {
engineRef.current = new BimEngine(containerRef.current, {
locale: 'zh-CN',
theme: 'light'
});
// 初始化 3D 引擎
engineRef.current.engine?.initialize();
// 加载模型
engineRef.current.engine?.loadModel('/models/building.gltf');
}
return () => {
engineRef.current?.destroy();
engineRef.current = null;
};
}, []);
return <div ref={containerRef} style={{ width: '100%', height: '100vh' }} />;
}
```
### 原生 HTML
```html
<!DOCTYPE html>
<html>
<head>
<title>iflow-engine Demo</title>
<style>
#bim-container {
width: 100%;
height: 100vh;
}
</style>
</head>
<body>
<div id="bim-container"></div>
<script type="module">
import { BimEngine } from './lib/iflow-engine.es.js';
const engine = new BimEngine('bim-container', {
locale: 'zh-CN',
theme: 'light'
});
// 初始化 3D 引擎
engine.engine?.initialize();
// 加载模型
engine.engine?.loadModel('./models/building.gltf');
</script>
</body>
</html>
```
## 主题切换
```typescript
// 切换到暗色主题
engine.setTheme('dark');
// 切换到亮色主题
engine.setTheme('light');
// 自定义主题
engine.setCustomTheme({
name: 'custom',
primary: '#ff6b6b',
primaryHover: '#ff5252',
primaryActive: '#ff4757',
// ... 其他属性
});
```
## 语言切换
```typescript
// 切换到英文
engine.setLocale('en-US');
// 切换到中文
engine.setLocale('zh-CN');
```
## 工具栏操作
```typescript
// 显示/隐藏工具栏
engine.toolbar?.show();
engine.toolbar?.hide();
// 添加自定义按钮
engine.toolbar?.addButton({
id: 'custom-btn',
type: 'button',
label: '自定义',
icon: '<svg>...</svg>',
onClick: () => {
console.log('Custom button clicked');
}
});
// 设置按钮激活状态
engine.toolbar?.setBtnActive('measure', true);
```
## 测量功能
```typescript
// 显示测量面板
engine.measure?.show();
// 切换测量模式
engine.measure?.switchMode('distance'); // 距离
engine.measure?.switchMode('angle'); // 角度
engine.measure?.switchMode('volume'); // 体积
engine.measure?.switchMode('elevation'); // 标高
engine.measure?.switchMode('slope'); // 坡度
// 获取测量配置
const config = engine.measure?.getConfig();
console.log(config); // { unit: 'mm', precision: 2 }
// 设置测量配置
engine.measure?.setConfig({ unit: 'cm', precision: 1 });
// 清除所有测量结果
engine.measure?.clearAll();
```
## 剖切功能
### 平面剖切
```typescript
// 显示剖切面板
engine.sectionPlane?.show();
// 隐藏剖切面板
engine.sectionPlane?.hide();
```
### 轴向剖切
```typescript
// 显示轴向剖切
engine.sectionAxis?.show();
// 设置剖切轴向
engine.sectionAxis?.setActiveAxis('x'); // X 轴
engine.sectionAxis?.setActiveAxis('y'); // Y 轴
engine.sectionAxis?.setActiveAxis('z'); // Z 轴
```
### 剖切盒
```typescript
// 显示剖切盒
engine.sectionBox?.show();
// 获取剖切范围
const range = engine.sectionBox?.getRange();
console.log(range); // { minX, maxX, minY, maxY, minZ, maxZ }
// 设置剖切范围
engine.sectionBox?.setRange({ minX: 0, maxX: 100 });
// 反向剖切
engine.sectionBox?.setReversedState(true);
```
## 漫游功能
```typescript
// 显示漫游控制面板
engine.walkControl?.show();
// 隐藏漫游控制面板
engine.walkControl?.hide();
```
## 事件监听
```typescript
// 监听模型加载完成
const unsubscribe = engine.on('engine:model-loaded', (payload) => {
console.log('Model loaded:', payload.url);
});
// 监听对象点击
engine.on('engine:object-clicked', (payload) => {
console.log('Object clicked:', payload.objectId, payload.position);
});
// 监听主题变更
engine.on('sys:theme-changed', (payload) => {
console.log('Theme changed:', payload.theme);
});
// 取消监听
unsubscribe();
```
## 销毁引擎
```typescript
// 在组件卸载或页面关闭时销毁
engine.destroy();
```
## TypeScript 类型
SDK 提供完整的 TypeScript 类型支持:
```typescript
import type {
// 主入口
BimEngine,
// 配置类型
EngineOptions,
ModelLoadOptions,
DialogOptions,
DialogPosition,
ButtonConfig,
ButtonGroupOptions,
TreeOptions,
TreeNodeConfig,
TreeNodeCheckState,
CollapseOptions,
CollapseItemConfig,
DescriptionOptions,
DescriptionItem,
// 主题类型
ThemeConfig,
ThemeType,
// 事件类型
EngineEvents,
} from 'iflow-engine';
```
## 常见问题
### 1. 模型加载失败
- 检查模型 URL 是否正确
- 确保模型格式受支持GLTF/GLB/IFC
- 检查 CORS 配置
### 2. 工具栏不显示
- 确保容器有足够的尺寸
- 检查是否调用了 `engine.initialize()`
### 3. 主题不生效
- 确保在引擎初始化后再设置主题
- 检查自定义主题配置是否完整
### 4. 内存泄漏
- 确保在组件卸载时调用 `engine.destroy()`
- 取消不再需要的事件监听
## 下一步
- 查看 [架构文档](ARCHITECTURE.md) 了解设计原理
- 查看 [模块文档](MODULES/_INDEX.md) 了解详细 API
- 查看 [demo](../demo/) 获取更多示例
---
**文档生成时间**: 2026-01-23
**文档版本**: 1.0.0

104
docs/INDEX.md Normal file
View File

@@ -0,0 +1,104 @@
# iflow-engine SDK 文档索引
> 🤖 **AI 代码助手入口文件** - 请从此文件开始了解项目结构
## 项目概述
| 项目 | 内容 |
|------|------|
| **名称** | iflow-engine |
| **版本** | 1.0.1 |
| **描述** | BIM 3D 引擎 SDK支持 Vue2、Vue3、React 和原生 HTML |
| **类型** | 技术项目 / SDK |
| **语言** | TypeScript |
| **构建工具** | Vite |
| **核心依赖** | Three.js, iflow-engine-base |
## 快速导航
| 文档 | 说明 | 适合人群 |
|------|------|---------|
| [ARCHITECTURE.md](ARCHITECTURE.md) | 架构设计、设计模式、模块依赖 | 架构师、核心开发 |
| [GETTING_STARTED.md](GETTING_STARTED.md) | 快速开始、安装、基础用法 | 新用户、集成开发 |
| [MODULES/_INDEX.md](MODULES/_INDEX.md) | 所有模块的详细文档索引 | 所有开发者 |
## 模块概览
```
src/
├── bim-engine.ts # 主入口类 BimEngine
├── index.ts # 导出文件
├── core/ # 核心基础设施
├── managers/ # 管理器层(业务逻辑)
├── components/ # UI 组件层
├── services/ # 全局服务(主题、国际化)
├── themes/ # 主题预设和类型
├── locales/ # 国际化文案
├── types/ # 公共类型定义
└── utils/ # 工具函数
```
## 核心模块
| 模块 | 路径 | 职责 | 文档 |
|------|------|------|------|
| **BimEngine** | `src/bim-engine.ts` | 主入口类,整合所有功能 | [详情](MODULES/bim-engine.md) |
| **core** | `src/core/` | 事件系统、管理器基类、注册表 | [详情](MODULES/core.md) |
| **managers** | `src/managers/` | 15 个管理器,处理业务逻辑 | [详情](MODULES/managers.md) |
| **components** | `src/components/` | 20+ 个 UI 组件 | [详情](MODULES/components.md) |
| **services** | `src/services/` | 主题管理、国际化服务 | [详情](MODULES/services.md) |
## 架构分层
```
┌─────────────────────────────────────┐
│ BimEngine (主引擎) │ ← 用户 API 入口
├─────────────────────────────────────┤
│ ManagerRegistry (单例注册表) │ ← 全局状态管理
├─────────────────────────────────────┤
│ 管理器层 (15个Manager类) │ ← 业务逻辑
├─────────────────────────────────────┤
│ 组件层 (20+ UI组件) │ ← 视图渲染
├─────────────────────────────────────┤
│ 服务层 (LocaleManager, ThemeManager) │ ← 横切关注点
├─────────────────────────────────────┤
│ 核心基础设施 │ ← 事件、基类
│ (EventEmitter, BaseManager) │
└─────────────────────────────────────┘
```
## 关键设计模式
| 模式 | 应用位置 | 说明 |
|------|---------|------|
| **单例模式** | ManagerRegistry, LocaleManager, ThemeManager | 全局唯一实例 |
| **观察者模式** | EventEmitter, 服务订阅 | 事件驱动通信 |
| **模板方法** | BaseManager, BaseDialogManager | 统一生命周期 |
| **工厂模式** | BimEngine 初始化 | 创建管理器实例 |
## 公开 API 统计
| 类别 | 数量 |
|------|------|
| 管理器类 | 15 个 |
| UI 组件 | 20+ 个 |
| 事件类型 | 30+ 个 |
| 主题属性 | 70+ 个 |
| 国际化键 | 200+ 个 |
## 技术栈
- **语言**: TypeScript 5.x
- **构建**: Vite 7.x
- **3D 引擎**: Three.js 0.182.x
- **核心 SDK**: iflow-engine-base 1.0.x
## 相关链接
- **仓库**: http://123.60.156.158:13000/bim_engine/bimEngine
- **问题反馈**: http://123.60.156.158:13000/bim_engine/bimEngine/issues
---
**文档生成时间**: 2026-01-23
**文档版本**: 1.0.0

122
docs/MODULES/_INDEX.md Normal file
View File

@@ -0,0 +1,122 @@
# 模块文档索引
## 模块列表
| 模块 | 路径 | 职责 | 文档 |
|------|------|------|------|
| **core** | `src/core/` | 核心基础设施:事件系统、管理器基类、注册表 | [core.md](core.md) |
| **managers** | `src/managers/` | 15 个管理器,处理业务逻辑和组件协调 | [managers.md](managers.md) |
| **components** | `src/components/` | 20+ 个 UI 组件 | [components.md](components.md) |
| **services** | `src/services/` | 全局服务:国际化、主题管理 | [services.md](services.md) |
## Core 模块
提供 SDK 的核心基础设施。
| 类 | 文件 | 职责 |
|-----|------|------|
| EventEmitter | `event-emitter.ts` | 事件发布/订阅系统 |
| ManagerRegistry | `manager-registry.ts` | 全局单例注册表 |
| BaseManager | `base-manager.ts` | Manager 抽象基类 |
| BaseDialogManager | `base-dialog-manager.ts` | 对话框 Manager 基类 |
[查看详情 →](core.md)
## Managers 模块
处理业务逻辑,协调组件交互。
### 核心管理器
| 管理器 | 职责 |
|--------|------|
| EngineManager | 3D 引擎管理 |
| ToolbarManager | 工具栏管理 |
| DialogManager | 对话框管理 |
| ButtonGroupManager | 按钮组管理 |
| RightKeyManager | 右键菜单管理 |
### 功能管理器
| 管理器 | 职责 |
|--------|------|
| PropertyPanelManager | 属性面板管理 |
| ConstructTreeManagerBtn | 构件树管理 |
| MeasureDialogManager | 测量对话框管理 |
| SectionPlaneDialogManager | 平面剖切管理 |
| SectionAxisDialogManager | 轴向剖切管理 |
| SectionBoxDialogManager | 剖切盒管理 |
| WalkControlManager | 漫游控制管理 |
| WalkPathDialogManager | 漫游路径管理 |
| WalkPlanViewDialogManager | 漫游平面图管理 |
| MapDialogManager | 地图管理 |
[查看详情 →](managers.md)
## Components 模块
纯 UI 组件,不包含业务逻辑。
### 核心组件
| 组件 | 职责 |
|------|------|
| Engine | 3D 视口容器 |
| BimDialog | 通用对话框 |
| BimTree | 树形控件 |
| BimMenu | 菜单组件 |
| BimButtonGroup | 按钮组 |
### 面板组件
| 组件 | 职责 |
|------|------|
| MeasurePanel | 测量面板 |
| SectionPlanePanel | 平面剖切面板 |
| SectionAxisPanel | 轴向剖切面板 |
| SectionBoxPanel | 剖切盒面板 |
| WalkControlPanel | 漫游控制面板 |
| WalkPathPanel | 漫游路径面板 |
| WalkPlanViewPanel | 漫游平面图面板 |
| MapPanel | 地图面板 |
### 展示组件
| 组件 | 职责 |
|------|------|
| BimCollapse | 折叠面板 |
| BimTab | 标签页 |
| BimDescription | 描述列表 |
[查看详情 →](components.md)
## Services 模块
提供全局服务。
| 服务 | 职责 |
|------|------|
| LocaleManager | 国际化服务,多语言支持 |
| ThemeManager | 主题管理服务,明暗切换 |
[查看详情 →](services.md)
## 类型定义
| 文件 | 内容 |
|------|------|
| `types/component.ts` | 组件接口 IBimComponent |
| `types/events.ts` | 事件类型 EngineEvents |
| `types/measure.ts` | 测量类型定义 |
| `locales/types.ts` | 国际化类型 |
| `themes/types.ts` | 主题配置类型 |
## 工具函数
| 文件 | 内容 |
|------|------|
| `utils/icon-manager.ts` | 图标管理器,提供 40+ SVG 图标 |
---
**文档生成时间**: 2026-01-23

605
docs/MODULES/components.md Normal file
View File

@@ -0,0 +1,605 @@
# Components 模块文档
## 模块概述
| 项目 | 内容 |
|------|------|
| **模块名** | components |
| **职责** | 提供 BIM 3D 引擎 SDK 的所有 UI 组件 |
| **公开 API** | 20+ 个组件类 |
| **状态** | ✅ 稳定 |
## 代码地图
```
src/components/
├── engine/ # 3D 引擎组件
├── dialog/ # 通用弹窗组件
├── tree/ # 树形控件组件
├── menu/ # 菜单组件
├── button-group/ # 按钮组件
├── collapse/ # 折叠面板组件
├── tab/ # 标签页组件
├── description/ # 描述列表组件
├── measure-panel/ # 测量面板组件
├── section-plane-panel/ # 平面剖切面板
├── section-axis-panel/ # 轴向剖切面板
├── section-box-panel/ # 剖切盒面板
├── walk-control-panel/ # 漫游控制面板
├── walk-path-panel/ # 漫游路径面板
├── walk-plan-view-panel/ # 漫游平面图面板
├── right-key/ # 右键菜单组件
└── map-panel/ # 地图面板组件
```
## 组件接口
所有组件实现统一接口:
```typescript
interface IBimComponent {
element: HTMLElement;
init(): void;
setTheme(theme: ThemeConfig): void;
setLocales?(): void;
destroy(): void;
}
```
---
## Engine3D 引擎组件)
### 概述
包装第三方 3D 引擎 SDK提供模型加载、视角控制、测量功能。
### 配置
```typescript
interface EngineOptions {
container: HTMLElement;
backgroundColor?: number | string;
version?: 'v1' | 'v2';
showStats?: boolean;
showViewCube?: boolean;
}
```
### API
```typescript
class Engine {
init(): void;
loadModel(url: string, options?: ModelLoadOptions): void;
CameraGoHome(): void;
getEngine(): any;
activateMeasure(mode: MeasureMode): void;
deactivateMeasure(): void;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
### 测量模式
| 模式 | 说明 |
|------|------|
| `distance` | 距离测量 |
| `minDistance` | 最小距离 |
| `angle` | 角度测量 |
| `elevation` | 标高测量 |
| `volume` | 体积测量 |
| `laserDistance` | 激光测距 |
| `slope` | 坡度测量 |
| `spaceVolume` | 空间体积 |
---
## BimDialog通用弹窗组件
### 概述
通用弹窗容器,支持拖拽、缩放、自定义内容。
### 配置
```typescript
interface DialogOptions {
container: HTMLElement;
title?: string;
content?: HTMLElement | string;
width?: number | string;
height?: number | string;
position?: DialogPosition;
draggable?: boolean;
resizable?: boolean;
minWidth?: number;
minHeight?: number;
onOpen?: () => void;
onClose?: () => void;
backgroundColor?: string;
headerBackgroundColor?: string;
titleColor?: string;
textColor?: string;
borderColor?: string;
}
type DialogPosition =
| 'center'
| 'top-left' | 'top-center' | 'top-right'
| 'left-center' | 'right-center'
| 'bottom-left' | 'bottom-center' | 'bottom-right'
| { x: number; y: number };
```
### API
```typescript
class BimDialog {
init(): void;
setContent(content: HTMLElement | string): void;
fitWidth(recenter?: boolean): void;
fitHeight(recenter?: boolean): void;
close(): void;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## BimTree树形控件组件
### 概述
递归树形结构展示,支持复选框、搜索、展开折叠。
### 配置
```typescript
interface TreeOptions {
data: TreeNodeConfig[];
checkable?: boolean;
checkStrictly?: boolean;
indent?: number;
defaultExpandAll?: boolean;
enableSearch?: boolean;
searchPlaceholder?: string;
onNodeCheck?: (node: BimTreeNode) => void;
onNodeSelect?: (node: BimTreeNode) => void;
onNodeExpand?: (node: BimTreeNode) => void;
}
interface TreeNodeConfig {
id: string;
label: string;
icon?: string;
children?: TreeNodeConfig[];
expanded?: boolean;
checked?: boolean;
disabled?: boolean;
data?: any;
}
```
### API
```typescript
class BimTree {
init(): void;
getNode(id: string): BimTreeNode | undefined;
checkNode(id: string, checked: boolean): void;
expandAll(expanded: boolean): void;
getCheckedNodes(includeHalf?: boolean): TreeNodeConfig[];
revealNode(node: BimTreeNode): void;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## BimMenu菜单组件
### 概述
菜单列表渲染,支持分组、排序、递归子菜单。
### 配置
```typescript
interface MenuOptions {
items: MenuItemConfig[];
groupOrder?: string[];
}
interface MenuItemConfig {
id: string;
label: string;
icon?: string;
group?: string;
order?: number;
visible?: boolean;
disabled?: boolean;
children?: MenuItemConfig[];
onClick?: () => void;
}
```
### API
```typescript
class BimMenu {
init(): void;
getElement(): HTMLElement;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## BimButtonGroup按钮组件
### 概述
分组按钮布局,支持下拉菜单、互斥激活。
### 配置
```typescript
interface ButtonGroupOptions {
container: HTMLElement | string;
position?: GroupPosition;
direction?: 'row' | 'column';
align?: 'vertical' | 'horizontal';
expand?: 'up' | 'down' | 'left' | 'right';
type?: 'default' | 'glass-pill';
showLabel?: boolean;
visibility?: Record<string, boolean>;
backgroundColor?: string;
btnBackgroundColor?: string;
btnHoverColor?: string;
btnActiveColor?: string;
iconColor?: string;
iconActiveColor?: string;
textColor?: string;
textActiveColor?: string;
}
interface ButtonConfig {
id: string;
type: 'button' | 'menu';
label: string;
icon?: string;
keepActive?: boolean;
exclusive?: boolean;
isActive?: boolean;
disabled?: boolean;
onClick?: (button: any) => void;
children?: ButtonConfig[];
groupId?: string;
parentId?: string;
align?: 'vertical' | 'horizontal';
iconSize?: number;
minWidth?: number;
}
```
### API
```typescript
class BimButtonGroup {
init(): Promise<void>;
addGroup(groupId: string, beforeGroupId?: string): void;
addButton(config: ButtonConfig): void;
setBtnActive(id: string, active?: boolean): void;
setShowLabel(show: boolean): void;
updateButtonVisibility(id: string, visible: boolean): void;
setColors(colors: ButtonGroupColors): void;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## BimCollapse折叠面板组件
### 概述
可折叠/展开的面板组件,支持手风琴模式。
### 配置
```typescript
interface CollapseOptions {
container: HTMLElement | string;
items: CollapseItemConfig[];
activeIds?: string[];
accordion?: boolean;
bordered?: boolean;
ghost?: boolean;
className?: string;
onChange?: (activeIds: string[]) => void;
}
interface CollapseItemConfig {
id: string;
title: string;
content: HTMLElement | string;
icon?: string;
extra?: HTMLElement | string;
disabled?: boolean;
className?: string;
}
```
### API
```typescript
class BimCollapse {
init(): void;
toggleItem(id: string): void;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## BimTab标签页组件
### 概述
标签页容器,支持图标、禁用态。
### 配置
```typescript
interface TabOptions {
container: HTMLElement;
tabs: TabItem[];
activeId?: string;
onChange?: (tabId: string, tab: TabItem) => void;
}
interface TabItem {
id: string;
title: string;
icon?: string;
content: HTMLElement | string;
disabled?: boolean;
}
```
### API
```typescript
class BimTab {
init(): void;
activateTab(tabId: string): void;
setTheme(theme: ThemeConfig): void;
setLocales(): void;
destroy(): void;
}
```
---
## BimDescription描述列表组件
### 概述
Key-Value 数据展示组件。
### 配置
```typescript
interface DescriptionOptions {
container: HTMLElement | string;
items: DescriptionItem[];
bordered?: boolean;
className?: string;
fontSize?: string;
labelColor?: string;
valueColor?: string;
labelWidth?: string;
labelPadding?: string;
valuePadding?: string;
}
interface DescriptionItem {
label: string;
value: HTMLElement | string;
labelColor?: string;
valueColor?: string;
className?: string;
}
```
### API
```typescript
class BimDescription {
init(): void;
setItems(items: DescriptionItem[]): void;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## MeasurePanel测量面板组件
### 概述
测量面板 UI支持 8 种测量类型。
### 配置
```typescript
interface MeasurePanelOptions {
defaultMode?: MeasureMode;
defaultExpanded?: boolean;
onModeChange?: (mode: MeasureMode) => void;
onExpandedChange?: (expanded: boolean) => void;
onClearAll?: () => void;
onSettings?: () => void;
}
```
### API
```typescript
class MeasurePanel {
init(): void;
getActiveMode(): MeasureMode;
switchMode(mode: MeasureMode): void;
setResult(result: MeasureResult | null): void;
clearAll(): void;
getConfig(): MeasureConfig;
setConfig(partial: Partial<MeasureConfig>, persist?: boolean): void;
setExpanded(expanded: boolean): void;
getExpanded(): boolean;
setTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## SectionPlanePanel平面剖切面板
### 概述
平面剖切控制面板。
### 配置
```typescript
interface SectionPlanePanelOptions {
onHide?: () => void;
onReverse?: () => void;
onReset?: () => void;
}
```
### API
```typescript
class SectionPlanePanel {
init(): void;
setTheme(theme: ThemeConfig): void;
setLocales(): void;
destroy(): void;
}
```
---
## SectionAxisPanel轴向剖切面板
### 概述
X/Y/Z 轴向剖切控制面板。
### 配置
```typescript
interface SectionAxisPanelOptions {
defaultAxis?: 'x' | 'y' | 'z';
onHideToggle?: (isHidden: boolean) => void;
onReverse?: () => void;
onAxisChange?: (axis: 'x' | 'y' | 'z') => void;
}
```
---
## SectionBoxPanel剖切盒面板
### 概述
六面体剖切盒控制面板。
### 配置
```typescript
interface SectionBoxPanelOptions {
onHideToggle?: (isHidden: boolean) => void;
onReverseToggle?: (isReversed: boolean) => void;
onFitToModel?: () => void;
onReset?: () => void;
onRangeChange?: (axis: string, value: number) => void;
}
```
---
## WalkControlPanel漫游控制面板
### 概述
漫游模式控制面板。
### 配置
```typescript
interface WalkControlPanelOptions {
defaultSpeed?: number;
defaultGravity?: boolean;
defaultCollision?: boolean;
defaultCharacterModel?: 'construction-worker' | 'office-male';
defaultWalkMode?: 'walk' | 'run';
onPlanViewToggle?: (active: boolean) => void;
onPathModeToggle?: (active: boolean) => void;
onWalkModeToggle?: (active: boolean) => void;
onSpeedChange?: (speed: number) => void;
onGravityToggle?: (enabled: boolean) => void;
onCollisionToggle?: (enabled: boolean) => void;
onCharacterModelChange?: (model: string) => void;
onWalkModeChange?: (mode: string) => void;
onExit?: () => void;
}
```
### API
```typescript
class WalkControlPanel {
init(): void;
getState(): WalkControlState;
setPlanViewActive(active: boolean): void;
setPathModeActive(active: boolean): void;
setTheme(theme: ThemeConfig): void;
setLocales(): void;
destroy(): void;
}
interface WalkControlState {
mode: 'none' | 'path' | 'walk';
isPlanViewActive: boolean;
speed: number;
gravity: boolean;
collision: boolean;
characterModel: string;
walkMode: string;
}
```
---
## 依赖关系
所有组件依赖:
- `ThemeManager` (主题)
- `LocaleManager` (国际化,部分组件)
组件不直接依赖 Manager由 Manager 创建和管理组件实例。
---
**文档生成时间**: 2026-01-23

386
docs/MODULES/core.md Normal file
View File

@@ -0,0 +1,386 @@
# Core 模块文档
## 模块概述
| 项目 | 内容 |
|------|------|
| **模块名** | core |
| **职责** | 提供 SDK 的核心基础设施事件发射、Manager 注册表、Manager 生命周期管理 |
| **公开 API** | 4 个类 |
| **状态** | ✅ 稳定 |
## 代码地图
```
src/core/
├── event-emitter.ts # 事件发射器
├── manager-registry.ts # Manager 注册表(单例)
├── base-manager.ts # Manager 抽象基类
└── base-dialog-manager.ts # 对话框 Manager 基类
```
| 文件 | 行数 | 职责 | 导出 |
|------|------|------|------|
| `event-emitter.ts` | 70 | 发布/订阅事件系统 | `EventEmitter` |
| `manager-registry.ts` | 127 | 全局单例注册表 | `ManagerRegistry` |
| `base-manager.ts` | 57 | Manager 基类 | `BaseManager` |
| `base-dialog-manager.ts` | 145 | 对话框 Manager 基类 | `BaseDialogManager` |
## 架构设计
### 类关系图
```
EventEmitter
↑ (组合)
ManagerRegistry (单例)
↑ (访问)
BaseManager (抽象类)
↑ (继承)
BaseDialogManager (抽象类)
↑ (继承)
具体 Manager 类
```
### 设计模式
| 模式 | 应用 | 说明 |
|------|------|------|
| 单例模式 | ManagerRegistry | 全局唯一实例 |
| 发布/订阅 | EventEmitter | 解耦事件通信 |
| 模板方法 | BaseDialogManager | 定义对话框生命周期 |
---
## EventEmitter
### 概述
轻量级事件发射器,提供发布/订阅功能。
### API
```typescript
class EventEmitter {
// 订阅事件,返回取消订阅函数
on(event: string, listener: (payload: any) => void): () => void;
// 取消订阅
off(event: string, listener: (payload: any) => void): void;
// 发送事件
emit(event: string, payload?: any): void;
// 清除所有监听器
clear(): void;
}
```
### 使用示例
```typescript
const emitter = new EventEmitter();
// 订阅
const unsubscribe = emitter.on('user:login', (data) => {
console.log('User logged in:', data);
});
// 发送
emitter.emit('user:login', { userId: 123 });
// 取消订阅
unsubscribe();
```
---
## ManagerRegistry
### 概述
全局单例注册表,集中管理所有 Manager 实例,提供跨 Manager 通信。
### API
```typescript
class ManagerRegistry {
// 获取单例
static getInstance(): ManagerRegistry;
// 重置单例(用于测试)
static reset(): void;
// 容器元素
container: HTMLElement | null;
wrapper: HTMLElement | null;
// Manager 实例
toolbar: ToolbarManager | null;
dialog: DialogManager | null;
engine3d: EngineManager | null;
buttonGroup: ButtonGroupManager | null;
rightKey: RightKeyManager | null;
constructTree: ConstructTreeManagerBtn | null;
propertyPanel: PropertyPanelManager | null;
measure: MeasureDialogManager | null;
walkControl: WalkControlManager | null;
map: MapDialogManager | null;
sectionPlane: SectionPlaneDialogManager | null;
sectionAxis: SectionAxisDialogManager | null;
sectionBox: SectionBoxDialogManager | null;
// 事件方法
emit<K extends keyof EngineEvents>(event: K, payload: EngineEvents[K]): void;
on<K extends keyof EngineEvents>(event: K, listener: (payload: EngineEvents[K]) => void): () => void;
off<K extends keyof EngineEvents>(event: K, listener: (payload: EngineEvents[K]) => void): void;
clearEvents(): void;
}
```
### 使用示例
```typescript
const registry = ManagerRegistry.getInstance();
// 访问 Manager
registry.toolbar?.show();
registry.measure?.switchMode('distance');
// 发送事件
registry.emit('engine:model-loaded', { url: 'model.gltf' });
// 订阅事件
const unsubscribe = registry.on('engine:object-clicked', (payload) => {
console.log('Object clicked:', payload.objectId);
});
```
### 支持的事件
| 事件 | 数据类型 | 说明 |
|------|---------|------|
| `ui:open-dialog` | `{ id: string; data?: any }` | 打开对话框 |
| `ui:close-dialog` | `{ id: string }` | 关闭对话框 |
| `engine:model-loaded` | `{ url: string }` | 模型加载完成 |
| `engine:object-clicked` | `{ objectId: string; position: Point3D }` | 点击对象 |
| `ui:tree-node-check` | `{ id: string; checked: boolean; node: any }` | 树节点勾选 |
| `ui:tree-node-select` | `{ id: string; selected: boolean; node: any }` | 树节点选择 |
| `sys:theme-changed` | `{ theme: string }` | 主题变更 |
| `sys:locale-changed` | `{ locale: string }` | 语言变更 |
| `walk:speed-change` | `{ speed: number }` | 漫游速度变更 |
| `walk:path-mode-toggle` | `{ isActive: boolean }` | 路径模式切换 |
| `map:opened` | `{}` | 地图打开 |
| `map:closed` | `{}` | 地图关闭 |
---
## BaseManager
### 概述
所有 Manager 的抽象基类,提供注册表访问和事件订阅管理。
### API
```typescript
abstract class BaseManager {
// 受保护属性
protected registry: ManagerRegistry;
// 受保护方法
protected subscribe<K extends keyof EngineEvents>(
event: K,
handler: (payload: EngineEvents[K]) => void
): void;
protected emit<K extends keyof EngineEvents>(
event: K,
payload: EngineEvents[K]
): void;
// 公开方法
destroy(): void;
}
```
### 使用示例
```typescript
export class CustomManager extends BaseManager {
constructor() {
super();
}
public initialize(): void {
// 订阅事件(自动管理生命周期)
this.subscribe('engine:model-loaded', (payload) => {
console.log('Model loaded:', payload.url);
});
}
public doSomething(): void {
// 发送事件
this.emit('custom:action', { data: 'value' });
// 访问其他 Manager
this.registry.toolbar?.show();
}
public destroy(): void {
// 自动清理所有订阅
super.destroy();
}
}
```
### 特性
- **自动资源清理**: `destroy()` 时自动取消所有订阅
- **类型安全**: 使用 TypeScript 泛型确保事件类型
- **注册表访问**: 可通过 `this.registry` 访问所有 Manager
---
## BaseDialogManager
### 概述
对话框 Manager 的抽象基类,封装对话框的完整生命周期。
### API
```typescript
abstract class BaseDialogManager extends BaseManager {
// 抽象属性(子类必须实现)
protected abstract get dialogId(): string;
protected abstract get dialogTitle(): string;
// 抽象方法(子类必须实现)
protected abstract createContent(): HTMLElement;
// 可选属性(子类可重写)
protected get dialogWidth(): number; // 默认: 300
protected get dialogHeight(): number | 'auto'; // 默认: 'auto'
protected get dialogOptions(): DialogManagerOptions;
// 钩子方法(子类可重写)
protected onDialogCreated(): void;
protected onDialogClose(): void;
protected onBeforeDestroy(): void;
protected getDialogPosition(): { x: number; y: number };
// 公开方法
show(): void;
hide(): void;
toggle(): void;
isOpen(): boolean;
destroy(): void;
}
interface DialogManagerOptions {
draggable?: boolean; // 默认 true
resizable?: boolean; // 默认 false
}
```
### 使用示例
```typescript
export class MeasureDialogManager extends BaseDialogManager {
private panel: MeasurePanel | null = null;
protected get dialogId(): string {
return 'measure-dialog';
}
protected get dialogTitle(): string {
return 'measure.dialogTitle'; // i18n key
}
protected get dialogWidth(): number {
return 250;
}
protected createContent(): HTMLElement {
this.panel = new MeasurePanel({
onModeChange: (mode) => {
this.registry.engine3d?.activateMeasure(mode);
}
});
this.panel.init();
const wrapper = document.createElement('div');
wrapper.appendChild(this.panel.element);
return wrapper;
}
protected onDialogCreated(): void {
this.dialog?.fitHeight(false);
}
protected onDialogClose(): void {
this.registry.toolbar?.setBtnActive('measure', false);
}
protected onBeforeDestroy(): void {
this.panel?.destroy();
this.panel = null;
}
// 业务方法
public switchMode(mode: string): void {
this.panel?.switchMode(mode);
}
}
```
### 生命周期
```
show()
销毁旧对话框
createContent() ← 子类实现
创建 BimDialog
onDialogCreated() ← 钩子
显示中...
hide() / 关闭按钮
onDialogClose() ← 钩子
onBeforeDestroy() ← 钩子
销毁对话框
```
---
## 依赖关系
```
BaseDialogManager
↓ 继承
BaseManager
↓ 依赖
ManagerRegistry
↓ 组合
EventEmitter
```
### 被依赖情况
| 模块 | 依赖方式 |
|------|---------|
| managers/* | 继承 BaseManager 或 BaseDialogManager |
| components/* | 间接依赖(通过 Manager |
| BimEngine | 使用 ManagerRegistry |
---
**文档生成时间**: 2026-01-23

489
docs/MODULES/managers.md Normal file
View File

@@ -0,0 +1,489 @@
# Managers 模块文档
## 模块概述
| 项目 | 内容 |
|------|------|
| **模块名** | managers |
| **职责** | 处理业务逻辑,协调组件交互,管理组件生命周期 |
| **公开 API** | 15 个 Manager 类 |
| **状态** | ✅ 稳定 |
## 代码地图
```
src/managers/
├── engine-manager.ts # 3D 引擎管理器
├── toolbar-manager.ts # 工具栏管理器
├── dialog-manager.ts # 对话框管理器
├── button-group-manager.ts # 按钮组管理器
├── right-key-manager.ts # 右键菜单管理器
├── property-panel-manager.ts # 属性面板管理器
├── construct-tree-manager-btn.ts # 构件树管理器
├── walk-control-manager.ts # 漫游控制管理器
├── measure-dialog-manager.ts # 测量对话框管理器
├── section-plane-dialog-manager.ts # 平面剖切对话框管理器
├── section-box-dialog-manager.ts # 剖切盒对话框管理器
├── section-axis-dialog-manager.ts # 轴向剖切对话框管理器
├── map-dialog-manager.ts # 地图对话框管理器
├── walk-path-dialog-manager.ts # 漫游路径对话框管理器
└── walk-plan-view-dialog-manager.ts # 漫游平面图对话框管理器
```
## 管理器分类
### 按继承关系
```
BaseManager
├── EngineManager
├── ToolbarManager
├── DialogManager
├── ButtonGroupManager
├── RightKeyManager
├── PropertyPanelManager
├── ConstructTreeManagerBtn
└── WalkControlManager
BaseDialogManager (继承自 BaseManager)
├── MeasureDialogManager
├── SectionPlaneDialogManager
├── SectionAxisDialogManager
├── SectionBoxDialogManager
├── MapDialogManager
├── WalkPathDialogManager
└── WalkPlanViewDialogManager
```
### 按功能分类
| 类别 | 管理器 | 职责 |
|------|--------|------|
| **核心** | EngineManager | 3D 引擎管理 |
| **UI 容器** | ToolbarManager, DialogManager, ButtonGroupManager | 容器组件管理 |
| **交互** | RightKeyManager, PropertyPanelManager, ConstructTreeManagerBtn | 用户交互 |
| **3D 工具** | MeasureDialogManager, SectionPlaneDialogManager, SectionAxisDialogManager, SectionBoxDialogManager | 3D 操作工具 |
| **漫游** | WalkControlManager, WalkPathDialogManager, WalkPlanViewDialogManager, MapDialogManager | 漫游功能 |
---
## EngineManager
### 概述
管理 3D 引擎的初始化、模型加载和测量功能。
### API
```typescript
class EngineManager extends BaseManager {
initialize(options?: EngineOptions): void;
isInitialized(): boolean;
loadModel(url: string, options?: ModelLoadOptions): void;
getEngine(): any;
CameraGoHome(): void;
activateMeasure(mode: MeasureMode): void;
deactivateMeasure(): void;
getCurrentMeasureType(): MeasureMode | null;
destroy(): void;
}
```
### 使用示例
```typescript
const engine = new EngineManager(container);
engine.initialize();
engine.loadModel('model.gltf', { autoFit: true });
engine.activateMeasure('distance');
```
---
## ToolbarManager
### 概述
管理底部工具栏的按钮配置、显示控制、主题管理。
### API
```typescript
class ToolbarManager extends BaseManager {
addGroup(groupId: string, beforeGroupId?: string): void;
addButton(config: ButtonConfig): void;
setBtnActive(id: string, active?: boolean): void;
setButtonVisibility(id: string, visible: boolean): void;
setShowLabel(show: boolean): void;
updateTheme(theme: ThemeConfig): void;
setBackgroundColor(color: string): void;
setColors(colors: ButtonGroupColors): void;
show(): void;
hide(): void;
setVisible(visible: boolean): void;
refresh(): void;
destroy(): void;
}
```
### 使用示例
```typescript
const toolbar = new ToolbarManager(container);
toolbar.addGroup('custom-group');
toolbar.addButton({
id: 'custom-btn',
groupId: 'custom-group',
type: 'button',
label: 'Custom',
icon: '<svg>...</svg>',
onClick: () => console.log('Clicked')
});
toolbar.setBtnActive('custom-btn', true);
```
---
## DialogManager
### 概述
创建和管理通用对话框实例。
### API
```typescript
class DialogManager extends BaseManager {
create(options: DialogOptions): BimDialog;
showInfoDialog(): void;
updateTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
### 使用示例
```typescript
const dialogManager = new DialogManager(container);
const dialog = dialogManager.create({
title: 'My Dialog',
content: element,
width: 400,
onClose: () => console.log('Closed')
});
```
---
## MeasureDialogManager
### 概述
管理测量工具的对话框和测量面板。
### API
```typescript
class MeasureDialogManager extends BaseDialogManager {
getActiveMode(): MeasureMode;
switchMode(mode: MeasureMode): void;
setMeasureResult(result: MeasureResult | null): void;
getConfig(): MeasureConfig;
setConfig(partial: Partial<MeasureConfig>, persist?: boolean): void;
clearAll(): void;
openSettings(): void;
show(): void;
hide(): void;
toggle(): void;
}
```
### 测量模式
| 模式 | 说明 |
|------|------|
| `distance` | 距离测量 |
| `minDistance` | 最小距离 |
| `angle` | 角度测量 |
| `elevation` | 标高测量 |
| `volume` | 体积测量 |
| `laserDistance` | 激光测距 |
| `slope` | 坡度测量 |
| `spaceVolume` | 空间体积 |
### 使用示例
```typescript
const measure = new MeasureDialogManager();
measure.show();
measure.switchMode('distance');
const config = measure.getConfig();
measure.setConfig({ unit: 'cm', precision: 1 });
```
---
## SectionPlaneDialogManager
### 概述
管理平面剖切工具对话框。
### API
```typescript
class SectionPlaneDialogManager extends BaseDialogManager {
show(): void;
hide(): void;
toggle(): void;
isOpen(): boolean;
}
```
---
## SectionAxisDialogManager
### 概述
管理轴向剖切工具对话框。
### API
```typescript
class SectionAxisDialogManager extends BaseDialogManager {
getHiddenState(): boolean;
setHiddenState(isHidden: boolean): void;
getActiveAxis(): 'x' | 'y' | 'z';
setActiveAxis(axis: 'x' | 'y' | 'z'): void;
show(): void;
hide(): void;
toggle(): void;
}
```
### 使用示例
```typescript
const sectionAxis = new SectionAxisDialogManager();
sectionAxis.show();
sectionAxis.setActiveAxis('y');
```
---
## SectionBoxDialogManager
### 概述
管理剖切盒工具对话框。
### API
```typescript
class SectionBoxDialogManager extends BaseDialogManager {
getHiddenState(): boolean;
setHiddenState(isHidden: boolean): void;
getReversedState(): boolean;
setReversedState(isReversed: boolean): void;
getRange(): SectionBoxRange;
setRange(range: Partial<SectionBoxRange>): void;
show(): void;
hide(): void;
toggle(): void;
}
interface SectionBoxRange {
minX: number;
maxX: number;
minY: number;
maxY: number;
minZ: number;
maxZ: number;
}
```
### 使用示例
```typescript
const sectionBox = new SectionBoxDialogManager();
sectionBox.show();
const range = sectionBox.getRange();
sectionBox.setRange({ minX: 0, maxX: 100 });
sectionBox.setReversedState(true);
```
---
## WalkControlManager
### 概述
管理漫游控制面板和相关交互。
### API
```typescript
class WalkControlManager extends BaseManager {
init(): void;
show(): void;
hide(): void;
destroy(): void;
}
```
### 事件
| 事件 | 说明 |
|------|------|
| `walk:plan-view-toggle` | 平面图切换 |
| `walk:path-mode-toggle` | 路径模式切换 |
| `walk:walk-mode-toggle` | 漫游模式切换 |
| `walk:speed-change` | 速度变化 |
| `walk:gravity-toggle` | 重力开关 |
| `walk:collision-toggle` | 碰撞开关 |
---
## PropertyPanelManager
### 概述
管理构件属性面板的显示。
### API
```typescript
class PropertyPanelManager extends BaseManager {
init(): void;
show(): void;
hide(): void;
isOpen(): boolean;
destroy(): void;
}
```
---
## ConstructTreeManagerBtn
### 概述
管理构件树按钮和对话框。
### API
```typescript
class ConstructTreeManagerBtn extends BaseManager {
openConstructTreeDialog(): void;
addGroup(groupId: string, beforeGroupId?: string): void;
addButton(config: ButtonConfig): void;
setButtonVisibility(id: string, visible: boolean): void;
setShowLabel(show: boolean): void;
setVisible(visible: boolean): void;
setBackgroundColor(color: string): void;
setColors(colors: ButtonGroupColors): void;
refresh(): void;
destroy(): void;
}
```
---
## RightKeyManager
### 概述
管理右键上下文菜单。
### API
```typescript
class RightKeyManager extends BaseManager {
registerHandler(handler: ContextMenuHandler): void;
showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void;
hide(): void;
destroy(): void;
}
type ContextMenuHandler = (e: MouseEvent) => MenuItemConfig[];
```
### 使用示例
```typescript
const rightKey = new RightKeyManager(container);
rightKey.registerHandler((e) => [
{ id: 'view', label: 'View', onClick: () => {} },
{ id: 'delete', label: 'Delete', onClick: () => {} }
]);
```
---
## ButtonGroupManager
### 概述
创建和管理多个按钮组实例。
### API
```typescript
class ButtonGroupManager extends BaseManager {
create(id: string, options: ButtonGroupOptions): BimButtonGroup;
get(id: string): BimButtonGroup | undefined;
updateTheme(theme: ThemeConfig): void;
destroy(): void;
}
```
---
## 交互流程
### 工具栏按钮触发测量
```
ToolbarManager (按钮点击)
MeasureDialogManager.show()
onModeChange 事件
EngineManager.activateMeasure(mode)
3D 引擎进入测量模式
```
### 漫游模式激活
```
ToolbarManager (walk 按钮)
WalkControlManager.show()
隐藏底部工具栏
显示漫游控制面板
```
---
## 依赖关系
所有 Manager 都依赖:
- `BaseManager``BaseDialogManager`
- `ManagerRegistry`
各 Manager 之间通过事件系统通信,避免直接依赖。
---
**文档生成时间**: 2026-01-23

402
docs/MODULES/services.md Normal file
View File

@@ -0,0 +1,402 @@
# Services 模块文档
## 模块概述
| 项目 | 内容 |
|------|------|
| **模块名** | services |
| **职责** | 提供全局状态管理服务:国际化和主题系统 |
| **公开 API** | 2 个管理器类 + 辅助函数 |
| **状态** | ✅ 稳定 |
## 代码地图
```
src/
├── services/
│ ├── locale.ts # 国际化服务
│ └── theme.ts # 主题服务
├── locales/
│ ├── types.ts # 翻译类型定义
│ ├── zh-CN.ts # 中文翻译
│ └── en-US.ts # 英文翻译
└── themes/
├── types.ts # 主题类型定义
└── presets.ts # 内置主题预设
```
---
## LocaleManager国际化服务
### 概述
管理应用语言、翻译文本,支持实时订阅。
### API
```typescript
class LocaleManager {
getLocale(): LocaleType;
setLocale(locale: LocaleType): void;
t(key: string): string;
subscribe(listener: (locale: LocaleType) => void): () => void;
}
type LocaleType = 'zh-CN' | 'en-US';
// 单例导出
export const localeManager: LocaleManager;
// 便捷函数
export function t(key: string): string;
```
### 使用示例
```typescript
import { localeManager, t } from 'iflow-engine';
// 获取当前语言
const locale = localeManager.getLocale(); // 'zh-CN'
// 切换语言
localeManager.setLocale('en-US');
// 翻译
console.log(t('toolbar.home')); // 'Home'
console.log(t('measure.modes.distance')); // 'Distance'
// 订阅语言变更
const unsubscribe = localeManager.subscribe((locale) => {
console.log('Language changed:', locale);
});
```
### 翻译键结构
| 域 | 说明 | 示例 |
|---|------|------|
| `common` | 通用文本 | `common.title` |
| `toolbar` | 工具栏按钮 | `toolbar.home`, `toolbar.measure` |
| `dialog` | 对话框 | `dialog.testTitle` |
| `menu` | 菜单项 | `menu.info` |
| `tree` | 树形控件 | `tree.searchPlaceholder` |
| `measure` | 测量工具 | `measure.modes.distance`, `measure.units.m` |
| `sectionPlane` | 平面剖切 | `sectionPlane.dialogTitle` |
| `sectionAxis` | 轴向剖切 | `sectionAxis.dialogTitle` |
| `sectionBox` | 剖切盒 | `sectionBox.dialogTitle` |
| `walkControl` | 漫游控制 | `walkControl.speed` |
| `map` | 地图 | `map.dialogTitle` |
### 扩展新语言
1. 创建翻译文件 `src/locales/ja-JP.ts`
2. 更新类型 `src/locales/types.ts`
3. 注册到 LocaleManager
```typescript
// src/locales/ja-JP.ts
export const jaJP: TranslationDictionary = {
common: { title: 'BimEngine' },
toolbar: { home: 'ホーム', measure: '測定' },
// ...
};
```
---
## ThemeManager主题服务
### 概述
管理应用主题、颜色方案,支持实时订阅。
### API
```typescript
class ThemeManager {
getTheme(): ThemeConfig;
setTheme(themeName: 'dark' | 'light'): void;
setCustomTheme(theme: ThemeConfig): void;
subscribe(listener: (theme: ThemeConfig) => void): () => void;
}
// 单例导出
export const themeManager: ThemeManager;
```
### 使用示例
```typescript
import { themeManager } from 'iflow-engine';
// 获取当前主题
const theme = themeManager.getTheme();
console.log(theme.primary); // '#2563eb'
// 切换预设主题
themeManager.setTheme('dark');
// 自定义主题
themeManager.setCustomTheme({
name: 'custom',
primary: '#ff6b6b',
// ...
});
// 订阅主题变更
const unsubscribe = themeManager.subscribe((theme) => {
console.log('Theme changed:', theme.name);
});
```
### 预设主题
#### 亮色主题 (`lightTheme`)
| 属性 | 值 | 说明 |
|------|-----|------|
| `primary` | `#2563eb` | 主色 |
| `bgBase` | `#f8fafc` | 页面背景 |
| `bgElevated` | `#ffffff` | 卡片背景 |
| `textPrimary` | `#0f172a` | 主文本 |
| `textSecondary` | `#475569` | 次要文本 |
#### 暗色主题 (`darkTheme`)
| 属性 | 值 | 说明 |
|------|-----|------|
| `primary` | `#3b82f6` | 主色 |
| `bgBase` | `#152232` | 页面背景 |
| `bgElevated` | `#1f2d3e` | 卡片背景 |
| `textPrimary` | `#ffffff` | 主文本 |
| `textSecondary` | `#94a3b8` | 次要文本 |
### ThemeConfig 结构
```typescript
interface ThemeConfig {
name: string;
// 品牌色
primary: string;
primaryHover: string;
primaryActive: string;
primarySubtle: string;
// 状态色
success: string;
warning: string;
danger: string;
info: string;
// 背景色
bgBase: string;
bgElevated: string;
bgOverlay: string;
bgInset: string;
bgGlass: string;
bgGlassBlur: string;
// 文字色
textPrimary: string;
textSecondary: string;
textTertiary: string;
textDisabled: string;
textInverse: string;
textLink: string;
// 图标色
iconDefault: string;
iconHover: string;
iconActive: string;
iconDisabled: string;
// 边框色
borderDefault: string;
borderSubtle: string;
borderStrong: string;
divider: string;
// 组件状态
componentBg: string;
componentBgHover: string;
componentBgActive: string;
componentBgSelected: string;
// 焦点
focusRing: string;
selectionBg: string;
// 阴影
shadowSm: string;
shadowMd: string;
shadowLg: string;
shadowGlow: string;
// 浮动层
floatingBg: string;
floatingBorder: string;
floatingBtnBg: string;
floatingBtnBgHover: string;
floatingIconColor: string;
// 面板
panelBg: string;
panelBorder: string;
panelHeaderBg: string;
panelRadius: string;
// 选项卡
tabBg: string;
tabItemBg: string;
tabItemBgActive: string;
tabItemTextActive: string;
// 组件覆盖(可选)
overrides?: {
dialog?: { headerBg?: string };
toolbar?: { bg?: string; buttonBg?: string };
input?: { bg?: string; placeholder?: string };
};
}
```
### 创建自定义主题
```typescript
import { createThemeFromPartial, lightTheme } from 'iflow-engine';
// 基于预设创建(推荐)
const customTheme = createThemeFromPartial(lightTheme, {
name: 'coral',
primary: '#ff6b6b',
primaryHover: '#ff5252',
primaryActive: '#ff4757',
});
themeManager.setCustomTheme(customTheme);
```
### CSS 变量映射
主题颜色自动映射到 CSS 变量:
```css
.my-component {
background-color: var(--bim-bg-elevated);
color: var(--bim-text-primary);
border: 1px solid var(--bim-border-default);
}
.my-button {
background-color: var(--bim-primary);
color: var(--bim-text-inverse);
}
.my-button:hover {
background-color: var(--bim-primary-hover);
}
```
常用 CSS 变量:
| 变量 | 说明 |
|------|------|
| `--bim-primary` | 主色 |
| `--bim-bg-base` | 页面背景 |
| `--bim-bg-elevated` | 卡片背景 |
| `--bim-text-primary` | 主文本 |
| `--bim-border-default` | 边框 |
| `--bim-shadow-sm` | 小阴影 |
---
## React 集成
```typescript
import { useEffect, useState } from 'react';
import { localeManager, themeManager } from 'iflow-engine';
// 语言 Hook
export function useLocale() {
const [locale, setLocale] = useState(() => localeManager.getLocale());
useEffect(() => {
return localeManager.subscribe(setLocale);
}, []);
return { locale, setLocale: localeManager.setLocale.bind(localeManager) };
}
// 主题 Hook
export function useTheme() {
const [theme, setTheme] = useState(() => themeManager.getTheme());
useEffect(() => {
return themeManager.subscribe(setTheme);
}, []);
return { theme, setTheme: themeManager.setTheme.bind(themeManager) };
}
```
---
## 架构设计
### 单例模式
两个服务都采用单例模式:
```typescript
export const localeManager = new LocaleManager();
export const themeManager = new ThemeManager();
```
### 观察者模式
支持订阅状态变更:
```typescript
// 订阅
const unsubscribe = themeManager.subscribe((theme) => {
// 更新 UI
});
// 取消订阅
unsubscribe();
```
### 与 BimEngine 集成
```typescript
const engine = new BimEngine('container', {
locale: 'zh-CN',
theme: 'dark'
});
// 动态切换
engine.setLocale('en-US');
engine.setTheme('light');
engine.setCustomTheme(customTheme);
```
---
## 依赖关系
```
BimEngine
LocaleManager ←→ locales/*.ts
ThemeManager ←→ themes/*.ts
```
Services 模块无外部依赖,完全自包含。
---
**文档生成时间**: 2026-01-23