Teil 4 verpasst? Dann geht es hier weiter!
Im vierten Teil haben wir uns mit dem Border-Objekt in einer Zeichnung beschäftigt. Heute soll es um Komponenten in der Baugruppe gehen. Im einfachsten Fall besteht eine Baugruppe aus Bauteile und/oder Unterbaugruppen. Es gibt eine "Besonderheit" die noch wichtig sein wird: In einer Baugruppe können unterschiedliche Dateien verbaut sein, aber auch mehrere gleiche Bauteile. In dieser IAM ist 3 mal die gleiche IPT verbaut.
Wenn es um die Struktur einer Baugruppe geht, muss man die enthaltenen Dateien von den Komponentenvorkommen unterscheiden. Die Baugruppe enthält eine Datei (Die RAM.ipt) aber 3 Komponentenvorkommen der RAM. Das sind 2 unterschiedliche Paar Schuhe wenn es um die Programmierung geht. Möchte ich wissen, welche Dateien in meiner IAM verbaut sind, beziehe ich mich auf die enthaltenen Dateien. Wenn ich wissen will, wie oft ein bestimmtes Bauteil verbaut ist, dann sind die sog. ComponentOccurrences interessant.
Wir wollen heute mit den Enthaltenen Dateien in der Baugruppe etwas anstellen, uns interessiert also nicht, wie oft eine Komponente in der IAM enthalten ist, sondern nur welche Dateien in der IAM stecken.
Los geht es wie immer mit den Start des VBA-Editors (ALT+F11) und dem laden unseres VBA-Projekts. Dann machen wir eine neue Sub namens Baugruppe. Wie letztes mal schon als Public Sub.
Darin definieren wir eine Variable vom Typ AssemblyDocument und befüllen die Variable mit dem aktuellen Dokument in Inventor. Noch ein Haltepunkt (F9) bei End Sub setzen und schon kann die wilde Fahrt los gehen.
In Inventor muss natürlich eine IAM auf sein (Bitte eine kleine IAM nehmen mit max 20 Bauteilen!), sonst bekommen wir beim Start eine Fehlermeldung. Warum weiß der, der den letzten Beitrag gelesen hat :)
Nach dem Start können wir uns im Locals-Fenster beim Halt bei End Sub das oDoc-Objekt anschauen:
oDoc (=die gesamte Baugruppe) hat in sich Eintrag AllReferencedDocuments und weiter unten ReferenceDocuments. Der Unterschied: AllReferencedDocuments = ALLE enthaltenen Dateien auch in allen Unterbaugruppen. ReferenceDocuments = Nur die direkt in der aktuellen IAM enthaltenen Dateien, also die Komponenten der ersten Ebene. Wenn man hinten bei Type schaut, sieht man, das das Unterobjekt AllreferencedDocuments von TypDocumentsEnumerator ist.
Wollen wir auf dieser Objekt zugreifen, legen wir am besten ein Variable diesen Typs an und befüllen sie mit AllReferencedDocuments aus dem aktuellen Document.
Das Objekt oRefDocs enthält eine "Liste" von Items, wobei jedes Item für eine Datei steht, die in der IAM enthalten ist. Hinten bei Typ sieht man, das alle vom Typ "PartDocument" sind, als es sind nur Bauteile, keine Unterbaugruppen. Zudem sehen wir noch die Eigenschaft Count, die die Anzahl anzeigt. in der IAM sind also 15 verschiedene Dateien enthalten. Diese können u.U. öfter verbaut sein. Das erklärt auch die Zahlen unten rechts im Inventorfenster. Es sind 16 Datei geöffnet (Die eine IAM + alle 15 enthaltene Dateien) und 22 Komponenten sind in der IAM enthalten, weil mache Datei en(z.B. die Schrauben) mehrfach verbaut sind.
Jetzt wollen wir durch die Liste der Items gehen und uns die Dateipfade ausgeben lassen. Dafür nutzen wir die For Each Schleifen, was soviel heißt wie "Für jedes "Ding" innerhalb des "Haufen" mache was". Wir gehen also durch die Liste der Item uns machen etwas mit den Item. Jedes item ist ja auch wieder ein Objekt und zwar i.d.R. ein Bauteil oder eine Baugruppe also allgemein vom Typ Document, also definieren wir eine neue Variable die das jeweilige Item enthält und durchlaufen dann die Liste der Items. Der Codeblock sieht wie folgt aus:
Dim oRefDoc As Document
For Each oRefDoc In oRefDocs
Debug.Print oRefDoc.FullFileName
Next
Wir erstellen ein Objekt namens oRefDoc (enthält später ein EINZELNES referenziertes Document, während oRefDocs von weiter oben ALLE referenzierte Dateien der IAM enthält!!). Dann gehen wir durch die Item-Liste im Objekt oRefDocs und weisen dabei bei jedem Durchgang je ein Item des Objekt oRefDoc zu. die Variable oRefDoc enthält also Item 1, dann Item 2 usw. wir wollen den Dateipfad des aktuellen oRefdoc ausgeben und zwar in einem Fenster im VBA-Editor. Dazu nutzen wir Debug.Print wie oben zu sehen. Next springt nach oben und weißt oRefDoc das nächste item zu. Um die Ausgabe von Debug.Print zu sehen, müssen wir das Immediate-Fenster öffnen (View > Immediate Window). Wenn wir das Programm starten, werden über die For Each Schleife alle items durchlaufen und für jedes Item wird die Eigenschaft FullFilename (=Dateipfad) ausgegeben wie unten im Bild zu sehen.
Jetzt ist das schon ein hammergutes Programm :), aber so wirklich den Riesennutzen hat es noch nicht. Wir wollen was wirklich nützliches machen: Wir wollen für jede Datei schauen, ob es eine Zeichnung gleichen Namens gibt und wenn ja diese öffnen, als PDF speichern und wieder die Zeichnung schließen. Was müssen wir alles machen?
- Wir müssen den FullfileName so "ändern", das die Endung .idw oder dwg (je nachdem was du nutzt) ist
- wir müssen schauen ob die Zeichnungsdatei mit diesem Pfad überhaupt existiert
- Wenn ja, dann Zeichnung öffnen
- als PDF speichern
- Zeichnung schließen
- weiter mit nächster Datei
Es gibt noch ein Problem: Beim Öffnen der Zeichnung kann es vorkommen, das Inventor eine Dialogbox bringt, ob er irgendwas aktualisieren soll o.ä. Man kann dem Inventor sagen, das er möglichst keine Meldungen ausgeben soll über ThisApplication.SilentOperation = True. Am Ende des Programms muss die Silentoperation wieder auf False gesetzt werden.
Ich habe dieses mal die Beschreibungen als Kommentare in den Programmcode geschrieben:
Das Beispiel, dass wir heute gemacht haben, ist etwas umfangreicher als bisher und ich weiß, das ich euch viel zugemutet habe, aber es ist auch schon durchaus brauchbar für den Alltag. Was noch fehlt, ist das komplette Errorhandling, also das Abfangen von Fehler. Wenn ihr weiter dabei sein wollt, ist es wichtig, wirklich zu verstehen, was jede Programmzeile bedeutet und für was sie gut ist. Bitte nimm dir die Zeit, zu verstehen, was da Zeile für Zeile passiert, sonst wirst du ab heute raus sein! Ab jetzt geht es richtig ab :)
Hier der Programmcode als Text, für den, der zu Faul zum Tippen ist und als Download.
Public Sub Baugruppe()
'Ruhe im Pu** :)
ThisApplication.SilentOperation = True
Dim oDoc As AssemblyDocument
Set oDoc = ThisApplication.ActiveDocument
Dim oRefDocs As DocumentsEnumerator
Set oRefDocs = oDoc.AllReferencedDocuments
Dim oRefDoc As Document
'Var. die den Pfad zur Zeichnung enthält
Dim Zeichnungpfad As String
'Var die die die zu öffnende Zeichnung enthält
Dim oZeichDoc As Document
For Each oRefDoc In oRefDocs
'Wir berücksichtigen nur Zeichnungen, die im gleichen Pfad sind wie die zugehörige Modelldatei
'wir schreiben also den Fullfilename abzüglich der letzten 4 Zeichen
'(also ohne Dateiendung wie .ipt oder .iam) in die Var Zeichnungpfad
'Left heißt schneide den Linken Teil ab und über Len wir die Länge eines Strings ermittelt.
'Left (Hallo,2) würde Ha ergeben.
Zeichnungpfad = Left(oRefDoc.FullFileName, (Len(oRefDoc.FullFileName) - 4))
'Wir machen ein FileSystemobject um zu prüfen, ob die Zeichnung überhaupt als Datei auf der Festplatte existiert.
'Wie kommt man auf sowas? Man googelt z.B. nach "VBA prüfen ob Datei existiert" oder sowas :)
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
'Mit dem FileSystemobject und dessen Funktion FileExists prüfen wir, ob die Datei deren Pfad sich aus
'der Var Zeichnungpfad und der Dateiendung .dwg (ODER IDW, WENN IHR IDW NUTZT. ENTSPRECHEND ANPASSEN!)
If objFso.FileExists(Zeichnungpfad & ".dwg") Then
'Die Datei existiert wnen wir hier laden und wir ändern den Inhalt der Var Zeichnungpfad indem wir
'die Endung ergänzen.
'Das ist nicht zwingend notwendig, aber so sparen wir uns das andauerende Anhängen von & ".dwg"
Zeichnungpfad = Zeichnungpfad & ".dwg"
'Jetzt öffnen wir die Zeichnung und weißen die geöffnete Datei dem Objekt oZeichDoc zu.
'Ich denke, der Ausdruck ist soweit klar. Das True am Ende besagt, das die Datei sichtbar geöffnet wird.
Set oZeichDoc = ThisApplication.Documents.Open(Zeichnungpfad, True)
'das hatten wir schon. Wir machen Kopie speichern unter mit der Zeichnung.
Call oZeichDoc.SaveAs(oZeichDoc.FullFileName & ".pdf", True)
'Jetzt die Zeichnung speichern und schließen
Call oZeichDoc.Close(False)
End If
Next
'Inventor darf wieder Dialoge anzeigen
ThisApplication.SilentOperation = False
End Sub
Super! Weiter so :)
AntwortenLöschenMach gerade alle deine Guides durch und das wir immer interessanter.
AntwortenLöschenGleich mal ein wenig Errorhandling rein gepackt :D
Ich finde deine Anleitung sehr gut:) Die Beiträge sind für Anfänger gut verständlich.
AntwortenLöschenMach weiter so!!