Section
NIVIOBIM剖切功能的主插件类,提供完整的3D模型剖切功能,包括剖切盒管理、剖切面控制与拖拽交互。
类定义
class Section extends Plugin构造函数
constructor(viewer3D, options)
初始化剖切插件,设置剖切盒、拖拽控制器和事件监听。
参数:
viewer3D{Viewer3D} - Viewer3D实例,提供场景和渲染器访问options{Object} - 插件配置选项
示例:
// 创建剖切插件
const section = new Section(viewer3D, {
name: 'Section'
});属性
enabled
剖切功能是否启用。
类型:
示例:
// 启用剖切功能
section.enabled = true;
// 禁用剖切功能
section.enabled = false;Box
剖切盒对象,返回当前剖切盒的引用。
类型: {SectionBox}
只读: true
示例:
// 获取剖切盒对象
const box = section.Box;boxVisible
剖切盒是否可见,同时反映拖拽功能是否启用。
类型: {boolean}
只读: true
示例:
// 检查剖切盒是否可见
if (section.boxVisible) {
console.log('剖切盒可见');
}planes
剖切面数组,返回六个剖切面的数组。
类型: {Array<Plane>}
只读: true
示例:
// 获取剖切面数组
const planes = section.planes;planeInterval
剖切面区间,返回剖切面的包围盒区间。
类型: {Box3}
只读: true
示例:
// 获取剖切面区间
const interval = section.planeInterval;inBox
交点过滤函数引用,用于筛选剖切盒内部交点。
类型: {Function}
只读: true
示例:
// 获取过滤函数
const filter = section.inBox;sliceLinesEnabled
剖切线显示与交互总开关。
启用时允许渲染剖切线并参与悬停/选中;禁用时会清除剖切线与高亮。
类型: {boolean}
只读: false
示例:
// 关闭剖切线显示与交互
section.sliceLinesEnabled = false;
// 打开剖切线显示与交互
section.sliceLinesEnabled = true;sliceLineRayEnabled
剖切线射线检测开关。
关闭后 raycastSliceLine 将直接返回,不参与剖切线命中检测。
类型: {boolean}
只读: false
示例:
section.sliceLineRayEnabled = false;
section.sliceLineRayEnabled = true;方法
setBoxVisible(boolean)
设置剖切盒可见性,同时控制拖拽功能的启用状态。
参数:
boolean{boolean} - 是否显示剖切盒,true为显示,false为隐藏
示例:
// 显示剖切盒
section.setBoxVisible(true);getBoxInterval()
获取剖切盒区间,返回剖切盒的包围盒区间。
返回值:
- {Box3} 剖切盒区间
示例:
const interval = section.getBoxInterval();moveTo(axis, index, sign, value)
移动剖切盒,更新剖切面的位置参数。
参数:
axis{string} - 移动的轴向,'x'、'y'或'z'index{number} - 剖切面索引,0-5分别对应六个剖切面sign{number} - 移动方向,1为正方向,-1为负方向value{number} - 移动的目标值
示例:
// 沿X轴正方向移动剖切盒
section.moveTo('x', 1, 1, 10);getBoundingBoxCenter()
获取剖切盒的中心点坐标,通常用于定位和视图居中等操作。
返回值:
- {Vector3} 剖切盒的中心点坐标
示例:
// 获取剖切盒中心点
const center = section.getBoundingBoxCenter();getBoundingSphere()
获取剖切盒的包围球。
计算并返回当前剖切盒几何体的包围球(BoundingSphere)。
返回值:
- {Sphere} 当前剖切盒的包围球
示例:
const sphere = section.getBoundingSphere();
console.log('包围球:', sphere);getBoundingBox()
获取剖切盒的包围盒。
计算并返回当前剖切盒几何体的包围盒(BoundingBox)。
返回值:
- {Box3} 当前剖切盒的包围盒
示例:
const box = section.getBoundingBox();
console.log('包围盒:', box);shouldHighlightSliceLine()
判断是否允许剖切线高亮。
返回值:
- {boolean} 是否允许剖切线高亮
示例:
if (section.shouldHighlightSliceLine()) {
console.log('剖切线高亮已启用');
}highlightSliceLineByPointer(pointerEvent, camera)
根据指针位置高亮剖切线,命中剖切线时会触发 sliceLineHover 事件,未命中时触发 sliceLineHoverOut。
参数:
pointerEvent{PointerEvent} - 指针事件camera{Camera} - 当前相机
示例:
section.highlightSliceLineByPointer(event, camera);highlightSliceSegment(hit)
高亮命中的剖切线段,并在场景中渲染高亮线段。
参数:
hit{Object} - Raycaster 命中结果
示例:
section.highlightSliceSegment(hit);selectionFilter(intersections)
过滤交点,仅保留剖切盒内部的交点(根据剖切面和剖切盒)。
参数:
intersections{Array<Object>} - three.js Raycaster 的相交结果数组
返回值:
- {Array<Object>} 过滤后的交点数组
示例:
const filtered = section.selectionFilter(intersections);clearSliceHighlight()
清除剖切线高亮状态。
移除当前高亮线段并释放相关几何资源。
示例:
section.clearSliceHighlight();updateSliceLines(options)
更新剖切线显示。
根据当前剖切状态重建或清空剖切线。
参数:
options{Object} [可选] - 更新选项options.clearOnly{boolean} [可选] - 是否仅清空剖切线而不重建
示例:
// 仅清空剖切线
section.updateSliceLines({ clearOnly: true });
// 重建剖切线
section.updateSliceLines();setSelectionFilterFirstOnly(boolean)
设置 selectionFilter 是否只返回第一个交点。
参数:
boolean{boolean} - true 仅返回第一个交点,false 返回所有交点
示例:
section.setSelectionFilterFirstOnly(false);raycastSliceLine(raycaster, intersections)
执行剖切线射线检测。
在启用剖切线射线检测时,对当前剖切线集合执行 Raycaster 命中计算。
参数:
raycaster{Raycaster} - three.js 射线检测器intersections{Array<Object>} [可选] - 命中结果数组,默认[]
返回值:
- {Array<Object>} 命中结果数组
示例:
const hits = section.raycastSliceLine(raycaster, []);reset()
重置剖切盒,将剖切盒恢复到默认状态,包括大小、位置和可见性。
示例:
section.reset();dispose()
销毁剖切插件,清理插件资源,移除剖切盒,释放事件监听器,还原材质属性。
示例:
section.dispose();事件
update
剖切状态更新时触发,当剖切盒位置、可见性或剖切参数发生变化时触发。
示例:
section.addEventListener('update', () => {
console.log('剖切状态已更新');
});drag
剖切盒拖拽时触发。
事件数据:
object{Object} - 拖拽的对象pointerType{string} - 指针类型(mouse、touch、pen)
示例:
section.addEventListener('drag', (event) => {
console.log('剖切盒拖拽中', event.pointerType);
});dragend
剖切盒拖拽结束时触发。
事件数据:
object{Object} - 拖拽的对象pointerType{string} - 指针类型(mouse、touch、pen)
示例:
section.addEventListener('dragend', (event) => {
console.log('剖切盒拖拽结束', event.pointerType);
});hoveron
鼠标悬停开始时触发。
事件数据:
object{Object} - 悬停的对象pointerType{string} - 指针类型(mouse、touch、pen)
示例:
section.addEventListener('hoveron', (event) => {
console.log('悬停开始', event.pointerType);
});hoveroff
鼠标悬停结束时触发。
事件数据:
object{Object} - 悬停的对象pointerType{string} - 指针类型(mouse、touch、pen)
示例:
section.addEventListener('hoveroff', (event) => {
console.log('悬停结束', event.pointerType);
});hoverout
鼠标移出时触发。
事件数据:
pointerType{string} - 指针类型(mouse、touch、pen)
示例:
section.addEventListener('hoverout', (event) => {
console.log('鼠标移出', event.pointerType);
});sliceLineHover
鼠标悬停到剖切线时触发,返回命中线段与剖切面信息。
事件数据:
hit{Object} - Raycaster 命中结果point{Vector3} - 命中点坐标plane{Plane} - 命中线段对应的剖切面planeIndex{number} - 命中线段对应的剖切面索引
示例:
section.addEventListener('sliceLineHover', (event) => {
console.log('剖切线悬停', event.planeIndex, event.point);
});sliceLineHoverOut
鼠标移出剖切线或不再命中时触发。
示例:
section.addEventListener('sliceLineHoverOut', () => {
console.log('剖切线悬停结束');
});sliceLineSelect
鼠标点击剖切线时触发,返回命中线段与剖切面信息。
事件数据:
hit{Object} - Raycaster 命中结果point{Vector3} - 命中点坐标plane{Plane} - 命中线段对应的剖切面planeIndex{number} - 命中线段对应的剖切面索引pointerEvent{PointerEvent} - 原始指针事件
示例:
section.addEventListener('sliceLineSelect', (event) => {
console.log('剖切线选中', event.planeIndex, event.point);
});