You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发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!");
        }
    }
}

错误原因

  1. 运行环境违规:代码以独立控制台程序形式编写,直接实例化Application对象违反Navisworks API使用规范。Navisworks API仅支持在Navisworks进程内作为Add-in运行,独立程序无法正确初始化Navisworks的CLR执行环境,触发致命引擎错误。
  2. 选中项获取无效:独立程序中GetSelectedItems()无法获取Navisworks UI中实际选中的测试项,因为没有绑定Navisworks的交互上下文。
  3. 文档操作冲突:独立进程直接调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:52:50