Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Funktion beschleunigen - ExtensionDictionary auslesen

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:  Funktion beschleunigen - ExtensionDictionary auslesen (728 mal gelesen)
fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Jul. 2009 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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Jul. 2009 15: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


ZeichnungRM.txt

 
yepp. Die XDATEN hängen am einzigen Objekt in der Zeichnung.
An der Struktur der Daten kann ich leider nichts ändern, da diese von einer Fremdapplikation geschrieben wird.

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Jul. 2009 15:20    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 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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

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