Autodesk Inventor autodesk

Programmierung mit VBA in Autodesk Inventor - Teil 3

Im zweiten Teil des dreiteiligen Tutorials hatten wir den Code zum Plazieren einer Komponente des Marker Bauteils im Massenschwerpunkt der Baugruppe eingefügt. In diesem Abschnitt des Tutorials fügen wir zusätzliche Prozeduren hinzu.

Eine Prozedur ist für das Aktualisieren der Position des Marker Bauteils in Abhängigkeit vom Massenschwerpunkt der Baugruppe zuständig. Diese Aktion wird ausgeführt, nachdem der Anwender den Aktualisieren Button drückt. Eine weitere Prozedur skaliert das Marker Bauteil. Abschließend wird noch der Programmcode zur Sichtbarkeitssteuerung der Urspungsgeometrie (Arbeitsebenen,-achsen und Mittelpunkt) des Marker Bauteils erstellt. Parallel dazu werden wir uns mit Methoden zum Finden und Fixen von Programmierfehlern (debuggen) zu befassen. Die Hierarchie der Objekte des Programms sind in Bild 1 dargestellt.

Dateien downloaden

Sie können entweder mit Ihrem bisher erstellten Code weiterarbeiten, oder aber den Code der bisherigen Tutorials runterladen ( COG_B.zip (259 KB)).

Die gezippte Datei enthält die folgenden Dateien:

Marker.ipt

Marker.ipt50

COG_B.ivb

Hinweis: Sollten Sie Autodesk Inventor 5.3 installiert haben, so können Sie direkt mit dem Marker.ipt weiterarbeiten. Haben Sie noch eine ältere Version von Autodesk Inventor 5 auf Ihrem Rechner, so löschen Sie bitte die Datei Marker.ipt und benennen die Datei Marker.ipt50 in Marker.ipt um.

Kopieren Sie das Marker.ipt Bauteil in ein Verzeichnis in Ihrem aktuellen Projekt.

Die Projektdatei COG_B.ivb enthält den kompletten Code der bisherigen Tutorials. Benennen Sie diese Datei in COG.ivb um und laden das Projekt mittels der Autodesk Inventor· VBA IDE:

  1. Wählen Sie Werkzeuge > Makro > Visual Basic Editor aus dem Autodesk Inventor Menü
  2. Wählen Sie dann Datei > Projekt laden aus dem VBA Menü.  Browsen Sie zu der Datei COG.ivb und laden Sie diese.
Bild 1
Bild 1: Objekt Hierarchie des Massenschwerpunktes der Baugruppe

Aktualisierung der Marker Position

Obwohl es möglich ist die Position des Marker Bauteils in Abhängigkeit von Autodesk Inventor Events automatisch zu aktualisieren, halten wir die Situation einfach. Der Anwender startet das Update manuell durch Drücken des Buttons Aktualisieren. Der für das Update benötigte Code ist fast mit dem Code der InsertMarker Unterroutine identisch. Es wird eine temporäre Matrix mit der Position des Massenschwerpunktes der Baugruppe erzeugt, und im Anschluß werden diese Daten genutzt, um das Marker Bauteil auf den aktuellen Massenschwerpunkt der Baugruppe zu schieben. 

Obwohl das Marker Bauteil nach dem Einfügen fixiert ist, gibt es keinen Schutz, daß der Anwender das Bauteil löst, verschiebt oder rotiert, oder sogar das Marker Bauteil mit anderen Komponenten verbindet. Die zur Transformierung des Marker Bauteils verwendete Matrix speichert die Orientierung (Rotation)des Bauteils um es an das Koordinaten-system der Baugruppe anzupassen (Ausrichtung in den Hauptachsrichtungen). Die Update Prozedur kümmert sich nicht um Zusammenbauabhängigkeiten, man könnte dies aber prüfen, und dann alle notwendigen Zusammenbauabhängigkeiten bei Bedarf (Abhängig vom Bewegen des Bauteils) löschen.

1. Erzeugen Sie eine neue Private Subroutine mit dem Namen UpdateMarker.

2. Schneiden Sie die ersten sechs Programmcodezeilen (keine Kommentare) aus der InsertMarker Prozedur, und fügen diese dann in die UpdateMarker Prozedur.

3. Löschen sie die Zeile mit der Genauigkeitsdefinition der Baugruppen Masseneigenschaft. Der Code sollte wie in Bild 2 gezeigt aussehen.

Bild 2: UpdateMarker Prozedur
Bild 2: UpdateMarker Prozedur

4. Fügen Sie die folgende Zeile Code oberhalb der End Sub Zeile ein.

Call m_oOccMarker.SetTransformWithoutConstraints(oMatrix)

Die Methode SetTransformWithoutContraints verschiebt die Komponente (Marker.ipt) unabhängig von Zusammenbauabhängigkeiten auf der Ausprägung. Jedoch würde das nächste Update der Baugruppe die Zusammenbauabhängigkeiten wieder aktivieren. Als Bonusaufgabe können Sie versuchen die dem Bauteil zugeordneten Zusammenbauabhängigkeiten zu löschen. Hinweis: Die Variable  Assembly ComponentOccurence hat eine Eigenschaft Abhängigkeiten.

5. Kopieren Sie den Code von der InsertMarker Prozedur, der die Marker Bauteil Eigenschaft zum Fixieren des Bauteils und als Referenzkomponente definiert,. Fügen Sie den Code unterhalb des Codes aus Punkt 4 ein.

6. Kopieren Sie den Code von der InsertMarker Prozedur, der die UpdateXYZ Unterroutine aufruft. Fügen Sie den Code unterhalb des Codes aus Punkt 5 ein.

7. Fügen Sie eine Codezeile zum Updaten der Baugruppe ein (siehe InsertMarker).

Obwohl eine innerhalb einer Prozedur definierte Objektvariable am Ende einer Prozedur  (außerhalb des Geltungsbereichs) unabhängig von allen Objekten ist, zeugt das Einfügen einer Codezeile zum Setzen der Variable auf Nothing am Ende der Prozedur von einem guten Programmierstil.

8. Fügen Sie vor der End Sub Zeile folgenden Code ein:

Set oMatrix = Nothing

Die UpdateMarker Unterroutine sollte nun wie in Bild 3 dargestellt aussehen.

Bild 3
Bild 3: UpdateMarker Prozedur

9. Es muß jetzt noch eine Verbindung zum Aktualisieren Button des Dialogs hergestellt werden. Erzeugen Sie eine Private Unterroutine cmdUpdate mit der Prozedur Click. Von dort aus rufen Sie die UpdateMarker Routine auf. Der Code sollte wie folgt aussehen:

Private Sub cmdUpdate_Click()

Call UpdateMarker

End Sub

Testen und Debuggen

Testen wir jetzt die Prozedur. Öffnen Sie eine Baugruppe , die eine Komponente des Marker Bauteils beinhaltet. In unserem Fall verwenden wir eine einfache Baugruppe mit 2 Würfeln gleicher Grösse.

1. Wählen Sie Extras > Makros  aus dem VBA Menü.

2. Klicken Sie Ausführen des CogTool Makros.

Der blaue Würfel ist an dem Baugruppenursprung in Bild 4 fixiert. Der graue Würfel ist mit der Abhängigkeit Abstand des Mittelpunkts  zur X,Y,Z-Achse der Baugruppe von 11/-17/8  mm versehen.

Bild 4
Bild 4: Baugruppe mit Marker Bauteil

3. Bewegen Sie die unterbestimmte Komponente oder ändern Sie den Offset Wert der Baugruppenabhängigkeit um eine Änderung der Baugruppe zu erwirken (in unserem Beispiel X um zusätzliche 30 mm und  Y um zusätzliche 20 mm).

4. Klicken Sie den Aktualisieren Button in der Dialogbox Massenschwerpunkt Baugruppe.

Die Baugruppe in Bild 5 zeigt Änderungen an 2 Baugruppenabhängigkeiten. Das Marker Bauteil hat sich auf den neuen Massenschwerpunkt der Baugruppe bewegt. Im Dialog werden die aktualisierten Koordinaten angezeigt.

Bild 5
Bild 5: aktualisierte Baugruppe

5. Lösen Sie die Fixierung des Marker Bauteils und bewegen es vom Massenschwerpunkt der Baugruppe weg.

6. Rotieren Sie das Marker Bauteil mit Komponente drehen.

7. Klicken Sie den Aktualisieren Button nochmals. Das Marker Bauteil wird zum Massenschwerpunkt der Baugruppe zurück bewegt. Die Orientierung richtet sich wieder an den Baugruppen Referenzachsen aus.

Das war eigentlich zu einfach. Was passiert, wenn der Anwender das Marker Bauteil löscht, während das Makro aktiv ist ? Versuchen wir es.

1. Löschen Sie das Marker Bauteil aus der Baugruppe.

2. Klicken Sie den Aktualisieren Button. Eine Fehlermeldung erscheint und signalisiert, daß ein Fehler während des Bewegens des Marker Bauteils auftrat (Bild 6).

Bild 6
Bild 6: Fehlermeldung beim Verschieben des Marker Bauteils

3. Klicken Sie den Debuggen Button in der Fehlermeldung.

Die Zeile mit dem Fehler wird im Code Fenster hervorgehoben. Falls das Bauteil nicht länger in der Baugruppe vorhanden ist, hat die Variable m_oOccMarker keine Referenz mehr dazu.

4. Um das Makro anzuhalten, klicken Sie den Zurücksetzen Button in der VBA Standard Symbolleiste (Bild 7).

Bild 7
Bild 7: Zurücksetzen Button

Das Beachten jeder möglichen Anwenderaktion ist eine echte Herausforderung, selbst für ein relativ einfaches Programm. Fehlerbehandlung erlaubt es dem Programm auf  unerwartete Situationen zu reagrieren (wie z.b. die gerade vorher beschriebene Situation). Eine komplette Fehlerbehandlung würde den Rahmen des Tutorials sprengen. Wir fügen aber zumindest für das aktuelle Problem eine Fehlerverfolgung und Fehlerbehebung ein. Nachdem wir jetzt wissen welche Codezeile den Fehler erzeugt, können wir einen Code zum Abprüfen des Codes für diese Zeile einfügen.

5. Fügen Sie die folgende Zeile als erstes Anweisung in die UpdateMarker Prozedur ein.

On Error Resume Next

Diese Zeile erzwingt die Ausführung des nächsten Programmanweisung, falls ein Fehler innerhalb der Prozedur auftritt. Wir fügen jetzt eine Zeile Code direkt unterhalb der identifizierten Zeile ein, um zu prüfen, ob aktuell ein Fehler auftritt.  Das Err Objekt ist ein VBA Objekt, welches Informationen über den Fehler enthält. Suchen Sie nach Err Object in der VBA Hilfe um mehr über die Fehlerbehandlung zu erfahren.

6. Fügen Sie den Code wie in Bild 8 gezeigt, unmittelbar unterhalb der Anweisung zum Bewegen des Marker Bauteils ein..

Bild 8
Bild 8: Programmiercode Fehlerbehandlung

Haltepunkt und Objektverfolgung

Es gibt eine Vielzahl von Tools zur Fehlerverfolgung im Code im VBA Editor. Eine nützliche Technik ist das Setzen von Haltepunkten im Bereich einer verdächtigen Code Sektion. Dadurch kann man Variablen in diesem Bereich beim Schrittweisen Abarbeiten untersuchen.

1. Aktivieren Sie das Autodesk Inventor Fenster und klicken Sie den Undo Button in der Standard Symbolleiste , um das gelöschte Marker Bauteil wieder zurückzubringen.

2. Aktivieren Sie das VBA Fenster.

3. Klicken sie in den grauen Rand neben der Codezeile wie in Bild 9 gezeigt. Die Zeile wird mit einem roten Hintergrund hervorgehoben. Das Programm wird vor der Ausführung dieser Anweisung unterbrochen.

Bild 9
Bild 9: Haltepunkt in einer Unterroutine

4. Starten Sie Extras > Makros im VBA Menü und führen Sie das CogTool Makro aus.

5. Löschen Sie das Autodesk Inventor Marker.ipt Bauteil aus der Baugruppe.

6. Klicken Sie den Aktualisieren Button in der Dialogbox Massenschwerpunkt Baugruppen.

Der VBA Editor ist aktiviert und die Haltepunktzeile ist ausgeleuchtet. Das Makro ist immer noch aktiv, aber die Ausführung ist unterbrochen. Ab hier können Sie die Variablenwerte untersuchen und die Codeanweisung Schritt für Schritt durchlaufen, um die Programmlogik und Ausführung zu überprüfen

7. Drücken Sie die F8 Taste um die ausgeleuchtete Anweisung auszuführen.

8. Drücken Sie die F8 Taste nochmals um zur Zeile Call oMatrix zu gelangen.

Man kann Werte von Nichtobjektvariablen durch Überfahren der Variable mit dem Cursor betrachten.

9. Bewegen Sie den Cursor über .X kurz vor Ende der ausgeleuchteten Zeile. Der X Wert des Massenschwerpunkts der Baugruppe wird als QuickInfo gezeigt (Bild 10).

Bild 10
Bild 10: Untersuchung der Variablenwerte
Hinweis: Ihr Wert wird sich gegenüber dem in Bild 10 gezeigten Wert unterscheiden. Rundungstoleranzen sind die Ursache hierfür.

Man kann die Werte jeder Variable auch jederzeit in einem separaten Fenster im VBA Editor betrachten (einschließlich der Objektvariablen).

10. Klicken Sie mit der rechten Maustaste auf das Wort Err in der If Err Anweisung und starten Sie Überwachung hinzufügen aus dem erscheinenden Menü.

11. Klicken Sie im folgenden Dialog auf OK um die Voreinstellungen für Überwachung hinzufügen zu akzeptieren.

Das Überwachungsausdrücke Fenster öffnet sich und das Err Objekt wird zu den überwachten Ausdrücken hinzugefügt. Man kann das Fenster jederzeit an eine Ecke im VBA Editor verankern (falls nicht schon geschehen).

12. Klicken Sie im Überwachungsfenster das + Zeichen neben dem Err Ausdruck. Alle Eigenschaften des Err Objektes werden mit ihren aktuellen Werten gezeigt.

13. Drücken Sie solange die F8 Taste, bis die If Err Then Anweisung ausgeleuchtet wird. Das Err Objekt im Überwachungsfenster wird jetzt mit allen verknüpften Fehlerwerten angezeigt.(Bild 11).

 

Bild 11
Bild 11: Überwachung des Err Objektes

14. Drücken Sie weiterhin die F8 Taste, um die Prozedur zu durchlaufen. Solange If Err den Wert True annimmt, wird der Code innerhalb der If · End If Anweisung ausgeführt. Eine Warnung weist den Anwender auf das Problem hin, und der Dialog ermöglicht nur das Einfügen des Marker Bauteils.

Hinweis: Mit der Taste F5 können Sie die Programmausführung fortfahren.


Collection object (oParams) used:
 Set oPartDef = m_oOccMarker.Definition
 Set oParams = oPartDef.Parameters.UserParameters
 Set oParam = oParams.Item(1)

Collection object not used:
 Set oPartDef = m_oOccMarker.Definition
 Set oParam = oPartDef.Parameters.UserParameters.Item(1)

Hinweis: Das Lokal-Fenster(Ansicht > Lokal-Fenster) stellt alle Variablen mit den jeweils zugewiesenen Werten der aktuellen Prozedur dar. Falls die Prozedur einer Form zugeordnet ist, so wird auch das Me Objekt (die Form) im Lokal-Fenster aufgeführt. Expandieren Sie das Me Objekt um alle Formebenenobjekte und Variablen untersuchen zu können.

Zugriff auf Parameter
Das Ändern von Modellen und benutzerdefinierten Parametern ist eine nützliche Funktion in VBA Makros. Z.B. das Ändern des Werts einer Baugruppenabhängigkeit Passend mit anschließender Berechnung basierend auf dem Passend Wert (Bauteileposition, Geschwindigkeit, ·). In unserem Programm gibt der Anwender einen Skalierungsfaktor in die Textbox txtScale ein, und dieser Wert wird zum Aktualisieren der Anwenderparameter zur Steuerung der Teilegröße des Marker Bauteils verwendet.

Die Variable Typ ComponentOccurrence speichert das Vorkommen des Marker Bauteils in der Baugruppe. Das Makro limitiert das Vorkommen des Marker Bauteils auf einmal. Normalerweise kann die Komponente beliebig oft in einer Baugruppe vorkommen. Um auf die Parameter des Marker Bauteil zugreifen zu können, benötigen wir das PartComponentDefinition Objekt des Bauteils.  Zum Glück hat das ComponentOccurrence Objekt eine Definitionseigenschaft, die das PartComponentDefinition Objekt für die Komponente offenlegt. Es ist hierbei wichtig daß die Objekteigenschaften in der Objekthierarchie auf der selben Ebene angeordnet sind. Normalerweise geben die Applikationseigenschaften eines Objektes die Applikationsobjekte der obersten Ebene zurück.

1. Erzeugen Sie in frmCog eine neue Private Unterroutine mit dem Namen ScaleMarker.

2. Deklarieren Sie die folgenden Variablen (In Referenz auf die Objekthierarchie in Bild 1):

Dim oPartDef As PartComponentDefinition
Dim oParams As UserParameters
Dim oParam As UserParameter

Hinweis: Es ist nicht immer notwendig die Variablen auf jeder Ebene der Objekthierarchie in einer Prozedur zu definieren. Die Variable oParams speichert die Auswahl von Benutzerparametern, während die Variable oParam auf einen Benutzerparameter in der Auswahl referenziert. Diese individuellen Parameter können direkt, ohne die Deklaration einer Ebenenauswahlvariable verwendet werden. Die beiden Möglichkeiten sind im folgenden Code dargestellt.

Collection object (oParams) used:
 Set oPartDef = m_oOccMarker.Definition
 Set oParams = oPartDef.Parameters.UserParameters
 Set oParam = oParams.Item(1)

Collection object not used:
 Set oPartDef = m_oOccMarker.Definition
 Set oParam = oPartDef.Parameters.UserParameters.Item(1)

3. Fügen Sie den Code, wie in Bild 12 gezeigt in die ScaleMarker Prozedur ein.

 

Bild 12
Bild 12: Änderung des Skalierungsparameters

4. Bereinigen Sie am Ende der Prozedur die 3 Objektvariablen. Dazu setzen Sie die am Anfang der Prozedur definierten Objektvariablen auf equal to nothing.

Nachdem jetzt die Prozedur für die Skalierung des Marker Bauteils programmiert ist, muß noch festgelegt werden wann sie benutzt wird. Das Marker Bauteil wird durch den Anwenderklick auf den Aktualisieren Button skaliert, allerdings wäre ein Defaultwert  für den Skalierungsparameter beim Einfügen des Marker Bauteils ebenso von Vorteil.

5. Wählen Sie InsertMarker aus der Prozedurenliste oben im Code Fenster. Sollte die Prozedur in der Liste nicht zu sehen sein, wählen Sie in der Objektliste Allgemein (Allgemein Prozeduren sind nicht mit einem Steuerelement verbunden), und wählen dann anschließend InsertMarker aus der Prozedurenliste.  Geben Sie jetzt den Code wie in Bild 13 gezeigt ein (oberhalb der Dokumentenupdatezeile).

Bild 13
Bild 13: Skalierung des Marker Bauteils während des Einfügens

6. Wählen Sie UpdateMarker aus der Prozedurenliste.

7. Fügen Sie eine Anweisung zum Aufruf der ScaleMarker Prozedur hinzu. In diesem Fall erzwingen Sie keine Änderung des Inhalts in der Textbox.  Mit der InsertMarker Prozedur fügen Sie diese Zeile vor dem Dokumentupdate hinzu.

Wie üblich, versuchen wir jede mögliche Fehlereingabe abzufangen. Was würde passieren, wenn der Anwender den Text in der txtScale Textbox löscht oder einen nichtnumerischen Wert eingibt? Die Val (txtScale.Text) Anweisung würde Null zurückgeben und Autodesk Inventor würde beim Versuch das Teil auf Null zu skalieren einen Fehlerreport ausgeben. Glücklicherweise kann eine If Anweisung dieses Problem eliminieren.

8. Fügen Sie vor dem Aufruf der ScaleMarker Prozedur eine If Anweisung ein, die den Wert der txtScale Textbox prüft. Sollte der Wert kleiner oder gleich Null sein, dann setzen Sie den Text in der Textbox auf ·1.0· (Bei der Skalierung können Sie den Wert entweder mit Komma  oder Punkt angeben). Versuchen Sie dies selbst zu erstellen, ohne es aus Bild 14 abzuschreiben

Bild 14
Bild 14: Validierung des Skalierungswertes 

Sichtbarkeit der Referenzgeometrie

Wir definieren jetzt die Sichtbarkeit  der Referenzgeometrie im Marker Bauteil. Dies ist abhängig von den Kontrollkästchen im Dialog. Es wird die PartComponentDefinition des Marker Bauteils an den Programmiercode übergeben, und man kann dann von dort aus auf die Ursprungsebenen, -achsen und Mittelpunkt Auswahl des Marker Bauteils zugreifen. Die Ursprungsebenen, -achsen und Mittelpunkt sind immer die ersten Einträge in dieser Auswahl. Nochmals der Hinweis auf Bild 1 mit der Objekthierarchie.

1. Erzeugen Sie in frmCog eine neue Private Unterroutine mit dem Namen ShowWorkGeom.

2. Fügen Sie den Code wie in Bild 15 gezeigt ein.

Bild 15
Bild 15: Code zur Darstellung der Marker Ursprungsgeometrie

3. Rufen Sie die ShowWorkGeom Prozedur aus der UpdateMarker Prozedur auf (nach der Anweisung die ScaleMarker Prozedur aufzurufen).

4. Rufen Sie die ShowWorkGeom Prozedur aus der InsertMarker Prozedur auf (nach der Anweisung die ScaleMarker Prozedur aufzurufen).

Zurück zum Seitenanfang

Der Abschlußtest

Natürlich könnten wir jetzt noch beliebig fortfahren. Es soll aber jetzt für dieses Tutorial genügen und wir wollen unser Ergebnis jetzt testen. Am Ende des Tutorials haben Sie die Möglichkeit das Endgültige Programm mit einigen Erweiterungen runterzuladen.

1. Starten Sie das CogTool Makro in einer Baugruppenzeichnung und geben Sie 2 in der txtScale Textbox ein.

2. Klicken Sie den Aktualisieren Button. Das Marker Bauteil wird doppelt so groß dargestellt.

3. Klicken Sie die Ebenen Kontrollkästchen und klicken Sie danach den Aktualisieren Button. Die Ursprungsebenen des Marker Bauteils werden dargestellt.

4. Plazieren Sie einen Haltepunkt an einigen Punkten im Programm, und durchlaufen Sie dann das Programm mit der F8 Taste. Untersuchen Sie dabei Objekte und Variablen im Überwachungs- und Lokalen Fenster.

5. Weisen Sie einigen Baugruppen Bauteilen andere Materialien zu. Verifizieren Sie die Veränderung des Massenschwerpunkts der Baugruppe und das Verschieben des Marker Bauteils.

Zusammenfassung

Mit Autodesk Inventor VBA Makros können Sie von einfachen bis zu komplexen Funktionen alles gestalten. Wir hoffen daß diese Tutorials Ihnen den Einstieg in das Anpassen der Autodesk Inventor Software eröffnet haben. Wenn Sie einmal mit den Basistechniken und Objekten der Autodesk Inventor API vertraut geworden sind, ist es viel einfacher, sich mit den vielfältigen Objektmodellen zurecht zu finden.

Laden Sie das COG_Done.zip (47 KB) herunter um zusätzliche Prozeduren für das Programm zu erhalten. Die txtScale_KeyPress Prozedur enthält Code um Tastatureingaben des Anwenders filtern zu können. Den Code dieses Kapitels finden Sie in COG_C.zip (33 KB).

© Copyright 2002 Autodesk, Inc. Alle Rechte vorbehalten.