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/EndWidth — ConstantWidth 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.
Comments
No comments yet — be the first!
Leave a comment
Sign in to skip moderation — anonymous comments are reviewed before appearing.