Bulding Coder(Revit 二次开发) - AU 圆桌会议

原文链接:The Champions Roundtable at AU

Jeremy 在 AU DevLab 上与回答其它 Revit 二次开发人员的问题


译者注:Jeremy 直接将他在 AU DevLab 上的笔记贴上来了,虽然句子有些混乱,但是我看下来之后依然觉得其中不乏原则性策略和编程技巧。所以翻译整理了一下,和大家分享。

Q: 我如何运行一个批处理来打开连续的工作共享 Revit 文件,并且对它们执行一个外部命令?
A: 你可以使用 Journaling,但是我不推荐。执行 Journaling 时,打开/关闭文件的操作不会产生内存泄露,因为 .NET Framwork 为托管代码提供了垃圾回收机制。
为了自动执行外部命令,你可以安装一个外部应用程序,注册其 OnDocumentOpened 事件,然后在事件处理函数中调用外部命令对应的代码。

Q: 如何将 Revit 数据导出?
A: 有多种通讯方式可以选择。以将数据导出到 SQL 为例,可以在一个外部应用程序中持续地从 Revit Server 下载文件,然后通过通用 .NET 代码读取文件数据后写入数据库。
我建议为你的外部应用程序提供日志,这样就可以追踪可能的错误(比方说 1000 个文件里有一个处理失败了)。Saikat 实现过一个插件(荣膺月度之星的),用来将 RVT 文件批量地更新到新版本格式。这个插件就将所有的操作就记录到文本文件中。另外你也可以使用 Revit 2013 新引入的进度 API 来获取 Revit 的内部处理信息。

Q: 外部进程可以调用 Revit API 创建 3D 模型吗?
A: Revit API 只能在 Revit 进程会话中调用,外部进程不可以直接调用。当然你可以使用一些消息处理机制从外部进程通知 Revit 进程来执行操作。

Q: AutoCAD 的控制台可以直接通过命令访问模型数据。Revit 将会有类似的功能吗?
A: 也许吧 :-)

Q: 目前无法在不打开 Revit 文档的前提下访问 Revit 数据库。这种情况会改变吗?
A: 我们有计划为 Revit 提供类似 RealDWG 提供的数据库访问。但是目前你只能在 Revit 文档打开时(有窗口或者在内存中)访问 RVT 内部数据结构。

Q: 我们创建了参数化的 Revit 模型,在改变参数时,有没有办法禁止相关的 UI 改变?
A: 对于一个有视图的文档,你必须使用 Regeneration() 或者提交事务才能确认 Revit 模型被正确更新了。也就是说 UI 必须要改变。但是你可以使用 OpenDocumentFile() 在内存中打开 Revit 模型,然后改变其参数。只有 OpenAndActiveDocument() 才会打开文档的视图。

Q: 是否只有提交事务才能确认模型被正确更新了?
A: 通常情况下是的。但是有时候调用 Regeneration() 就足够了。

Q: Revit 对于管理大量的大模型稳定性如何?
A: 稳定性是我们在持续改性的重点。但是在任何时候,遵循 Revit 的最佳实践模式创建和访问模型是保证稳定性的重要条件。

Q: 可以编辑一个组合(Group)吗?
A: 不行。只能先取消组合,然后再重新组合。如果该组合有多个实例,你还需要逐个处理它们。

Q: 有些族提供选项设置其在不同视图中的外观。其它类别的模型有这个功能吗?有些族只有平面视图,我们能在 UI 中实现这一点吗?
A: 不行。没有任何 UI 和 API 可以让一个族只有平面视图。

Q: 一个族在没有创建族实例的情况下,依然创建了自身的几何对象(默认几何对象)。当创建一个族实例且与默认几何对象存在空间冲突时,Revit 会报错:cannot make type。如果解决这个问题?
A: 这是一个 Regeneration() 的 BUG,我已经记录下来了。

Q: 我如何知道 Revit 正在做的操作?
A:使用进度通知。它可以告诉你 Revit 正在进行的事务的子过程信息。

Q: Revit 在执行 regeneration 操作时,是否会将一些细节记录到 Journal 文件中?
A: 部分细节会记录。Revit 二次开发人员可以使用 JournalingMode 来控制外部命令是否记录到 Journal 文件中,使用 ExternalCommandData.JournalData 来控制记录的内容。这就是为什么有时候你会发现 Journal 文件内容是加密的。

Q: 当我对一个工作共享的模型启用一个事务时,是否应在提交事务之前验证所有的修改都是可提交的?
A: 我不认为你有办法做这种验证。目前你只有在事务报错并回滚时才能知道修改是否是正确的。不过 Revit 开发小组有计划实现这个功能。

Q: AutoCAD已经集成了 DesignScript。Revit 是否有计划也集成它?
A: 目前 Revit 只支持参数化建模。不过 DesignScript 是一个开放的项目,我认为将它集成到 Revit 是完全可能的。

译者注:DesignScript 是 Autodesk 实验室设计的一种全新脚本。AutoCAD 用户可以使用 DesignScript 进行一些以往只能通过 UI 操作实现的建模功能。详见http://labs.autodesk.com/utilities/designscript

Q: 我可以使用公式来建立两个族之间的参数化关联吗?
A:好主意!不过目前不行。

Q: 我可以访问文档警告吗?
A: Revit 提供了失败API,但是没有警告相关API。你可以在外部应用程序中注册失败处理函数。这样事务在提交时如果有错误,Revit 就是调用你的失败处理函数。

Q: 我有一个操作导致了300个警告。有办法获取出现的警告列表吗?
A: 没有直接的API。你只能一个个的处理它们。我建议还是修正导致这些警告的操作,从根本上解决问题。

Q: 如何解决链接文件和宿主文件的阶段不匹配的问题?
A: 虽然 Revit 2013 提供了很多关于链接文件的支持,但是目前 Revit API 不支持阶段(Phase)匹配。我们的目标是为所有 UI 操作提供对应的 API,但是这需要时间。好消息是今后所有 Revit 新增的功能我们都将为其提供对应的 API。

Q: Dispose() 方法是从 APIObject 基类继承的。我们需要对所有使用的对象调用 Dispose() 方法吗?
A: 这可能是一个好习惯。一般来说,.NET 的垃圾回收机制会帮助我们完成这一点。另外在 Revit API 中,范围化对象(例如:事务)也会自动释放自身占用的资源。但是最简洁的方式就是使用 using 块。需要指出的是,APIObject.Dispose() 实际上没有做任何事情。如果你的代码分配了资源,最好显示地释放它们。Revit 元素的生命周期具有不确定性。但是因为 Revit 文档已经为我们保存了一份 Element,所以我们的代码应该保存 ElementId 而不是 Element 本身。

Q: 用户有什么办法可以向我们提供错误报告?
A: Journal 文件是最便捷的错误报告。另外工作共享相关的日志文件(.slog)可以提供本地和服务器之间的交互记录。

Q: 链接文件中的视图在链接文档和宿主文档中的 UniqueId 相同。
A: 你说的应该是 ElementId。ElementId 只在 Revit 会话中有效,有时候在不同的 work sharing 会话中会有不同的值。但是 UniqueId 应该是不变的。

Q: Revit Add-in 会导致 Revit 崩溃吗?
A: 通常情况下不会。Revit 为 Add-in 提供了一个沙盒来隔离 Add-in 和 Revit 内置功能。不过如果在 Add-in 中如果发生了异常嵌套,则无法保证 Revit 依然是安全的。另外 Revit无法提供对非托管代码的保护。例如使用 COM 访问非法的引用。

Q: Revit API 支持重新加载 keynotes 文件吗?
A: 目前不支持。

你可能感兴趣的:(Bulding Coder(Revit 二次开发) - AU 圆桌会议)