Du hast Teil 2 noch nicht durchgearbeitet? Hier kannst du das nachholen!
Im letzten Teil haben wir uns das ThisApplication Objekt angeschaut. Bevor wir weiter machen. bitte zuerst mal den VBA-Editor starten (ALT+F11) und unser Benutzerprojekt laden (wenn du nicht mehr weißt, wie das geht, dann schauen in Teil 2 nach!).
Heute erstellen wir eine Dokumentvariable und befüllen diesen um sie dann näher zu untersuchen. Wir erstellen dazu ein neues Programm mit Namen Dokument. Dazu tippen wir unterhalb des letzten Programmes Sub Dokument und dann Enter. Das ergibt:
Jetzt definieren wir eine Variable, also einen leeren "Behälter" der Inhalte aufnehmen kann. Wir haben im ersten Teil bereits eine Variable definiert mit Namen "Version" (Dim Version). Wenn wir uns eine Variable als einen Behälter oder Tasche vorstellen, die Inhalte aufnehmen kann, so gibt es verschiedenen Typen von Variablen und auch Taschen. Es gibt Reisetaschen, Sporttaschen, Koffer, Taschen für Fallschirme uvm. Jeder dieser Taschen hat andere Eigenschaften und Funktion. Eine Reisetasche hat vielleicht mehrere Fächer und lässt sich mittels Rollen und Henkel ziehen, während der Fallschirmrucksack einen Fallschirm beinhaltet (Eigenschaft) und wenn man an einer Leine zieht kommt der raus (Funktion). Und eben solche Eigenschaften und Funktionen haben Variablen (meist) auch. Wir haben im ersten Beispiel mittels Dim Version zwar eine Variable erstellt, ihr aber nicht genau gesagt, was für eine Art Variable es ist (ich wollte die Sache einfach halten). Das wollen wir jetzt ändern. Wir definieren eine Variable vom Typ Dokument, d.h. diese Variable kann ein Inventordokument enthalten mittels Dim Dok as Document. Wir haben also eine Variable (Taschen) namens Dok von Typ Document.
Bisher ist die Variable leer. Wir wollen sie befüllen und zwar mit den aktuell im Inventor aktiven Dokument. Dazu greifen wir auf das Objekt ThisApplication zurück und darin auf ActiveDocument (du erinnerst dich noch an Teil 2?). Zuweisungen funktionieren mittels Set und = also Variable namens XXX = Inhalt, der zugewiesen werden soll.
Wir tippen also Dok = ThisA - dann wie gehabt STRG+Leertaste und ThisApplication auswählen, Punkt tippen und in der Liste ActiveDocument auswählen.
Jetzt erstellen wir eine Überwachung (Watch) für die Variable Dok, indem wir sie markieren, die rechte Maustaste drücken, Add Watch... aus dem Kontextmenü wählen und den folgenden Dialog mit OK bestätigen. In der Watchliste wir die Variable ergänzt. Sollte das Watch-Fenster nicht angezeigt werden, im Menü View oben den Eintrag Watch Window wählen. Dann den Eingabencursor in die Zeile End Sub stellen und F9 drücken. Es wird ein Haltepunkt erstellt, an dem die Programmausführung pausiert wird.
Jetzt öffnen wir eine Bauteildatei im Inventor und starten dann das Programm (F5) und klappen im Watchfenster die Variable Dok auf.
Dort sehen wir alle Eigenschaften der Variable vom Typ Document, z.B. den Name, der im Baum im Inventor angezeigt wird, den DisplayName. (Info am Rande: In der Spalte "Type" ist der Typ der Eigenschaft zu sehen. Bei DisplayName ist das "String", was für Text steht).
Wir machen nun eine Meldungsbox, in der dieser Displayname angezeigt wird. Dazu schreiben wir msgbox (Dok.DisplayName), wobei auch hier nach dem tippen des Punktes die Liste zur Verfügung steht. Sollte das Programm noch laufen und am End Sub stehen (gelb hinterlegt) dann mittels F5 das Programm vollständig ausführen lassen. Es greifen wir die gleichen Funktionen wie bisher auch, also z.B. nach dem Punkt hinter Dok kommt die Liste mit den Eigenschaften.
So sieht es fertig aus:
Mit F5 starten und die Meldungsbox bestaunen, die erscheint und mit OK schließen, sonst können wir nachher nichts mehr in Editor tippen.
Jetzt machen wir was total verrücktes, wir ändern den Displayname :) Dazu müssen wir der Eigenschaft Displayname einen neuen Text zuweisen. Das sieht dann so aus: Dok.DisplayName = "Ich heiße jetzt anders"
Den Haltepunkt bei End Sub können wir entfernen in dem wir den Cursor in die Zeile stellen und F9 drücken. Die rote Hinterlegung verschwindet. Jetzt starten wir das Programm wieder, bestätigen die Meldungsbox und schauen mal oben in den Browserbaum im Inventor.
Tatsächlich steht da jetzt der Text, den wir der Eigenschaft DisplayName zugewiesen haben. Jetzt ändern wir die Programmzeile auf Dok.DisplayName = "" d.h. wir setzen den Displayname auf "leer" und starten das Programm wieder.
Zuerst wird der neu, beim letzten Programmlauf geänderte Displayname anzeigt bevor er wieder geändert wird, dieses mal eben auf "". Wenn wir in den Bau schauen, sehen wir, das der Inventor den Displayname wieder gleich dem Dateinamen gesetzt hat.
wir wollen die beiden Zeilen Msgbox... und Dok.DisplayName nicht mehr ausführen ohne sie aber zu löschen, d.h. wir kommentieren sie aus in dem wir ein ' an den Anfang der Zeile setzen.
WICHTIG: Kommentare sind in Programm sehr wichtig, wenn die Programme länger werden, weil man dort Hinweise schreiben kann, warum man was im Programm macht!
Bisher haben wir auf Eigenschaften zugegriffen. Jetzt wollen wir uns Funktionen des Objekts "Document" anschauen. Dazu schreiben in eine neue Zeile Dok. und schon kommt wieder die Liste mit den Eigenschaften. Tippen wir nun sa um zu den Einträgen zu springen, die mit sa beginnen, finden wir einen Eintrag Save, der ein grünes Symbol vorne hat. Die Einträge mit den grünen Symbolen nennt man Methoden, während die mit der kleinen Hand die bereits bekannten Eigenschaften sind. Methoden sind also "Funktionen" die etwas mit dem Objekt machen, es z.B. speichern.
Das Programm sieht so aus:
Wird es gestartet, wird das aktuelle Inventordokument gespeichert, so wie wenn wir auf den Speichernknopf klicken würden. Schauen wir uns an, welche Eigenschaften und Methoden so ein Dokumentobjekt hat. Dazu stellen wir den Eingabecursor auf das Wort Document oben in der Zeile "Dim Dok as Document" und drücken F1. Sollte diese Box erscheinen, wählen wir den ersten Eintrag und drücken auf den Knopf "Help".
Die Programmierhilfe des Inventors wird geöffnet und es werden Informationen zum Objekt Document angezeigt.
Wir sehen eine Liste mit "Methods" das sind die "Funktionen" oder wie es richtig heißt Methoden, die ein Objekt hat und weiter unten die Properties (Eigenschaften). Leider gibt es diese Hilfe nicht auf Deutsch, aber Englisch können wir ja alle, oder :)
Hinter jedem Eintrag in der Tabelle ist eine Beschreibung zu finden. Klickt man auf den blauen Begriff wird eine detailierte Hilfeseite dazu geöffnet.
Ist jemand aufgefallen, das es die Methoden Save, Save2 und Saveas gibt? Save und Saveas sind denke ich klar (Speichern und Speichern unter) aber save2? Was steht in der Hilfe?
Save2 speichern also nicht nur das aktuelle Dokument sondern auch abhängige Dokumente. Bei einer Baugruppe also auch Komponenten in der Baugruppe.
Schauen wir uns Saveas in der Hilfe an:
Wenn wir unter Syntax schauen, sehen wir, das Savas noch weitere Angaben braucht. Zum einen ist das der Dateiname (Klar, speichern unter in Inventor aufgerufen fragt ja auch einen neuen Dateinamen ab). Zudem muss die Frage beantwortet werden, ob es sich um Speichern unter oder Kopie Speichern unter handelt, das sind (wie hoffentlich bekannt) in Inventor 2 unterschiedliche Funktionen.
Will man aus einer IPT eine STEP Datei machen, nutzt man Kopie speichern unter. Zudem bleibt bei Kopie speichern unter das aktuelle Dokument geöffnet.
Wir wollen nun unser Bauteil als DWF-Datei abspeichern. Dazu müssen wir vorher einen Ordner suchen, in den wir Schreibrechte haben. Dafür müssen wir einen gemeinsamen Nennern finden, der bei euch allen, egal welche Rechte ihr unter Windows habt, funktioniert. Wir nehmen c:\users\public was c > Benutzer > Öffentlich entspricht.
Um eine DWF zu speichern brauchen wir die Funktion Kopie speichern unter!
Wir schreiben also: Dok.save2 ( und wieder bekommen wir einen Hilfe, welche Argumente wir zusätzlich angeben müssen.
Nach der Klammer muss also der Dateiname inkl. Pfad kommen (das ist ein Text als hat die Angabe den Typ "String") dann ein Komma und dann die Angabe ob Speichern unter oder Kopie speichern unter und zwar als boolsche Angabe, d.h. es gibt wahr oder falsch (True oder False).
Als kleines Schmankerl soll bei der Pfadangabe der Pfad zwar fix sein (c:\users\public) der Dateiname soll aber dem Displayname entsprechen zzgl. der Endung dwfx. Wir müssen den Pfad also aus einem fixen Text und einer Eigenschaft des Dokuments zusammensetzen, bzw. aus 2 Strings (auch DisplayName ist vom Typ String siehe oben!). Das macht man mit dem &. Der String sieht also wie folgt aus:
"c:\users\public\" & Dok.DisplayName & ".dwfx"
Nach dieser Eingabe tippen wir ein Komma und schon fragt der Inventor ab, ob die zweite Angabe True oder False ist. Wir wollen KOPIE speichern unter (nur da kann man DWFX erstellen!) also TRUE. So sieht die Zeile aus.
Sieht richtig aus, ist aber trotzdem rot. Wenn man Methoden aufrufen will, muss man vorne ein Call stellen. So ist es also richtig:
Wenn wir jetzt unser Programm ausführen, wird die in das angegeben Verzeichnis eine DWF-Datei des aktuelle Modells gespeichert.
Jetzt haben wir ein Programm, das beim Ausführen vom aktuellen Dokument eine DWFX-Datei erstellt. Wir wollen das etwas verändern. Ist die Datei eine IPT oder IAM wollen wir eine DWF-Datei bei einer IDW aber eine PDF. Dazu brauchen wir was in der Form: Wenn Dateityp IPT oder IAM ist, dann Speichern unter als DWF sonst speichern als PDF.
Rufen wir nochmals die Hilfe zum Objekt Document auf und schauen in die Eigenschaften. Dort gibt es eine Eigenschaft DocumentType, welch Glück :)
Der Typ dieser Eigenschaft ist nicht etwa String (Text) sondern DocumentTypeEnum. Klicken wir darauf sehen wir welche Typen es gibt. Wir müssen also abhängig vom Typ unterschiedliche Befehle ausführen, also was mit Wenn > Dann > Sonst oder in der Programmsprache IF ... THEN ... ELSE ... END IF
Wieder erscheint nach dem = eine Auswahl gleich was DocumentType alles sein kann.
Der gesamte Programmblock sieht so aus:
Ich habe die Befehle (Call ...) innerhalb der Wenn - Dann - Sonst Struktur eingerückt. Das verbessert die Lesbarkeit des Programmcodes ungemein! Einfach Erst die TAB-Taste drücken und dann lostippen! Nochmals der Block in unserer Sprache:
WENN Dokumenttyp = IAM ODER Dokumenttyp = IPT DANN
RUFE AUF Methode ....
SONST
RUFE AUF Methode ....
ENDE WENN
Das soll es bis hier gewesen sein! Hausaufgabe bis zum nächsten mal: Schreibe ein Programm das bei einer IPT eine STP erstellt, bei einer IAM eine DWFX und bei einer IDW eine PDF. (Kleiner Tipp: Es geht auch IF ..... THEN ...... in einer Zeile ohne Else und End if) Rufe dazu auch mal die Hilfe zum Befehl if auf!
Übrigens, den Beitrag habe ich heute morgen während meiner Chemotherapie/Immuntherapie im Krankenhaus für euch geschrieben. Da ist ein paar Stunden Zeit :)
AntwortenLöschenDanke dir, wir wissen das zu schätzen, allerdings solltest du dich schonen!
AntwortenLöschenWie wurde denn eigentlich jetzt die letzte Hausaufgabe abgefragt? :D
Ps. Ich hab mich mehr als nur 30 minuten mit dem Watcher beschäftigt. Komme soweit auch klar.
Allerdings benötige ich noch ein Schubser von dir, wie man am schnellsten von unterobjekten einer baugruppe in die eigentliche Main Baugruppe kommt. Ich habe gesehen das bei jedem OBjekt ein Parent (Elternobjekt) und ein Application objekt vorhanden ist. Allerdings ist meine Frage Angenommen ich lasse eine Schleife durch eine Baugruppe rennen, diese schleife soll bei jedem Bauteil prüfen ob ein bestimmtes Iprop = ABC text enthält. Ist dies der Fall soll in der main baugruppe die Itemnumber geändert werden. Prinzipiell bekomme ich das schon hin. Allerdings verwende ich als Jumper den internalname der ipt, die ich dann wieder in der Main Baugruppe suche bei den items um dort die Itemnumber zu ändern. Gibt es noch einen schnelleren Weg? Das ganze geht hier aber zu weit. VIelleicht magst du mich einfach über meinen Googleaccount kontaktieren.
Danke und Grüßle
Bin mir nicht sicher, ob ich dich richtig verstanden habe.
LöschenDu möchtest alle Bauteile einer Baugruppe durchlaufen und wenn auch nur eines aller verbauten Bauteile einen bestimmten Wert in einem Property enthält, dann soll in der Hauptbraugruppe eine Property verändert werden?
Der Code dazu könnte eventuell so aussehen:
__________________________________________________________________________________________________
Public Sub SubPartCheck()
Dim oAssDoc As Inventor.AssemblyDocument
Set oAssDoc = ThisApplication.ActiveDocument
Dim oOcc As Inventor.ObjectCollection
Set oOcc = ThisApplication.TransientObjects.CreateObjectCollection
Dim oPartOcc As Inventor.ComponentOccurrence
For Each oPartOcc In oAssDoc.ComponentDefinition.Occurrences
Dim oCompDef As Inventor.ComponentDefinition
Set oCompDef = oPartOcc.Definition
Dim oDefDoc As Inventor.Document
Set oDefDoc = oCompDef.Document
Dim oPropSet1 As Inventor.PropertySet
Set oPropSet1 = oDefDoc.PropertySets.Item("Design Tracking Properties")
Dim oProp1 As Inventor.Property
Set oProp1 = oPropSet1.Item("Part Number")
Dim strCheck As String
strCheck = "12345"
If CStr(oProp1.Value) = strCheck Then
oOcc.Add (oPartOcc)
End If
Next
If oOcc.Count > 0 Then
Dim oPropSet2 As Inventor.PropertySet
Set oPropSet2 = oAssDoc.PropertySets.Item("Design Tracking Properties")
Dim oProp2 As Inventor.Property
Set oProp2 = oPropSet2.Item("Part Number")
Dim strValue As String
strValue = "Neuer Wert"
oProp2.Value = strValue
End If
End Sub
__________________________________________________________________________________________________
Kannst dir das ja mal in Ruhe anschauen und vielleicht hilft es dir weiter.
BTW. Ganz großes Lob an Jürgen Wagner, überragend Hilfsbereit, obwohl er selbst schwere Zeiten durchleidet... davor habe ich aller größten Respekt. Mach weiter so :)
Für mich einfach wow.... Danke für das gute hinführen, es gehen schon einige Dinge im Kopf vor , was sich vereinfachen lässt. Auch von mir ganz großes Lob, viel Kraft alles gut durchzustehen.
AntwortenLöschen@ Marcel, deine Routine funktioniert bei mir nicht richtig. Für was ist die Objectcollection aber ich denke das is nicht das was ich suche zumindest nicht ganz.
AntwortenLöschenMeine Bedinung sollte eher so lauten, schaue in jedes Bauteil der Baugruppe, findest du in einem oder mehrere Einzelteile den Occurence.name = 14.0000032 (eigentlich ist nur das 14. entscheidend, da es eine Klassifizierung ist) Dann setze in der BOM der Der Asm für dieses Teil die Itemnumber auf V1, findest du zwei Teile dann setze V1 und V2 usw. immer V1+1 für jeden Teil das er findet.