Forge Viewer如何获取Autodesk.Section剖切框实时包围盒
Autodesk.Section扩展实时剖切包围盒获取方案
现有方案失效原因
- 社区流传的
sb.tool.getSectionBoxValues()、sb.tool.utilities.getBoundingBox()两个接口,读取的是剖切框首次创建时写入内部缓存的默认值。用户对剖切框做平移、旋转、缩放操作时,这部分缓存不会同步刷新,因此只能拿到初始生成状态的数值。 - 直接通过CutPlanes数组自行计算的方式存在逻辑缺陷:CutPlanes存储的是世界坐标系下的平面方程参数,当剖切框存在旋转角度时,直接取平面x/y/z分量与w分量相乘的计算方式没有纳入旋转变换换算,仅在剖切框与世界坐标轴完全对齐时结果才准确,其余场景都会出现偏差。
可直接复用的正确实现
直接读取剖切工具内部维护的剖切框网格对象,结合Three.js原生包围盒计算接口获取实时状态即可,该方式会自动纳入所有平移、旋转、缩放变换的影响,返回结果与视图中显示的剖切框完全匹配:
const sectionExtension = viewer.getExtension('Autodesk.Section'); if (!sectionExtension?.tool) return null; // 兼容不同版本Viewer的剖切框mesh获取逻辑 const sectionBoxMesh = sectionExtension.tool.getSectionBox?.() || sectionExtension.tool.sectionBoxGizmo?.boxMesh; if (!sectionBoxMesh) return null; // 强制更新世界变换矩阵,确保拿到最新交互状态 sectionBoxMesh.updateMatrixWorld(true); // 计算实时世界坐标系下的包围盒 const realtimeSectionBBox = new THREE.Box3().setFromObject(sectionBoxMesh);
补充说明
- 上述逻辑适配v7及以上版本的APS(原Forge Viewer),其中
getSectionBox()是剖切工具内部稳定存在的方法,虽未写入公开API文档,但从v7版本迭代至今逻辑未发生变动,可放心使用。 - 如果需要获取剖切框未应用变换的原始尺寸,直接读取
sectionBoxMesh.geometry.boundingBox即可,该值为剖切框局部坐标系下的固定尺寸。 - 不推荐通过CutPlanes反向推导包围盒:剖切框旋转时,需要计算6个平面的相交顶点才能还原框体,计算逻辑复杂且容易引入浮点误差,直接读取gizmo对象的方式性能和准确率都更高。
内容的提问来源于stack exchange,提问作者Bandu W
相关产品推荐
相关产品推荐

