Measure
NIVIOBIM测量功能的主插件类,继承自Plugin。提供完整的3D测量工具集,支持多种测量模式和设备适配。
主要功能包括:
- 多种测量模式:距离、角度、面积、体积、标高测量
- 设备适配:自动检测移动端并使用触控模式
- 单位精度管理:支持多种测量单位和精度设置
- 模型管理:设置和管理要测量的3D模型
- 事件分发:分发测量相关事件
- 资源管理:管理测量相关的资源
类定义
class Measure extends Plugin构造函数
constructor(viewer3D, options)
创建测量插件实例。
初始化测量插件,根据设备类型自动选择计算模式(桌面端使用SmartMeasureSystem,移动端使用TouchMode)。设置事件监听器,当测量状态更新时自动分发update事件。
参数:
viewer3D{Viewer3D} - 三维视图实例,提供场景管理器和渲染器访问options{Object} - 插件配置选项options.name{string} [可选] - 插件名称,默认值为Measureoptions.enabled{boolean} [可选] - 是否启用插件,默认值为false
示例:
// 创建测量插件
const measure = new Measure(viewer3D, {
name: 'Measure',
enabled: false
});
// 启用测量功能
measure.enabled = true;静态属性
UNIT
测量单位枚举。
定义所有可用的测量单位类型,用于控制测量结果的显示单位。
类型: {Object}
静态: true
只读: true
属性:
KM{number} - 千米,值为2000M{number} - 米,值为2001DM{number} - 分米,值为2002CM{number} - 厘米,值为2003MM{number} - 毫米,值为2004
示例:
// 使用测量单位枚举
console.log(Measure.UNIT.KM); // 2000
console.log(Measure.UNIT.M); // 2001
console.log(Measure.UNIT.CM); // 2003
// 设置测量单位
measure.setCurrentUnit(Measure.UNIT.M);
// 判断当前单位
if (measure.currentUnit === Measure.UNIT.M) {
console.log('当前单位为米');
}PRECISION
测量精度枚举。
定义测量结果的小数位数精度,用于控制测量结果的显示精度。
类型: {Object}
静态: true
只读: true
属性:
ONE{number} - 1位小数,值为1TWO{number} - 2位小数,值为2THREE{number} - 3位小数,值为3FOUR{number} - 4位小数,值为4FIVE{number} - 5位小数,值为5
示例:
// 使用测量精度枚举
console.log(Measure.PRECISION.ONE); // 1
console.log(Measure.PRECISION.TWO); // 2
console.log(Measure.PRECISION.THREE); // 3
// 设置测量精度
measure.setCurrentPrecision(Measure.PRECISION.TWO);
// 判断当前精度
if (measure.currentPrecision === Measure.PRECISION.TWO) {
console.log('当前精度为2位小数');
}MODE
测量模式枚举。
定义所有可用的测量模式类型,用于控制测量功能的操作模式。
类型: {Object}
静态: true
只读: true
属性:
NONE{number} - 无测量模式,值为1000DISTANCE{number} - 距离测量模式,值为1001LEVEL{number} - 标高测量模式,值为1002ANGEL{number} - 角度测量模式,值为1003CLOSED_LINE_AREA{number} - 闭合线面积测量模式,值为1004MESH_SURFACE_AREA{number} - 网格表面积测量模式,值为1005MESH_VOLUME{number} - 网格体积测量模式,值为1006
示例:
// 使用测量模式枚举
console.log(Measure.MODE.DISTANCE); // 1001
console.log(Measure.MODE.ANGEL); // 1003
console.log(Measure.MODE.LEVEL); // 1002
// 设置测量模式
measure.setCurrentMode(Measure.MODE.DISTANCE);
// 判断当前模式
if (measure.currentMode === Measure.MODE.DISTANCE) {
console.log('当前为距离测量模式');
}LEVEL_MODE
标高模式枚举。
定义标高测量的两种模式:
- ABSOLUTE: 绝对标高模式,显示相对于绝对零点(Y=0)的高度
- RELATIVE: 相对标高模式,显示相对于参考点的高度差
类型: {Object}
静态: true
只读: true
属性:
ABSOLUTE{number} - 绝对标高模式,值为3000RELATIVE{number} - 相对标高模式,值为3001
示例:
// 使用标高模式枚举
console.log(Measure.LEVEL_MODE.ABSOLUTE); // 3000
console.log(Measure.LEVEL_MODE.RELATIVE); // 3001
// 判断当前标高模式
if (currentMode === Measure.LEVEL_MODE.ABSOLUTE) {
console.log('当前为绝对标高模式');
} else if (currentMode === Measure.LEVEL_MODE.RELATIVE) {
console.log('当前为相对标高模式');
}属性
enabled
获取测量功能是否启用。
返回当前测量功能的启用状态,控制测量交互是否处于活动状态。
类型: {boolean}
只读: false
示例:
// 检查测量功能是否启用
if (measure.enabled) {
console.log('测量功能已启用');
}currentMode
获取当前测量模式。
返回当前激活的测量模式,如距离测量、角度测量、面积测量等。
类型: {number}
只读: true
示例:
// 获取当前测量模式
const mode = measure.currentMode;
console.log('当前测量模式:', mode);
// 判断是否为距离测量模式
if (measure.currentMode === Measure.MODE.DISTANCE) {
console.log('当前为距离测量模式');
}currentUnit
获取当前测量单位。
返回当前测量结果的显示单位,如米、厘米、毫米等。
类型: {number}
只读: true
示例:
// 获取当前测量单位
const unit = measure.currentUnit;
console.log('当前测量单位:', unit);
// 判断是否为米单位
if (measure.currentUnit === Measure.UNIT.M) {
console.log('当前单位为米');
}constraintEnable
获取或设置约束功能启用状态。
返回当前约束功能的启用状态,控制测量时是否启用智能约束功能。智能约束功能包括端点吸附、中点吸附、边缘吸附等。
类型: {boolean}
只读: false
示例:
// 检查约束功能是否启用
if (measure.constraintEnable) {
console.log('智能约束功能已启用');
}
// 启用/禁用约束功能
measure.constraintEnable = true;
measure.constraintEnable = false;currentPrecision
获取当前测量精度。
返回当前测量结果的小数位数精度设置。
类型: {number}
只读: true
示例:
// 获取当前测量精度
const precision = measure.currentPrecision;
console.log('当前测量精度:', precision);
// 判断是否为2位小数精度
if (measure.currentPrecision === Measure.PRECISION.TWO) {
console.log('当前精度为2位小数');
}方法
clear()
清除所有测量结果。
清空当前场景中的所有测量数据,包括测量线、测量标签和测量缓存。调用后所有已完成的测量结果将被移除。
示例:
// 清除所有测量结果
measure.clear();
console.log('所有测量结果已清除');setModel(model)
设置要测量的3D模型。
指定测量操作的目标模型,设置后测量功能将针对该模型进行交互。
参数:
model{Object3D} - 要测量的3D模型对象
示例:
// 设置测量模型
measure.setModel(modelGroup);
console.log('测量模型已设置');setCurrentMode(mode)
设置当前测量模式。
激活指定的测量功能,支持距离、角度、面积、体积、标高等多种测量模式。设置后用户可以通过交互进行相应类型的测量操作。
参数:
mode{number} - 测量模式(使用Measure.MODE枚举)
示例:
// 设置距离测量模式
measure.setCurrentMode(Measure.MODE.DISTANCE);
// 设置角度测量模式
measure.setCurrentMode(Measure.MODE.ANGEL);
// 设置面积测量模式
measure.setCurrentMode(Measure.MODE.CLOSED_LINE_AREA);
// 设置体积测量模式
measure.setCurrentMode(Measure.MODE.MESH_VOLUME);
// 设置标高测量模式
measure.setCurrentMode(Measure.MODE.LEVEL);setCurrentLevelMode(levelMode)
设置当前标高模式。
根据传入模式切换标高测量方式,并取消当前进行中的测量,以避免旧模式下的状态影响新模式。
参数:
levelMode{number} - 要设置的标高模式(LEVEL_MODE.ABSOLUTE 或 LEVEL_MODE.RELATIVE)
示例:
// 设置为绝对标高模式
measure.setCurrentLevelMode(Measure.LEVEL_MODE.ABSOLUTE);
// 设置为相对标高模式
measure.setCurrentLevelMode(Measure.LEVEL_MODE.RELATIVE);setCurrentUnit(unit)
设置当前测量单位。
更改测量结果的显示单位,支持千米、米、分米、厘米、毫米等多种长度单位。设置后所有测量结果将按新单位显示。
参数:
unit{number} - 测量单位(使用Measure.UNIT枚举)
示例:
// 设置单位为米
measure.setCurrentUnit(Measure.UNIT.M);
// 设置单位为厘米
measure.setCurrentUnit(Measure.UNIT.CM);
// 设置单位为毫米
measure.setCurrentUnit(Measure.UNIT.MM);
// 设置单位为千米
measure.setCurrentUnit(Measure.UNIT.KM);setCurrentPrecision(precision)
设置当前测量精度。
控制测量结果的小数位数精度,支持1-5位小数精度设置。设置后所有测量结果将按新精度显示。
参数:
precision{number} - 测量精度(使用Measure.PRECISION枚举)
示例:
// 设置精度为1位小数
measure.setCurrentPrecision(Measure.PRECISION.ONE);
// 设置精度为2位小数
measure.setCurrentPrecision(Measure.PRECISION.TWO);
// 设置精度为3位小数
measure.setCurrentPrecision(Measure.PRECISION.THREE);
// 设置精度为4位小数
measure.setCurrentPrecision(Measure.PRECISION.FOUR);
// 设置精度为5位小数
measure.setCurrentPrecision(Measure.PRECISION.FIVE);setSliceLineSelected(options)
设置剖切线选中状态。
将剖切线的命中点与剖切面信息传入测量系统,用于锁定第一个测量点并进入第二阶段测量。
参数:
options{Object} - 选中信息options.point{Vector3} - 命中点坐标options.plane{Plane} - 剖切面平面options.hit{Object} [可选] - 射线命中结果options.pointerEvent{PointerEvent} [可选] - 当前指针事件(用于去重)
示例:
section.addEventListener('sliceLineSelect', (event) => {
measure.setSliceLineSelected({
point: event.point,
plane: event.plane,
hit: event.hit,
pointerEvent: event.pointerEvent
});
});setSliceLineRaycast(callback)
设置剖切线射线检测回调函数。
用于向测量系统注入剖切线射线检测逻辑,支持剖切线上的吸附与命中计算。
参数:
callback{Function} - 剖切线射线检测回调
示例:
measure.setSliceLineRaycast((raycaster, intersections) => {
return section.raycastSliceLine(raycaster, intersections);
});setSliceLineHover(options)
设置剖切线悬停状态。
更新剖切线悬停的命中点与剖切面信息,用于显示吸附点与参照面。
参数:
options{Object} - 悬停信息options.point{Vector3} - 命中点坐标options.plane{Plane} - 剖切面平面options.hit{Object} [可选] - 射线命中结果
示例:
section.addEventListener('sliceLineHover', (event) => {
measure.setSliceLineHover({
point: event.point,
plane: event.plane,
hit: event.hit
});
});clearSliceLineHover()
清理剖切线悬停状态。
移除当前剖切线悬停效果与相关状态。
示例:
section.addEventListener('sliceLineHoverOut', () => {
measure.clearSliceLineHover();
});clearSliceLineSelected()
清理剖切线选中状态。
重置剖切线选中状态,释放相关锁定信息。
示例:
measure.clearSliceLineSelected();dispose()
销毁测量插件。
清理插件资源,移除所有事件监听器,销毁计算模式和测量工具。调用后插件将无法使用,需要重新创建实例。
示例:
// 销毁测量插件
measure.dispose();
console.log('测量插件已销毁');事件
update
测量状态更新事件。
当测量状态发生变化时触发,如测量点更新、测量完成等。