Back to blog
Polylijnen aanmaken en analyseren met C# in AutoCAD
Intermediate

Polylijnen aanmaken en analyseren met C# in AutoCAD

David De Lombaerde David De Lombaerde · juli 10, 2026 · 14 min read

Polylijnen zijn de meest gebruikte geometrie in AutoCAD-tekeningen: contouren, tracés, muuropeningen, parkeerplaatsen. In dit artikel leer je hoe je via C# lichte polylijnen (Polyline) aanmaakt, bogen toevoegt met de bulge-waarde, oppervlaktes en omtrekken berekent, en bestaande polylijnen analyseert en aanpast.

Lightweight Polyline vs 2D Polyline

AutoCAD heeft twee polylijnklassen: Polyline (lichtgewicht, aanbevolen) en Polyline2d (oud formaat). Gebruik altijd Polyline voor nieuwe code — hij is compacter, sneller en ondersteunt alle moderne functies. Polyline3d is voor 3D-puntenreeksen zonder bogen.

Een eenvoudige polylijn aanmaken

[CommandMethod("MAAKPOLYLIJN")]
public void MaakPolylijn()
{
    var doc = Application.DocumentManager.MdiActiveDocument;
    var db  = doc.Database;

    using (var tr = db.TransactionManager.StartTransaction())
    {
        var ms = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

        var pl = new Polyline();
        pl.AddVertexAt(0, new Point2d(0,   0),   0, 0, 0);   // punt 0
        pl.AddVertexAt(1, new Point2d(100, 0),   0, 0, 0);   // punt 1
        pl.AddVertexAt(2, new Point2d(100, 50),  0, 0, 0);   // punt 2
        pl.AddVertexAt(3, new Point2d(0,   50),  0, 0, 0);   // punt 3
        pl.Closed = true;    // sluit de rechthoek
        pl.ConstantWidth = 0.5;

        ms.AppendEntity(pl);
        tr.AddNewlyCreatedDBObject(pl, true);
        tr.Commit();
    }
}

Bogen toevoegen met de bulge-waarde

Een boog in een polylijn wordt bepaald door de bulge-waarde van een segment. Bulge = tan(hoek/4), waarbij hoek de insluithook van de boog is. Een halfcirkel heeft bulge ±1.0. Positief = boog links van de richting, negatief = rechts.

// Maak een D-vorm: rechte lijn + halve cirkel
var pl = new Polyline();
pl.AddVertexAt(0, new Point2d(0,  0),  0.0, 0, 0);  // segment 0→1 is recht
pl.AddVertexAt(1, new Point2d(0, 50),  1.0, 0, 0);  // segment 1→2 is halve cirkel (bulge=1)
pl.AddVertexAt(2, new Point2d(0,  0),  0.0, 0, 0);
pl.Closed = false;
// Bulge wijzigen na aanmaken:
// pl.SetBulgeAt(1, 1.0);

Punten uitlezen en analyseren

public void AnalyseerPolylijn(Transaction tr, ObjectId plId)
{
    var pl = (Polyline)tr.GetObject(plId, OpenMode.ForRead);
    var ed = Application.DocumentManager.MdiActiveDocument.Editor;

    ed.WriteMessage($"\nAantal segmenten : {pl.NumberOfVertices - (pl.Closed ? 0 : 1)}");
    ed.WriteMessage($"\nGesloten         : {pl.Closed}");
    ed.WriteMessage($"\nOppervlakte      : {pl.Area:F2} mm²");
    ed.WriteMessage($"\nLengte           : {pl.Length:F2} mm");

    for (int i = 0; i < pl.NumberOfVertices; i++)
    {
        var pt     = pl.GetPoint2dAt(i);
        var bulge  = pl.GetBulgeAt(i);
        var segType = Math.Abs(bulge) < 1e-6 ? "lijn" : "boog";
        ed.WriteMessage($"\n  Punt {i}: ({pt.X:F1}, {pt.Y:F1})  bulge={bulge:F3}  [{segType}]");
    }
}

Een punt toevoegen aan een bestaande polylijn

public void VoegPuntToe(Transaction tr, ObjectId plId, Point2d punt, double bulge = 0.0)
{
    var pl = (Polyline)tr.GetObject(plId, OpenMode.ForWrite);
    int idx = pl.NumberOfVertices;
    pl.AddVertexAt(idx, punt, bulge, 0, 0);
}

Polylijn inkorten of splitsen op een punt

public void SplitsPolylijn(Database db, Transaction tr, ObjectId plId, double parameter)
{
    var pl = (Polyline)tr.GetObject(plId, OpenMode.ForRead);

    // SplitBy geeft een reeks nieuwe curves terug
    var curves = new DBObjectCollection();
    pl.Explode(curves); // alternatief: pl.GetSubEntities()

    var ms = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    foreach (Entity ent in curves)
    {
        ms.AppendEntity(ent);
        tr.AddNewlyCreatedDBObject(ent, true);
    }

    pl.UpgradeOpen();
    pl.Erase();
}

Polylijn offsetten

Offset geeft een nieuwe curve terug op de opgegeven afstand. Handig voor het aanmaken van bufferstroken of wanddikte.

public void OffsetPolylijn(Database db, Transaction tr, ObjectId plId, double afstand)
{
    var pl = (Polyline)tr.GetObject(plId, OpenMode.ForRead);
    var ms = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

    // Offset geeft een CurveCollection terug
    foreach (Entity ent in pl.GetOffsetCurves(afstand))
    {
        ms.AppendEntity(ent);
        tr.AddNewlyCreatedDBObject(ent, true);
    }
}

Polylijn naar lijn/boog-segmenten exploderen

Gebruik Explode() om een polylijn om te zetten naar losse Line- en Arc-objecten. Nuttig als je individuele segmenten wil verwerken of exporteren.

public void ExplodeerNaarSegmenten(Database db, Transaction tr, ObjectId plId)
{
    var pl = (Polyline)tr.GetObject(plId, OpenMode.ForRead);
    var ms = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

    var segmenten = new DBObjectCollection();
    pl.Explode(segmenten);

    foreach (Entity seg in segmenten)
    {
        if (seg is Line l)
            Application.DocumentManager.MdiActiveDocument.Editor
                .WriteMessage($"\nLijn: {l.Length:F2} mm");
        else if (seg is Arc a)
            Application.DocumentManager.MdiActiveDocument.Editor
                .WriteMessage($"\nBoog: R={a.Radius:F2} hoek={a.TotalAngle * 180 / Math.PI:F1}°");

        ms.AppendEntity(seg);
        tr.AddNewlyCreatedDBObject(seg, true);
    }
    pl.UpgradeOpen();
    pl.Erase();
}

Oppervlakteberekening in bulk

Voor een stuklijst of hoeveelhedenraming kun je alle gesloten polylijnen doorlopen en hun oppervlaktes optellen.

public double BerekenTotaalOppervlak(Database db, Transaction tr)
{
    double totaal = 0;
    var ms = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);

    foreach (ObjectId id in ms)
    {
        if (tr.GetObject(id, OpenMode.ForRead) is Polyline pl && pl.Closed)
            totaal += pl.Area;
    }
    return totaal;
}

Veelgemaakte fouten

Bulge bij het laatste punt van een open polylijn — de bulge van het laatste vertex heeft geen effect bij een open polylijn (er is geen volgend punt). Stel hem in op 0.

ConstantWidth vs StartWidth/EndWidthConstantWidth stelt alle segmenten gelijk in. Voor variabele breedte gebruik je SetStartWidthAt en SetEndWidthAt per vertex.

Area van een open polylijn — AutoCAD berekent de oppervlakte door de polylijn virtueel te sluiten. Controleer altijd of de polylijn echt gesloten is (pl.Closed == true) als je oppervlakteberekeningen uitvoert.

Samenvatting

Polylijnen zijn de ruggengraat van de meeste AutoCAD-tekeningen. Met de .NET API kun je ze aanmaken, analyseren, splitsen, offsetten en exploderen. Bijzonder krachtig is de bulge-waarde voor bogen en de Area-property voor directe oppervlakteberekening — dit zijn functies die handmatig uren werk kosten maar geautomatiseerd in milliseconden draaien.

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.