【问题标题】:Revit API How to make a external command run asynchrously?Revit API 如何使外部命令异步运行?
【发布时间】:2018-09-07 03:44:32
【问题描述】:

我有一个外部命令来创建大约 40 个(甚至更多)通用模型 在 Revit 中。我想让Revit按照这个流程异步运行命令来加快进程:

加载命令 -> 运行命令 -> 加载族 -> 异步生成族实例 -> 结束命令。

我已经阅读了一些关于制作无模式对话框以解决问题的想法,但这不是我所需要的。我该怎么做?

【问题讨论】:

    标签: multithreading asynchronous revit-api revit


    【解决方案1】:

    Meiki 完全正确。 Revit API 只能在有效的 Revit API 上下文中使用,并且此类上下文仅由 Revit 事件提供。但是,您可以实现外部事件并从外部触发该事件以获得对有效 Revit API 上下文的访问。由 The Building Coder 在Idling and External Events for Modeless Access and Driving Revit from Outside 的主题组中提供的许多解决方案对此进行了详细讨论。

    另一种方法可能是使用DocumentOpened Event。您可以使用它来触发您想要的执行流程。

    第三种但不受支持的方法可能是使用日志文件,如 IFC Import and Conversion Journal Script

    我会开始阅读主题组中列出的众多解决方案,最终可能会使用外部事件。

    祝你好运,玩得开心!

    【讨论】:

    【解决方案2】:

    由于事务,您不能异步运行外部命令来创建(或修改)某些内容,请记住 Revit 不支持异步方法或方法。你能准确描述一下你要做什么吗?也许还有另一种方法。

    【讨论】:

    • 我想做的和我写的流程一模一样。假设我有一个外部命令。当我执行该命令时,它将生成至少 40 个类型通用模型的实例,并进行所有可能的修改(设置位置、旋转、移动......)。所有这些都在交易中。通常,Revit 会一一生成(同步),但我想让它同时生成所有 40 个实例(可能在 40 个线程中),等待生成完成然后关闭事务。跨度>
    • 我听说有人说 Revit 可以异步运行,但不支持或不允许外部命令和应用程序这样做。解决此问题的一种方法是使用空闲事件和无模式对话框。并不是说我对这个解决方案有充分的了解,但我认为它不会解决我的问题。该解决方案建议使命令本身异步并在“执行”方法返回后继续能够工作。我只想让我的命令的一部分异步/多线程运行,以在“执行”方法返回之前加快进程。
    【解决方案3】:

    根据文档:

    Autodesk Revit API 仅支持单线程访问。这意味着您的 API 应用程序必须在主线程中执行所有 Autodesk Revit API 调用(由 Autodesk Revit 进程在各个 API 入口点调用),并且您的 API 应用程序无法维护其他线程中的操作并期望它们能够随时调用 Autodesk Revit。

    但是,我相信您可以创建一个外部 API 并从您的命令中使用它。

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 2020-12-25
      • 1970-01-01
      • 2016-10-24
      • 2013-11-02
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多