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

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

1.1. 新建一个控制台项目

14420957507ae91a40c1f5926e06a23b.png

1.2. 添加Revit API引用

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

RevitNET.dll

RevitAPI.dll

caf08f4ae4b86c5887434d96024c6e16.png

修改属性:复制本地:FALSE

e99c0db28cd0c7edd4800ffaa1f6e82a.png

1.3. 为MAIN函数添加STAThread特性

[STAThread]//一定要有

static void Main(string[] args)

{

}

如果未添加则报错:

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

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

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

51a74cecea1b3a25a8a3cda613a59617.png

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);

}

}

}

}

完成!

50ad4bdc624ba8704f393238d0c6ee25.png

1.7. 留下的坑:

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode自动加前缀_详解VScode自动补全CSS3前缀插件以及配置无效的解决办法

1.在vscode中搜索Autoprofixer2.在安装完成之后要配置在需要添加前缀的css文件上,右键点击命令面板,输入Autoprefixer CSS就好啦ps: 如果想要兼容性最好的话,需要在设置配置文件setting.json里加上(打开设置->搜索autoprefixer->点击在…

java类快速构造_程序员有什么办法能快速梳理java知识点?有这八张图就够了

一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。1、字符串不变性下面这张图展示了这段代码做了什么String s "abcd";s s.concat(&quo…

php数组foreach循环添加键值对_循环 - PHP二维数组根据键值对获取一组数组 (不使用foreach)...

问 题$user array(0 > array(id > 1,name > 张三,email > zhangsansina.com,),1 > array(id > 2,name > 李四,email > lisi163.com,),2 > array(id > 5,name > 王五,email > 10000qq.com,),......);比如我想获取当id2时,该数组的全部内容…

uos配置 java 环境变量_CentOS 7.3 环境配置java和tomcat开机启动

Centos7下添加开机自启动服务和脚本 https://blog.csdn.net/GMingZhou/article/details/78677953安装部分参考我的博文,仅参考他的开机启动部分CentOS 7环境配置tomcat7开机启动 https://blog.csdn.net/tiantang_1986/article/details/537049661.安装 jdk-8u5-lin…

react全局方法_前端面试题 ---react

高阶组件相关什么是高阶组件,它有哪些运用?高阶组件就是一个函数,接收一个组件,经过处理后返回后的新的组件;高阶组件,不是真正意义上的组件,其实是一种模式;可以对逻辑代码进行抽离…

java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...

Code-Apprentice2javasqljunitjdbc我正在用Java编写数据库程序,并且想要创建一个表(如果它还不存在).我从中了解DatabaseMetaData.getTables()了如何在Java中检测SQL表的存在?而我正在尝试使用它:private boolean tableExists() throws SQLException {System.out.pr…

get方法请求返回一个文件_一键转换多种文件格式,完全免费,总有一个方法适合你...

相信各位小伙伴平时办公的时候,肯定经常需要对多种文件格式进行转换,但是下面这些非常好用的转换方法,你用过吗?接下来就带各位一探究竟,希望可以帮到你哦!一、迅捷PDF转换器在线版1、文档转换首先我们可以…

java 堆排序方式_幾種排序方式的java實現(02:希爾排序,歸並排序,堆排序)

/** 希爾排序:先取一個小於n的整數d1作為第一個增量,* 把文件的全部記錄分成(n除以d1)個組。所有距離為d1的倍數的記錄放在同一個組中。* 先在各組內進行直接插入排序;然后,取第二個增量d2* 直至所取的增量dt1(dtpublic classShel…

jacoco入门_Android jacoco 代码覆盖率测试入门

前言最近同事搞了一个基于 jacoco 统计 Android 代码覆盖率测试的功能,可以统计每天手工测试的代码覆盖率.抱着好奇的心态,自己也学习一下 jacoco,陆陆续续搞了三天终于有点结果了.本文介绍仅仅在源码中加入少量代码就可以完成代码覆盖率覆测试.代码配置build.gradle在 app 目录…

java下文_java实现文件下载的两种方式

本文实例为大家分享了java实现文件下载的具体代码,供大家参考,具体内容如下public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件的路径。File file new File(path);// 取得文件名。String …

uinty粒子系统子物体变大_Unity的粒子系统(一)基础篇

简介闲来无事,仔细的学习一下粒子系统,也当是给自己做个笔记方便之后进行回顾。引擎版本:Unity2018.3创建一个ParticleSystem创建方式:1、Hierarchy-->Effects-->ParticleSystem第一种创建方式创建结果2、gameObject-->A…

java字符串string_Java字符串String方法总结

Java字符串创建与初始化实例。Java字符串String方法总结,包括字符串的大小写替转换,获取字符串长度的方法、截取字符串,去除字符串中的空格、StringBuffer类转换成String类等:java创建并初始化字符串的方法:1、使用字符…

java定义返回码常量_码出规范(四)常量定义

01各位屏幕前的读者朋友大家早上中午晚上凌晨好,本文是《码出规范》专题的第四篇,文中参考阿里巴巴最新发布的《Java开发手册》,结合《springboot2.x独门秘籍》专题中的项目开发进度,学以致用,让你在开发中码出高效&am…

centos下载mysql_python数据分析之路——centos下载并配置mysql与navicat的使用

python数据分析之路——centos下载并配置mysql与navicat的使用在之前的文章中已经说明了如何购买并配置一台自己的服务器,那么在安装完anaconda之后,为了之后方便用Django进行网站开发与数据分析,需要对数据库进行配置,那么在数据…

php数组遍历相同的元素覆盖_php获取数组中重复数据的两种方法

搜索热词代码如下:PHPfunction FetchRepeatMemberInArray($array) {// 获取去掉重复数据的数组$unique_arr array_unique ( $array );// 获取重复数据的数组$repeat_arr array_diff_assoc ( $array,$unique_arr );return $repeat_arr;} // 测试用例$array array (apple,ipho…

mysql 解压缩安装_[mysql] MySQL解压缩安装步骤

以前装的MySQL出问题了,只好卸载了。又下载了一个mysql-5.6.24-win32.1432006610.zip。msi文件直接安装就行了。这里需要解压到指定目录,配置后可使用。环境变量配置:在 mysql根目录下修改 my-default.ini :# These are commonly set, remove…

php过滤多空格_php正则过滤html标签、空格、换行符的代码(附说明)

$strpreg_replace("/\s/", " ", $str); //过滤多余回车$strpreg_replace("/$strpreg_replace("//si","",$str); //注释$strpreg_replace("//si","",$str); //过滤DOCTYPE$strpreg_replace("//si",…

mysql+json插入_MySQL对JSON数据的增删改查

MySQL从5.7版本开始就支持JSON格式的数据,操作用起来挺方便的。建表在新建表时字段类型可以直接设置为json类型,比如我们创建一张表:CREATE TABLE test_user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR ( 50 ) NOT NULL,info JSON);js…

java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载

运行于手机上的中国象棋游戏,鉴于JAVA J2ME技术,本游戏分服务端和客户端,导入JAR包即可在手机上运行,内有开发文档和运用说明。Java手机网络版象棋游戏附源码(1 folders, 2 files, 1.38 KB, 727.25 KB in total.) 源码(…

mysql数据库如何创建表_mysql数据库如何创建数据表

mysql数据库创建数据表的方法是:可以通过CREATE TABLE语句来创建,基本语法:【CREATE TABLE ([表定义选项])[表选项][分区选项];】。要注意的是,创建数据表不能使用SQL语言中的关键字。在 MySQL 中,可以使用 CREATE TAB…