Hoe werkt de AutoCAD database?
Alles wat je in een AutoCAD-tekening ziet — lijnen, cirkels, tekst, blokken — is een object in de AutoCAD database (ook wel de DWG-database of Database-object). Je werkt er altijd mee via een transactie: open, schrijf, commit. Doe je dat niet correct, dan gaat de tekening corrupt of crasht AutoCAD.
Het basispatroon ziet er zo uit:
// Haal de actieve database op (de huidige geopende tekening)
Database db = HostApplicationServices.WorkingDatabase;
// Open een transactie — alles binnen deze using-block is atomair
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// ... objecten toevoegen ...
// Commit: sla alle wijzigingen op in de database
tr.Commit();
}
// Als tr.Commit() niet wordt aangeroepen (bijv. door een exception),
// wordt alles automatisch teruggedraaid (rollback)
De ModelSpace ophalen
Objecten voeg je toe aan de ModelSpace — de tekenruimte die je ziet wanneer je in een tekening werkt. Je haalt die op via de BlockTable:
using Autodesk.AutoCAD.DatabaseServices;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// Haal de BlockTable op (bevat alle blokkendefinities, incl. ModelSpace)
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
// Open de ModelSpace-record voor schrijven
BlockTableRecord modelSpace = tr.GetObject(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
// ... voeg hier objecten toe aan modelSpace ...
tr.Commit();
}
Een lijn tekenen
using Autodesk.AutoCAD.Geometry; // voor Point3d en Vector3d
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// Maak een lijn aan van punt (0,0,0) naar (100,50,0)
// Point3d(x, y, z) — voor 2D-tekeningen is z altijd 0
Line lijn = new Line(
new Point3d(0, 0, 0), // startpunt
new Point3d(100, 50, 0) // eindpunt
);
// Stel eigenschappen in vóór het toevoegen
lijn.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(
Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 1); // rood (ACI kleurindex 1)
lijn.LineWeight = LineWeight.LineWeight050; // 0.50 mm lijndikte
// Voeg de lijn toe aan de ModelSpace
ms.AppendEntity(lijn);
// Registreer de entiteit in de transactie (verplicht na AppendEntity)
tr.AddNewlyCreatedDBObject(lijn, true);
tr.Commit();
}
Een cirkel tekenen
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// Maak een cirkel aan met middelpunt (50, 50, 0) en straal 25
Circle cirkel = new Circle(
new Point3d(50, 50, 0), // middelpunt
Vector3d.ZAxis, // normaalvector (ZAxis = cirkel ligt in XY-vlak)
25.0 // straal
);
ms.AppendEntity(cirkel);
tr.AddNewlyCreatedDBObject(cirkel, true);
tr.Commit();
}
Een polylijn tekenen
Een Polyline bestaat uit meerdere segmenten. Je voegt punten één voor één toe:
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// Maak een polylijn aan (2D, ligt altijd in het XY-vlak)
Polyline pline = new Polyline();
// Voeg hoekpunten toe — AddVertexAt(index, punt2d, bolling, beginbreedte, eindbreedte)
// Bolling = 0 voor rechte segmenten; gebruik een waarde voor bogen
pline.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
pline.AddVertexAt(1, new Point2d(100, 0), 0, 0, 0);
pline.AddVertexAt(2, new Point2d(100, 80), 0, 0, 0);
pline.AddVertexAt(3, new Point2d(0, 80), 0, 0, 0);
// Sluit de polylijn (verbindt het laatste punt met het eerste)
pline.Closed = true;
ms.AppendEntity(pline);
tr.AddNewlyCreatedDBObject(pline, true);
tr.Commit();
}
Tekst toevoegen
AutoCAD heeft twee soorten tekst: DBText (enkelvoudige tekstregel) en MText (meerregelige tekst met opmaak). Voor eenvoudige labels gebruik je DBText:
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// Enkelvoudige tekstregel
DBText tekst = new DBText();
tekst.Position = new Point3d(10, 90, 0); // positie van het tekstvak
tekst.TextString = "KleverCAD Add-in"; // inhoud
tekst.Height = 5.0; // teksthoogte in tekeneenheden
tekst.HorizontalMode = TextHorizontalMode.TextLeft;
tekst.VerticalMode = TextVerticalMode.TextBase;
ms.AppendEntity(tekst);
tr.AddNewlyCreatedDBObject(tekst, true);
tr.Commit();
}
Alles samen: een volledig commando
Hier is een compleet [CommandMethod] dat een rechthoek met middelpunttekst tekent:
[CommandMethod("KLEVERRECHTHOEK")]
public void TekenRechthoek()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord ms = tr.GetObject(
bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// Rechthoek als polylijn
Polyline rect = new Polyline();
rect.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
rect.AddVertexAt(1, new Point2d(200, 0), 0, 0, 0);
rect.AddVertexAt(2, new Point2d(200, 100),0, 0, 0);
rect.AddVertexAt(3, new Point2d(0, 100),0, 0, 0);
rect.Closed = true;
ms.AppendEntity(rect);
tr.AddNewlyCreatedDBObject(rect, true);
// Label in het midden
DBText label = new DBText();
label.Position = new Point3d(100, 50, 0);
label.TextString = "KleverCAD";
label.Height = 8.0;
label.HorizontalMode = TextHorizontalMode.TextMid;
label.VerticalMode = TextVerticalMode.TextVerticalMid;
label.AlignmentPoint = new Point3d(100, 50, 0);
ms.AppendEntity(label);
tr.AddNewlyCreatedDBObject(label, true);
tr.Commit();
ed.WriteMessage("\nRechthoek aangemaakt op layer 0.");
}
}
Conclusie
Met transacties, de BlockTable en BlockTableRecord heb je alle bouwstenen om AutoCAD-tekeningen programmatisch op te bouwen. Houd altijd het patroon aan: open transactie ? voeg entiteit toe ? AppendEntity ? AddNewlyCreatedDBObject ? commit.
In de volgende post behandelen we hoe je lagen aanmaakt en beheert vanuit je add-in — zodat je objecten altijd op de juiste laag terechtkomen.
Comments
No comments yet — be the first!
Leave a comment
Sign in to skip moderation — anonymous comments are reviewed before appearing.