使用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安装目录下的文件全部复制到指定位置)
如果上面没有写清楚,请留言!