Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Probleme mit XData

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:  Probleme mit XData (2019 mal gelesen)
Benny4
Mitglied
Softwareentwickler


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

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 15. Dez. 2008 18:27    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

Hi,

ich habe ein mir unerklärliches Problem mit XData.

Habe eine Polylinie an der ich mittels XData das Handle eines anderen Objektes gespeichert habe. Nun möchte ich, wenn die Poylinie geändert wird, auch das Objekt ändern, das dem Handle entspricht das ich an der Polylinie gespeichert habe.

Das kriege ich auch wunderbar hin. Dann möchte ich noch an der Polylinie einen Wert mittels XData speichern. Auch das funktioniert noch. Aber beim commit der Transaction stürzt AutoCAD ohne Fehlermeldung ab. Wenn ich die Zeile auskommentiere in der ich an die Polylinie was speichern will, dann funktioniert die Funktion ohne Probleme. Jemand eine Idee?

Code:

Public Sub updateSolid(ByVal insertPoint As Point3d, ByVal height As Double, ByVal polyLineID As ObjectId)
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
        Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
        Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
        'start a transaction
        Dim ta As Transaction = tm.StartTransaction()
        Dim createdPlate As Solid3d = New Solid3d()
        'Dim corpusID As ObjectId
        Dim corpusBase As Region = New Region()

        Try

            Dim insPtX As Double = insertPoint.X
            Dim insPtY As Double = insertPoint.Y
            Dim insPtZ As Double = insertPoint.Z

            Dim myPolyLine As Polyline2d = tm.GetObject(polyLineID, OpenMode.ForWrite, False)

            Dim bt As BlockTable = tm.GetObject(db.BlockTableId, OpenMode.ForWrite, False)
            Dim btr As BlockTableRecord = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False)

            'Region erzeugen um die Extrusion erzeugen zu können
            Dim tCollTemp As DBObjectCollection = New DBObjectCollection
            tCollTemp.Add(myPolyLine)
            Dim tRegions As DBObjectCollection = Region.CreateFromCurves(tCollTemp)

            'Platte erzeugen
            createdPlate.Extrude(tRegions(0), height, 0)
            'Platte zur Datenbank und Zeichnung hinzufügen
            Dim mySolID As ObjectId = btr.AppendEntity(createdPlate)
            tm.AddNewlyCreatedDBObject(createdPlate, True)

            XData.AddXData(mySolID, "HEIGHT", height.ToString)
            XData.AddXData(mySolID, "PL_HANDLE", myPolyLine.Handle.Value)

            XData.AddXData(polyLineID, "SOL_HANDLE", createdPlate.Handle.Value)
            ta.Commit()

        Catch ex As Exception
            ed.WriteMessage("Unbehandelter Fehler: " + ex.Message.ToString)
        Finally
            ta.Dispose()
        End Try
    End Sub


------------------
Grüsse Benny

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


Ex-Mitglied

erstellt am: 15. Dez. 2008 18:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Benny,

nachdem ich leider nicht weiss, was hinter 'XData' (Klasse? Modul?) steckt, kann ich mit

Code:
XData.AddXData(mySolID, "HEIGHT", height.ToString)
XData.AddXData(mySolID, "PL_HANDLE", myPolyLine.Handle.Value)
XData.AddXData(polyLineID, "SOL_HANDLE", createdPlate.Handle.Value)
leider auch nichts anfangen.

- alfred -

Benny4
Mitglied
Softwareentwickler


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

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 15. Dez. 2008 19:01    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

Hi,

da habe ich den Code genommen, der mir in diesem Forum gezeigt wurde. Beim Solid funktioniert es ja auch, aber der hat noch keine XData.


Hier der code

------------------
Grüsse Benny

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


Ex-Mitglied

erstellt am: 15. Dez. 2008 20:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Benny,

jetzt gehen wir mal ein wenig in die Tiefe, dazu brauch ich aber auch ein wenig Informationen:
schreibst Du ein Programm, weil Du

a) dotNET üben/lernen willst
b) eine Applikation für Dich schreibst
c) eine Applikation für einen Kunden schreibst

verzeih mir bitte gleich vorweg die Worte: "Die ich rief, die Geister, werd ich nun nicht los", aber Code zu nehmen und zu verwenden, ohne die Bedeutung zu kennen, halte ich für gefährlich. Und je weiter Du aus meiner obigen Frage in Richtung 'C' tendierst, umso gefährlicher ist das ganze.

WIESO: Der Code von Jonapap ist in sich schlüssig und plausibel kommentiert und (so sollte man Code-Schnippsel immer auffassen) eine Basis für Verständnis, aber nicht unbedingt gleich zu so zu verwenden.

In diesem Code werden EED-Daten immer als String gespeichert. Du willst AutoCAD-Handles drin ablegen, die Objekte gegenseitig referenzieren. Jetzt stell Dir mal die Situation vor, dass Du eine Zeichnung erstellt hast, in der die Handles richtig referenziert sind und dann fügst Du diese Zeichnung in eine andere ein ==> die Handles (eben weil als dumme String-Werte gespeichert) kennen dann ihre referenzierten Element nicht mehr und Deine Applikation ist damit nicht mehr lauffähig.
Aus diesem Grund gibt es bei den EED-Daten nicht nur den Typ String zu speichern, sondern auch 'DatabaseServices.DxfCode.ExtendedDataHandle', dies (im Zusammenhang mit Wissen über Hard- und SoftPointer) ermöglicht Dir erst, stabile Objektverweise zu bauen.

WEITERS: da ich nicht weiss, wo Deine Funktion 'updateSolid' aufgerufen wird, kann das schon mal ein Hinderungsgrund sein. Die Erklärung, dass EED-Daten an alle neuen Elemente hinzugefügt werden können, nur an das bestehende Element mit der ObjectID 'PolylineID' misslingt, lässt mich zwei Vermutungen äussern:

a) Es kommt aus einem Event, das diese Polylinie gerade verändert (und eben dadurch, dass es im Event abläuft, gerade am Verändern ist), dann kann nicht alles mit bestehenden Elementen gemacht werden.

b) Es kommt aus einem Funktionsaufruf, der das Document nicht sperrt, dann solltest Du es am Anfang sperren und am Ende wieder freigeben. Z.B.:

Code:
Dim tDocLock as ApplicationService.DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument
...code was auch immer zu tun ist, und am Ende:
if (tDocLock isnot Nothing) then tDocLock.Dispose

Und dann wäre da noch die heikle Sitation mit geschachtelten Transactions, für jede EED-Zuweisung wird eine Transaction gestartet (nachdem Du eigentlich schon eine aktive Transaction hast), diese wiederum ruft den Code für EED-Applikationsregistrierung auf, in dieser wird wieder eine Transaction gestartet, sprich Du fährst mit 3 Ebenen von Transactions, diese nicht einmal wirklich geschachtelt, sondern (halb-)parallel! ==> Das wird Dir mit der Zeit (eher bald) auf den Kopf fallen, weil ein fehlendes oder mißlungenes 'COMMIT' und alles ist beim Teufel. Nebenbei ist das auch noch um ein vielfaches langsamer.

Das waren mal ein paar Info's, nochmals bitte einen eventuell 'zu vorbehaltlosen' Tonfall zu entschuldigen. Nur schreib ich hier kein Manual, sondern betreibe Hilfestellung

- alfred -

Benny4
Mitglied
Softwareentwickler


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

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

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

Hi Alfred,

danke dir schon mal für die genauen Ausführungen. Ja das alles soll etwas für den Kunden werden. Das heißt, ich habe im Prinzip bisher Mist gebaut...

Das mit den "'DatabaseServices.DxfCode.ExtendedDataHandle'dies (im Zusammenhang mit Wissen über Hard- und SoftPointer) ermöglicht Dir erst, stabile Objektverweise zu bauen." klingt genau nach dem was ich brauche. Meine Frage: Wo kann ich denn nachlesen, wie ich damit arbeiten kann, oder gibt es viell. gar Beispiele dazu? Ich nehme mal an dass es auf Deutsch dazu nichts gibt...

Danke jedenfalls für deine Unterstützung hier.

------------------
Grüsse Benny

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


Ex-Mitglied

erstellt am: 16. Dez. 2008 09:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Benny,
 
Zitat:
Das heißt, ich habe im Prinzip bisher Mist gebaut...
bitte nicht meine Aussage so auffassen. Ich wollte Dich nur nicht sehenden Auges hineinrennen lassen.

Es gibt im wesentlichen 4 Quellen, aus denen ich 50% erfahre, der Rest ist 'Selbsterfahrung', die 4 Quellen sind
a) Internet
b) arxdev.chm
c) arxdoc.chm
d) arxmdg.chm

...und ja, alles englisch (weil alles was übersetzt ist, bereits die erste Fehlerquelle ist), die CHM-Files stammen aus ObjectARX-Kit (in welchem auch jede Menge Beispiele enthalten sind).

- alfred -

[Diese Nachricht wurde von a.n. am 16. Dez. 2008 editiert.]

Benny4
Mitglied
Softwareentwickler


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

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 16. Dez. 2008 11: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

Hi Alfred,

ok habe ich fast befürchtet. Na dann habe ich über die Feiertage ja einiges zu tun... 

Zwei Fragen habe ich da aber doch noch:
1. Habe jetzt das Handle des Solids mittels XData und dem Code 'DatabaseServices.DxfCode.ExtendedDataHandle' bei der Polylinie gespeichert. Habe gelesen, dass wenn ich diese Objekte mittels eines Blocks einfüge, das Handle automatisch angepasst wird. Das heißt das Handle des neuen Solids wurde automatisch upgedatet. Das ist noch viel besserwie ich mir es gedacht habe. Nun meine Frage: Kriege ich es auch irgendwie hin, dass sich das ACAD beim kopieren der Objekte, und nicht des Blockes, gleich verhält?

2. Die Funktion updateSolid wird in der Funktion aufgerufen, die prüft, ob ein Objekt verändert wurde. In der Tat wird die Polylinie verändert, ich baue den Solid neu auf und möchte dann das neue Handle des Solids in die Polylinie schreiben. Nur geht das anscheinend nicht währenddessen die Polylinie bearbeitet wird (vom Benutzer gestreckt). Habe ich eine andere Möglichkeit das neue Handle an die Polylinie zu speichern?


Vielen, vielen Dank schon mal

------------------
Grüsse Benny

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


Ex-Mitglied

erstellt am: 16. Dez. 2008 12:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Benny,

das mit dem Kopieren musst Du selbst abfangen (Event ObjectCreated und aktiver Befehl z.B. GRIP*, COPY, OFFSET, ...)

zu 2) ich gehe hier so vor, dass ich

a) Objektmodifikationen überwache und mir nur die ObjectID's zwischenspeichere von den Objekten, an denen sich etwas verändert hat.
b) bei der ersten Modifikation setze ich mit einen Eventhandler auf AcadDocED.EnteringQuiescentState, das bewirkt, dass nach Abschluss der AutoCAD-internen Modifikationen zu dem Zeitpunkt, an dem AutoCAD in den 'Ruhezustand' zurückkehrt, meine Prozedur losfährt und dann die Reaktionen auf die Objektmodifikationen durchführt.

Hoffe, dass ich das soweit klarmachen konnte.

- alfred -

Benny4
Mitglied
Softwareentwickler


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

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

erstellt am: 16. Dez. 2008 13:28    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

Hi Alfred,

ok das denke ich ist ein guter Ansatz. Werde mal schauen was es mit dem 'AcadDocED.EnteringQuiescentState' auf sich hat und wie man den anwenden kann.

Danke vielmals!

------------------
Grüsse Benny

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

Benny4
Mitglied
Softwareentwickler


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

Beiträge: 178
Registriert: 16.02.2006

AutoCAD 2008
WIN XP Pro SP2

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

Hi Alfred,

ich habe jetzt versucht den Lösungsansatz, den du mir gegeben hast umzusetzen. Allerdings habe ich es nicht geschafft entscheidend weiterzukommen. Mit diesem Event AcadDocED.EnteringQuiescentState bin ich nicht zurechtgekommen, oder besser, ich wusste nicht wie diesen einsetzen. Könntest du mir auf die Sprüunge helfen, bzw. hast du ein Beispiel für mich wie ich das in VB.NET umsetzen kann.
Der Hintergrund ist eben der, dass ich alle geänderten Objekte speichern möchte, und nachdem wie du sagtest, AutoCAD die internen Modifikationen beendet hat meine Modifikationen drüberlaufen lassen möchte.

Vielen Dank schon im Voraus.

------------------
Grüsse Benny

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


Ex-Mitglied

erstellt am: 28. Dez. 2008 20:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat


AcadEvent_ObjectModified.zip

 
Hi Benny,

ich hab Dir mal was geschrieben (sorry für wenig Kommentare und in englischer Form, mach ich halt so), schau es Dir an, wieweit Du diesen Code verstehst/lesen kannst.

Vorgehensweise:

a) Verweise und Programmstart(Debug) auf Deine Pfade aktualisieren
b) dll erstellen
c) Debug (und damit AutoCAD) Starten
d) Befehl 'netload' und xxxx\bin_1702\AcadEvent_ObjectModified.dll laden
e) Befehl 'EventsActivate' starten und dann Zeichnen/Ändern/Löschen

Ich hoffe es wird Dir damit verständlich und es funktioniert wie's soll und wie Du es erwartest.
VORSICHT: getestet habe ich es nicht wirklich
VORSICHT 2: das Wechseln von Dokumenten (Schalten zwischen mehreren Zeichnungen) ist hier definitiv nicht überwacht!!

- alfred -

[Diese Nachricht wurde von a.n. am 28. Dez. 2008 editiert.]

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