| | | 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
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 15. Dez. 2008 18:27 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 15. Dez. 2008 19:01 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 15. Dez. 2008 20:02 <-- editieren / zitieren -->
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
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 16. Dez. 2008 09:08 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 16. Dez. 2008 11:59 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 16. Dez. 2008 13:28 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 22. Dez. 2008 15:20 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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 >>)
|