| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: XRecords und XData (2081 mal gelesen)
|
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 03. Dez. 2008 15:37 <-- editieren / zitieren --> Unities abgeben:
Hi, hab mich jetzt längers mit diesen XRecords und XData beschäftigt. Meines Wissenes kann man mit denen beliebigen AutoCAD Objekten zusätzliche Eigenschaften verpassen. Dies möchte ich jetzt einem Volumenkörper machen, kriege es aber leider nicht hin. Arbeite mit VB.NET und alle Beispiele die ich bisher gefunden habe, auch in der Hilfe, waren in C#. Hat jemand ein kleines Beispiel für mich, wäre super! Danke schon mal ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Dez. 2008 16:00 <-- editieren / zitieren -->
Hi, zeig mal den Codeteil her, den Du bis jetzt hast und ich bearbeite diesen - alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 03. Dez. 2008 17:47 <-- editieren / zitieren --> Unities abgeben:
Hi, hab da noch gar nichts, weil gar nichts geklappt hat. Erstelle einen Solid und an dem möchte ich Eigenschaften anhängen. Den Solid mache so: Code:
<CommandMethod("cs")> _ Public Sub createSolid() 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 mySolid As Solid3d = New Solid3d() Dim solidID As ObjectId Try mySolid.CreateBox(600, 560, 720) Dim bt As BlockTable = tm.GetObject(db.BlockTableId, OpenMode.ForRead, False) Dim btr As BlockTableRecord = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False) solidID = btr.AppendEntity(mySolid) tm.AddNewlyCreatedDBObject(mySolid, True) ta.Commit() Catch ex As Exception MsgBox("Unbehandelter Fehler: " + ex.Message.ToString) Finally ta.Dispose() End Try End Sub
Und daran möchte ich jetzt Eigenschaften heften, nur wie? Und dann gleich noch 2 Fragen: 1. Eigentlich möchte ich einen Quader erstellen der die ganzen Grips zum ziehen in der Länge, Breite Höhe hat. Mein Solid lässt sich überhaupt nicht ziehen 2. Wie kann ich auf das Ändern meiner selbst definierten Eigenschaften reagieren? Das heißt wenn der Benutzer in den Eigenschaften von ACAD eine solche ändert, soll irgendwas passieren. Vielen Dank für deine Geduld die Mühe!
------------------ Grüsse Benny [Diese Nachricht wurde von Benny4 am 03. Dez. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Dez. 2008 17:53 <-- editieren / zitieren -->
Hi Benny, Basiscode ist zu wenig, als dass ich da jetzt aus dem Bauch heraus blind schreibe (sitze gerade auf einem Arbeitsplatz, wo keine Entwicklungsumgebung vorhanden ist, sorry) ==> das wir ein wenig dauern, denn zum Speichern von EED-Daten gehört von EED_RegAppTable-Eintrag bis hin zum eigentlichen EED-Daten an Objekt dranhängen mehr dazu, als dass ich das blind (fehlerfrei) könnte. (etwas Geduld oder wer anderer hilft inzwischen). Das Definieren von eigenen Grips an einem Element wird Dir mit VB.NET nicht gelingen ==> ObjectARX PLUS eigene Modellieren, weil Du einem Objekt Änderungen antun willst, die das AutoCAD-Objekt selbst nicht kann (zumindest laut Deiner Beschreibung) Auf das Ändern von Eigenschaften kannst Du mit Event ObjectModified überwachen und darauf reagieren. - alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 03. Dez. 2008 18:04 <-- editieren / zitieren --> Unities abgeben:
Hi, Geduld habe ich, das ist kein Problem, lass dich bloss nicht stressen von mir... Naja das mit Objekt kann AutoCAD eigentlich schon. Denn wenn ich manuell mit der Funktion Quader einen SOlid zeichne, dann sind diese Objektgriffe ja dran. Ich möchte nicht nur einen blöden Solid sondern eben einen Quader zeichnen. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Dez. 2008 18:10 <-- editieren / zitieren -->
Hi Benny, dann lass es mich genauer definieren: Du kannst mit VB.NET einem Objekt nicht mehr Griffe zur Bearbeitung zukommen lassen, als es von sich aus in AutoCAD hat. Wenn Du mit '_extrude' ein Solid anders erzeugst (als der Befehl '_quader'), daher das Resultat ein anders ist und daher wiederum andere Griffe zur Verfügung stehen, dann kannst Du diese natürlich verwenden, aber eben nur diese. Vielleicht kommen wir schneller weiter, wenn Du mir Deine Aufgabe beschreibst, denn obiges Problem (Vermeidung, dass Quader verwendet wird statt Polylinie und Extrude, dann kann eventuell auch anders unterbunden werden, aber die ganze Aufgabe wäre mal interessant. - alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 03. Dez. 2008 18:18 <-- editieren / zitieren --> Unities abgeben:
Hi, also ist es mit .NET einfach nicht möglich einen Quader zu erzeugen, ok. Bleibt nur noch das Problem mit den XRecords. Habe keine bestimmte Aufgabe, möchte einfach die Möglichkeiten von .NET in AutoCAD erforschen. Und diese XRecords finde ich recht gut und möchte einfach wissen wie ich die am Beispiel eines Solids anwenden kann. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 03. Dez. 2008 18:20 <-- editieren / zitieren -->
Hi, sorry ==> mit DotNET ist es schon möglich, einen Quader zu erzeugen, aber nicht einen 'eigenen Quader', der mehr Griffpunkt und/oder andere Funktionen hinter den Griffpunkten hat als eben der AutoCAD-Quader. - alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 03. Dez. 2008 18:24 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 03. Dez. 2008 18:27 <-- editieren / zitieren -->
Hi, ich glaube doch, mich daran zu erinnern, dass es a) in den Beispieldateien von ObjectARX auch Beispiele zur Verwendung von BRep-API gibt b) es von Autodesk ein Video im Internet gibt, dass die Verwendung der BRep-API mit vs.net zeigt (nachdem ich aber eben nicht auf meinem Platz sitze, kann ich Dir die Links auch nicht so leicht heraussuchen, sollten aber zu 'ergooglen' sein) - alfred - |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 08. Dez. 2008 18:30 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
Hallo Benny, hier der Code um Acad-Objekten XDaten anzuhängen: Code:
''' <summary> Schreibt X-Daten in Autocad-Objekte.</summary> ''' <remarks></remarks> Class XData ' Mit (entget(car(entsel))'("*")) erhält man die X-Daten aller Applicationen ''' <summary> Schreibt vorgegebene X-Daten in ein durch seine Objekt-ID vorgegebenes Objekt.</summary> ''' <param name="ObjId">Objekt-ID des Objektes, dass die X-Daten enthalten soll.</param> ''' <param name="Appname">Applicationsname der X-Daten.</param> ''' <param name="DataVal">Eigentliche Daten die dem Objekt zugeordnet werden sollen.</param> ''' <returns>Gibt den Erfolgsstatus dieser Operation zurück.</returns> ''' <remarks>Bevor X-Daten geschrieben werden können muss evtl. der Applicationsname noch mit AddRegAppTableRecord registriert werden. ''' Weil bei jedem Aufruf dieser Funktion AddRegAppTableRecord gestartet wird ist die Performance bei vielen Objekten evtl. ''' schlechter, da dieser Aufruf eigentlich nur einmal für jeden Anwendungsnamen gestartet werden muss.</remarks> Public Shared Function AddXData(ByVal ObjId As ObjectId, ByVal Appname As String, ByVal DataVal As String) As Boolean Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database Dim myT As Transaction = db.TransactionManager.StartTransaction() Try Dim obj As DBObject = myT.GetObject(ObjId, OpenMode.ForWrite) AddRegAppTableRecord(Appname) Dim rb As New ResultBuffer(New TypedValue(1001, Appname), New TypedValue(1000, DataVal)) obj.XData = rb myT.Commit() Finally myT.Dispose() End Try End Function ''' <summary> Wenn der Applicationsname der X-Daten noch nicht existiert wird er hier in die Datenbank eingetragen.</summary> ''' <param name="regAppName">Applicationsnamen der X-Daten.</param> ''' <remarks>Der Applikationsname muss und darf nur einmal pro Zeichnung eingetragen werden.</remarks> Public Shared Sub AddRegAppTableRecord(ByVal regAppName As String) Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database Dim myT As Transaction = db.TransactionManager.StartTransaction() Try Dim rat As RegAppTable = CType(myT.GetObject(db.RegAppTableId, OpenMode.ForRead, False), RegAppTable) If Not rat.Has(regAppName) Then rat.UpgradeOpen() Dim ratr As New RegAppTableRecord ratr.Name = regAppName rat.Add(ratr) myT.AddNewlyCreatedDBObject(ratr, True) End If myT.Commit() Finally myT.Dispose() End Try End Sub End Class
Ich würde diesen Code nicht versuchen, in deinen einzubauen, sondern die Klasse so wie sie ist benutzen. Das macht deinen Code deutlich lesbarer und man kann die Klasse auch aus anderen Prozeduren heraus nutzen. ------------------ Gruß Markus 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: 09. Dez. 2008 09:41 <-- editieren / zitieren --> Unities abgeben:
Hi Markus, vielen Dank schon mal,werde das sobald als möglich ausprobieren. Eine Frage noch dazu: Soweit ich informiert bin, kann ich XDatan nur begrenzt einsetzen. Wieviele XDaten kann ich denn pro AutoCAD-Objekt speichern? Oder: Wie kann ich XRecords an AutoCAD-Objekten speichern? Die sind meines Wissens unbegrenzt!? ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Dez. 2008 09:48 <-- editieren / zitieren -->
Hi Benny XData ist begrenzt auf 16kB je Objekt XRecords nicht (nur durch Zeichnungsgröße, die Du bereit bist, zu investieren) [EDIT]auch für XRecords hast Du Beispiele in ObjectARX-Lib[/EDIT] - alfred - [Diese Nachricht wurde von a.n. am 09. Dez. 2008 editiert.] |
MichaelKlein Mitglied
Beiträge: 17 Registriert: 28.11.2008 Mein System: AutoCAD 2008 / ObjectARX / VisualStudio 2008 Standard
|
erstellt am: 24. Apr. 2009 08:22 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
|