Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Arbeiten mit Dictionaries

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
  
PNY wird von NVIDIA zum Händler des Jahres gewählt - zum dritten Mal in Folge, eine Pressemitteilung
Autor Thema:  Arbeiten mit Dictionaries (1842 mal gelesen)
GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 22. Dez. 2008 08: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

Guten Tag,
ich habe da wieder einmal ein Problem. Ich versuche innerhalb einer Zeichnung ein Dictionary zu eröffnen um darin z.B. bestimmte Punkte zu speichern

Sub ErzeugeDictionary()
    Dim d As Variant
    Dim i As Integer
    Set d = ThisDrawing.Dictionaries.Add("FußPunkte")
    MsgBox d.Name & " wurde neu erzeugt", , "Dictionary"  'geht, o.k.

    d.Add "01", "0.0,0.0,0.0"                    'Hier kommt VB-Fehlermeldung 438 "Objekt
    d.Add "02", "4.0,5.4,6.2"                    'unterstützt diese Eigenschaft oder
    d.Add "03", "3.4,2.4,3.3"                    'Methode nicht"

    'Probeausgabe (soweit bin ich aber noch nie gekommen)
    'hier sollten die drei Punkte ausgegeben werden
    For i = 0 To d.Count - 1 'Das Datenfeld wiederholen
        Debug.Print d(i)          'Schlüssel drucken
    Next
End Sub

Was mach ich falsch?
Im Voraus (für evtl. Hilfe) dankeschön
GustavZwo

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

Carsten1210
Mitglied
staatl. geprüfter Holztechniker


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

Beiträge: 1360
Registriert: 24.07.2002

erstellt am: 22. Dez. 2008 09:09    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 GustavZwo 10 Unities + Antwort hilfreich

Hallo Gustav,

Vielleicht hilft dir dies schon weiter.

Gruß, Carsten

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

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 22. Dez. 2008 09: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

Guten Tag, Carsten,

danke für die Blitzantwort. Ich habe mir die angegebene Stelle zu Gemüte geführt und mein erster Eindruck ist, das ist ein Volltreffer. Jetzt muß ich nur noch sehen, die Anregung auf mein Problem umzupfriemeln.

Wenn das so weiter geht, bin ich hoffentlich auch bald in der Lage, positive Antworten dem Forum zu bieten. Noch aber backe ich ganz kleine Brötchen und verneige mich vor den Könnern.

Nochmals danke.
GustavZwo

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

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 08. Jan. 2009 23:26    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

Guten Tag,

beim Verarbeiten der Tips blieb ich wieder hängen.
Was ich will:
ich will in einer Zeichnung eine Reihe "Textmarken" in Form eines Punktes unterbringen.
Die Textmarken sollen in einem Dictionary abgespeichert werden, Key=fortlaufende Nummer, Wert ist ein Punkt,
genauer gesagt, drei Koordinaten x,y,z, zusammengefaßt in einem Array.
Die Punkte will ich später der Reihe nach aufrufen und als Referenzpunkt z.B. eines Blockes nutzen.


1  Public Sub speicherePt()
2  Dim oDict As AcadDictionary
3  Dim oXRec As AcadXRecord
4  Dim dxfCode(2) As Variant
5  Dim dxfData(2) As ACAD_POINT

7  Set oDict = ThisDrawing.Dictionaries.Add("PtDict")
8  Set oXRec = oDict.AddXRecord("Record1")
9  For i = 0 To 3
10    dxfCode(0) = 11: dxfCode(1) = 11: dxfCode(2) = 11:
11    'dxfData = Array(2#, 4#, 6#)                            'Fehlermeldung: Keine Zuweisung an Datenfeld möglich
12    'dxfData(0) = 2#: dxfData(1) = 4#: dxfData(2) = 6#  ' 'Fehlermeldung: Laufzeitfehler ungültiges Argument
'type in SetXRecordData method
13    oXRec.SetXRecordData  dxfCode,dxfData
14  Next i
15 End Sub

Der Fehler müßte in den Zeilen 12 oder 13 stecken.
Die von der jeweiligen Zeile verursachten Fehler
stehen als Kommentar unter der Zeile.
Wo steckt dieser verflixte Fehler?
Wieso kann ich einer Variablen kein Array zuordnen?

Ein ratloser GustavZwo

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


Ex-Mitglied

erstellt am: 09. Jan. 2009 00:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,
Zitat:
Dim dxfData(2) As ACAD_POINT
...
dxfData(0) = 2#: dxfData(1) = 4#: dxfData(2) = 6#  ' 'Fehlermeldung: Laufzeitfehler ungültiges Argument
nachdem ich leider nicht erkenne, wie Du die Struktur (oder Klassendefinition) von 'ACAD_POINT' definiert hast, kann ich Dir hier nicht helfen, die bräuchte ich schon.

Wenn Du nur die Koordinaten des Punktes speichern willst, dann wäre das möglich:

Code:
Dim dxfData(2) As Double
....
dxfData(0) = 2#: dxfData(1) = 4#: dxfData(2) = 6#


Zitat:
Wieso kann ich einer Variablen kein Array zuordnen
kannst Du schon, aber dann muss die Variable auch dafür deklariert sein, ein Array einem Double-Wert zuweisen geht nicht. Und nicht vergessen, ein dimensioniertes Array mit einem undimensionierten zu überschreiben bringt Laufzeitfehler (zumindest mit VBA oder VB6, in dotNET gibt es dann die Casts dafür).


- alfred -

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 09. Jan. 2009 08:51    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

Guten Morgen, Alfred,
danke für Deine Nachricht.
Zum Ersten wußte ich nicht, daß ich einen  ACAD_POINT noch definieren muß,
obwohl er mir von VBA vorgeschlagen wird wie "String"  oder "Double".

Ich ging einfach davon aus, daß ein Punkt ein Punkt ist. Ich habe das gewählt, nachdem
ich weder mit Double noch mit Variant einen Erfolg erzielte.

Wenn ich die Definition in "Double" ändere und die Zeile 12 auskommentiere,
erscheint nach Zeile 13 die beschriebene Fehlermeldung

Laufzeitfehler '-2145320939(80210015)'
Ungültiges Argument in SetXRecordData method

Auch die Deklaration eines Array bring mir keinen Erfolg.

1 Public Sub speichereHKFussPt()
2   Dim oDict As AcadDictionary
3   Dim oXRec As AcadXRecord
4   Dim dxfCode(2) As Variant
5   Dim dxfData
6   Set oDict = ThisDrawing.Dictionaries.Add("HKFussPtDict")
7   Set oXRec = oDict.AddXRecord("Record1")
8   For i = 0 To 3
9     dxfData = Array(2#, 4#, 6#)                       
10     oXRec.SetXRecordData dxfCode, dxfData              ' Fehlermeldung: Laufzeitfehler ungültiges Argument
11                                                         ' type in SetXRecordData method
12   Next i
13 End Sub

Genau das war meine Frage.

Gruß GustavZwo

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


Ex-Mitglied

erstellt am: 09. Jan. 2009 10:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat


ScreenShot_XDict01.jpg

 
Hi,

was sagt Dir denn Deine Hilfe, wenn Du nach 'ACAD_POINT' suchst? Meine Hilfe kennt diesen nicht.
Auch wenn ich Deine Beschreibung leider nicht ganz verstehe (was das Ziel ist, warum Du entweder Koordinaten oder AutoCAD-Punktobjekte in XRecords ablegen willst), hier ein Beispiel, wie es funktionieren könnte, vielleicht hilfts Dir weiter (anbei aus Screenshot des Ergebnisses).

Code:
Public Sub speichereHKFussPt()
   Dim oDict As AcadDictionary
   Dim oXRec As AcadXRecord
   Dim dxfCode(2) As Integer
   Dim dxfData As Variant
   Set oDict = ThisDrawing.Dictionaries.Add("HKFussPtDict")
   Set oXRec = oDict.AddXRecord("Record2")
     
   dxfCode(0) = 1040    '1040...zu speichernder wert vom Typ DOUBLE
   dxfCode(1) = 1040    '1040...zu speichernder wert vom Typ DOUBLE
   dxfCode(2) = 1040    '1040...zu speichernder wert vom Typ DOUBLE
   dxfData = Array(2#, 4#, 6#)
  
   oXRec.SetXRecordData dxfCode, dxfData
     
End Sub

- alfred -

[Diese Nachricht wurde von a.n. am 09. Jan. 2009 editiert.]

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 10. Jan. 2009 23:04    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

Guten Tag,

Alfreds Code vom 9.1.09 trifft meine Vorstellung schon ziemlich weit. Ich bedanke mich dafür.
Was ich will, präzisiere ich hier gegenüber meiner Beschreibung vom 8.1. noch einmal:
ich möchte eine Prozedur erstellen, die bestimmte Koordinaten aufnimmt und speichert.
Diese Punkte sollen ähnlich Bookmarks funktionieren, damit ich sie später als Referenzpunkte benutzen kann.

Ich habe mit den angehefteten Screenshot angeschaut. Mir ist sowohl das linke als auch das rechte Fenster unbekannt.
Kann ich die in der Standard-IDE aufrufen oder ist das ein AddIn?

Gruß
GustavZwo

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


Ex-Mitglied

erstellt am: 10. Jan. 2009 23:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

das AddIn nennt sich 'ArxDbg.arx' und ist Bestandteil von ObjectARX-SDK (kostenlos, aber registrierungspflichtig)

Hängst Du jetzt noch beim VB oder kommst Du mit obigen Beispiel weiter? Wenn nicht, wo stehst Du an?

- alfred -

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 11. Jan. 2009 23:18    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

Guten Abend, Alfred
Danke für Deine Mühe.
Das 'ArxDbg.arx' werde ich mir besorgen, es gefällt mir. Danke auch für diesen Tip.

Mit dem VBA-Problem bin ich dank Deiner Hilfe zum Ziel gekommen. Falls jemand eine solche Routine braucht, hier ist sie. Sie ist noch etwas holprig, aber sie tut ihren Dienst.

Sub erzeugeReferenz()
    Call speichereReferenzPt(23#, 37#, 33#)
    Call speichereReferenzPt(433#, 637#, 10#)
    Call speichereReferenzPt(78#, 87#, 73#)
End Sub
'------------------------------------------------------------------

Sub speichereReferenzPt(X, Y, Z)
    Dim FPDict As AcadDictionary, FPXRecord As AcadXRecord
    Dim XRecordDataType As Variant, XRecordData As Variant
    Dim ArraySize As Long, iCount As Long
    Dim DataType As Integer, Data As Double, msg As String
    On Error GoTo CREATE
    Set FPDict = ThisDrawing.Dictionaries("ReferenzPunktDictionary")
    Set FPXRecord = FPDict.GetObject("ReferenzPunktXRecord")
    On Error GoTo 0
                            ' Aktuelle XRecordData aufnehmen
    FPXRecord.GetXRecordData XRecordDataType, XRecordData
                            ' Wenn wir noch kein Aray haben, erzeuge eines
    If VarType(XRecordDataType) And vbArray = vbArray Then
        ArraySize = UBound(XRecordDataType)          ' Größe des Daten-Arrays
        ArraySize = ArraySize + 3                        ' vergrößern f. neue Daten
        ReDim Preserve XRecordDataType(0 To ArraySize)
        ReDim Preserve XRecordData(0 To ArraySize)
    Else
        ArraySize = 0
        ReDim XRecordDataType(0 To ArraySize) As Integer
        ReDim XRecordData(0 To ArraySize) As Variant
    End If
                            ' Neue XRecord Daten anhängen
    If ArraySize > 2 Then
        XRecordDataType(ArraySize - 2) = 1040: XRecordData(ArraySize - 2) = X
        FPXRecord.SetXRecordData XRecordDataType, XRecordData
        XRecordDataType(ArraySize - 1) = 1040: XRecordData(ArraySize - 1) = Y
        FPXRecord.SetXRecordData XRecordDataType, XRecordData
        XRecordDataType(ArraySize) = 1040: XRecordData(ArraySize) = Z
        FPXRecord.SetXRecordData XRecordDataType, XRecordData
    Else
        XRecordDataType(ArraySize) = 1001: XRecordData(ArraySize) = "ReferenzPunktDictionary"
        FPXRecord.SetXRecordData XRecordDataType, XRecordData
    End If
    Exit Sub

CREATE:
                            ' Erzeuge das Dictionary, das die Daten speichert
    If FPDict Is Nothing Then
        Set FPDict = ThisDrawing.Dictionaries.Add("ReferenzPunktDictionary")
        Set FPXRecord = FPDict.AddXRecord("ReferenzPunktXRecord")
    End If
    Resume
End Sub
'------------------------------------------------------------------

Sub liesReferenzPt()
    Dim FPDict As AcadDictionary, FPXRecord As AcadXRecord
    Dim XRecordDataType As Variant, XRecordData As Variant
    Dim ArraySize As Long, iCount As Long
    Dim DataType As Integer, Data As Variant, msg As String
                         
    On Error Resume Next
    Set FPDict = ThisDrawing.Dictionaries("ReferenzPunktDictionary")
    Set FPXRecord = FPDict.GetObject("ReferenzPunktXRecord")
 
 
                            ' Alle XRecordData-Einträge zurückschreiben
    FPXRecord.GetXRecordData XRecordDataType, XRecordData
    ArraySize = UBound(XRecordDataType)
                            ' Lies die gespeicherten XRecordData und zeige sie an
    For iCount = 1 To ArraySize
        DataType = XRecordDataType(iCount)
        Data = XRecordData(iCount)
        If DataType = 1040 Then
            If iCount Mod 3 = 0 Then
                msg = msg & Data & vbCrLf
            Else
                msg = msg & Data & " ,"
            End If
        End If
    Next
    MsgBox "Die Daten des Datensatzes sind: " & vbCrLf & vbCrLf & msg, vbInformation
 
End Sub

Ich möchte mich hier noch einmal ganz herzlich für Die Geduld bedanken, die Du für mich aufgebracht hast

GustavZwo

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

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 13. Jan. 2009 09:51    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

Guten Tag,

der Test aller Dictionaries in einer neuen Zeichnung zeigt, daß Wörterbuch 0 und 1
nicht existiert oder
verborgen ist.
Dafür gibt es ACAD_MLINESTYLE gleich zweimal mit Nr 2 u. 3

Sub zeigeDictionaries()
    Dim Dic As AcadDictionary
    Dim i As Integer
    On Error Resume Next
    For i = 0 To ThisDrawing.Dictionaries.Count - 1
        Set Dic = ThisDrawing.Dictionaries(i)
        Debug.Print i & " " & Dic.Name
    Next
End Sub

Resultat:

2 ACAD_MLINESTYLE
3 ACAD_MLINESTYLE
4 ACAD_PLOTSTYLENAME
5 ReferenzPunktDictionary      (nach Eröffnung der Zeichnung mit
ThisDrawing.Dictionaries.Add("ReferenzPunktDictionary") manuell eingefügt)

Weiß jemand im Forum, was sich hinter Nr 0 und 1 verbirgt und warum 3 u. 4 doppelt ist?

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


Ex-Mitglied

erstellt am: 13. Jan. 2009 12:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

das wird wohl von der Vorlagenzeichnung abhängen, die Du verwendest und ev. auch von einer Applikation, die mit dem Start von AutoCAD mitgestartet wird. Nochmals Hinweis zu ArxDbg, damit kannst Du Dir (relativ) einfach die Einstellungen/Unterpunkte zu diesen Dingen ansehen.

- alfred -



Anzeige:Infos zum Werbeplatz >>

cseTools Koordinatentransformation CAD APP für Tiefbau, AEC - Architektur-, Ingenieur- und Bauwesen, GIS, Vermessung und Kartografie

Mit der cseTools Koordinatentransformation können komplette DWG/DXF Dateien zwischen verschiedenen Koordinatensystemen (CRS) transformiert werden. Beispielsweise von Gauß-Krüger nach ETRS89 / UTM.

GustavZwo
Mitglied



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

Beiträge: 20
Registriert: 21.11.2008

WindowsXP SP2, Acad 2002, Office 2000,

erstellt am: 13. Jan. 2009 23:30    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

Guten Tag, Alfred,

trotz eifrigem Suchen habe ich die ArxDbg bis jetzt nicht gefunden. Darf ich Dich noch um einen Hinweis auf die Quelle nerven?

GustavZwo

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)2025 CAD.de | Impressum | Datenschutz