Die Inventor FAQ wird unterstützt von:

Inventor FAQ Logo

23.01.2017

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

Du hast Teil 2 noch nicht durchgearbeitet? Hier kannst du das nachholen!

Alle Beiträge der Serie

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:

image

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.

image

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.

image

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.

image

Jetzt öffnen wir eine Bauteildatei im Inventor und starten dann das Programm (F5) und klappen im Watchfenster die Variable Dok auf.

image

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.

image

So sieht es fertig aus:

image

Mit F5 starten und die Meldungsbox bestaunen, die erscheint und mit OK schließen, sonst können wir nachher nichts mehr in Editor tippen.

image

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"

image

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.

image

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.

image

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.

image

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.

image

Das Programm sieht so aus:

image

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".

image

Die Programmierhilfe des Inventors wird geöffnet und es werden Informationen zum Objekt Document angezeigt.

image

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.

image

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?

image

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:

image

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.

image

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.

image

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.

image

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.

image

Sieht richtig aus, ist aber trotzdem rot. Wenn man Methoden aufrufen will, muss man vorne ein Call stellen. So ist es also richtig:

image

Wenn wir jetzt unser Programm ausführen, wird die in das angegeben Verzeichnis eine DWF-Datei des aktuelle Modells gespeichert.

image

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 :)

image

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.

image

Der gesamte Programmblock sieht so aus:

image

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!

Weiter zu Teil 4

5 Kommentare:

  1. Ü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öschen
  2. Danke dir, wir wissen das zu schätzen, allerdings solltest du dich schonen!

    Wie 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

    AntwortenLöschen
    Antworten
    1. Bin mir nicht sicher, ob ich dich richtig verstanden habe.
      Du 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 :)

      Löschen
  3. 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
  4. @ 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.

    Meine 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.

    AntwortenLöschen

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

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.

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