c# - 提示用户选择一个组并获取该组 ID 的方法

标签 c# autocad-plugin

我正在尝试编写一种方法,提示用户选择一个组并返回该组的 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,这意味着它没有意识到我正在选择一个组。我不知道出了什么问题或如何解决。

最佳答案

实际上组不是从实体派生的,因此不在模型空间(BlockTableRecord)上。结果在绘图上没有Group,而是在Dictionary上。

当用户选择某物时,您需要找到它所属的组。这是一个示例代码:

[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();
  }
}

来源:http://adndevblog.typepad.com/autocad/2012/04/how-to-detect-whether-entity-is-belong-to-any-group-or-not.html

关于c# - 提示用户选择一个组并获取该组 ID 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31526061/

相关文章:

c# - CloudBlockBlob.DownloadTextAsync 返回无效文本

c# - 如何通过 Lambda 表达式创建 AutoCAD 对象并返回它

c# - 如何使用 Windows 窗体创建 AutoCAD 图层?

c# - 将数组传递给 WCF 服务

c# - Enum.Parse 方法返回一个不同于作为参数传递给它的枚举成员

c# - 我在这个项目上过度扩张了吗?

c++ - AutoCAD C++ AcDbEntity 何时需要打开读取?

c# - RedirectToPage 丢失 Razor Pages 中的路由对象项内容

c# - 在 AutoCAD 中限制另一个形状内的形状移动

c# - 在 C# 中将父类转换为子类