离线读取指的是不打开Autodesk Revit 软件的情况下,读取.rvt ,.rfa等revit文件,目前autodesk官方的API中并不能实现。如下图所示:
上图中话题的时间是2022年9月份,离现在并不久远。
有没有其他方法呢?
第三方库
这里主要介绍ODA(Open Design Alliace开放设计联盟),以前叫做Tegha。ODA是一个非营利性技术联盟,为开发工程应用程序提供高级工具包,其在美国注册,但主要工作人员在俄罗斯,他们对工程行业中的常用的封闭格式进行逆向工程,如.dwg,.dng,.rvt等,让开发人员可以不受限制的访问这些文件,其实就是不依赖Autodesk官方软件。
ODA也并不是免费的,而是会员制。如果要了解详细信息可以访问他们的官网:www.opendesign.com。
RevitNet.dll
如上述论坛题主所述,revitnet.dll确实可以在不打开revit的情况下读取revit文件,但是目前可能仅支持到2018版本,而revit是不支持降版的。
使用RevitNET.dll通过初始化RevitNet核心类Product后可以在不打开RevitUI界面的情况下后台操作模型文件(支持开启事务)。可以对模型文件进行增、删、查、改等一系列操作,总而言之就等于是没有界面,没有了UI交互,但是一样可以操作Revit。
Product主要属性及方法:
- public APISettings Settings { get; }
public Application Application { get; } // 当前的应用程序服务Application对象
public static ICriticalSituationProcessor GetCriticalSituationProcessor();
public static Product GetInstalledProduct();// 获取Product对象
public static void RegisterCriticalSituationProcessor(ICriticalSituationProcessor processor);
public sealed override void Dispose();
public void EnableIFC(bool enable);
public void Exit(); // 退出/关闭应用
public void Init(DB.ClientApplicationId id, string clientData);
public void SetPreferredLanguage(ApplicationServices.LanguageType language);
public void SetSettingsFileLocation(string strSettingsFileLocation);
一下是一些技术文章可以参考
Revit二次开发之十五 RevitNet.dll 的使用 –
Design Automation API
按照Autodesk官方的意思
运行 Revit 附加模块或 Web 应用程序以处理或创建 RVT/RTE/RFA 数据
Design Automation API for Revit 是 Revit 的引擎,作为 APSservice 在云中运行。构建用于创建、提取和修改 Revit 数据的云原生应用程序和服务。通过提供对完整 Revit DB API 的访问,无需在桌面上安装 Revit,现在可以在任何地方使用以下工作流:
- 创建自定义 Revit 族内容
- 自动创建模型
- 浏览和分析模型数据
- 提取和生成自动报告
- 修改现有模型以维护公司标准
- 自动创建文档
若要开始,我们建议在此处浏览适用于 Revit 的设计自动化 API 教程和此处的示例。
Autodesk官方Design Automation API除了支持Revit,也可以支持Autocad,3ds Max,Inventor。
OpenMcdf
OpenMCDF是一个100%的.net / C#组件,允许开发人员操作结构化存储文件。关于OpenMCDF与Com结构化存储的信息来自一篇文章:Reading Revit File Without Revit。文章中提出,Revit使用**COM结构化存储**的文件存储技术,我们可以用它来读取一些简单必要的信息。因此这种方法只能获取少量信息。
OpenMCDF的相关信息可以参考https://github.com/ironfede/openmcdf
可以用用它来读取Revit文件
static void Main(string[] args)
{
CompoundFile compoundFile = new CompoundFile(args[0], CFSUpdateMode.ReadOnly, CFSConfiguration.Default);
var root = compoundFile.RootStorage;
List<CFItem> cFItems = new List<CFItem>();
root.VisitEntries((CFItem cf) =>
{
Console.WriteLine($"Name : {cf.Name}");
Console.WriteLine($"Size : {cf.Size}");
Console.WriteLine();
}, recursive:true);
}