java读取rvt文件数据_Revit二次开发之隐藏API 独立进程读取rvt文件
在项目中需要读取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文件相关推荐
- 南方数码iData数据工厂二次开发
iData数据工厂软件是南方公司旗下的一个产品,该软件深耕于测绘地理信息领域,在数据生产,建库方面发挥着重要的作用.目前正值第三次全国土地调查之际,南方公司专门在原有iData软件的基础上,定制开发出 ...
- 聚播群控微信二次开发sdk完整API
聚播群控微信二次开发sdk完整API功能: 微信加好友功能API 1.导入手机通讯录 2.手机通讯录加好友 3.加指定微信群好友 4.自动通过微信好友请求 5.手机模拟定位 6.附近人加好友 7.各种 ...
- Tekla二次开发使用Tekla API 将两个零件相互切割
关注"闭目鸽"微信公众号回复"tekla"关键字, 便可获得数GB的精品tekla视频教程 Tekla二次开发使用Tekla API 将两个零件相互切割的代码 ...
- 自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)
二次开发接口(API)与插件(Addin) 许式伟 (版权声明) 2007-4-20 在前文,我们已经解释了: 自动化(Automation)基础概念:COM组件(Component)与接口(Inte ...
- 群控sdk二次开发完整调用API(厉害了我的哥。。。)
聚播群控sdk二次开发完整调用API功能 微信加好友功能API 1.导入手机通讯录 2.手机通讯录加好友 3.加指定微信群好友 4.自动通过微信好友请求 5.手机模拟定位 6.附近人加好友 7.各种账 ...
- pythoncad二次开发视频_revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档...
二次开发 revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档2019-07-08赞( 0 ) 记录一下CAD二次开发的一些简单实例. 1.helloworld ...
- 基于Java的Zabbix二次开发-----Zabbix的Api接口实例
博主之前的文章配置好了Zabbix环境,正常启动Zabbix服务端,并成功监控客户端服务器的情况,如有疑问,下方传送门: centos7下安装Zabbix服务端 Windows下安装Zabbix客户端 ...
- Revit二次开发之使用外部程序集DT_Mgd读取CAD图遇到的问题
Revit二次开发学习笔记(一) 最近学习在revit中读取链接的CAD图纸信息(包括文字.图层.各种线型),由于小白也是初学者,遇到了一些问题,如图所示: 通过大量查阅参考资料发现,问题是:在类库项 ...
- C#实战之CAD二次开发006:与python进行Socket传输文件
前言 前面介绍了与CAD相关的一些功能,本期介绍一下C#和python如何通过socket通信来进行文件的传输,建议不了解Socket的同学先去了解一下socket的通讯原理,这样看起来不会云里雾里的 ...
最新文章
- 2018考研英语:10篇必背的真题文章
- linux合并vi的两个文件,两个文件的对比查看及合并工具:vimdiff-文件合并
- 做为技术人员为什么要写博客?
- a标签禁止点击_Nofollow标签的使用
- sqlilabs 5
- Spring mvc 返回json格式 - 龙企阁 - 博客频道 - CSDN.NET
- 【javascript】 的严格模式 详解
- Camera 图像处理原理分析- 色彩篇 二
- 使用Dockerfile制作ffmpeg镜像
- 计算机无法验证签名,电脑提示“无法验证此文件的数字签名”的修复方法
- (原創) M型化的NB使用族群:談ASUS Eee PC的爆紅對應用程式開發的影響 (OS) (Linux)...
- 注册@MSN.com后缀邮箱的地址
- ScreenToGIF工具分享--将视频转成GIF动图
- 玩转Google cloud(二)
- 数字经济下 “东数西算” 的中国布局
- 【学习笔记】微体系结构-单周期、多周期、流水线
- 参数反演 计算机,叠前各向异性特征参数反演方法及计算机可读存储介质与流程...
- 日本女演员全解封,这很马斯克
- 【WebGL学习日报】22/09/01 : 绘制点
- Python 飞速下载各大平台音乐
热门文章
- oracle的insert语句clob,.Net 操作 Oracle CLOB类型字段 INSERT 超长数据
- 混凝土墙开洞_易县混凝土剪力墙切割常见问题
- Foxmail邮件字体大小怎么设置 Foxmail字体的设置方法
- ie浏览器剪贴板操作警告弹窗关闭方法
- 无线网络受限制或无连接处理方法
- RTSP播放器开发填坑之道
- js数组遍历和对象遍历
- MySQL在like查询中是否使用到索引
- Mysql 5.7 的‘虚拟列’是做什么?
- 长春理工大学c语言实验题库,长春理工大学首届趣味心理知识竞赛初赛题库.doc...