# BIM Engine SDK 使用文档
BIM Engine SDK 是一个用于 3D BIM 模型展示的 JavaScript SDK,支持原生 HTML、Vue 2/3 和 React 框架。
## 目录
- [安装](#安装)
- [原生 HTML 使用](#原生-html-使用)
- [Vue 3 使用](#vue-3-使用)
- [Vue 2 使用](#vue-2-使用)
- [React 使用](#react-使用)
- [API 参考](#api-参考)
- [类型定义](#类型定义)
---
## 安装
### NPM 安装
```bash
npm install bim-engine-sdk
```
### CDN / 本地引入
```html
```
---
## 原生 HTML 使用
### 基础示例
```html
BIM Engine Demo
```
### 完整功能示例
```html
```
---
## Vue 3 使用
### 安装依赖
```bash
npm install bim-engine-sdk
```
### 组件封装
```vue
```
### 使用组件
```vue
```
---
## Vue 2 使用
### 安装依赖
```bash
npm install bim-engine-sdk
```
### 组件封装
```vue
```
### 使用组件
```vue
```
---
## React 使用
### 安装依赖
```bash
npm install bim-engine-sdk
```
### Hook 封装
```tsx
// hooks/useBimEngine.ts
import { useEffect, useRef, useState, useCallback } from 'react';
import { BimEngine } from 'bim-engine-sdk';
import type { EngineOptions, ModelLoadOptions } from 'bim-engine-sdk';
type MeasureMode = 'distance' | 'minDistance' | 'angle' | 'elevation' | 'volume' | 'laserDistance' | 'slope' | 'spaceVolume';
interface UseBimEngineOptions {
locale?: 'zh-CN' | 'en-US';
theme?: 'light' | 'dark';
engineOptions?: Omit;
onReady?: (engine: BimEngine) => void;
onError?: (error: Error) => void;
}
export function useBimEngine(options: UseBimEngineOptions = {}) {
const containerRef = useRef(null);
const engineRef = useRef(null);
const [isReady, setIsReady] = useState(false);
const [error, setError] = useState(null);
// 初始化引擎
useEffect(() => {
if (!containerRef.current) return;
try {
// 创建引擎实例
const engine = new BimEngine(containerRef.current, {
locale: options.locale || 'zh-CN',
theme: options.theme || 'light'
});
// 初始化 3D 引擎
const success = engine.engine?.initialize({
version: 'v2',
showStats: false,
showViewCube: true,
...options.engineOptions
});
if (success) {
engineRef.current = engine;
setIsReady(true);
options.onReady?.(engine);
} else {
throw new Error('3D 引擎初始化失败');
}
} catch (err) {
const error = err as Error;
setError(error);
options.onError?.(error);
}
// 清理
return () => {
engineRef.current?.destroy();
engineRef.current = null;
setIsReady(false);
};
}, []);
// 加载模型
const loadModel = useCallback((url: string, modelOptions?: ModelLoadOptions) => {
engineRef.current?.engine?.loadModel(url, modelOptions);
}, []);
// 回到主视角
const goHome = useCallback(() => {
engineRef.current?.engine?.CameraGoHome();
}, []);
// 激活测量
const activateMeasure = useCallback((mode: MeasureMode) => {
engineRef.current?.engine?.activateMeasure(mode);
}, []);
// 停用测量
const deactivateMeasure = useCallback(() => {
engineRef.current?.engine?.deactivateMeasure();
}, []);
// 切换主题
const setTheme = useCallback((theme: 'light' | 'dark') => {
engineRef.current?.setTheme(theme);
}, []);
// 切换语言
const setLocale = useCallback((locale: 'zh-CN' | 'en-US') => {
engineRef.current?.setLocale(locale);
}, []);
return {
containerRef,
engine: engineRef.current,
isReady,
error,
loadModel,
goHome,
activateMeasure,
deactivateMeasure,
setTheme,
setLocale
};
}
```
### 组件封装
```tsx
// components/BimViewer.tsx
import React, { useEffect } from 'react';
import { useBimEngine } from '../hooks/useBimEngine';
import type { ModelLoadOptions } from 'bim-engine-sdk';
interface BimViewerProps {
modelUrl?: string;
modelOptions?: ModelLoadOptions;
locale?: 'zh-CN' | 'en-US';
theme?: 'light' | 'dark';
className?: string;
style?: React.CSSProperties;
onReady?: (engine: any) => void;
onError?: (error: Error) => void;
}
export const BimViewer = React.forwardRef((props, ref) => {
const {
modelUrl,
modelOptions,
locale = 'zh-CN',
theme = 'light',
className,
style,
onReady,
onError
} = props;
const {
containerRef,
engine,
isReady,
loadModel,
goHome,
activateMeasure,
deactivateMeasure,
setTheme,
setLocale
} = useBimEngine({
locale,
theme,
onReady,
onError
});
// 暴露方法给父组件
React.useImperativeHandle(ref, () => ({
getEngine: () => engine,
loadModel,
goHome,
activateMeasure,
deactivateMeasure,
setTheme,
setLocale
}));
// 加载模型
useEffect(() => {
if (isReady && modelUrl) {
loadModel(modelUrl, modelOptions);
}
}, [isReady, modelUrl, modelOptions, loadModel]);
return (
);
});
BimViewer.displayName = 'BimViewer';
```
### 使用组件
```tsx
// App.tsx
import React, { useRef } from 'react';
import { BimViewer } from './components/BimViewer';
function App() {
const viewerRef = useRef(null);
const handleReady = (engine: any) => {
console.log('引擎已就绪', engine);
};
const handleError = (error: Error) => {
console.error('引擎错误', error);
};
const goHome = () => {
viewerRef.current?.goHome();
};
const measure = (mode: string) => {
viewerRef.current?.activateMeasure(mode);
};
const stopMeasure = () => {
viewerRef.current?.deactivateMeasure();
};
return (
);
}
export default App;
```
---
## API 参考
### BimEngine
主引擎类,用于创建和管理 BIM 引擎实例。
#### 构造函数
```typescript
new BimEngine(container: HTMLElement | string, options?: {
locale?: 'zh-CN' | 'en-US';
theme?: 'light' | 'dark';
})
```
| 参数 | 类型 | 说明 |
|------|------|------|
| container | HTMLElement \| string | 容器元素或容器 ID |
| options.locale | string | 语言设置,默认 'zh-CN' |
| options.theme | string | 主题设置,默认 'light' |
#### 属性
| 属性 | 类型 | 说明 |
|------|------|------|
| engine | EngineManager | 3D 引擎管理器 |
| toolbar | ToolbarManager | 工具栏管理器 |
| dialog | DialogManager | 弹窗管理器 |
| measure | MeasureDialogManager | 测量面板管理器 |
#### 方法
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| setLocale | locale: 'zh-CN' \| 'en-US' | void | 设置语言 |
| getLocale | - | string | 获取当前语言 |
| setTheme | theme: 'light' \| 'dark' | void | 设置主题 |
| setCustomTheme | theme: ThemeConfig | void | 设置自定义主题 |
| destroy | - | void | 销毁引擎 |
---
### EngineManager
3D 引擎管理器,通过 `engine.engine` 访问。
#### 方法
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| initialize | options?: EngineOptions | boolean | 初始化 3D 引擎 |
| isInitialized | - | boolean | 检查是否已初始化 |
| loadModel | url: string, options?: ModelLoadOptions | void | 加载模型 |
| CameraGoHome | - | void | 回到主视角 |
| activateMeasure | mode: MeasureMode | void | 激活测量功能 |
| deactivateMeasure | - | void | 停用测量功能 |
| getCurrentMeasureType | - | MeasureMode \| null | 获取当前测量类型 |
| getEngine | - | any | 获取原始引擎实例 |
| destroy | - | void | 销毁引擎 |
---
## 类型定义
### EngineOptions
```typescript
interface EngineOptions {
container: HTMLElement; // 容器元素
backgroundColor?: number | string; // 背景色
version?: 'v1' | 'v2'; // WebGL 版本
showStats?: boolean; // 是否显示性能统计
showViewCube?: boolean; // 是否显示视图立方体
}
```
### ModelLoadOptions
```typescript
interface ModelLoadOptions {
position?: [number, number, number]; // 位置 [x, y, z]
rotation?: [number, number, number]; // 旋转 [x, y, z](弧度)
scale?: [number, number, number]; // 缩放 [x, y, z]
id?: string; // 模型 ID
}
```
### MeasureMode
```typescript
type MeasureMode =
| 'distance' // 距离测量
| 'minDistance' // 最小距离测量
| 'angle' // 角度测量
| 'elevation' // 标高测量
| 'volume' // 体积测量
| 'laserDistance' // 激光测距
| 'slope' // 坡度测量
| 'spaceVolume'; // 空间体积测量
```
---
## 注意事项
1. **容器尺寸**:确保容器元素有明确的宽度和高度,否则 3D 引擎可能无法正常渲染。
2. **模型路径**:模型路径应为相对于 HTML 页面的路径,或者完整的 URL。
3. **销毁清理**:在组件卸载或页面关闭前,务必调用 `destroy()` 方法释放资源。
4. **浏览器兼容性**:SDK 需要浏览器支持 WebGL。建议使用现代浏览器(Chrome、Firefox、Safari、Edge)。
5. **静态资源**:确保 Draco 解码器等静态资源正确部署:
```
/static/js/draco/
├── DRACOLoader.js
├── draco_decoder.js
├── draco_decoder.wasm
├── draco_encoder.js
└── draco_wasm_wrapper.js
```
---
## 常见问题
### Q: 模型加载失败怎么办?
A: 检查以下几点:
- 模型路径是否正确
- 模型格式是否支持
- 网络请求是否正常(F12 查看 Network)
- Draco 解码器是否正确部署
### Q: 如何自定义主题?
A: 使用 `setCustomTheme` 方法:
```javascript
engine.setCustomTheme({
background: '#1a1a2e',
textPrimary: '#ffffff',
textSecondary: '#cccccc',
// ... 更多配置
});
```
### Q: 如何监听引擎事件?
A: 使用 `on` 方法监听事件:
```javascript
engine.on('modelLoaded', (data) => {
console.log('模型已加载', data);
});
```
---
## 技术支持
如有问题,请联系技术支持或提交 Issue。