deep-engine-demo/packages/docs/api/tool/Tool.md
2026-04-19 18:46:28 +08:00

343 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
outline: [2, 3]
---
# Tool
- 源文件:`packages/sdk/src/tool/Tool.ts`
- 文档位置:`packages/docs/api/tool/Tool.md`
## 枚举:`UserDataProperty`
- 作用UserData 属性枚举
| 枚举项 | 值 | 说明 |
| --- | --- | --- |
| `SELECTION` | `'selection'` | 选择排除属性,为真的时候,在点击事件进行返回 |
| `SCENE_TREE_EXCLUDE` | `'sceneTreeExclude'` | 场景树排除属性 |
## 类:`Tool`
- 作用:包围盒工具类 提供计算物体包围盒的静态方法
### 属性
| 属性名 | 可见性 | 类型 | 作用 |
| --- | --- | --- | --- |
| `originalTransparentMap` | `public static` | `WeakMap<THREE.Material<THREE.MaterialEventMap>, boolean>` | 修改对象及其所有子对象的透明度 |
### 方法
#### `defineMaterialOpacityMapping(object: THREE.Mesh, propertyName: string = "mappedOpacity", sourceMin: number = 0.3, sourceMax: number = 1): void`
- 作用:为对象定义透明度映射属性 读取时将材质 opacity 从 sourceMin~sourceMax 映射到 0~1设置时反向映射回 sourceMin~sourceMax。
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Mesh` | 是 | 目标对象(需包含 material |
| `propertyName` | `string` | 否 | 挂载到对象上的属性名,默认 opacity |
| `sourceMin` | `number` | 否 | 材质真实透明度最小值,默认 0.3 |
| `sourceMax` | `number` | 否 | 材质真实透明度最大值,默认 1 |
- 出参:`void`
- 返回说明:无返回值。
#### `removeMaterialOpacityMapping(object: THREE.Object3D, propertyName: string = "opacity", restoreDirectBinding: boolean = true): void`
- 作用:取消对象上的透明度映射属性 可选恢复为材质 opacity 的直接读写绑定(不做区间映射)。
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 目标对象(需包含 material |
| `propertyName` | `string` | 否 | 挂载在对象上的属性名,默认 opacity |
| `restoreDirectBinding` | `boolean` | 否 | 是否恢复直接绑定,默认 true |
- 出参:`void`
- 返回说明:无返回值。
#### `computeBoundingBox(object: THREE.Object3D): THREE.Box3 | null`
- 作用:计算物体的包围盒,包括所有子对象
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要计算包围盒的物体 |
- 出参:`THREE.Box3 \| null`
- 返回说明:物体的包围盒,如果物体没有几何体则返回 null
#### `getBoundingBoxSize(object: THREE.Object3D): THREE.Vector3 | null`
- 作用:计算物体包围盒的大小
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要计算大小的物体 |
- 出参:`THREE.Vector3 \| null`
- 返回说明:包围盒的大小向量,如果物体没有几何体则返回 null
#### `getBoundingBoxCenter(object: THREE.Object3D): THREE.Vector3 | null`
- 作用:计算物体包围盒的中心点
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要计算中心点的物体 |
- 出参:`THREE.Vector3 \| null`
- 返回说明:包围盒的中心点向量,如果物体没有几何体则返回 null
#### `getBoundingBoxFaceCenters(object: THREE.Object3D): { YF: THREE.Vector3; YB: THREE.Vector3; ZU: THREE.Vector3; ZD: THREE.Vector3; XL: THREE.Vector3; XR: THREE.Vector3; } | null`
- 作用:计算物体包围盒的六个面中心点
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要计算面中心点的物体 |
- 出参:`{ YF: THREE.Vector3; YB: THREE.Vector3; ZU: THREE.Vector3; ZD: THREE.Vector3; XL: THREE.Vector3; XR: THREE.Vector3; } \| null`
- 返回说明:六个面的中心点对象,如果物体没有几何体则返回 null
#### `queryObjectsByName(scene: THREE.Object3D, name: string, exactMatch: boolean = false): THREE.Object3D<THREE.Object3DEventMap>[]`
- 作用:遍历场景并查询对象名称
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `scene` | `THREE.Object3D` | 是 | 要查询的场景或对象 |
| `name` | `string` | 是 | 查询的名称 |
| `exactMatch` | `boolean` | 否 | 是否精确匹配true: === 匹配, false: 模糊匹配) |
- 出参:`THREE.Object3D<THREE.Object3DEventMap>[]`
- 返回说明:匹配的对象列表
#### `setUserDataProperty(object: THREE.Object3D, key: string, value: any): void`
- 作用:给 Three.js 对象设置 userData 属性
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要设置属性的对象 |
| `key` | `string` | 是 | 属性名 |
| `value` | `any` | 是 | 属性值 |
- 出参:`void`
- 返回说明:无返回值。
#### `removeUserDataProperty(object: THREE.Object3D, key: string): void`
- 作用:从 Three.js 对象中移除 userData 属性
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要移除属性的对象 |
| `key` | `string` | 是 | 属性名 |
- 出参:`void`
- 返回说明:无返回值。
#### `setSelectionExclude(object: THREE.Object3D, exclude: boolean = true): void`
- 作用:给 Three.js 对象设置 meta 中的是否选择排除属性
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要设置属性的对象 |
| `exclude` | `boolean` | 否 | 是否排除选择 |
- 出参:`void`
- 返回说明:无返回值。
#### `setSceneTreeExclude(object: THREE.Object3D, exclude: boolean = true): void`
- 作用:给 Three.js 对象设置 meta 中的是否场景树排除属性
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要设置属性的对象 |
| `exclude` | `boolean` | 否 | 是否排除场景树 |
- 出参:`void`
- 返回说明:无返回值。
#### `setExcludeAll(object: THREE.Object3D, exclude: boolean = true): void`
- 作用:同时设置选择排除和场景树排除属性
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要设置属性的对象 |
| `exclude` | `boolean` | 否 | 是否排除,默认为 true |
- 出参:`void`
- 返回说明:无返回值。
#### `setHiddenAndUnselectable(object: THREE.Object3D): void`
- 作用:设置对象不可在树菜单显示且不可选择
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要设置属性的对象 |
- 出参:`void`
- 返回说明:无返回值。
#### `handleMaterialOpacity(object: THREE.Object3D, material: THREE.Material, opacity: number): void`
- 作用:处理单个材质的透明度
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 目标对象。 |
| `material` | `THREE.Material` | 是 | 要处理的材质 |
| `opacity` | `number` | 是 | 透明度值,范围 0-1 |
- 出参:`void`
- 返回说明:无返回值。
#### `setOpacity(object: THREE.Object3D, opacity: number): void`
- 作用:设置 Opacity。
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 目标对象。 |
| `opacity` | `number` | 是 | 参数 `opacity`,类型为 `number`。 |
- 出参:`void`
- 返回说明:无返回值。
#### `getOpacity(mesh: THREE.Mesh, materialIndex: number = 0): number`
- 作用:获取对象的透明度值
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `mesh` | `THREE.Mesh` | 是 | 要获取透明度的 Mesh 对象 |
| `materialIndex` | `number` | 否 | 材质索引,当材质为数组时使用,默认为 0 |
- 出参:`number`
- 返回说明:透明度值,范围 0-1
#### `getPoints(points: Array<THREE.Vector3 | { x: number; y: number; z: number }>): THREE.Vector3[]`
- 作用:获取 Points。
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `points` | `Array<THREE.Vector3 \| { x: number; y: number; z: number }>` | 是 | 参数 `points`,类型为 `Array<THREE.Vector3 \| { x: number; y: number; z: number }>`。 |
- 出参:`THREE.Vector3[]`
- 返回说明:返回数组结果,元素类型为 `THREE.Vector3`
#### `setRenderOrder(object: THREE.Object3D, defaultRenderOrder: number, specificMeshes?: Array<{ name: string, renderOrder: number }>): void`
- 作用:设置场景中网格的渲染顺序
- 入参:
| 参数名 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `object` | `THREE.Object3D` | 是 | 要遍历的根对象 |
| `defaultRenderOrder` | `number` | 是 | 所有网格的默认渲染顺序值 |
| `specificMeshes` | `Array<{ name: string, renderOrder: number }>` | 否 | 可选的特定网格数组及其渲染顺序值 |
- 出参:`void`
- 返回说明:无返回值。
## 构造示例
- 当前 Demo 中没有直接展示 `Tool` 的构造调用。
## 函数示例
### `Tool.defineMaterialOpacityMapping`
- 来源:`packages/demo/src/hooks/Bus.ts`
```ts
setSection(section: ParametricBox | THREE.Mesh) {
Tool.defineMaterialOpacityMapping(section);
this.section = section;
}
```
### `Tool.setSelectionExclude`
- 来源:`packages/demo/src/components/SceneTree.vue`
```ts
if (object) {
Tool.setSelectionExclude(object, selectable);
}
}
};
```
### `Tool.setExcludeAll`
- 来源:`packages/demo/src/panels/TunnelScene/RobotExcavationPanel.vue`
```ts
let defaultExcavationTunnel = new ParametricArch(viewer, {
...geometrySettings,
animate:false
});
defaultExcavationTunnel.name = "机器人开挖隧道碰撞体";
defaultExcavationTunnel.visible = false;
Tool.setExcludeAll(defaultExcavationTunnel)
viewer.rangeCullingManager.add(defaultExcavationTunnel);
```
## Demo 参考
### `Tool`
以下示例文件中可以看到该 API 的实际调用方式:
- `packages/demo/src/components/SceneTree.vue`
- `packages/demo/src/hooks/Bus.ts`
- `packages/demo/src/hooks/useDebug.ts`
- `packages/demo/src/panels/TunnelScene/RobotExcavationPanel.vue`
- `packages/demo/src/views/GeothermalScene.vue`
- `packages/demo/src/views/GoldMineScene.vue`
- `packages/demo/src/views/OilGasScene.vue`
- `packages/demo/src/views/TunnelScene.vue`