Forge Viewer判断多墙体连通性及获取墙角点的方案咨询
解决方案
- 优先使用Revit原生属性提取墙端点
你目前用bounding box计算中心线的方案本身存在精度缺陷:bounding box是轴对齐的包围盒,遇到斜墙、非矩形截面墙时计算出的中心线误差极大,自然容易出现转角空隙。
大部分Revit导出的Forge模型中,墙构件的属性会自带「起点 X」「起点 Y」「终点 X」「终点 Y」四个参数,直接通过viewer.getProperties()接口读取即可得到精准的墙体中心线端点,不需要自行计算。原生端点本身就是在Revit建模时就已对齐的,只要判断两个端点的坐标差小于浮点容差(通常取1e-3即可)即可判定墙体连通,完全不需要额外做碰撞检测。
参考代码示例:
// 获取单块墙的原生端点坐标 export const getWallEndpoints = async (viewer: Autodesk.Viewing.GuiViewer3D, dbId: number) => { return new Promise((resolve, reject) => { viewer.getProperties(dbId, (props) => { // 匹配Revit原生的墙起点、终点属性,不同语言版本的属性名可对应调整 const startX = props.properties.find(p => p.displayName === '起点 X')?.displayValue; const startY = props.properties.find(p => p.displayName === '起点 Y')?.displayValue; const endX = props.properties.find(p => p.displayName === '终点 X')?.displayValue; const endY = props.properties.find(p => p.displayName === '终点 Y')?.displayValue; if (startX && startY && endX && endY) { resolve({ start: [parseFloat(startX), parseFloat(startY)], end: [parseFloat(endX), parseFloat(endY)] }); return; } reject(new Error('无原生端点属性')); }, reject); }); }
注:如果是英文版本Revit导出的模型,属性名需替换为「Start X」「Start Y」「End X」「End Y」匹配即可
- 无原生属性时直接提取构件几何计算
如果导出模型时关闭了属性导出,没有上述端点参数,可以直接提取墙构件的实际几何网格计算中心线:
- 遍历墙dbId对应的所有fragment
- 通过
fragList.getGeometry(fragId)拿到网格顶点数据,忽略Z轴投影到二维平面 - 提取墙体的二维外轮廓后,向内偏移墙厚的1/2即可得到精准中心线
这种方案还可以兼容弧形墙、异形截面墙等特殊场景,精度远高于bounding box计算方案。
- 墙体连通性判断技巧
拿到所有墙体的中心线端点后,只需要对所有端点做容差匹配:将坐标保留3位小数后作为key存入Map,同一个key下有2个及以上端点的即为墙体共享的转角点,直接把这些共享点作为多段线的连接点即可完美解决转角空隙问题。
内容的提问来源于stack exchange,提问作者Raúl Bojalil
相关产品推荐
相关产品推荐

