常见问题解答:Revit 宏

本部分回答了关于 Revit 宏的常见问题。

问题 答案
我想会在宏管理器的分类列表中看到新创建的宏,但是列表中没有显示该宏。为什么? 要使新宏出现在宏管理器中,必须首先在 Revit 宏 IDE 中成功构建宏项目(使用“构建”菜单)。
在编写新宏时,是否需要添加 RevitAPI.dll 和 RevitAPIUI.dll 作为引用? 否。 无需引用 RevitAPI.dll 和 RevitAPIUI 文件,因为该步骤已经由系统完成。 Revit 宏项目使用这两个文件作为必需的引用。 如果在 IDE 中删除了以下引用,则 Revit 宏将失败:

请参见恢复 RevitAPI.dll 和 RevitAPIUI.dll

是否需要编辑 Revit.ini 文件? 否。Revit 宏会自动注册并在宏管理器中显示,而无需进一步修改系统。
在 Revit 宏 IDE 中,我通过在 This*.cs 文件或 This*.vb 文件中删除宏的方法删除了该宏。 但是,当我再次打开宏管理器的分类列表时,删除后的宏名称仍然显示。 如何从列表中清除其名称? 只有成功构建了编辑的项目时,宏管理器才能识别删除操作。
应用程序级宏和文档级宏之间的区别是什么? 应用程序级宏可以在 Revit 应用程序单个实例中所有打开的 Revit 项目中运行。 文档级宏项目存储在 RVT 文件中。 可以从当前活动的文档中载入这些项目并对该文档运行这些项目。
如何访问 Application 对象或等效 externalCommandData 对象? 所有应用程序级宏都与 UIApplication 对象相关联。在应用程序级宏中,C# 和 VB.NET 中的 Application 关键字指针将返回 API Application 对象。

在文档级宏中,Document 关键字将返回 API Document 对象。要从文档级宏访问 UIApplication 对象,请使用 this.Application

在启动和关闭方法 Module_StartupModule_Shutdown 中应加入什么代码?

Module_Startup 方法在模块载入时调用,而 Module_Shutdown 在模块卸载时调用。

对于应用程序级宏模块,Module_Startup 在 Revit 启动时调用,而 Module_Shutdown 在 Revit 关闭时调用。

对于文档级宏模块,Module_Startup 在 Revit 项目打开时调用,而 Module_Shutdown 在项目文档关闭时调用。

此外,Module_StartupModule_Shutdown 还将在重新构建宏项目时调用。

可以在 Module_Startup 方法中添加初始化代码,在 Module_Shutdown 方法中执行清除工作。 例如,可以在启动时注册事件处理程序,而在关闭时取消注册(这是推荐的方式)。

如何以及为什么需要注册和取消注册 Revit 事件处理程序? 如上所述,在 Revit IDE 中推荐的方式是使用 *_Startup 方法注册事件处理程序,而使用 *_Shutdown 方法取消注册。 每个宏都将动态载入和卸载。 调试宏期间,如果没有正确取消注册事件处理程序,Revit 可能会调用错误的方法(可能是无效内存地址)。 在这种情况下,尽管 Revit IDE 可能避免 Revit 发生崩溃,但任何未正确取消注册的事件处理程序都可能在当前 Revit 会话期间导致性能问题。
一个对话框似乎无法正常工作,而且导致 Revit 出现问题。 在处于运行状态的 API 回调的范围外操作的无模式对话框可能会导致问题。建议您避免执行这类回调,以防止 Revit 中出现不稳定情况。
我想练习使用启动和关闭方法以及事件处理程序。 您是否能给我提供一个示例? 以下示例代码说明了如何注册 OnDocumentNewed 事件处理程序,该处理程序将在创建新的 Revit 项目时自动启动一个消息框。 注意:Revit SDK 中提供的某一宏示例可能给出了文档级事件处理程序的启动和关闭方法的示例。 该常见问题部分提供了应用程序级事件处理程序示例。

请注意,在 2011 年,所有的 API 事件都可由 Revit IDE 进行访问。 2011 年之前的事件已被删除。 以下示例显示了新事件。

为什么我使用 Python 创建的宏不再起作用? Python 宏需要 .NET Framework 3.5。默认情况下,并未安装它。手动安装 .NET Framework 3.5 以运行 Python 宏。

C# 示例,应用程序级:

private void Module_Startup(object sender, EventArgs e)
{
   this.Application.DocumentOpened
      += new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(Application_DocumentOpened);
}

private void Module_Shutdown(object sender, EventArgs e)
{
   this.Application.DocumentOpened
      -= new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(Application_DocumentOpened); 
}

void Application_DocumentOpened(object sender, Autodesk.Revit.DB.Events.DocumentOpenedEventArgs e)
{ 
   System.Windows.Forms.MessageBox.Show("message here");
}

VB.NET 示例,应用程序级:

Private
Sub Module_Startup(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Startup
AddHandler Me.OnDocumentNewed,
AddressOf Me.ThisApplication_OnDocumentNewed
End SubPrivate Sub Module_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
RemoveHandler Me.OnDocumentNewed,
AddressOf Me.ThisApplication_OnDocumentNewed
End SubPrivate Sub ThisApplication_OnDocumentNewed(ByVal document As Autodesk.Revit.Document)
System.Windows.Forms.MessageBox.Show("VB.NET
Application event OnDocumentNewed")
End Sub