c# - 从 IExternalApplication 获取当前应用程序和文档 - Revit

标签 c# api revit

在执行 IExternalCommand 时,我可以通过 ExternalCommandData 轻松获取应用程序和文档

        UIApplication uiApp = commandData.Application;
        Document doc = uiApp.ActiveUIDocument.Document;
        Transaction trans = new Transaction(doc);

在执行 IExternalApplication 时,没有 ExternalCommandData 对象。我需要找到当前打开的 Revit 文件的路径。如何通过 IExternalApplication 访问 Document

最佳答案

您也可以这样做(在 IExternalApplication.OnStartup 中),但它依赖于 UIControlledApplication 对象的未记录的功能。我从 Revit 2012 到 2017 一直使用这种技术,所以我想这是一个稳定的假设:

var versionNumber = uiControlledApplication.ControlledApplication.VersionNumber;
var fieldName = versionNumber == "2017" ? "m_uiapplication" : "m_application";
var fi = uiControlledApplication.GetType().GetField(
    fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication);

```

想法是使用内省(introspection)来访问UIControlledApplication 对象的非公共(public)字段(m_uiapplication)。这是 UIApplication 类型。

关于c# - 从 IExternalApplication 获取当前应用程序和文档 - Revit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382320/

相关文章:

c# - 编写 C++ .dll 并访问它们 Unity-3D

c# - System.Linq 的 Visual Studio .Net 源步进

python - 如何使用 python Bottle 框架创建 REST API 应用程序以及如何将其部署到 apache 服务器上?

c# - TreeView 添加排序

c# - 自动生成ID

c# - 如何创建自定义 FluentAssertion 错误消息?

api - 推特 API 问题

reactjs - 在 dockerfile 中获取容器的 IP

c# - 反序列化 - 程序集未找到问题 c#

autodesk-forge - IFC 实体类型名称是否区分大小写?