Back to blog
Gebruikersinvoer en objectselectie in een AutoCAD C# add-in
Intermediate

Gebruikersinvoer en objectselectie in een AutoCAD C# add-in

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

De Editor als communicatiekanaal

De Editor is jouw verbinding met de AutoCAD-gebruiker. Via de Editor vraag je punten op, lees je waarden in, toon je berichten, en laat je de gebruiker objecten selecteren. Alle Get*-methoden van de Editor blokkeren het programma totdat de gebruiker invoer geeft of op Escape drukt — dat is exact het gedrag dat je wilt in een interactief commando.

// Haal altijd de Editor op via het actieve document
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor   ed  = doc.Editor;

Een punt opvragen

De meest gebruikte invoer: de gebruiker klikt een punt in de tekening.

[CommandMethod("KLEVERPUNTTEST")]
public void PuntTest()
{
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

    // Stel de prompt in die de gebruiker ziet in de commandoregel
    PromptPointOptions opties = new PromptPointOptions("\nKlik een startpunt: ");
    opties.AllowNone = false; // Escape is niet toegestaan

    // Vraag het punt op — blokkeert totdat de gebruiker klikt of Escape drukt
    PromptPointResult resultaat = ed.GetPoint(opties);

    // Controleer altijd de status vóór je het resultaat gebruikt
    if (resultaat.Status != PromptStatus.OK)
    {
        ed.WriteMessage("\nGeannuleerd.");
        return;
    }

    Point3d punt = resultaat.Value;
    ed.WriteMessage($"\nGeselecteerd punt: X={punt.X:F2}, Y={punt.Y:F2}");
}

Een tweede punt met rubber-band lijn

Bij het opvragen van een tweede punt kun je een "rubber-band" lijn tonen vanuit het eerste punt:

// Vraag startpunt op
PromptPointResult start = ed.GetPoint("\nStartpunt: ");
if (start.Status != PromptStatus.OK) return;

// Vraag eindpunt op met rubber-band lijn vanuit het startpunt
PromptPointOptions eindOpties = new PromptPointOptions("\nEindpunt: ");
eindOpties.UseBasePoint = true;
eindOpties.BasePoint    = start.Value; // rubber-band trekt van dit punt

PromptPointResult eind = ed.GetPoint(eindOpties);
if (eind.Status != PromptStatus.OK) return;

// Nu heb je beide punten
double lengte = start.Value.DistanceTo(eind.Value);
ed.WriteMessage($"\nLengte: {lengte:F2}");

Tekst en getallen opvragen

// Tekst invoeren
PromptStringOptions tekstOpties = new PromptStringOptions("\nVoer een labelnaam in: ");
tekstOpties.AllowSpaces = true;        // spaties toegestaan in de invoer
PromptResult tekstResultaat = ed.GetString(tekstOpties);

if (tekstResultaat.Status != PromptStatus.OK) return;
string label = tekstResultaat.StringResult;

// Geheel getal invoeren
PromptIntegerOptions intOpties = new PromptIntegerOptions("\nAantal kopieën: ");
intOpties.DefaultValue = 1;   // standaardwaarde als gebruiker Enter drukt
intOpties.LowerLimit   = 1;   // minimum toegestane waarde
intOpties.UpperLimit   = 100; // maximum toegestane waarde
intOpties.AllowNone    = false;

PromptIntegerResult intResultaat = ed.GetInteger(intOpties);
if (intResultaat.Status != PromptStatus.OK) return;
int aantalKopieen = intResultaat.Value;

// Decimale waarde invoeren
PromptDoubleOptions dubbelOpties = new PromptDoubleOptions("\nStraal (mm): ");
dubbelOpties.DefaultValue   = 10.0;
dubbelOpties.AllowNegative  = false;
dubbelOpties.AllowZero      = false;

PromptDoubleResult dubbelResultaat = ed.GetDouble(dubbelOpties);
if (dubbelResultaat.Status != PromptStatus.OK) return;
double straal = dubbelResultaat.Value;

Eén object laten selecteren

Laat de gebruiker één entiteit aanwijzen in de tekening:

[CommandMethod("KLEVERENTITEITINFO")]
public void EntiteitInfo()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Editor   ed  = doc.Editor;
    Database db  = doc.Database;

    // Vraag de gebruiker om één object te selecteren
    PromptEntityOptions selectOpties = new PromptEntityOptions("\nSelecteer een object: ");
    selectOpties.SetRejectMessage("\nGeen geldig object — probeer opnieuw.");
    // Beperk tot specifiek type (optioneel):
    // selectOpties.AddAllowedClass(typeof(Line), exactMatch: true);

    PromptEntityResult selectResultaat = ed.GetEntity(selectOpties);
    if (selectResultaat.Status != PromptStatus.OK) return;

    // Lees de eigenschappen van de geselecteerde entiteit
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        Entity ent = tr.GetObject(selectResultaat.ObjectId, OpenMode.ForRead) as Entity;

        ed.WriteMessage($"\nType:  {ent.GetType().Name}");
        ed.WriteMessage($"\nLaag:  {ent.Layer}");
        ed.WriteMessage($"\nKleur: {ent.Color}");

        tr.Commit();
    }
}

Meerdere objecten selecteren (SelectionSet)

Voor bulkbewerkingen laat je de gebruiker een selectieset maken:

[CommandMethod("KLEVERLAAGWISSEL")]
public void LaagWisselSelectie()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Editor   ed  = doc.Editor;
    Database db  = doc.Database;

    // Laat de gebruiker meerdere objecten selecteren
    // GetSelection() accepteert kader, window, kruisjes — alles wat AutoCAD kent
    PromptSelectionResult selectie = ed.GetSelection();

    if (selectie.Status != PromptStatus.OK)
    {
        ed.WriteMessage("\nNiets geselecteerd.");
        return;
    }

    SelectionSet set = selectie.Value;
    ed.WriteMessage($"\n{set.Count} object(en) geselecteerd.");

    // Vraag de doellaag op
    PromptResult laagInvoer = ed.GetString("\nNaam van doellaag: ");
    if (laagInvoer.Status != PromptStatus.OK) return;

    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;

        // Controleer of de doellaag bestaat
        if (!lt.Has(laagInvoer.StringResult))
        {
            ed.WriteMessage($"\nLaag '{laagInvoer.StringResult}' bestaat niet.");
            return;
        }

        ObjectId doelLaagId = lt[laagInvoer.StringResult];
        int teller = 0;

        // Pas alle geselecteerde objecten aan
        foreach (SelectedObject selObj in set)
        {
            if (selObj == null) continue;

            Entity ent = tr.GetObject(selObj.ObjectId, OpenMode.ForWrite) as Entity;
            if (ent == null) continue;

            ent.LayerId = doelLaagId;
            teller++;
        }

        tr.Commit();
        ed.WriteMessage($"\n{teller} object(en) verplaatst naar laag '{laagInvoer.StringResult}'.");
    }
}

Selectie filteren op type of laag

Met een SelectionFilter beperk je de selectie tot specifieke objecttypes of laagnamen — de gebruiker kan dan alleen de relevante objecten aanwijzen:

// Filter: alleen lijnen op een specifieke laag
TypedValue[] filterWaarden = {
    new TypedValue((int)DxfCode.LayerName, "KC-CONSTRUCTIE"), // DXF 8 = laagnaam
    new TypedValue((int)DxfCode.Start,     "LINE")             // DXF 0 = objecttype
};

SelectionFilter filter = new SelectionFilter(filterWaarden);
PromptSelectionResult gefilterd = ed.GetSelection(filter);

if (gefilterd.Status == PromptStatus.OK)
{
    ed.WriteMessage($"\n{gefilterd.Value.Count} lijn/lijnen op laag KC-CONSTRUCTIE geselecteerd.");
}

Conclusie

De Editor API geeft je alles wat je nodig hebt voor professionele gebruikersinteractie: punten, tekst, getallen, enkelvoudige selectie en selectiesets met filters. Combineer dit met de entiteits- en laagbeheer uit de vorige posts en je hebt de bouwstenen voor vrijwel elk AutoCAD-automatiseringsscenario.

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.