使用RevitNet操作多个版本的Revit

在Revit二次开发中,如果只是简单的从模型中提取数据或不需要界面对Revit进行修改,我们一般使用RevitNet。

如果对RevitNet不熟悉的,请参考:RevitAPI进阶之独立进程内读取、写入Revit文件.

 

我们接下来对使用过程中出现的问题做一下总结: 

1,异常:SEHException: 外部组件发生异常。

  解决方法:Revit 内核必须加 STAThread 标签

  RevitCoreContext.Instance.Run();

 

2,在Windows应用程序提示无法加载RevitNET.dll。

  可能的原因是:目标平台为Any CPU,首先32位。

  • 应该取消首先32位的对勾,或者更改为X64 
  • 目标框架 注意与引用的项目一致(主要针对其它dll)

 

3,如何跨线程访问吗?

  将RevitNet封装为一个控制台应用程序(Revit启动程序),然后通过命令行去启动Revit启动程序。

  在启动过程可以传入参数。

Process process=new Process();//AppDomain.CurrentDomain.BaseDirectory +
process.StartInfo.FileName =  Path.Combine(AppDomain.CurrentDomain.BaseDirectory ,"ExportStart.exe");//执行的exe路径
process.StartInfo.UseShellExecute = false;//不显示shell
process.StartInfo.CreateNoWindow = true;//不创建窗口
process.StartInfo.RedirectStandardInput = true;//打开流输入
process.StartInfo.RedirectStandardOutput = true;//打开流输出
process.StartInfo.RedirectStandardError = true;//打开错误流
process.StartInfo.Arguments = "" + revitCmd +  " \"" + filePathList.First() + "\"";//输入参数,多个参数使用空间分割,如果一个参数包含空格,使用""包括此参数
process.Start();//执行
string msg = process.StandardOutput.ReadToEnd();//读取输出
process.WaitForExit();//等待执行完成
process.Close();//结束

 

 

4,未能加载由“RevitNET.dll”导入的过程?

 

解决办法:

查看环境变量,将RevitInstallPath的path放至第一位.

 


其它涉及到操作多个版本Revit 的问题(这里说的是Revit文件的版本可能是2018,2019):

不启动获取Revit文件的版本

 /// <summary>
        /// 获取Revit文件的版本
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns></returns>
        public static string GetRevitVision(string path)
        {
            string revitVision = null;
            FileStream stream = new FileStream(path, FileMode.Open);

            int size = 1024 * 1024;
            byte[] bytes = new byte[size];

            
            while (stream.Read(bytes, 0, size) > 0)
            {
                string str = Encoding.Unicode.GetString(bytes);

                string pattern = @"Autodesk Revit \d{4}";
                var match = Regex.Match(str, pattern);
                if (match.Success)
                {
                    revitVision = match.Value.Substring(match.Length - 4, 4);

                    //File.WriteAllText(@"D:\abc.txt", str);
                    break;
                }
            }
            return revitVision;
        }

 

1,程序运行目录(OutputDll)能否删除RevitAPI.dll或RevitAPIUI.dll等相关dll?

可以,设置环境变量后,Revit会去Revit安装目录下查找以上dll。

注意:如果如果程序运行目录(OutputDll)存在Revit相关的dll,版本必须正确,否则会报错。(如果不能保证版本正确,不如将Revit相关dll全部删除,好办法^_^)

 

2,RevitNet启动程序,能否取消RevitAddInUtility.dll的引用?

可以取消,RevitAddInUtility.dll 此dll的作用是用于获取Revit的安装目录,可以手动指定Revit的安装目录。从而取消此dll的引用。(完全可以不安装Revit,只复制Revit需要的dll,但区别那些dll是Revit需要的会很麻烦。不过可以将Revit安装目录下的文件全部复制到指定位置)

 

如果上面没有写清楚,请留言!

posted @ 2019-07-31 16:15  huihuang88515  阅读(2490)  评论(3编辑  收藏  举报