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

若為應用程式層級巨集模組,開啟 Revit 專案時會呼叫 Module Startup,而在關閉專案文件時會呼叫 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 發生不穩定的事件。
我想要試驗 Startup 和 Shutdown 方法及事件處理常式。可以展示範例嗎? 下列範例程式碼展示如何登錄 OnDocumentNewed 事件處理常式,它會在建立新 Revit 專案時自動啟動訊息方塊。注意事項:Revit SDK 提供的其中一個巨集範例,可能會展示文件層級事件處理常式的啟動和關閉範例。此常見問題展示應用程式層級事件處理常式範例。

請注意,在 2011 中,所有 API 事件都可由 Revit IDE 存取。2011 之前的事件均已移除。下列範例展示了新事件。

C# 範例,應用程式層級:

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

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