Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  VBA Inventor: Index des angewählten Bauteils

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Bigles an!   Senden Sie eine Private Message an Bigles  Schreiben Sie einen Gästebucheintrag für Bigles

Beiträge: 26
Registriert: 09.03.2012

erstellt am: 04. Sep. 2012 11:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 04. Sep. 2012 14:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bigles 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Bigles an!   Senden Sie eine Private Message an Bigles  Schreiben Sie einen Gästebucheintrag für Bigles

Beiträge: 26
Registriert: 09.03.2012

erstellt am: 04. Sep. 2012 16:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 05. Sep. 2012 00:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bigles 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Bigles an!   Senden Sie eine Private Message an Bigles  Schreiben Sie einen Gästebucheintrag für Bigles

Beiträge: 26
Registriert: 09.03.2012

erstellt am: 05. Sep. 2012 14:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 05. Sep. 2012 22:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bigles 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von bwr an!   Senden Sie eine Private Message an bwr  Schreiben Sie einen Gästebucheintrag für bwr

Beiträge: 129
Registriert: 21.02.2007

erstellt am: 06. Sep. 2012 07:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bigles 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Bigles an!   Senden Sie eine Private Message an Bigles  Schreiben Sie einen Gästebucheintrag für Bigles

Beiträge: 26
Registriert: 09.03.2012

erstellt am: 06. Sep. 2012 10:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von bwr an!   Senden Sie eine Private Message an bwr  Schreiben Sie einen Gästebucheintrag für bwr

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bigles 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Bigles an!   Senden Sie eine Private Message an Bigles  Schreiben Sie einen Gästebucheintrag für Bigles

Beiträge: 26
Registriert: 09.03.2012

erstellt am: 06. Sep. 2012 15:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Bigles an!   Senden Sie eine Private Message an Bigles  Schreiben Sie einen Gästebucheintrag für Bigles

Beiträge: 26
Registriert: 09.03.2012

erstellt am: 06. Sep. 2012 18:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

YEEEEEEEEEEEEEES!!!!!!!!!!!!!! Ich habs hingekriegt!!  War zwar jetzt fast 6h daran.. aber immerhin habe ich jetzt mehr oder weniger verstanden wie das geht mit den ReferencedKeys! 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz