如何在Navisworks API中添加预定义及自定义碰撞检测忽略规则?
规则用于将特定操作或条目应用到一组条目上,TimeLiner与Clash Detective功能均使用这类规则。该类支持启用或禁用指定规则。
开发Navisworks碰撞检测自动化Add-in时,多数人卡在规则配置环节的核心原因是:Autodesk.Navisworks.Api.Clash命名空间下的Rule类没有公开的可实例化构造函数,无法通过new Rule()直接创建合法规则实例,必须通过ClashTest测试对象内置的规则创建方法生成规则,挂载到测试项的规则集合中才能在检测时生效。
实现流程
- 操作入口:直接通过现有代码中
documentClashTest对象(即DocumentClashTests类型的实例,是管理文档内所有碰撞测试的核心入口,也就是已经用来执行TestsRunAllTests()的对象)获取目标碰撞测试项,即可开始配置规则。 - 预定义规则添加:Navisworks原生碰撞面板展示的所有忽略规则,均有对应的API创建方法,直接调用即可生成和原生功能完全一致的合法规则:
- 忽略同一构件内部碰撞:调用测试项的
CreateRuleIgnoreSameModelItem()方法生成规则,加入测试项的Rules集合 - 忽略同一源文件内构件的碰撞:调用
CreateRuleIgnoreSameSourceFile()方法生成规则 - 过滤小于指定距离的软碰撞:调用
CreateRuleMinDistance(double distance)方法,传入适配模型单位的距离阈值生成规则 - 忽略指定构件集合的碰撞:调用
CreateRuleIgnoreModelItems(ModelItemCollection items)方法,传入需要排除的构件集合生成规则
- 忽略同一构件内部碰撞:调用测试项的
- 自定义规则搭建:如果需要匹配特定属性的构件(比如指定楼层、指定专业的构件不参与碰撞计算),可以通过规则组合的方式实现:
- 先调用测试项的内置方法,生成基于模型属性的基础匹配规则(比如匹配构件属性中“楼层=3F”“专业=消防”的条目)
- 通过逻辑与/或关系将多条基础规则组合成复合规则
- 必须为复合规则指定作用范围(即规则是匹配A检测集、B检测集还是两侧都匹配),否则规则不会触发过滤逻辑
关键注意事项
- 所有规则的创建、启停操作,必须在执行
documentClashTest.TestsRunAllTests()方法之前完成,否则已经运行完成的碰撞结果不会回溯应用新规则的过滤逻辑 - 每一条生成的规则都自带
IsEnabled属性,可以随时调整规则的生效状态,不需要重新创建规则对象 - 禁止直接将非当前测试对象生成的Rule实例加入规则集合,不属于测试上下文的规则会导致加载异常
简化代码示例
// 获取文档内当前激活的碰撞测试 var currentTest = documentClashTest.ActiveTest; // 添加忽略同构件内部碰撞的规则 var samePartRule = currentTest.CreateRuleIgnoreSameModelItem(); samePartRule.IsEnabled = true; currentTest.Rules.Add(samePartRule); // 添加距离过滤规则,忽略小于2mm的无效碰撞 var minDistRule = currentTest.CreateRuleMinDistance(0.002); minDistRule.IsEnabled = true; currentTest.Rules.Add(minDistRule); // 执行全量碰撞检测 documentClashTest.TestsRunAllTests();
内容的提问来源于stack exchange,提问作者Md. Shohag Mia
相关产品推荐
相关产品推荐

