Skip to content

Tools API

u-space 提供了一组实用工具类,包括测量、剖切和标注功能。

MeasureTool

用于 3D 场景中的距离测量、面积测量和角度测量,测量结果会以可视化线条渲染到场景中。

typescript
import { MeasureTool } from 'u-space';

const measureTool = new MeasureTool(viewer.scene);

measureDistance(pointA, pointB, options?)

测量两点之间的距离,并在场景中绘制连线。

typescript
const result = measureTool.measureDistance(
  { x: 0, y: 0, z: 0 },
  { x: 5, y: 0, z: 5 },
  { lineColor: 0xffff00 },
);
console.log(result.value, result.unit); // 7.071 m

measureArea(points, options?)

测量由 3 个或更多共面点围成的多边形面积。

typescript
const result = measureTool.measureArea([
  { x: 0, y: 0, z: 0 },
  { x: 5, y: 0, z: 0 },
  { x: 5, y: 0, z: 5 },
  { x: 0, y: 0, z: 5 },
], { lineColor: 0x00ff00 });
console.log(result.value, result.unit); // 25 m²

measureAngle(pointA, vertex, pointC, options?)

测量以中间点为顶点的夹角(单位:度)。

typescript
const result = measureTool.measureAngle(
  { x: 3, y: 0, z: 0 },
  { x: 0, y: 0, z: 0 },
  { x: 0, y: 0, z: 3 },
);
console.log(result.value, result.unit); // 90 °

MeasureResult

所有测量方法返回 MeasureResult 对象:

属性类型说明
idstring测量的唯一标识。
typestring'distance' / 'area' / 'angle'
valuenumber测量值。
unitstring单位(m°)。
pointsVector3[]测量点坐标。
objectGroup场景中的可视化对象。

MeasureStyleOptions

属性类型默认值说明
lineColorColorRepresentation因方法而异线条颜色。

管理方法

typescript
measureTool.get('measure_dist_0');  // 获取指定测量
measureTool.remove('measure_dist_0'); // 移除指定测量
measureTool.removeAll();              // 清除全部
measureTool.getAll();                 // 获取所有测量结果
measureTool.dispose();                // 释放资源

ClippingTool

提供剖切面和剖切盒功能,基于 WebGPU 的 ClippingGroup 实现。需要被剖切的对象必须是 ClippingGroup 的子节点。

typescript
import { ClippingTool } from 'u-space';

const clippingTool = new ClippingTool(viewer.scene);

// 将场景中已有的物体移入 ClippingGroup,使其受剖切影响
clippingTool.attach();

attach() / detach()

attach() 将场景根节点的所有子对象移入内部的 ClippingGroup,使其受剖切面影响。detach() 反向操作,将对象移回场景根节点。

也可以手动将对象添加到 clippingTool.group 中:

typescript
clippingTool.group.add(myModel); // 仅 myModel 受剖切

addPlane(id, options?)

添加一个剖切面。

typescript
clippingTool.addPlane('cutY', {
  normal: { x: 0, y: -1, z: 0 },  // 法线方向
  constant: 1.5,                    // 距离原点的偏移
  showHelper: true,                 // 显示 Helper
  helperSize: 5,
  helperColor: 0xff0000,
});

ClippingPlaneOptions

属性类型默认值说明
normal{x, y, z}{x:0, y:-1, z:0}法线方向。
constantnumber0距原点偏移。
showHelperbooleanfalse是否显示 PlaneHelper。
helperSizenumber5Helper 尺寸。
helperColorColorRepresentation0xff0000Helper 颜色。

addBox(id, box, options?) / addBoxFromObject(id, object, padding?, options?)

添加由 6 个面组成的剖切盒。

typescript
import { Box3 } from 'three/webgpu';

// 从 Box3 创建
const box = new Box3().setFromObject(myModel);
clippingTool.addBox('clipBox', box);

// 从对象创建(带边距)
clippingTool.addBoxFromObject('clipBox', myModel, 0.5);

动态调整

typescript
clippingTool.setPlaneConstant('cutY', 2.0); // 修改剖切位置
viewer.render();

Helper 控制

typescript
clippingTool.showHelper('cutY', 5, 0xff0000);
clippingTool.hideHelper('cutY');

管理方法

typescript
clippingTool.get('cutY');       // 获取 Plane 对象
clippingTool.removePlane('cutY'); // 移除单个
clippingTool.removeBox('clipBox'); // 移除剖切盒(6 个面)
clippingTool.removeAll();          // 移除全部
clippingTool.enable();             // 启用剖切
clippingTool.disable();            // 禁用剖切
clippingTool.dispose();            // 释放资源(对象移回场景根节点)

AnnotationManager

管理 3D 标注,支持引线标注和 HTML 标签。配合 CSSRenderer 使用可实现 HTML 浮动标签。

typescript
import { AnnotationManager } from 'u-space';

const annotationManager = new AnnotationManager(viewer.scene);

setCSSObjectFactory(factory)

设置 CSS 对象工厂函数(来自 CSSRenderer),使标注可渲染为 CSS 叠加元素。

typescript
annotationManager.setCSSObjectFactory(
  (el) => viewer.cssRenderer.createCSS2DObject(el),
);

add(id, options)

添加一个标注。

typescript
annotationManager.add('label-01', {
  position: { x: 0, y: 3, z: 0 },
  content: '<b>设备 A</b><br>温度: 25°C',
  labelOffset: { x: 0, y: 2, z: 0 },
  showLeaderLine: true,
  lineColor: 0xffffff,
  labelStyle: {
    background: 'rgba(0, 0, 0, 0.8)',
    padding: '8px 12px',
    borderRadius: '6px',
  },
});

AnnotationOptions

属性类型默认值说明
position{x, y, z}标注锚点位置。
contentstringHTML 内容。
labelOffset{x, y, z}{0, 2, 0}标签相对锚点的偏移。
showLeaderLinebooleantrue是否显示引线。
lineColorColorRepresentation0xffffff引线颜色。
labelStyleAnnotationLabelStyle自定义 CSS 样式。

addText(text, position, options?)

快捷添加纯文本标注。

typescript
annotationManager.addText('入口', { x: 5, y: 0, z: 0 });

更新与控制

typescript
annotationManager.updateContent('label-01', '温度: 30°C');
annotationManager.updatePosition('label-01', { x: 1, y: 3, z: 0 });
annotationManager.show('label-01');
annotationManager.hide('label-01');
annotationManager.showAll();
annotationManager.hideAll();

管理方法

typescript
annotationManager.get('label-01');   // 获取标注对象
annotationManager.remove('label-01'); // 移除标注
annotationManager.removeAll();        // 移除全部
annotationManager.keys();             // 获取所有 ID
annotationManager.size;               // 标注数量
annotationManager.dispose();          // 释放资源

u-space docs