Back to blog
Entiteiten aanmaken met de AutoCAD .NET API: lijnen, cirkels en tekst
Intermediate

Entiteiten aanmaken met de AutoCAD .NET API: lijnen, cirkels en tekst

David De Lombaerde David De Lombaerde · juli 9, 2026 · 9 min read

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.

Share this article

LinkedIn WhatsApp X

Comments

No comments yet — be the first!

Leave a comment

Sign in to skip moderation — anonymous comments are reviewed before appearing.