Werte aus Teilereferenz per VBA auslesen / AutoCAD VBA
insidERR 13. Feb. 2020, 15:22

Hallo Leute, 
ich bastle gerade ein Makro, welches die Zeichnung nach Teilereferenzen (_ampartref) absucht und die darin enthaltenen Werte ausliest.

Bin soweit dass ich im Debugger die Werte sehen kann. Kann sie aber mit VBA nicht auslesen.
Auf dem folgendem Bild sieht man welche Werte ich suche.

So sieht mein Code aktuel aus.

Code:
Private Sub checkPositionsNummern() '05.02.2020
    On Error Resume Next
    Dim BlockCol As Collection, erLine As Single, Objekt As Object
    erLine = 0
    Set BlockCol = New Collection
   
    For Each Objekt In ThisDrawing.ModelSpace
        If TypeName(Objekt) = "IMcadPartReference3" Then BlockCol.Add Objekt
       
    Next
   
    For i = 1 To BlockCol.Count
      'hier alle gefundenen Teilereferenzen durchlaufen und die Werte "Data(1,0)" , "Data(1,1)" usw. auslesen
    Next i
End Sub

ein vergleichbares Makro für/in Inventor läuft wunderbar. Da lese ich die Objekte aber anders aus.

Hat eine/r ne Idee, wie ich die Werte "Data(1,0)" , "Data(1,1)" usw. auslesen kann? 

Danke 

KlaK 13. Feb. 2020, 18:26

Hi,

kannst Du mal eine Beispielzeichnung anhängen? Habe kein Inventor.
Evtl. müßte man auch noch Verweise setzen, dann wäre ich auch raus.
Aber prinzipiell solltest Du doch den Variant Data einem Variant zuweisen können und dann ganz normalen Zugriff auf diesen haben.

Code:

    DIM vData as Variant
    For i = 0 To BlockCol.Count-1 ' Zählung beginnt bei 0 wenn nicht Optionbase 1 gesetzt ist
      'hier alle gefundenen Teilereferenzen durchlaufen und die Werte "Data(1,0)" , "Data(1,1)" usw. auslesen
      set vData = BlockCol(i).Data
      For J = 0 to 4
        Debug.Print "Data " & J & " : ",vData(J,0), vData(J,1)
      Next J
    Next i


(ungetestet)

Alternativ:

Code:

    For each BC in BlockCol
      set vData = BC.Data
      For J = 0 to 4
        Debug.Print "Data " & J & " : ",vData(J,0), vData(J,1)
      Next J
    Next


Grüße
Klaus   

insidERR 14. Feb. 2020, 07:51

Hallo Klaus,
danke für deine Antwort.

Ich bekomme in den Zeilen "Set vData = BlockCol(1).Data" und "set vData = BC.Data" sofort die Fehlermeldung "Laufzeitfehler 13: Typen unverträglich

Hier zum Verdeutlichen an welche Daten ich kommen will.

----------------

Wolltest du das passende Makro für Inventor, oder ein Bild von Inventor sehen, wo man die Positionsnummern sehen kann?

KlaK 14. Feb. 2020, 10:50

Hi,

Wie schon geschrieben, ohne Beispielzeichnung schwer nachzuvollziehen bzw. zu testen.

Grüße
Klaus 

insidERR 14. Feb. 2020, 11:14


PositionsNr.dwg

 
Hatte verstanden dass du eine Zeichnung für Inventor haben willst.
Um Inventor geht es im aktuellen Fall aber nicht, sondern AutoCAD.
Habe jetzt eine *.dwg angehängt.

KlaK 14. Feb. 2020, 11:52

Hi,

Wie schon vermutet werden die Elemente bei mir nur als Proxy angezeigt.
Da muß Dir jemand mit Mechanical helfen, sorry

Aber evtl. machst Du ja noch einmal einen Versuch mit einem Variantarray
DIM vData() as Variant

Grüße
Klaus 

insidERR 14. Feb. 2020, 12:12

Danke für deine Ideen.
Klappt leider nicht.
Bekomme die Fehlermeldung "Keine Zuweisung an Datenfeld möglich" und bei

Code:
Set vData = BlockCol(i).Data
wird vData markiert.

Hier nochma der ganze Code

Code:
Private Sub checkPositionsNummern() '05.02.2020
    'On Error Resume Next
    Dim BlockCol As Collection, erLine As Single, Objekt As Object
    Set BlockCol = New Collection
   
    For Each Objekt In ThisDrawing.ModelSpace
        If TypeName(Objekt) = "IMcadPartReference3" Then BlockCol.Add Objekt
       
    Next
   
    Dim vData() As Variant
    For i = 1 To BlockCol.Count
        'hier alle gefundenen Teilereferenzen durchlaufen und die Werte "Data(1,0)" , "Data(1,1)" usw. auslesen
        'UNFERTIG: hier sollten alle Details der "Positionsnummern" aufgelistet werden. So könnte man doppelte Einträge in Schnittzeichnungen finden.
      Set vData = BlockCol(i).Data
      For j = 0 To 4
        Debug.Print "Data " & j & " : ", vData(j, 0), vData(j, 1)
      Next j
    Next i
End Sub

Schade, vielleicht findet das hier jemand der auch Mechanical hat.