| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: 3D Polylinie (1804 mal gelesen)
|
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 24. Feb. 2014 09:32 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich muss einen Bogen zeichnen der aus einzelnen Liniensegmenten besteht. Also habe ich mir alle Koordinaten ausgerechnet und in eine Point3dCollection gepackt. Wenn ich die Liste der 2D_Zeichenroutine übergebe macht es genau was es soll. In der 3D_ Zeichenroutine kommt eine Fehlermeldung eNoDatabase (siehe Anhang) Könnt ihr mir sagen was hier nicht stimmt ? Mfg, Bernd Code:
Private Sub setplines_2D(liste As Point3dCollection) Dim doc As Document = _AcAp.Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Using tr As Transaction = db.TransactionManager.StartTransaction() Dim bt As BlockTable = CType(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable) Dim btr As BlockTableRecord = CType(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord) Dim pline As Polyline = New Polyline For i As Integer = 0 To liste.Count - 1 Dim p As Point2d = New Point2d(liste(i).X, liste(i).Y) pline.AddVertexAt(i, p, 0, 0, 0) Next i pline.Closed = False btr.AppendEntity(pline) tr.AddNewlyCreatedDBObject(pline, True) tr.Commit() End Using End Sub Private Sub setplines_3D(liste As Point3dCollection) Dim doc As Document = _AcAp.Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Using tr As Transaction = db.TransactionManager.StartTransaction() Dim bt As BlockTable = CType(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable) Dim btr As BlockTableRecord = CType(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord) Dim pline As Polyline3d = New Polyline3d For Each pkt As Point3d In liste Dim ver As PolylineVertex3d = New PolylineVertex3d ver.Position = pkt pline.AppendVertex(ver) Next btr.AppendEntity(pline) tr.AddNewlyCreatedDBObject(pline, True) tr.Commit() End Using End Sub
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: 24. Feb. 2014 10:20 <-- editieren / zitieren --> Unities abgeben: Nur für bccad
Hallo Bernd, es wäre natürlich schön gewesen zu wissen, an welcher Stelle des Codes, der Fehler kommt. Die Meldung sagt eigentlich aus, dass du eine Operation erst dann ausführen kannst, wenn das Objekt schon der Database hinzugefügt wurde. Nachfolgend mein c#Code, den ich zur Erzeugung der Polylines verwende.
Code:
internal static Polyline3d dtCreatePolyline3dBy(Point3dCollection _PointCollection, Boolean _Closing) { DoubleCollection _bulges = new DoubleCollection(); foreach (Point3d _p in _PointCollection) _bulges.Add(0.0); return new Polyline3d(Poly3dType.SimplePoly, _PointCollection,_Closing); } //.. danach dann das übliche : Anhängen an BlockTableRecord und Transaction.AddNewly..
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 |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 24. Feb. 2014 11:36 <-- editieren / zitieren --> Unities abgeben: Nur für bccad
Hallo, es sieht so aus als müsste die Polyline zuerst zur DB hinzugefügt werden, bevor Verticies hinzugefügt werden können. Weiters verlangt scheinbar auch der Vertex ein "AddNewlyCreatedDBObject" Code:
Private Sub setplines_3D(liste As Point3dCollection) Dim doc As Document = _AcAp.Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Using tr As Transaction = db.TransactionManager.StartTransaction() Dim bt As BlockTable = CType(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable) Dim btr As BlockTableRecord = CType(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord) Dim pline As Polyline3d = New Polyline3d btr.AppendEntity(pline) tr.AddNewlyCreatedDBObject(pline, True) For Each pkt As Point3d In liste Dim ver As PolylineVertex3d = New PolylineVertex3d ver.Position = pkt pline.AppendVertex(ver) tr.AddNewlyCreatedDBObject(ver, True) Next tr.Commit() End Using End Sub
Ein Beispiel findt sich hier: (allerdings c#.net) Gruß Karlovac Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bccad Mitglied
Beiträge: 57 Registriert: 02.11.2009
|
erstellt am: 24. Feb. 2014 14:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Karlovac, das war's. Ich wusste nicht das die Vertexe auch Bestandteil der Datenbank sind. Polylinie zuerst anlegen hatte ich schon erfolglos probiert. Danke für die schnelle Hilfe. Mfg Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|