using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rt = Autodesk.AutoCAD.Runtime;
using Wn = Autodesk.AutoCAD.Windows;
...
private static Db.ObjectId[] impsel;
...
Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
...
// Эту регистрацию нужно выполнить для всех уже имеющихся документов в
// DocumentManager, а так же для всех открываемых (показываю не текущем документе):
doc.ImpliedSelectionChanged += doc_ImpliedSelectionChanged;
...
static void doc_ImpliedSelectionChanged(object sender, EventArgs e) {
Ap.Document doc = (Ap.Document) sender;
Ed.PromptSelectionResult psr = doc.Editor.SelectImplied();
impsel = psr.Status == Ed.PromptStatus.OK ? psr.Value.GetObjectIds() : null;
}
...
/// <summary>
/// Код, который выполняется каждый раз перед тем, как будет отображено
/// контекстное меню выбранного в редакторе AutoCAD элемента.
/// </summary>
/// <param name="sender">Объект расширения контекстного меню.</param>
/// <param name="e">Пустой аргумент (заглушка).</param>
public static void cme_Popup(object sender, EventArgs e) {
Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
Ed.Editor ed = doc.Editor;
Ed.PromptSelectionResult result;
if (impsel != null) {
ed.SetImpliedSelection(impsel);
result = ed.SelectImplied();
}
else {
Db.TypedValue[] tv = GetDynBlockFilter(BlockRiseMarkExtension.RiseMarkBlockName);
Ed.SelectionFilter filter = new Ed.SelectionFilter(tv);
Ed.PromptSelectionOptions pso = new Ed.PromptSelectionOptions();
pso.MessageForAdding = String.Format("Выберите экземпляры блока '{0}', которым желаете назначить якорь",
BlockRiseMarkExtension.RiseMarkBlockName);
pso.SingleOnly = false;
result = ed.GetSelection(pso, filter);
}
...