| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Objekte nachträglich bearbeiten (631 mal gelesen)
|
Stelli1 Ehrenmitglied Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign MapGuide autodesk Topobase 2-2014 VS6, VS.net 2010
|
erstellt am: 15. Jan. 2014 10:51 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, mit folgender Funktion zeichne ich eine Polylinie in das AutoCAD.
Code: Public Function DrawLine(PunktCollection As Collection) As Long Dim acPolyline As Polyline = New Polyline 'Dim acObjectID As ObjectId '' Global in der Klasse Dim LPunkt As Cls_Leitungspunkt For Each LPunkt In PunktCollection acPolyline.AddVertexAt(0, LPunkt.acGetPoint2D, 0, 0, 0) Next ' Transaction starten Using acTransaction As Transaction = _Database.TransactionManager.StartTransaction() _AC_Document.LockDocument() 'Dim tr As Autodesk.AutoCAD.Geometry.Matrix3d = Autodesk.AutoCAD.Geometry.Matrix3d.Displacement(New Autodesk.AutoCAD.Geometry.Vector3d(Dy, Dx, 0)) 'acPolyline.TransformBy(tr) ' Zugriff auf Blocktable Dim acBlockTable As BlockTable acBlockTable = acTransaction.GetObject(_Database.BlockTableId, OpenMode.ForRead) ' Zugriff auf Modelspace Dim acBlockTableRecord As BlockTableRecord = acTransaction.GetObject(acBlockTable(BlockTableRecord.ModelSpace), OpenMode.ForWrite) ' Polylinie einfügen acBlockTableRecord.AppendEntity(acPolyline) acTransaction.AddNewlyCreatedDBObject(acPolyline, True) ' ObjectID merken _acObjectID = acPolyline.ObjectId ' Transaction abschliessen acTransaction.Commit() End Using End Function
Später ist es eventuell notwendig diese Linie zu verschieben oder zu löschen. Habe ich mit der gespeicherten ObjektID währende der Laufzeit der Sitzung noch Zugriff auf dieses Objekt? Was passiert wenn der Benutzer die Linie geändert oder gelöscht hat? Code zum Löschen
Code: Using acTransaction As Transaction = _Database.TransactionManager.StartTransaction() ' Zugriff auf Blocktable Dim acBlockTable As BlockTable acBlockTable = acTransaction.GetObject(_Database.BlockTableId, OpenMode.ForRead) ' Zugriff auf Modelspace Dim acBlockTableRecord As BlockTableRecord = acTransaction.GetObject(acBlockTable(BlockTableRecord.ModelSpace), OpenMode.ForWrite) acTransaction.GetObject(acObjectID, OpenMode.ForWrite).Erase() acTransaction.Commit() End Using
Code zum Verschieben Code: ' Wie komme ich hier wieder auf das Objekt acPolyline? Dim tr As Autodesk.AutoCAD.Geometry.Matrix3d = Autodesk.AutoCAD.Geometry.Matrix3d.Displacement(New Autodesk.AutoCAD.Geometry.Vector3d(Dy, Dx, 0)) acPolyline.TransformBy(tr)
Wilfried Stelberg
------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 15. Jan. 2014 11:14 <-- editieren / zitieren --> Unities abgeben: Nur für Stelli1
Hallo Wilfried, Grundsätzlich kannst du über die ObjectId wieder auf das Object zugreifen. -> Transaction.GetObject(..) Wenn der Benutzer das Objekt geändert hat, ist das der Id egal. Wenn der Benutzer das Object gelöscht oder so geändert hat, dass es seitens AutoCAD gelöscht wurde, also hinter deiner gespeicherten Id kein Objekt mehr ist, dann erzeugt die Transaction.GetObject()-Methode einen Fehler. Du kannst das aber auch prüfen, z.Bsp mit: ObjectId.IsErased. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Ehrenmitglied Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign MapGuide autodesk Topobase 2-2014 VS6, VS.net 2010
|
erstellt am: 15. Jan. 2014 16:59 <-- editieren / zitieren --> Unities abgeben:
|
Stelli1 Ehrenmitglied Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign MapGuide autodesk Topobase 2-2014 VS6, VS.net 2010
|
erstellt am: 17. Jan. 2014 12:29 <-- editieren / zitieren --> Unities abgeben:
Habs jetzt so gelöst Code: Public Function MoveLine(DeltaRechts As Double, DeltaHoch As Double, DeltaHöhe As Double) As Boolean ' Gibt es ein Objekt in der Klasse If Not IsNothing(_acObjectID) Then ' Wurde das Objekt bereits gelöscht If _acObjectID.IsErased = False Then Using acTransaction As Transaction = _Database.TransactionManager.StartTransaction() ' Polylinie wieder lesen Dim acPolyline As Polyline = CType(acTransaction.GetObject(_acObjectID, OpenMode.ForWrite), Polyline) ' Verschiebung definieren Dim acTransformation As Autodesk.AutoCAD.Geometry.Matrix3d = Autodesk.AutoCAD.Geometry.Matrix3d.Displacement(New Autodesk.AutoCAD.Geometry.Vector3d(DeltaRechts, DeltaHoch, DeltaHöhe)) ' Verschiebung anbringen acPolyline.TransformBy(acTransformation) acTransaction.Commit() End Using _Editor.UpdateScreen() Return True Else ' Objekt bereits gelöscht Return False End If Else ' Noch kein Objekt vorhanden Return False End If End Function Public Function DeleteLine() As Boolean ' Gibt es ein Objekt in der Klasse If Not IsNothing(_acObjectID) Then ' Wurde das Objekt bereits gelöscht If _acObjectID.IsErased = False Then Using acTransaction As Transaction = _Database.TransactionManager.StartTransaction() acTransaction.GetObject(_acObjectID, OpenMode.ForWrite).Erase() acTransaction.Commit() End Using _Editor.UpdateScreen() Else Return False End If Else Return False End If End Function
Mit den Ergebnissen kann ich so gut leben (siehe Anhang). Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|