| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Funktion beschleunigen - ExtensionDictionary auslesen (728 mal gelesen)
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 28. Jul. 2009 14:49 <-- editieren / zitieren --> Unities abgeben:
Ich habe hier ein Problem. Ich muss aus einem Dictionary Daten auslesen. leider sind diese Daten saublöd verspeichert. In diesem Fall besitzt das Xrecord 800 Stück Daten, die wiederum aus einem Array aus 127 Bytes aufgebaut sind. Das ganze zusammen ergibt dann einen langen XML String, der die kaufmännischen Daten repräsentieren. Das Lesen und Zusammenbauen dieses XML String dauert jedoch sagenhafte 15 Sekunden. Code:
DBDictionary tDict = (DBDictionary)tTransaction.GetObject(tObject.ExtensionDictionary, OpenMode.ForRead); if (tDict.Contains("PXCAD_PERS_DATA")) { ObjectId fldDictId = tDict.GetAt("PXCAD_PERS_DATA"); if (fldDictId != ObjectId.Null) { Xrecord tXrecord = (Xrecord)tTransaction.GetObject(fldDictId, OpenMode.ForRead); string a1; foreach (TypedValue rb in tXrecord.Data) { i1 += 1; if (rb.TypeCode == 310) { foreach (byte tByte in (byte[])rb.Value) { iXMLString = iXMLString + Convert.ToChar(tByte); } } } } } }
die alte VBA Methode selbst (die ich ersetzten möchte) jedoch ist wesentlich schneller (aber auch noch 5 Sekunden) Code: Set iDictionary = IAcadObject.GetExtensionDictionary("PXCAD_PERS_DATA") Call iDictionary.GetXRecordData(iValueType, iValue) Dim iXMLString As String For i1 = 0 To UBound(iValue) If iValueType(i1) = 310 Then For i2 = 0 To UBound(iValue(i1)) iXMLString = iXMLString & Chr(iValue(i1)(i2)) Next End If Next
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Jul. 2009 14:56 <-- editieren / zitieren -->
Hi, hast Du auch eine Zeichnung mit ein paar Testelementen, sonst kann ich mir's nicht im Profiler ansehen. - alfred - ------------------ www.hollaus.at |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 28. Jul. 2009 15:04 <-- editieren / zitieren --> Unities abgeben:
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 28. Jul. 2009 15:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred ! Danke für Deine Bemühungen. Aber ich habe selber eine Lösung gefunden. Ich gehe die 800 Byte Arrays nicht mehr Byte für Byte durch, unm den XML String zusammenzubauen, sondern mache das mit System.Text.Encoding.ASCII.GetString Das ist jetzt Sauschnell (< 0.5 Sekunden) Code:
Xrecord tXrecord = (Xrecord)tTransaction.GetObject(fldDictId, OpenMode.ForRead); string a1; foreach (TypedValue rb in tXrecord.Data) { i1 += 1; if (rb.TypeCode == 310) { iXMLString += System.Text.Encoding.ASCII.GetString((byte[])rb.Value); } }
[Diese Nachricht wurde von fuchsi am 28. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Jul. 2009 15:33 <-- editieren / zitieren -->
Hi, danke für die Rückmeldung, dann war ich zu spät (grad dran, aber eben noch nicht 'dort'). Das 'encoding' ist wohl die bessere Methode, aber vorsicht auf Unterschied mit ASCII <<>> UniCode!! (siehe z.B. Fugenh??he) - alfred - ------------------ www.hollaus.at |