// SelectionCommands.cs
// Выбор всех полилиний с указанным количеством вершин. © Andrey Bushman, 2013
// Заказ сотрудников расчётного отдела нашей компании.
#define SECOND_VARIANT
//Microsoft
using System;
//Autodesk
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using App = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rtm = Autodesk.AutoCAD.Runtime;
// Bushman
using Bushman.CAD.DatabaseServices;
[assembly: Rtm.ExtensionApplication(typeof(Bushman.CAD.Commands.SelectionCommands))]
[assembly: Rtm.CommandClass(typeof(Bushman.CAD.Commands.SelectionCommands))]
namespace Bushman.CAD.Commands {
public sealed class SelectionCommands : Rtm.IExtensionApplication {
[Rtm.CommandMethod("PlineSel", Rtm.CommandFlags.Modal)]
public void PolylineSelectionViaVertexCount() {
App.Document doc = cad.DocumentManager.MdiActiveDocument;
Db.Database db = doc.Database;
Ed.Editor ed = doc.Editor;
Ed.PromptIntegerOptions intOpt = new Ed.PromptIntegerOptions("\nКоличество вершин в полилиниях, подлежащих выборке");
intOpt.AllowNegative = false;
intOpt.AllowNone = false;
intOpt.AllowZero = false;
Ed.PromptIntegerResult intRes = ed.GetInteger(intOpt);
if (intRes.Status != Ed.PromptStatus.OK) {
ed.WriteMessage("\nНе было выбрано ни одного примитива.\n");
return;
}
#if !SECOND_VARIANT
Boolean rejectObjectsFromNonCurrentSpace = true;
Db.TypedValue[] filterList = new Db.TypedValue[2];
#else
Db.TypedValue[] filterList = new Db.TypedValue[3];
Db.LayoutManager layMng = Db.LayoutManager.Current;
String curLayoutName = layMng.GetCurrentSpaceName();
filterList[2] = new Db.TypedValue(410, curLayoutName);
#endif
filterList[0] = new Db.TypedValue((Int32)Db.DxfCode.Start, "LWPOLYLINE");
filterList[1] = new Db.TypedValue(90, intRes.Value);
Ed.SelectionFilter filter = new Ed.SelectionFilter(filterList);
Ed.PromptSelectionOptions selOpt = new Ed.PromptSelectionOptions();
selOpt.SingleOnly = false;
#if !SECOND_VARIANT
selOpt.RejectObjectsFromNonCurrentSpace = rejectObjectsFromNonCurrentSpace;
#endif
// Нужно в текущем пространстве (Модель\Лист) выделить все примитивы согласно фильтру
// так, чтобы отображались в т. ч. и ручки. Причём указанное выделение должно оставаться
// активным и по завершению работы кода
Ed.PromptSelectionResult selRes = ed.SelectAll(filter);
if (selRes.Status != Ed.PromptStatus.OK) {
ed.WriteMessage("\nНе было выбрано ни одного примитива.\n");
return;
}
ed.WriteMessage("\nКоличество выбранных примитивов: {0}\n", selRes.Value.Count);
// Результаты выборки подсвечиваю с отображением "ручек":
ed.SetImpliedSelection(selRes.Value.GetObjectIds());
// Если нужно просто подсветить объекты, без отображения "ручек" то следует
// использовать Entity.Highlight(). Чтобы снять такую подсветку, нужно вызывать
// метод Entity.Unhighlight()
// Чтобы очистить текущий набор выборки следует поступать так:
// ed.SetImpliedSelection(new Db.ObjectId[0]);
}
#region IExtensionApplication Members
public void Initialize() {
Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("\nPlineSel. © Andrey Bushman, 2013\n");
}
public void Terminate() {
// throw new NotImplementedException();
}
#endregion
}
}