Hallo Liebe cad.de Gemeinde,
Ich bin noch relativ neu im Bereich CAD-Programmierung, deshalb hoffe ich, dass hier vieleicht jemand eine Lösung für mein Problem hat:
Ich muss im Rahmen einer Studienarbeit ein vb.net Programm für AutoCAD schreibe, welches mir ermöglicht einen Datensatz einzulesen und diesen dann zeichnet. Die Daten(viele Kreise
) sind relativ einfach aufgebaut: x-Wert, y-Wert und Radius. Außerdem gibt es unterschiedliche Layer.
Die Daten werden aus einem DataSet mittels einer For schleife ausgelesen und dann gezeichnet.
Das glaubt auch alles wunderbar, solange ich die Layerinformation weglasse.
Füge ich zu den Kreisinformationen noch die Layerinformation, führt das zu einem Absturz von AutoCAD. Dabei wird der schon im Betreff genannte Fehler Code: "INTERNER FEHLER: !dbobji.cpp@8749: eNotOpenForWrite" ausgegeben.
Ich füge mal meinen Code an und vielleicht hat ja jemand eine Lösung für mein Problem...! Danke schön schon ein Mal fürs anschauen!!
Code:
Option Strict On
Imports System.IO
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Imports System.Windows.Forms
Imports Autodesk.AutoCAD.Colors
Public Class Form2
Public _dataPath As String = "data.xml"
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataSet1.ReadXml(_dataPath)
End Sub
Public Sub Zeichnen()
Dim y, x, r, z, layer As String
Dim i As Integer
z = "0"
For i = 0 To DataSet1.DataTable1.Count - 1
Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
layer = DataSet1.DataTable1.Rows(i).Item("Layer").ToString
' Wenn ich diesen Teil weglasse, funktioniert alles ohne Probleme:
' Anfang Layerabschnitt
Dim acLyrTbl As LayerTable
acLyrTbl = CType(acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite), LayerTable)
If acLyrTbl.Has(layer) = False Then
Dim acLyrTblRec As LayerTableRecord = New LayerTableRecord()
acLyrTblRec.Name = layer
acLyrTblRec.Color = Color.FromColorIndex(ColorMethod.ByAci, 1)
acLyrTbl.UpgradeOpen()
acLyrTbl.Add(acLyrTblRec)
acTrans.AddNewlyCreatedDBObject(acLyrTblRec, True)
End If
' Ende Layerabschnitt
Dim acBlkTbl As BlockTable
acBlkTbl = CType(acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead), BlockTable)
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForRead), BlockTableRecord)
y = DataSet1.DataTable1.Rows(i).Item("y").ToString
x = DataSet1.DataTable1.Rows(i).Item("x").ToString
r = DataSet1.DataTable1.Rows(i).Item("r").ToString
Dim acCirc As Circle = New Circle()
acCirc.SetDatabaseDefaults()
acCirc.Center = New Point3d(CDbl(y), CDbl(x), CDbl(z))
acCirc.Radius = CDbl(r) / 100
acCirc.Layer = layer
acBlkTblRec.AppendEntity(acCirc)
acTrans.AddNewlyCreatedDBObject(acCirc, True)
acTrans.Commit()
End Using
Next
End Sub
Private Sub BtnZeichnen_Click(sender As Object, e As EventArgs) Handles BtnZeichnen.Click
Zeichnen()
End Sub
End Class
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP