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