Вроде бы тривиальная задача, но убил три дня на нее и толком не решил.
Если через интерфейс легко делаем _solidedit _face, и далее можно мышкой выделять отдельные грани и делать что нужно, то почему через API это оказалось вдруг таким гемором?!
Пытался через .GetNestedEntity (в документации не уточняется, - можно ли его использовать с подобъектами из brep), в сети полно примеров с не brep-подобъектами:
PromptNestedEntityOptions pneo = new PromptNestedEntityOptions("\nSelect Face: ");
pneo.AllowNone = false;
PromptNestedEntityResult pner = ed.GetNestedEntity(pneo);
Но вытащить через нее ничего получилось. Опций у него минимум (AllowNone), а на выходе только сам solid3d без каких-либо вложений. Предварительное переключение переменной SUBOBJSELECTIONMODE на 3 ничего не дает. Пришел к выводу, что метод предназначен только для примитивов, которые могут существовать в модели самостоятельно.
Через .GetEntity тоже не получается:
PromptEntityOptions opts = new PromptEntityOptions("\nВыберите грань 3D-тела: ");
opts.AddAllowedClass(typeof(Solid3d), false);
opts.AllowNone = false; // Обязательный выбор
PromptEntityResult res = ed.GetEntity(opts);
Если указать AddAllowedClass = Solid3d, на выходе только тело полностью. При попытке подсунуть сюда типы Autodesk.AutoCAD.BoundaryRepresentation.Face или Autodesk.AutoCAD.DatabaseServices.Face и при выборе в модели грани через Ctrl дают PromptStatus.Cancel.
Дальше всего получилось продвинуться через SelectionSet в виде:
Application.SetSystemVariable("SUBOBJSELECTIONMODE", (short)3);
// 1. Запрос выбора грани у пользователя
PromptSelectionOptions pso = new PromptSelectionOptions();
pso.MessageForAdding = "\nSelect Face";
pso.SingleOnly = true;
pso.ForceSubSelections = true;
pso.SinglePickInSpace = true;
PromptSelectionResult psrFace = ed.GetSelection(pso);
SelectionSet SSet = psrFace.Value;
SelectedObject mainObj = SSet[0];
SelectedSubObject[] subs = mainObj.GetSubentities();
Этим способом худо-бедно добрался до подобъекта, но во-первых не понимаю, как сделать так, чтобы команда выполнилась сразу после клика на грани. При выборе грани ничего не происходит, команда продолжается только если что-то сделать еще (зум, еще один клик, Enter). Непонятно тогда, - о чем опции .SingleOnly и .SinglePickInSpace?
И самое бредовое и непроходимое - если тело содержит историю (а запись истории включена по умолчанию), нужную грань уже не выбрать. Под курсором подхватываются солиды или грани из истории, но только не грани текущего brep

Чтобы повторно взять грань у предыдущего тела, после выполнения команды попробовал уже все, что можно и в разных конфигурациях (внутри и после транзакции):
solidAfter.RecordGraphicsModified(true);
solidAfter.Highlight();
solidAfter.Unhighlight();
solidAfter.Draw();
ed.UpdateScreen();
ed.Regen();
Ничего не помогает! Только ручное отключение записи истории солида (с наскока даже не нашел, как это сделать через API).
Но предварительно отключать историю у всех объектов или под курсором - как-то фу! Да и должно быть какое-то штатное решение, просто не могу его найти.
На сайте примеров с ручным выделением и получением идентификатора конкретной грани не нашел.
Может кто поделится примером (достаточно только концепции - какой метод и с какими настройками), - как получить идентификатор грани одним кликом.