Метод, который предлагает пользователю выбрать группу и получить идентификатор этой группы
Я пытаюсь написать метод, который предлагает пользователю выбрать группу и возвращает ObjectId группы, чтобы я мог использовать его позже. Прямо сейчас этот метод выглядит так:
public static ObjectId PromptUserForGroup()
{
using (Transaction tr = _database.TransactionManager.StartTransaction())
using (DocumentLock docLock = _activeDocument.LockDocument())
{
PromptSelectionResult activeSelectionPrompt = _editor.GetSelection();
if (activeSelectionPrompt.Status == PromptStatus.OK)
{
ObjectId[] ids = activeSelectionPrompt.Value.GetObjectIds();
foreach (ObjectId id in ids)
{
Group groupToCheck = tr.GetObject(id, OpenMode.ForWrite) as Group;
if (groupToCheck != null)
{
return groupToCheck.Id;
}
}
}
else
{
throw new IOException();
}
return ObjectId.Null;
}
}
Когда я вызываю метод, он запрашивает пользователя так, как я хочу. Однако, когда я выбираю группу, она всегда возвращает ObjectId.Null, то есть не понимает, что я выбираю группу. Я не знаю, что случилось или как это исправить.
1 ответ
Решение
На самом деле группа не является производной от сущности, поэтому не находится в пространстве модели (BlockTableRecord). В результате на чертеже нет группы, кроме словаря.
Когда пользователь выбирает что-то, вам нужно найти группу, к которой он принадлежит. Вот пример кода:
[CommandMethod("FindGroup")]
static public void FindGroup()
{
Document doc =
Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptEntityResult acSSPrompt =
ed.GetEntity("Select the entity to find the group");
if (acSSPrompt.Status != PromptStatus.OK)
return;
using (Transaction Tx =
db.TransactionManager.StartTransaction())
{
Entity ent = Tx.GetObject(acSSPrompt.ObjectId,
OpenMode.ForRead) as Entity;
ObjectIdCollection ids = ent.GetPersistentReactorIds();
bool bPartOfGroup = false;
foreach (ObjectId id in ids)
{
DBObject obj = Tx.GetObject(id, OpenMode.ForRead);
if (obj is Group)
{
Group group = obj as Group;
bPartOfGroup = true;
ed.WriteMessage(
"Entity is part of " + group.Name + " group\n");
}
}
if (!bPartOfGroup)
ed.WriteMessage(
"Entity is Not part of any group\n");
Tx.Commit();
}
}