Häufig gestellte Fragen: Revit-Makros

In diesem Abschnitt werden häufig gestellte Fragen (Frequently Asked Questions, FAQ) zu Revit-Makros beantwortet.

Frage Antwort
Ich bin davon ausgegangen, das mein neu erstelltes Makro in der kategorisierten Liste in Makro-Manager aufgeführt wird, was jedoch nicht der Fall ist. Was ist der Grund? Sie müssen zuerst das Makroprojekt in der Revit-Makro-IDE erstellen (Menü Build). Erst dann werden die neuen Makros im Makro-Manager angezeigt.
Muss ich beim Schreiben eines neuen Makros RevitAPI.dll und RevitAPIUI.dll als Verweise hinzufügen? Nein. Sie müssen die Dateien RevitAPI.dll und RevitAPIUI nicht als Verweise hinzufügen, da dieser Schritt automatisch für Sie ausgeführt wird. In Revit-Makroprojekten werden beide als erforderliche Verweise verwendet. Revit-Makros können nicht ausgeführt werden, wenn Sie diese Verweise in der IDE löschen:

Weitere Informationen erhalten Sie unter Wiederherstellen von RevitAPI.dll und RevitAPIUI.dll.

Muss ich meine Revit.ini-Dateien bearbeiten? Nein. Revit-Makros werden im Makro-Manager automatisch registriert und angezeigt, ohne dass weitere Änderungen am System erforderlich sind.
Ich habe in der Revit-Makro-IDE ein Makro gelöscht, indem ich die zugehörige Methode in der Datei This*.cs bzw. This*.vb entfernt habe. Der Name des gelöschten Makros wird jedoch weiterhin angezeigt, wenn ich die kategorisierte Liste von Makro-Manager erneut öffne. Wie kann ich den Namen aus der Liste löschen? Sie müssen das bearbeitete Projekt erfolgreich erstellen, damit Makro-Manager erkennt, dass der Name entfernt wurde.
Worin bestehen die Unterschiede zwischen Anwendungs- und Dokumentmakros? Anwendungsmakros können in allen geöffneten Revit-Projekten innerhalb einer einzigen Instanz der Revit-Anwendung ausgeführt werden. Makroprojekte auf Dokumentebene werden in einer RVT-Datei gespeichert. Sie können vom aktiven Dokument aus geladen und in diesem Dokument ausgeführt werden.
Wie greife ich auf das Application-Objekt oder die externalCommandData-Entsprechung zu? Alle Anwendungsmakros sind mit dem UIApplication-Objekt verknüpft. Bei Anwendungsmakros wird mit dem Schlüsselwortzeiger Application sowohl in C# als auch in VB.NET das Application-Objekt der API zurückgegeben.

in Makros auf Dokumentebene wird mit dem Schlüsselwort Document das Document-Objekt der API zurückgegeben. Um von einem Dokumentmakro aus auf das UIApplication-Objekt zuzugreifen, verwenden Sie this.Application.

Was muss ich in die Startup- und Shutdown-Methoden aufnehmen: Module_Startup und Module_Shutdown?

Die Module_Startup-Methode wird beim Laden, die Module_Shutdown-Methode beim Entladen eines Moduls aufgerufen.

Für Makromodule auf Anwendungsebene wird Module_Startup beim Starten von Revit und Module_Shutdown beim Beenden von Revit aufgerufen.

Für Makromodule auf Dokumentebene wird Module_Startup beim Öffnen eines Revit-Projekts und Module_Shutdown beim Schließen des Projektdokuments aufgerufen.

Module_Startup und Module_Shutdown werden auch aufgerufen, wenn das Makroprojekt erneut erstellt wird.

Sie können den Initialisierungscode in den Module_Startup-Methoden hinzufügen und die Bereinigung in Module_Shutdown-Methoden durchführen. So können Sie z. B. Ereignishandler im Startup registrieren und beim Shutdown aus der Registrierung entfernen. (Dieses Verfahren wird empfohlen.)

Wie und weshalb sollte ich den Revit-Ereignishandler registrieren bzw. aus der Registrierung entfernen? Wie bereits erwähnt, ist die empfohlene Vorgehensweise hierfür in der Revit-IDE das Registrieren von Ereignishandlern in der * _Startup-Methode und das Entfernen aus der Registrierung in der * _Shutdown-Methode. Jedes Makro wird dynamisch geladen und entladen. Wenn beim Debuggen eines Makros der Ereignishandler nicht ordnungsgemäß aus der Registrierung entfernt wird, ruft Revit möglicherweise eine falsche Methode auf (z. B. eine ungültige Arbeitsspeicheradresse). Die Revit-IDE kann einen Absturz von Revit in dieser Situation zwar möglicherweise verhindern. Ereignishandler, die nicht ordnungsgemäß aus der Registrierung entfernt werden, können jedoch während der aktuellen Revit-Sitzung zur Beeinträchtigung der Leistung führen.
Eines meiner Dialogfelder scheint nicht einwandfrei zu funktionieren und verursacht Probleme in Revit. Nichtmodale Dialogfelder, die nicht für Callbacks einer laufenden API erreichbar sind, können Probleme verursachen. Vermeiden Sie die Verwendung solcher Callbacks, um die Stabilität von Revit zu gewährleisten.
Ich möchte mit den Startup- und Shutdown-Methoden und mit einem Ereignishandler experimentieren. Können Sie mir ein Beispiel nennen? Der folgende Beispielcode veranschaulicht die Registrierung eines OnDocumentNewed-Ereignishandlers, der automatisch eine Meldung anzeigt, wenn ein neues Revit-Projekt erstellt wird. Anmerkung: Eines der Makrobeispiele im Revit SDK veranschaulicht die Startup- und Shutdown-Methode eines Ereignishandlers auf Dokumentebene. Diese FAQ enthält Beispiele für Ereignishandler auf Anwendungsebene.

Beachten Sie, dass mit der Revit-IDE ab 2011 auf alle API-Ereignisse zugegriffen werden kann. Ereignisse vor 2011 wurden entfernt. Die folgenden Beispiele zeigen die neuen Ereignisse.

Warum funktionieren die mit Python erstellten Makros nicht mehr? Python-Makros erfordern .NET Framework 3.5. Dies ist nicht vorgabemäßig installiert. Installieren Sie .NET Framework 3.5 manuell, um Python-Makros auszuführen.

C#-Beispiel, Anwendungsebene:

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-Beispiel, Anwendungsebene:

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