提交代码

This commit is contained in:
yuding
2026-04-20 10:38:42 +08:00
parent 0b730da6f4
commit 9a185699ae
36 changed files with 17961 additions and 13149 deletions

View File

@@ -32,9 +32,10 @@
| 管理器 | 职责 |
|--------|------|
| EngineManager | 3D 引擎管理 |
| ToolbarManager | 工具栏管理 |
| ToolbarManager | 底部工具栏管理(传统线性布局,当前未使用) |
| **RadialToolbarManager** | **径向工具栏管理(当前主交互入口)** |
| DialogManager | 对话框管理 |
| ButtonGroupManager | 按钮组管理 |
| ButtonGroupManager | 按钮组管理(通用,当前未使用) |
| RightKeyManager | 右键菜单管理 |
### 功能管理器
@@ -75,6 +76,7 @@
| BimTree | 树形控件 |
| BimMenu | 菜单组件 |
| BimButtonGroup | 按钮组 |
| **RadialToolbar** | **径向工具栏(圆形扇形菜单,当前主交互入口)** |
### 面板组件

View File

@@ -18,6 +18,7 @@
src/managers/
├── engine-manager.ts
├── toolbar-manager.ts
├── radial-toolbar-manager.ts
├── dialog-manager.ts
├── button-group-manager.ts
├── right-key-manager.ts
@@ -44,6 +45,7 @@ src/managers/
BaseManager
├── EngineManager
├── ToolbarManager
├── **RadialToolbarManager**
├── DialogManager
├── ButtonGroupManager
├── RightKeyManager
@@ -127,7 +129,7 @@ class EngineManager extends BaseManager {
| 类别 | 代表 Manager | 主要职责 |
|---|---|---|
| 核心入口 | `EngineManager` | 引擎生命周期与外部 API |
| UI 容器 | `ToolbarManager`, `DialogManager`, `ButtonGroupManager` | UI 容器与通用交互 |
| UI 容器 | `RadialToolbarManager`, `ToolbarManager`, `DialogManager`, `ButtonGroupManager` | UI 容器与通用交互 |
| 业务编排 | `MeasureDialogManager`, `Section*DialogManager`, `WalkControlManager`, `SettingDialogManager` | 对话框/面板回调与引擎能力编排 |
| 数据/交互 | `ConstructTreeManagerBtn`, `ComponentDetailManager`, `RightKeyManager` | 构件树、属性、右键菜单 |

View File

@@ -20,6 +20,7 @@ src/components/
├── tree/ # 树形控件组件
├── menu/ # 菜单组件
├── button-group/ # 按钮组件
├── radial-toolbar/ # 径向工具栏组件
├── collapse/ # 折叠面板组件
├── tab/ # 标签页组件
├── description/ # 描述列表组件
@@ -408,6 +409,81 @@ class BimButtonGroup {
---
## RadialToolbar径向工具栏组件
### 概述
圆形径向菜单组件用于替代传统线性工具栏。支持多环布局、扇形展开、hover 触发和 toggle 状态。
### 配置
```typescript
interface RadialToolbarOptions {
container: HTMLElement;
items?: RadialMenuItem[];
mainButtonIcon?: string;
mainButtonLabel?: string;
onMainButtonClick?: () => void;
itemsPerRing?: number;
closeDelay?: number;
}
interface RadialMenuItem {
id: string;
label: string;
/** 直接显示的文本(优先级高于 label 的国际化翻译) */
title?: string;
icon?: string;
onClick?: (item: RadialMenuItem) => void;
isToggle?: boolean;
isActive?: boolean;
onToggle?: (nextActive: boolean, item: RadialMenuItem) => void;
}
```
### API
```typescript
class RadialToolbar {
init(): void;
addItem(item: RadialMenuItem): void;
setItemActive(id: string, active: boolean): void;
setTheme(theme: ThemeConfig): void;
setLocales(): void;
destroy(): void;
}
```
### 使用说明
- `label`:国际化键名(如 `'toolbar.home'`SDK 内置按钮使用
- `title`:直接显示文本,优先级高于 `label`,适合外部动态添加按钮
- `itemsPerRing`:每环最多显示的按钮数,超出自动进入下一环
- `isToggle`:是否为切换按钮,配合 `onToggle``setItemActive` 使用
### 布局说明
**角度计算**:按钮中心均匀分布在扇形范围内(默认 180°~270°通过 `(index + 0.5) / count` 计算位置,确保完整填满扇形而不贴边。
**环容量**:每环按钮数量写死在 `src/components/radial-toolbar/index.ts` 中(当前为 `[4, 6, 8]`),如需调整直接修改源码。
### 与 BottomDock 联动
`RadialToolbarManager` 会自动监听 `BottomDock` 状态变化,同步按钮激活状态:
```typescript
// 点击径向工具栏按钮展开/收起 Dock
onToggle: (active) => {
if (active) {
bimEngine.bottomDock?.open('measure');
} else {
bimEngine.bottomDock?.close('measure');
}
}
```
---
## BimCollapse折叠面板组件
### 概述

View File

@@ -172,3 +172,163 @@ bimEngine.engine?.getEngineComponent()?.isolateModels([
{ url: modelUrl, ids: [350518] }
]);
```
---
## 6) 启动一键编码 `startOneClickEncoding()`
### 所属模块
- 调用入口:`bimEngine.engine?.getEngineComponent()`
- 源码位置:`src/components/engine/index.ts`
### 方法签名
```ts
startOneClickEncoding(): void
```
### 入参
- 无入参。
### 行为约定
- 调用前建议先订阅 `encoding:start``encoding:complete``encoding:error` 事件以获取编码进度和结果。
- 若引擎未初始化或底层 `oneClickEncoding` 模块不可用,会在控制台输出警告并静默返回。
- 多次调用将重复触发编码流程(底层行为由 `iflow-engine-base` 决定)。
### 调用示例
```ts
const engineComp = bimEngine.engine?.getEngineComponent();
// 订阅编码事件
bimEngine.on('encoding:start', (data) => {
console.log('编码开始', data);
});
bimEngine.on('encoding:complete', (data) => {
console.log('编码完成', data);
});
bimEngine.on('encoding:error', (data) => {
console.log('编码失败', data);
});
// 启动编码
engineComp?.startOneClickEncoding();
```
---
## 7) 检查模型编码 `hasModelCode()`
### 所属模块
- 调用入口:`bimEngine.engine?.getEngineComponent()`
- 源码位置:`src/components/engine/index.ts`
### 方法签名
```ts
hasModelCode(): boolean
```
### 入参
- 无入参。
### 返回值
- `true`:所有已加载模型均已存在编码数据。
- `false`:至少有一个模型没有编码数据,或引擎未初始化、`oneClickEncoding` 模块不可用。
### 行为约定
- 遍历当前 `engine.models` 数组,对每个模型调用底层 `oneClickEncoding.exitModelCode(url)`
- 仅当所有模型的返回值为 `true` 时,才返回 `true`
- 若当前没有加载任何模型,返回 `false`
### 调用示例
```ts
const hasCode = bimEngine.engine?.getEngineComponent()?.hasModelCode();
console.log('模型是否已编码:', hasCode);
```
---
## 8) 读取缓存编码 `readModelCodeFormStoge()`
### 所属模块
- 调用入口:`bimEngine.engine?.getEngineComponent()`
- 源码位置:`src/components/engine/index.ts`
### 方法签名
```ts
readModelCodeFormStoge(): void
```
### 入参
- 无入参。
### 行为约定
- 遍历当前 `engine.models` 数组,对每个模型调用底层 `oneClickEncoding.readModelCodeFormStoge(url)`
- 若引擎未初始化或底层模块不可用,会在控制台输出警告并静默返回。
- 无返回值,仅触发读取动作。
### 调用示例
```ts
bimEngine.engine?.getEngineComponent()?.readModelCodeFormStoge();
```
---
## 9) 一键编码事件
### 所属模块
- 事件总线:`bimEngine`(通过 `ManagerRegistry` 桥接)
- 源码位置:`src/components/engine/index.ts`
### 事件列表
| 事件名 | 触发时机 | payload |
|--------|---------|---------|
| `encoding:start` | 编码流程开始时 | `{ data?: any }` |
| `encoding:complete` | 编码流程成功完成时 | `{ data?: any }` |
| `encoding:error` | 编码流程失败时 | `{ data?: any }` |
### 行为约定
- 事件由底层 `oneClickEncoding` 模块触发,经 `Engine` 组件桥接后冒泡到 `bimEngine` 事件总线。
- 订阅方式与 SDK 其他事件一致:使用 `bimEngine.on(event, handler)`,返回的函数可用于取消订阅。
- 建议在调用 `startOneClickEncoding()` 之前完成事件订阅,避免漏掉 `encoding:start` 事件。
### 调用示例
```ts
const unsubStart = bimEngine.on('encoding:start', (data) => {
console.log('编码开始', data);
});
const unsubComplete = bimEngine.on('encoding:complete', (data) => {
console.log('编码完成', data);
});
const unsubError = bimEngine.on('encoding:error', (data) => {
console.log('编码失败', data);
});
// 启动编码
bimEngine.engine?.getEngineComponent()?.startOneClickEncoding();
// 需要时取消订阅
// unsubStart();
// unsubComplete();
// unsubError();
```