开发Navisworks批量重命名Clash测试插件时遇“致命执行引擎错误”求助
错误场景
开发Navisworks Manage插件用于给批量选中的Clash测试名称添加前缀/后缀,运行代码时触发“致命执行引擎错误”,导致程序崩溃。
问题代码
using Autodesk.Navisworks.Api; using Autodesk.Navisworks.Api.Clash; namespace ClashTestNameModifier { class Program { static void Main(string[] args) { // Open the Navisworks document string modelPath = @"C:\path\to\your\model.nwd"; Autodesk.Navisworks.Api.Application app = new Autodesk.Navisworks.Api.Application(); Autodesk.Navisworks.Api.Document doc = app.OpenFile(modelPath); // Get the selected clash tests Autodesk.Navisworks.Api.Clash.TestsData clashTestsData = doc.GetClash().TestsData; SavedItemCollection selectedTests = clashTestsData.Tests.Value.GetSelectedItems(); if (selectedTests.Count == 0) { System.Console.WriteLine("No clash tests selected."); return; } // Modify the clash test names string prefix = "New Prefix "; string suffix = " - Suffix"; foreach (SavedItem testItem in selectedTests) { ClashTest test = clashTestsData.TestsDataArray[testItem.Index]; test.DisplayName = prefix + test.DisplayName + suffix; } // Save the modified document doc.SaveFile(modelPath); // Close the document doc.Close(); // Dispose of the application app.Dispose(); System.Console.WriteLine("Clash test names modified successfully!"); } } }
错误原因
- 运行环境违规:代码以独立控制台程序形式编写,直接实例化
Application对象违反Navisworks API使用规范。Navisworks API仅支持在Navisworks进程内作为Add-in运行,独立程序无法正确初始化Navisworks的CLR执行环境,触发致命引擎错误。 - 选中项获取无效:独立程序中
GetSelectedItems()无法获取Navisworks UI中实际选中的测试项,因为没有绑定Navisworks的交互上下文。 - 文档操作冲突:独立进程直接调用
OpenFile、SaveFile会与Navisworks内部文档管理逻辑冲突,引发内存或线程错误。
解决办法
将代码重构为标准的Navisworks Add-in插件,步骤如下:
1. 创建正确的插件项目
在Visual Studio中选择Navisworks Add-in模板(需安装Autodesk Navisworks SDK),生成带有AddInPlugin基类的项目结构。
2. 修正后的插件代码
using Autodesk.Navisworks.Api; using Autodesk.Navisworks.Api.Clash; using Autodesk.Navisworks.Api.Plugins; using System.Windows.Forms; namespace ClashTestNameModifier { [Plugin("ClashTestNameModifier", "ADSK", DisplayName = "Clash Test Name Modifier", ToolTip = "Add prefix/suffix to selected clash tests")] public class ClashNameModifierPlugin : AddInPlugin { public override int Execute(params string[] parameters) { try { // 获取当前激活的文档(Navisworks进程内的打开文档) Document doc = Application.ActiveDocument; if (doc == null) { MessageBox.Show("No active document found.", "Error"); return 1; } // 获取Clash测试数据 TestsData clashTestsData = doc.GetClash().TestsData; SavedItemCollection selectedTests = clashTestsData.Tests.Value.GetSelectedItems(); if (selectedTests.Count == 0) { MessageBox.Show("No clash tests selected.", "Info"); return 0; } // 定义前缀后缀 string prefix = "New Prefix "; string suffix = " - Suffix"; // 用事务包裹修改操作,确保数据一致性 using (Transaction tx = doc.BeginTransaction("Modify Clash Test Names")) { foreach (SavedItem testItem in selectedTests) { if (testItem is ClashTest test) { test.DisplayName = $"{prefix}{test.DisplayName}{suffix}"; } } tx.Commit(); } // 保存文档(可选,可改为提示用户手动保存) doc.Save(); MessageBox.Show("Clash test names modified successfully!", "Success"); return 0; } catch (System.Exception ex) { MessageBox.Show($"Error: {ex.Message}", "Error"); return 1; } } } }
3. 关键修正点
- 继承
AddInPlugin基类,通过Execute方法作为插件入口,在Navisworks进程内运行。 - 使用
Application.ActiveDocument获取当前打开的文档,符合Navisworks上下文逻辑。 - 加入
Transaction事务包裹修改操作,避免文档状态异常。 - 增加异常捕获,防止插件崩溃影响Navisworks主程序。
- 用
MessageBox替代控制台输出,适配Navisworks的UI交互场景。
4. 部署插件
将编译生成的DLL文件复制到Navisworks插件目录(默认路径:C:\Program Files\Autodesk\Navisworks Manage 20XX\Plugins),重启Navisworks后即可在插件菜单中找到该工具。
内容的提问来源于stack exchange,提问作者PAPIWARBUX
相关产品推荐
相关产品推荐

