...
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
...
Ed.PromptEntityOptions peo = new Ed.PromptEntityOptions(
String.Format("Укажите экземпляр блока '{0}'",
BlockRiseMarkExtension.AnchorBlockName));
peo.AllowNone = false;
peo.AllowObjectOnLockedLayer = true;
// Перед тем, как вызвать метод AddAllowedClass, нужно обязательно
// вызвать метод SetRejectMessage, иначе в AutoCAD 2009 получим Fatal
// Error, а в более новых - Exception.
peo.SetRejectMessage("\nНеобходимо указать вхождение блока якоря.\n");
peo.AddAllowedClass(typeof(Db.BlockReference), true);
using (doc.LockDocument()) {
using (Db.Transaction tr = db.TransactionManager
.StartTransaction()) {
Ed.PromptEntityResult per = null;
Boolean isAnchor = false;
// Запрашиваем выбор до тех пор, пока либо не будет выбран,
// якорь, либо не будет нажата клавиша Esc (отмена).
do {
per = ed.GetEntity(peo);
if (per.Status != Ed.PromptStatus.OK) {
ed.WriteMessage("Не был указан якорь. Операция" +
"прервана.\n");
return;
}
Db.BlockReference br = tr.GetObject(per.ObjectId,
Db.OpenMode.ForRead) as Db.BlockReference;
Db.ObjectId bdefId = br.IsDynamicBlock ?
br.DynamicBlockTableRecord : br.BlockTableRecord;
Db.BlockTableRecord btr = tr.GetObject(bdefId,
Db.OpenMode.ForRead) as Db.BlockTableRecord;
isAnchor = String.Equals(btr.Name,
BlockRiseMarkExtension.AnchorBlockName,
StringComparison.CurrentCultureIgnoreCase);
if (!isAnchor) ed.WriteMessage("\nУказанный примитив" +
" не является якорем.\n");
} while (!isAnchor);
// Возвращаем обратно предварительный выбор, чтобы отметки остались
// выбранными по завершению операции назначения якоря
ed.SetImpliedSelection(risemarks);
...