Skip to content

viewer.section — SectionManager

设计意图

viewer.section 是剖切(裁剪)域,对象模型分三层:manager 管 section 的创建 / 移除与全局旋钮(盖面样式、gizmo 交互开关);Section 是一组裁剪平面的容器(至多 6 个平面,按 "intersection" / "union" 布尔组合出「保留区域」),激活后才参与裁剪;SectionPlane 是单个平面的句柄(setPlane / flip / setStyle)。典型流程是三步:create()addPlane()activate()

多 section 的组合语义固定为交集:最多同时激活 4 个 section,最终可见区域是各 active section 保留区的交集——每多激活一个 section 只会切掉更多。planeFromAxis(axis, offset?) 是平面的便捷构造:过模型包围盒中心、法向沿世界轴(Z-up / CATIA 约定),offset 沿该轴偏移(世界单位,即模型文件的原始坐标单位)。切口默认有盖面(capping)填充,平面带 gizmo 可直接拖拽,拖拽过程经事件三连(section-plane-drag-start / -drag / -drag-end)对外广播。

何时用它:看装配内部结构的半切 / 盒切 / 楔形切、UI 上的剖切面板(按轴加平面 / 翻转 / 盖面开关)、与拖拽 gizmo 同步的自定义标注。只想「零件级隐藏外壳」用 viewer.model 的显隐更直接。

典型用法

三步建一个轴对齐半切(过包围盒中心,沿 +X 偏移 50 个世界单位):

ts
const section = viewer.section.create({ boolean: "intersection" });
const plane = section.addPlane(viewer.section.planeFromAxis("x", 50));
section.activate();
// 保留侧不对就翻转
plane.flip();

盖面与 gizmo(全局旋钮在 manager 上):

ts
viewer.section.setCappingStyle({ faceColor: { r: 0.8, g: 0.82, b: 0.88 } });
viewer.section.setInteractive(false); // 关掉平面拖拽,纯展示

跟踪 gizmo 拖拽(同步外部 UI 的平面参数显示):

ts
viewer.on("section-plane-drag", (e) => {
  panel.show(e.planeId, e.plane.point, e.plane.normal);
});
viewer.on("section-plane-drag-end", () => panel.commit());

注意事项

  • 两个上限都抛 ViewerError(InvalidArgument):单 section 超 6 个平面的 addPlane、并发激活超 4 个 section 的 activate;无平面的 section 也不能 activate
  • PlaneSpec 的语义是「法向负侧被裁掉」;planeFromAxis 在未加载模型时退化为 ±1 单位盒(不抛错),正常使用先加载模型。
  • 多 section 只会越切越多(交集语义);想「少切一点」是调平面或反激活某个 section,不是再加 section。
  • section-changed 只带单个代表 id:多 section 激活时取最近激活者;要精确跟踪哪个 section 变了,用 section-activated / section-deactivated 与拖拽事件三连。
  • deactivate() 保留平面与样式(可再次 activate);remove / clear 才是移除;clear() 反激活并移除全部。
  • 盖面是全局样式(setCappingStyle 部分字段合并更新,立即重算),不能按 section 单独配;平面级的参考四边形 / 控制杆显隐走 plane.setReferenceVisible / setHandleVisible

完整签名与延伸