Skip to content

Section

NIVIOBIM剖切功能的主插件类,提供完整的3D模型剖切功能,包括剖切盒管理、剖切面控制与拖拽交互。

类定义

javascript
class Section extends Plugin

构造函数

constructor(viewer3D, options)

初始化剖切插件,设置剖切盒、拖拽控制器和事件监听。

参数:

  • viewer3D {Viewer3D} - Viewer3D实例,提供场景和渲染器访问
  • options {Object} - 插件配置选项

示例:

javascript
// 创建剖切插件
const section = new Section(viewer3D, {
    name: 'Section'
});

属性

enabled

剖切功能是否启用。

类型:

示例:

javascript
// 启用剖切功能
section.enabled = true;

// 禁用剖切功能
section.enabled = false;

Box

剖切盒对象,返回当前剖切盒的引用。

类型: {SectionBox}
只读: true

示例:

javascript
// 获取剖切盒对象
const box = section.Box;

boxVisible

剖切盒是否可见,同时反映拖拽功能是否启用。

类型: {boolean}
只读: true

示例:

javascript
// 检查剖切盒是否可见
if (section.boxVisible) {
    console.log('剖切盒可见');
}

planes

剖切面数组,返回六个剖切面的数组。

类型: {Array<Plane>}
只读: true

示例:

javascript
// 获取剖切面数组
const planes = section.planes;

planeInterval

剖切面区间,返回剖切面的包围盒区间。

类型: {Box3}
只读: true

示例:

javascript
// 获取剖切面区间
const interval = section.planeInterval;

inBox

交点过滤函数引用,用于筛选剖切盒内部交点。

类型: {Function}
只读: true

示例:

javascript
// 获取过滤函数
const filter = section.inBox;

sliceLinesEnabled

剖切线显示与交互总开关。

启用时允许渲染剖切线并参与悬停/选中;禁用时会清除剖切线与高亮。

类型: {boolean}
只读: false

示例:

javascript
// 关闭剖切线显示与交互
section.sliceLinesEnabled = false;

// 打开剖切线显示与交互
section.sliceLinesEnabled = true;

sliceLineRayEnabled

剖切线射线检测开关。

关闭后 raycastSliceLine 将直接返回,不参与剖切线命中检测。

类型: {boolean}
只读: false

示例:

javascript
section.sliceLineRayEnabled = false;
section.sliceLineRayEnabled = true;

方法

setBoxVisible(boolean)

设置剖切盒可见性,同时控制拖拽功能的启用状态。

参数:

  • boolean {boolean} - 是否显示剖切盒,true为显示,false为隐藏

示例:

javascript
// 显示剖切盒
section.setBoxVisible(true);

getBoxInterval()

获取剖切盒区间,返回剖切盒的包围盒区间。

返回值:

  • {Box3} 剖切盒区间

示例:

javascript
const interval = section.getBoxInterval();

moveTo(axis, index, sign, value)

移动剖切盒,更新剖切面的位置参数。

参数:

  • axis {string} - 移动的轴向,'x'、'y'或'z'
  • index {number} - 剖切面索引,0-5分别对应六个剖切面
  • sign {number} - 移动方向,1为正方向,-1为负方向
  • value {number} - 移动的目标值

示例:

javascript
// 沿X轴正方向移动剖切盒
section.moveTo('x', 1, 1, 10);

getBoundingBoxCenter()

获取剖切盒的中心点坐标,通常用于定位和视图居中等操作。

返回值:

  • {Vector3} 剖切盒的中心点坐标

示例:

javascript
// 获取剖切盒中心点
const center = section.getBoundingBoxCenter();

getBoundingSphere()

获取剖切盒的包围球。

计算并返回当前剖切盒几何体的包围球(BoundingSphere)。

返回值:

  • {Sphere} 当前剖切盒的包围球

示例:

javascript
const sphere = section.getBoundingSphere();
console.log('包围球:', sphere);

getBoundingBox()

获取剖切盒的包围盒。

计算并返回当前剖切盒几何体的包围盒(BoundingBox)。

返回值:

  • {Box3} 当前剖切盒的包围盒

示例:

javascript
const box = section.getBoundingBox();
console.log('包围盒:', box);

shouldHighlightSliceLine()

判断是否允许剖切线高亮。

返回值:

  • {boolean} 是否允许剖切线高亮

示例:

javascript
if (section.shouldHighlightSliceLine()) {
    console.log('剖切线高亮已启用');
}

highlightSliceLineByPointer(pointerEvent, camera)

根据指针位置高亮剖切线,命中剖切线时会触发 sliceLineHover 事件,未命中时触发 sliceLineHoverOut

参数:

  • pointerEvent {PointerEvent} - 指针事件
  • camera {Camera} - 当前相机

示例:

javascript
section.highlightSliceLineByPointer(event, camera);

highlightSliceSegment(hit)

高亮命中的剖切线段,并在场景中渲染高亮线段。

参数:

  • hit {Object} - Raycaster 命中结果

示例:

javascript
section.highlightSliceSegment(hit);

selectionFilter(intersections)

过滤交点,仅保留剖切盒内部的交点(根据剖切面和剖切盒)。

参数:

  • intersections {Array<Object>} - three.js Raycaster 的相交结果数组

返回值:

  • {Array<Object>} 过滤后的交点数组

示例:

javascript
const filtered = section.selectionFilter(intersections);

clearSliceHighlight()

清除剖切线高亮状态。

移除当前高亮线段并释放相关几何资源。

示例:

javascript
section.clearSliceHighlight();

updateSliceLines(options)

更新剖切线显示。

根据当前剖切状态重建或清空剖切线。

参数:

  • options {Object} [可选] - 更新选项
  • options.clearOnly {boolean} [可选] - 是否仅清空剖切线而不重建

示例:

javascript
// 仅清空剖切线
section.updateSliceLines({ clearOnly: true });

// 重建剖切线
section.updateSliceLines();

setSelectionFilterFirstOnly(boolean)

设置 selectionFilter 是否只返回第一个交点。

参数:

  • boolean {boolean} - true 仅返回第一个交点,false 返回所有交点

示例:

javascript
section.setSelectionFilterFirstOnly(false);

raycastSliceLine(raycaster, intersections)

执行剖切线射线检测。

在启用剖切线射线检测时,对当前剖切线集合执行 Raycaster 命中计算。

参数:

  • raycaster {Raycaster} - three.js 射线检测器
  • intersections {Array<Object>} [可选] - 命中结果数组,默认 []

返回值:

  • {Array<Object>} 命中结果数组

示例:

javascript
const hits = section.raycastSliceLine(raycaster, []);

reset()

重置剖切盒,将剖切盒恢复到默认状态,包括大小、位置和可见性。

示例:

javascript
section.reset();

dispose()

销毁剖切插件,清理插件资源,移除剖切盒,释放事件监听器,还原材质属性。

示例:

javascript
section.dispose();

事件

update

剖切状态更新时触发,当剖切盒位置、可见性或剖切参数发生变化时触发。

示例:

javascript
section.addEventListener('update', () => {
    console.log('剖切状态已更新');
});

drag

剖切盒拖拽时触发。

事件数据:

  • object {Object} - 拖拽的对象
  • pointerType {string} - 指针类型(mouse、touch、pen)

示例:

javascript
section.addEventListener('drag', (event) => {
    console.log('剖切盒拖拽中', event.pointerType);
});

dragend

剖切盒拖拽结束时触发。

事件数据:

  • object {Object} - 拖拽的对象
  • pointerType {string} - 指针类型(mouse、touch、pen)

示例:

javascript
section.addEventListener('dragend', (event) => {
    console.log('剖切盒拖拽结束', event.pointerType);
});

hoveron

鼠标悬停开始时触发。

事件数据:

  • object {Object} - 悬停的对象
  • pointerType {string} - 指针类型(mouse、touch、pen)

示例:

javascript
section.addEventListener('hoveron', (event) => {
    console.log('悬停开始', event.pointerType);
});

hoveroff

鼠标悬停结束时触发。

事件数据:

  • object {Object} - 悬停的对象
  • pointerType {string} - 指针类型(mouse、touch、pen)

示例:

javascript
section.addEventListener('hoveroff', (event) => {
    console.log('悬停结束', event.pointerType);
});

hoverout

鼠标移出时触发。

事件数据:

  • pointerType {string} - 指针类型(mouse、touch、pen)

示例:

javascript
section.addEventListener('hoverout', (event) => {
    console.log('鼠标移出', event.pointerType);
});

sliceLineHover

鼠标悬停到剖切线时触发,返回命中线段与剖切面信息。

事件数据:

  • hit {Object} - Raycaster 命中结果
  • point {Vector3} - 命中点坐标
  • plane {Plane} - 命中线段对应的剖切面
  • planeIndex {number} - 命中线段对应的剖切面索引

示例:

javascript
section.addEventListener('sliceLineHover', (event) => {
    console.log('剖切线悬停', event.planeIndex, event.point);
});

sliceLineHoverOut

鼠标移出剖切线或不再命中时触发。

示例:

javascript
section.addEventListener('sliceLineHoverOut', () => {
    console.log('剖切线悬停结束');
});

sliceLineSelect

鼠标点击剖切线时触发,返回命中线段与剖切面信息。

事件数据:

  • hit {Object} - Raycaster 命中结果
  • point {Vector3} - 命中点坐标
  • plane {Plane} - 命中线段对应的剖切面
  • planeIndex {number} - 命中线段对应的剖切面索引
  • pointerEvent {PointerEvent} - 原始指针事件

示例:

javascript
section.addEventListener('sliceLineSelect', (event) => {
    console.log('剖切线选中', event.planeIndex, event.point);
});

相关链接

逆维悦动 智建未来