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

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 22. Dez. 2008 08:59 <-- editieren / zitieren --> Unities abgeben:         
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
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 22. Dez. 2008 09:09 <-- editieren / zitieren --> Unities abgeben:          Nur für GustavZwo
|
GustavZwo Mitglied

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 22. Dez. 2008 09:49 <-- editieren / zitieren --> Unities abgeben:         
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

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 08. Jan. 2009 23:26 <-- editieren / zitieren --> Unities abgeben:         
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 6 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 / zitieren -->
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

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 09. Jan. 2009 08:51 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 10. Jan. 2009 23:04 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 11. Jan. 2009 23:18 <-- editieren / zitieren --> Unities abgeben:         
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

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 13. Jan. 2009 09:51 <-- editieren / zitieren --> Unities abgeben:         
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 / zitieren -->
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 - |

| |
GustavZwo Mitglied

 Beiträge: 20 Registriert: 21.11.2008 WindowsXP SP2, Acad 2002, Office 2000,
|
erstellt am: 13. Jan. 2009 23:30 <-- editieren / zitieren --> Unities abgeben:         
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |