在项目中需要读取rvt文件,但是因为该格式为非公开格式,其数据需要revit的支持,但批量读取不可能一个一个用revit软件去打开。不过该方法还是需要revit的依赖,速度比开软件快了知道多少

1.1. 新建一个控制台项目

1.2. 添加Revit API引用

我们找到revit安装目录下的这两个DLL添加到项目引用中

RevitNET.dll

RevitAPI.dll

修改属性:复制本地:FALSE

1.3. 为MAIN函数添加STAThread特性

[STAThread]//一定要有

static void Main(string[] args)

{

}

如果未添加则报错:

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

1.4. 修改控制台项目为64位

由于revit为64位程序,所以我们的控制台程序一定要为64位才可正常使用。

1.5. 添加封装好的revitContext类

可以直接使用,可以根据自己需要去修改,其中的Application就是revit主要的

public class RevitContext

{

#region private fields

Product _revitProduct;

private static bool isLoadEnv = false;//是否已添加过环境变量

#endregion

#region public fields

///

/// revit程序目录

///

public static string RevitPath;

#endregion

#region event

public event EventHandler InitRevitFinished;

#endregion

#region public properties

///

/// 打开REVIT文件时的设置

///

public OpenOptions OpenOptions { get; set; }

///

/// Revit Application

///

public Autodesk.Revit.ApplicationServices.Application Application => this._revitProduct?.Application;

#endregion

#region constructors

///

///

///

/// revit安装目录

public RevitContext(string revitPath)

{

RevitPath = revitPath;

AddEnv();

}

///

/// 使用此构造方法前需要调用 RevitContext.AddEnv();

///

public RevitContext()

{

}

#endregion

#region public methods

public void InitRevit()

{

this.OpenOptions = new OpenOptions

{

Audit = true,

AllowOpeningLocalByWrongUser = false,

DetachFromCentralOption = DetachFromCentralOption.DetachAndDiscardWorksets //从中心模型分离

};

_revitProduct = Product.GetInstalledProduct();

var clientApplicationId = new ClientApplicationId(Guid.NewGuid(), "RevitContext", "BIM");

_revitProduct.SetPreferredLanguage(Autodesk.Revit.ApplicationServices.LanguageType.Chinese_Simplified);

_revitProduct.Init(clientApplicationId, "I am authorized by Autodesk to use this UI-less functionality.");

OnInitRevitFinished();

}

public Document OpenFile(string filename, OpenOptions options = null)

{

if (options == null)

{

options = this.OpenOptions;

}

ModelPath model = new FilePath(filename);

return this._revitProduct.Application.OpenDocumentFile(model, options);

}

///

/// 获取默认三维视图

///

/// 文档

///

public View3D GetView3D(Document document)

{

if (document.ActiveView is View3D view3D && !view3D.IsPerspective && view3D.CanBePrinted)

{

return view3D;

}

FilteredElementCollector filter=new FilteredElementCollector(document);

return (View3D) filter.OfClass(typeof(View3D)).FirstElement();

}

///

/// 获取指定三维视图

///

/// 文档

/// 指定视图名称

///

public View3D GetView3D(Document document,string viewName)

{

FilteredElementCollector filter = new FilteredElementCollector(document);

return (View3D)filter.OfClass(typeof(View3D)).FirstOrDefault(x => x.Name==viewName);

}

public IList GetElementsWithView(View3D view)

{

FilteredElementCollector collector=new FilteredElementCollector(view.Document,view.Id);

return collector.ToElements();

}

#endregion

#region public static methods

///

/// 添加revit安装路径到环境变量以便加载相应的DLL

///

/// 添加revit安装路径

public static void AddEnv(string revitPath=null)

{

if (isLoadEnv)

{

return;

}

if (revitPath!=null)

{

RevitPath = revitPath;

}

AddEnvironmentPaths(RevitPath);

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

}

#endregion

#region private static methods

///

/// 添加环境变量

///

/// revit安装路径

static void AddEnvironmentPaths(params string[] paths)

{

string[] first = {

Environment.GetEnvironmentVariable("PATH") ?? string.Empty

};

string value = string.Join(Path.PathSeparator.ToString(), first.Concat(paths));

Environment.SetEnvironmentVariable("PATH", value);

}

///

/// 动态加载revit相关的dll

///

///

///

///

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)

{

var assemblyName = new AssemblyName(args.Name);

var text = $"{Path.Combine(RevitPath, assemblyName.Name)}.dll";

Assembly result;

if (File.Exists(text))

{

Console.WriteLine($"Load Revit Dll Path:{text}");

result = Assembly.LoadFrom(text);

}

else

{

result = null;

}

return result;

}

#endregion

#region private methods

private void OnInitRevitFinished()

{

this.InitRevitFinished?.Invoke(this, this._revitProduct);

}

#endregion

}

1.6. 使用并测试

class Program

{

static RevitContext revit;

static Program()

{

RevitContext.AddEnv(@"D:\Program Files\Autodesk\Navisworks Manage 2020\Loaders\Rx\");

}

[STAThread]//一定要有

static void Main(string[] args)

{

revit = new RevitContext();

revit.InitRevitFinished += InitRevitFinished;

revit.InitRevit();

Console.ReadKey();

}

private static void InitRevitFinished(object sender, Product revitProduct)

{

Console.WriteLine("当前使用Revit版本为:" + revitProduct.Application.VersionName);

Document document = revit.OpenFile(@"E:\test\2019\经典小文件\2020.rvt");

View3D view = revit.GetView3D(document);

if (view!=null)

{

Console.WriteLine(view.Name);

var elements =revit.GetElementsWithView(view);

foreach (var element in elements)

{

Console.WriteLine(element.Name);

}

}

}

}

完成!

1.7. 留下的坑:

如何在不指定revit路径的情况下加载(动态获取revit安装路径)

根据revit文件版本加载相应的revit路径

一个程序动态支持多版本revit

以上问题本人已有相应的方法。

原文出处:https://www.cnblogs.com/tchivs/p/11925856.html

java读取rvt文件数据_Revit二次开发之隐藏API 独立进程读取rvt文件相关推荐

  1. 南方数码iData数据工厂二次开发

    iData数据工厂软件是南方公司旗下的一个产品,该软件深耕于测绘地理信息领域,在数据生产,建库方面发挥着重要的作用.目前正值第三次全国土地调查之际,南方公司专门在原有iData软件的基础上,定制开发出 ...

  2. 聚播群控微信二次开发sdk完整API

    聚播群控微信二次开发sdk完整API功能: 微信加好友功能API 1.导入手机通讯录 2.手机通讯录加好友 3.加指定微信群好友 4.自动通过微信好友请求 5.手机模拟定位 6.附近人加好友 7.各种 ...

  3. Tekla二次开发使用Tekla API 将两个零件相互切割

    关注"闭目鸽"微信公众号回复"tekla"关键字, 便可获得数GB的精品tekla视频教程 Tekla二次开发使用Tekla API 将两个零件相互切割的代码 ...

  4. 自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)

    二次开发接口(API)与插件(Addin) 许式伟 (版权声明) 2007-4-20 在前文,我们已经解释了: 自动化(Automation)基础概念:COM组件(Component)与接口(Inte ...

  5. 群控sdk二次开发完整调用API(厉害了我的哥。。。)

    聚播群控sdk二次开发完整调用API功能 微信加好友功能API 1.导入手机通讯录 2.手机通讯录加好友 3.加指定微信群好友 4.自动通过微信好友请求 5.手机模拟定位 6.附近人加好友 7.各种账 ...

  6. pythoncad二次开发视频_revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档...

    二次开发 revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档2019-07-08赞( 0 ) 记录一下CAD二次开发的一些简单实例. 1.helloworld ...

  7. 基于Java的Zabbix二次开发-----Zabbix的Api接口实例

    博主之前的文章配置好了Zabbix环境,正常启动Zabbix服务端,并成功监控客户端服务器的情况,如有疑问,下方传送门: centos7下安装Zabbix服务端 Windows下安装Zabbix客户端 ...

  8. Revit二次开发之使用外部程序集DT_Mgd读取CAD图遇到的问题

    Revit二次开发学习笔记(一) 最近学习在revit中读取链接的CAD图纸信息(包括文字.图层.各种线型),由于小白也是初学者,遇到了一些问题,如图所示: 通过大量查阅参考资料发现,问题是:在类库项 ...

  9. C#实战之CAD二次开发006:与python进行Socket传输文件

    前言 前面介绍了与CAD相关的一些功能,本期介绍一下C#和python如何通过socket通信来进行文件的传输,建议不了解Socket的同学先去了解一下socket的通讯原理,这样看起来不会云里雾里的 ...

最新文章

  1. 2018考研英语:10篇必背的真题文章
  2. linux合并vi的两个文件,两个文件的对比查看及合并工具:vimdiff-文件合并
  3. 做为技术人员为什么要写博客?
  4. a标签禁止点击_Nofollow标签的使用
  5. sqlilabs 5
  6. Spring mvc 返回json格式 - 龙企阁 - 博客频道 - CSDN.NET
  7. 【javascript】 的严格模式 详解
  8. Camera 图像处理原理分析- 色彩篇 二
  9. 使用Dockerfile制作ffmpeg镜像
  10. 计算机无法验证签名,电脑提示“无法验证此文件的数字签名”的修复方法
  11. (原創) M型化的NB使用族群:談ASUS Eee PC的爆紅對應用程式開發的影響 (OS) (Linux)...
  12. 注册@MSN.com后缀邮箱的地址
  13. ScreenToGIF工具分享--将视频转成GIF动图
  14. 玩转Google cloud(二)
  15. 数字经济下 “东数西算” 的中国布局
  16. 【学习笔记】微体系结构-单周期、多周期、流水线
  17. 参数反演 计算机,叠前各向异性特征参数反演方法及计算机可读存储介质与流程...
  18. 日本女演员全解封,这很马斯克
  19. 【WebGL学习日报】22/09/01 : 绘制点
  20. Python 飞速下载各大平台音乐

热门文章

  1. oracle的insert语句clob,.Net 操作 Oracle CLOB类型字段 INSERT 超长数据
  2. 混凝土墙开洞_易县混凝土剪力墙切割常见问题
  3. Foxmail邮件字体大小怎么设置 Foxmail字体的设置方法
  4. ie浏览器剪贴板操作警告弹窗关闭方法
  5. 无线网络受限制或无连接处理方法
  6. RTSP播放器开发填坑之道
  7. js数组遍历和对象遍历
  8. MySQL在like查询中是否使用到索引
  9. Mysql 5.7 的‘虚拟列’是做什么?
  10. 长春理工大学c语言实验题库,长春理工大学首届趣味心理知识竞赛初赛题库.doc...