Die Inventor FAQ wird unterstützt von:

Inventor FAQ Logo
Einsteigertipps Profitipps Probleme & Abstürze Themensammlungen Newsletter & Feed Alle Artikel Blog unterstützen

30.01.2017

Inventor automatisieren: Programmieren für Konstrukteure (Teil 4)

Du hast Teil 3 noch nicht gelesen? Dann hier lang!

Im dritten Teil haben wir ein Document-Objekt angelegt und mit dem aktuellen Dokument in Inventor "befüllt". Dann haben wir geschaut, ob es eine IPT, IAM oder IDW ist und entsprecht mit einer If Abfrage darauf reagiert. Wir starten wieder damit den VBA-Editor (ALT+F11) und laden unser VBA-Projekt. So sah unser Programm aus, als wir aufgehört haben:

image

Wir rufen jetzt mal die API-Hilfe des Inventor auf. Dazu in das Inventorfenster wechseln und dort unter Hilfe den entsprechenden Bereich aufrufen.

image

Dort rechts auf den Bereich Sample Programs die Struktur wie im Bild unten aufklappen. Dort seht ihr einen ähnliche Programmcode wie wir in erstellt haben (zumindest der Anfang) nur das unsere Variable Dok hieß und in dem Beispiel heißt sie oDrgDoc. Drg für Drawing und Doc für Document ist klar, aber waas soll das o? In den Beispielen von Autodesk und vielen anderen Programmierern wird der Variabelntyp mit einem vorangestellten Buchstaben beschrieben, z.B. o für Object. Das sollen helfen später einfacher Variablen über die Autovervollständigung zu erreichen und man weiß immer, was in einer Variable drin steckt. Wunder euch also nicht, wenn ihr Beispiele anschaut, warum da ein o vorne steht. Das ist einfach guter Stil an den wir uns aber nicht halten müssen :) Genauso könnte man obj für Object schreiben oder wie wir das o auch ganz weg lassen. Siehe auch https://de.wikibooks.org/wiki/VBA_in_Excel/_Namenskonventionen

image

Heute brauchen wir eine Zeichnung. Also im Inventor eine neue, leere Zeichnung erstellen. In dieser Zeichnung löschen wir den Rahmen raus indem wir in im Baum rechtsklicken.

image

Jetzt erstellen wir in unserem Module ein neues Programm aber dieses mal beginnen wir nicht mit Sub sondern mit Public Sub, wir Tippen also Public Sub Rahmen und drücken Enter. Public definiert die Prozedur als Öffentlich und sie ist somit aus anderern Modulen aufrufbar. Falls alle Beispiele beginnen mit Public...

Jetzt definieren wir wieder eine Variable aber dieses mal sind wir etwas spezifischer indem wir es als DrawingDocument definieren, weil Document kann jede Art von Dokument sein, während DrawingDocument eben spezifisch für Zeichnungen ist und spezielle Funktionen zur Verfügung stellt, die es nur in Zeichnungen gibt. Dann weißen wir dem Objekt das aktive Inventordokument zu (wie gehabt).

Dim Zeichnung As DrawingDocument
Set Zeichnung = ThisApplication.ActiveDocument

Jetzt setzen wir auf das End Sub einen Haltepunkt (F9) um das Objekt Zeichnung näher zu untersuchen. Wir haben dazu bisher eine Watch auf die Variable definiert. Jetzt machen wir das anders. Wir nutzen dazu das Locals Window (View > Locals Window) und schließen ggf. das Watchfenster. Jetzt starten wir das Programm und sollten das sehen:

image

Wir sehen das Zeichnungsobjekt und wenn wir nach unten blättern finden wir u.a. den Eintrag Sheets, was für die Blätter in der Zeichnung steht.

image

Wir wollen etwas mit dem Objekt Sheet machen. Dazu definieren wir eine Variable vom Typ Sheet um direkt darauf zugreifen zu können.

Dim Blatt As Sheet
Set Blatt = Zeichnung.ActiveSheet

Jetzt können wir das Blattobjekt bearbeiten also verschiedene Dinge mit dem ´Blatt anstellen. Was wir machen können, zeigt uns die Autovervollständigung wenn wir Blatt. schreiben. Zum Beispiel könnten wir es löschen :)

image

Es gibt auch eine Funktion AddDefaultBorder, die in das Blatt den Standardrahmen einfügt. wir tippen also Blatt. und wählen aus der Liste AddDefaultBorder.

image

So sieht unser Programm nun aus:

image

Wenn wir es starten sehen wir das der gelöschte Rahmen in der Zeichnung wieder drin ist.

Starten wir das Programm nochmals bekommen wir eine Fehlermeldung, da die Zeichnung bereits einen Rahmen enthält und somit nicht einfach ein anderer Rahmen eingefügt werden kann. Wir müssen also prüfen, ob ein Rahmen drin ist und wenn ja müssen wir diesen löschen bevor wir den Standardrahmen einfügen können.

image

Drücke auf den Knopf Debug und du siehst, welche Zeile den Fehler verursacht.

Wenn wir das Blatt-Objekt anschauen sehen wir, das das Unterobjekt Border einige Einträge hat, die eben diesen Rahmen beschreiben.

image

Bricht das Programm ab, lösche den Rahmen nochmals und erstelle einen Haltepunkt in die Zeile, in der der Rahmen eingefügt wird. Nun starte das Programm nochmals.

Wir sehen, das das Objekt Border = Nothing ist, wenn kein Rahmen in der Zeichnung ist.

image

Wir müssen also eine Abfrage machen in der wir schauen, ob das Borderobjekt = Nothing ist und darauf reagieren. ACHTUNG: Hier wird bei If kein Gleich benutzt, sondern ein Is.

If Not Blatt.Border Is Nothing Then Exit Sub

Was soviel heißt wie: Wenn das Borderobjekt innerhalb des Blattobjekts NICHT nothing ist, dann verlassen die Prozedur, weil dann ein Rahmen in der Zeichnung ist. Die Funktion AddDefaultBorder wird also nur noch ausgeführt, wenn kein Rahmen in der Zeichnung ist.

image

Jetzt machen wir ein neues Bauteil und führen das Programm wieder aus. Wir bekommen wieder eine Fehlermeldung, weil wir einer Variable Das svom Typ DrawingDocument kein Bauteil zuweisen können. Um diesen Fehler abzufangen, müssen wir am Anfang prüfen, ob das ActiveDocument vom Typ Zeichnung ist.

If ThisApplication.ActiveDocument.DocumentType <> kDrawingDocumentObject Then Exit Sub

Ich denke, die Zeile ist klar, oder?

image

Das soll es für heute gewesen sein.

Weiter zu Teil 5

Kommentare:

  1. Top Jürgen
    Wäre noch gut wenn wir die Hausaufgaben prüfen könnten, wenn welche gegeben wurden.
    sollte so heissen oder:
    If Dok.DocumentType = kAssemblyDocumentObject Then
    Call Dok.SaveAs("c:\users\public\" & Dok.DisplayName & ".dwfx", True)
    ElseIf Dok.DocumentType = kPartDocumentObject Then
    Call Dok.SaveAs("c:\users\public\" & Dok.DisplayName & ".step", True)
    ElseIf Dok.DocumentType = kDrawingDocumentObject Then
    Call Dok.SaveAs("c:\users\public\" & Dok.DisplayName & ".pdf", True)
    End If

    zumindest hat es so bei mir funktioniert

    AntwortenLöschen
    Antworten
    1. Das ist das schöne am Programmieren, man hat gleich ein Feedbaack ob das was man gemacht hat auch funktioniert ;)

      Löschen

War der Beitrag hilfreich oder hast du eine Ergänzung dazu?
Ist noch eine Frage offen?
Ich freue mich auf deine Rückmeldung!

Related Posts Plugin for WordPress, Blogger...
Inventor FAQ Newsletter. Emailadresse: