| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VBA Inventor: Index des angewählten Bauteils (3051 mal gelesen)
|
Bigles Mitglied Student, Technischer Zeichner
Beiträge: 26 Registriert: 09.03.2012
|
erstellt am: 04. Sep. 2012 11:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen Mit Item(x) kann man ja die verschiedenen Bauteile eines Assembly ansprechen. Kann mir jemand erklären wie ich den Index eines selektierten Bauteils herausfinden kann. Mit Index meine ich die Zahl in der Klammer: Item("Zahl"). Besten Dank
[Diese Nachricht wurde von Bigles am 04. Sep. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 04. Sep. 2012 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für Bigles
Hallo Der Index entspricht in der Regel der Reihenfolge in der die Bauteile in die Baugruppe eingefügt wurden, kann aber durch Umsortieren der Reihenfolge im Teilebrowser eventuell verändert werden. Da sich das keiner auf Dauer merken kann/will, kommt man so nicht weiter. Du kannst in einer Schleife durch alle Bauteiloccurrences laufen und jedes Mal vergleichen ob es das gleiche wie das selektierte Bauteil ist. Zählstt du dabei parallel einen Intergerwert bei jedem Durchlauf eins hoch, hast du den Index. Warum willst du den Index haben? Vielleicht gibt es eine Alternative. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bigles Mitglied Student, Technischer Zeichner
Beiträge: 26 Registriert: 09.03.2012
|
erstellt am: 04. Sep. 2012 16:06 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die schnelle Antwort! Ich versuche gerade ein Makro zu schreiben das gleich wie das Kwiksert Inserttool funktioniert (ich denke das kennst du). Ich möchte dann einige Dinge daran abändern. Ich habe erst heute begonnen und stosse leider schon bei verschiedenen Dingen auf Probleme. Hier mal mein Code von dem ich ausgehe. Er setzt einen Insertconstraint wenn zwei Kanten selektiert sind: Public Sub InsertConstraint() Dim oAsmCompDef As AssemblyComponentDefinition Set oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition Dim oSelectSet As SelectSet Set oSelectSet = ThisApplication.ActiveDocument.SelectSet If oSelectSet.Count <> 2 Then MsgBox("...") Exit Sub End If If Not TypeOf oSelectSet.Item(1) Is Edge Or Not TypeOf oSelectSet.Item(2) Is Edge Then MsgBox("...") Exit Sub End If Dim oEdge1 As Edge Dim oEdge2 As Edge Set oEdge1 = oSelectSet.Item(1) Set oEdge2 = oSelectSet.Item(2) Dim oInsert As InsertConstraint Set oInsert = oAsmCompDef.Constraints.AddInsertConstraint(oEdge1, oEdge2, True, 0) End Sub Das funktioniert problemlos. Ich möchte nun gleich wie bei Kwiksert auf meiner Userform auf einen Button "1 Kante" klicken können, dann die erste Kante anwählen, dann auf dem Button "2 Kante" und von da an nacheinander alle Lochkanten anwählen, wobei dann gleich das Bauteil eingefügt und die Insertconstraint gesetzt wird. Wo ich nicht weiterkomme ist: Wie kann ich auf meine Button klicken und danach auf die Kante und die ausgewählte Kante wird als "Edge" in einer Variabel gespeichert? (das wollte ich über den in der 1. Frage erwähnten Index versuchen). lg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 05. Sep. 2012 00:25 <-- editieren / zitieren --> Unities abgeben: Nur für Bigles
Hallo Zum Selektieren einzelner Elemente bietet Inventor mittlerweile die Pickmethode. Füge deinem Button 1 Kante folgenden Code hinzu: Code: Private Sub Kante1_Click() Dim oEdge1 As Object Set oEdge1 = ThisApplication.CommandManager.Pick(kPartEdgeCircularFilter, "Kante wählen") End Sub
Nach einem Klick auf den Button wechselt der Cursor und ein Filter der nur kreisförmige Kanten zuläßt ist aktiv. Selektierst du eine Kante, wird sie in Variable oEdge1 gespeichert. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bigles Mitglied Student, Technischer Zeichner
Beiträge: 26 Registriert: 09.03.2012
|
erstellt am: 05. Sep. 2012 14:49 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Hilfe! Ich habe das in der Zwischenzeit mit der clsSelect-Klasse (die ich im Internet gefunden) habe hingekriegt. Dort kann man auch eine in der Klasse integrierte pick-Funktion ansprechen. Sonst läuft es jedoch eher etwas frustrierend. Ich habe schon ziemlich viel VBA in Excel programmiert doch in Inventor verstehe ich das mit der Objektstruktur nicht wirklich.. z.B. bleibe ich hier stehen: Ich möchte ein Bauteil selektieren und es sollte mir in eine Variabe den Dateipfad dieses Bauteils speichern (damit ich anhand des Dateipfades das gleiche Bauteil wieder einfügen kann). Und was ich auch nicht hinkriege: Ich möchte am neu eingefügten Bauteil die gleiche Kante selektieren wie das beim ersten Bauteil manuell gemacht wurde. (zur Verständlichkeit: Ich füge ja zb eine Schraube in mein Assembly ein, klicke auf die Schraube und sie wird selektiert -> der Dateipfad wird gespeichert (siehe vorhergehende Frage), 2. ich klicke auf eine Lochkante -> constraint wird gesetzt (das hab ich soweit), 3. nun wird ein neues Bauteil automatisch eingefügt anhand des im 1. Schritt ermittelten Pfades (das kann ich), nun wird an der neu eingefügten Schraube die gleiche Kante selektiert wie das beim aller ersten mal gemacht wurde (-> diesen Schritt meine ich)) Entschuldigung für die vielen Fragen. Ich wollte das eigenlich so selbständig wie möglich machen, aber diese Objektstruktur ist für mich momentan noch ein Buch mit sieben Siegeln, genauso wie die Programmierhilfe von Autodesk... Danke nochmals für die Hilfe!! [Diese Nachricht wurde von Bigles am 05. Sep. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 05. Sep. 2012 22:00 <-- editieren / zitieren --> Unities abgeben: Nur für Bigles
Hallo Wenn du das Bauteil in einer Variablen (z.B. oDoc) gespeichert hast, findest du den vollständigen Pfad in oDoc.FullDocumentName oder oDoc.FullFileName als String. Die Objektstruktur gibt es als Übersichtsdiagramm. Mit dem Selektieren der Kante kann ich grad auch nicht helfen. Es gibt zwar eine AssoziativeID, aber ob man die dafür nutzen kann? ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bwr Mitglied Konstrukteur
Beiträge: 129 Registriert: 21.02.2007
|
erstellt am: 06. Sep. 2012 07:37 <-- editieren / zitieren --> Unities abgeben: Nur für Bigles
Zur Frage 2 mußt du mit ReferenceKeys arbeiten damit du beim neu eingefügten Bauteil die gleiche Kante wieder auswählen kannst. Anbei das Beispiel aus der Hilfe: Code:
"Reference keys." This sample demonstrates the concept of reference keys. Reference keys are persistent identifiers for Inventor objects. Select a face and run the ReferenceKeyFromFace() sub. This will get the reference key for the face and store it in the global RefKey variable. Then run the FaceFromReferenceKey() sub. This will use the global variable to retrieve the face and select it. ' Global variables to hold the reference key and key context values Private RefKey() As Byte Private ContextData() As Byte Public Sub ReferenceKeyFromFace() 'Set a reference to the active document Dim oDoc As Document Set oDoc = ThisApplication.ActiveDocument ' Check to make sure a single face is in the select set. If oDoc.SelectSet.Count 1 _ Or Not Typeof oDoc.SelectSet.Item(1) Is Face Then MsgBox "A single face must be selected." Exit Sub End If ' Get the Face from the select set. Dim oFace As Face Set oFace = oDoc.SelectSet.Item(1) ' Clear the select set oDoc.SelectSet.Clear ' Create a key context (required to obtain ref keys for BRep entities) Dim KeyContext As Long KeyContext = oDoc.ReferenceKeyManager.CreateKeyContext ' Get a reference key for the face Call oFace.GetReferenceKey(RefKey, KeyContext) ' Save KeyContext as a byte array for future use Call oDoc.ReferenceKeyManager.SaveContextToArray(KeyContext, ContextData) End Sub Public Sub FaceFromReferenceKey() 'Set a reference to the active document Dim oDoc As Document Set oDoc = ThisApplication.ActiveDocument ' Retrieve ContextKey from byte array Dim KeyContext As Long KeyContext = oDoc.ReferenceKeyManager.LoadContextFromArray(ContextData) ' Bind reference key to the Face object Dim oFace As Face Set oFace = oDoc.ReferenceKeyManager.BindKeyToObject(RefKey, KeyContext) ' Select the face oDoc.SelectSet.Select oFace End Sub
Es wird sogar noch konplizierter: Die gewählte Kante in deiner Baugruppe ist noch gar nicht die richtige Kante, sondern nur ein EdgeProxy von der man erst mit der NativeObject-Eigenschaft die eigentliche Kante des Bauteils schließen kann und dann von dieser Bauteilkante den ReferenzKey ermitteln muß. Anschließend wird eine weitere Instanz deines Bauteils eingefügt und die Kante anhand der ReferenzKeys wieder erkannt. Dann muß von dieser Kante erst wieder ein Proxy erstellt werden, damit diese in der Baugruppe plaziert werden kann. Die Sache ist nicht so trivial wie sie am Anfang scheien mag... Viel Erfolg Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bigles Mitglied Student, Technischer Zeichner
Beiträge: 26 Registriert: 09.03.2012
|
erstellt am: 06. Sep. 2012 10:52 <-- editieren / zitieren --> Unities abgeben:
Heey! Super, ihr habt mir sehr geholfen! @rkauskh: Genau, so eine Objektstrukturauflistung habe ich gesucht! Konnte das Problem mit fullfilename lösen. Danke!! @bwr: Tönt gut mit diesem Referencekey. Kannte das noch nicht. Habe ich das richtig verstanden, dass mit dem Erstellen eines Referencekeys einen Code, der auf eine Ecke, Fläche, ect. verweist, erstllt wird, mit welchem man zu einem späteren Zeitpunkt im Programm die codierte Fläche/Ecke/xy wieder aufrufen kann? Was ich aber nicht verstanden habe ist, wie ich diesen Code auf die Fläche von einem anderen Bauteil kommen kann. Ich denke das ist das was du mir mit native object erklären wolltest. Habe ich aber irgendwie nicht verstanden. Hast du vllt ein Codebsp dazu damit ich das verstehen kann? Danke lg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bwr Mitglied Konstrukteur
Beiträge: 129 Registriert: 21.02.2007 Win10 64-bit NVIDIA T500 Inventor 2022 Catia V5-6R2020
|
erstellt am: 06. Sep. 2012 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für Bigles
Ich habe von zwei verschiedenen Sachen geschrieben, zum einen von ReferenceKeys und zum anderen vom Proxies. Das sollst du nicht miteinander vermischen. Das obige Beispiel handelt ausschließlich von ReferencdKeys. NativeObject hat mit Proxies zu tun. Ich empfehle dir mal eine Lektüre, die du am besten bei Google suchst: autodesk course ID: MA42-4 Gleich das erste Suchergebnis sollte eine zip-Datei mit einem Worddokument bringen. Das bitte lesen und dann evt. weitere Fragen stellen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bigles Mitglied Student, Technischer Zeichner
Beiträge: 26 Registriert: 09.03.2012
|
erstellt am: 06. Sep. 2012 15:01 <-- editieren / zitieren --> Unities abgeben:
Danke für den Link, hab das mal durchgearbeitet und noch ein Dokument zu Proxy's. Das mit den Proxy's habe ich jetzt verstanden. Das würde bedeuten ich müsste die Kante die ich über die Pick-Methode in ein Objekt gewählt habe zuerst als NativeObjekt umwandeln und dort den ReferenceKey erzeugen. Stimmt das soweit? Komischerweise geht das nicht. Dim oNativeEdge1 As Edge Set oNativeEdge1 = oEdge1.NativeObject 'oEdge1 ist Objekt von "pick"-Methode erzeugt ' Get the key context nKeyCont = oAsmDoc.ReferenceKeyManager.CreateKeyContext 'Get the reference Key from occurrence Dim oPartRef() As Byte Call oNativeEdge1.GetReferenceKey(oPartRef, nKeyCont) '<-das erzeugt Fehler Call oEdge1.GetReferenceKey(oPartRef, nKeyCont) '<- das funktioniert Müsste es nicht gerade umgekehrt sein? [Diese Nachricht wurde von Bigles am 06. Sep. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bigles Mitglied Student, Technischer Zeichner
Beiträge: 26 Registriert: 09.03.2012
|
erstellt am: 06. Sep. 2012 18:07 <-- editieren / zitieren --> Unities abgeben:
|