Appearance
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。
完整签名与延伸
SectionManager/Section/SectionPlane— 三层对象的精确签名。PlaneSpec/CuttingBoolean/CappingStyle— 平面、布尔与盖面的类型定义。- 指南:剖切 — 行为要点逐条说明与可拖拽 demo。
- 概念:坐标系与单位(剖切轴方向语义)、事件系统(
section-*事件参考)。