使用 C# 以编程方式将 AutoCAD 实体连接到块中

Using C# to Join AutoCAD Entities into a Block Programmatically

我正在尝试编写一种方法,提示用户 select 他们想要组合成一个块的所有实体,然后将它们连接成一个块和 returns 块引用.现在看起来像这样。

        /// <summary>
        /// Returns all entities in an AutoCAD drawing in a list
        /// </summary>
        public static List<Entity> GetEntitiesInDrawing()
        {
            List<Entity> entitiesToReturn = new List<Entity>(); //Blocks that will be returned
            Transaction tr = _database.TransactionManager.StartTransaction();
            DocumentLock docLock = _activeDocument.LockDocument();

            using (tr)
            using (docLock)
            {
                BlockTableRecord blockTableRecord = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(_database), OpenMode.ForRead);
                foreach (ObjectId id in blockTableRecord)
                {
                    try
                    {
                        Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
                        entitiesToReturn.Add(ent);
                    }
                    catch (InvalidCastException)
                    {
                        continue;
                    }
                }
            }
            return entitiesToReturn;
        }
        /// <summary>
        /// Prompts the user for a number of entities and then joins them into a block
        /// </summary>
        public static BlockReference JoinEntities()
        {
            BlockReference blkToReturn = null;
            List<Entity> entitiesToJoin = PromptUserForEntities();
            foreach (Entity ent in entitiesToJoin)
            {
                // ToDo: Join entities into blkToReturn
            }
            return blkToReturn;

        }

我的问题是我不知道如何或是否可以获取实体列表并将它们加入块引用。

基恩在他的博客中对此进行了介绍:Creating an AutoCAD block using .NET

总结:

  1. 使用 Editor.Getselection 这样用户就可以 select 实体
  2. 在 BlockTable 上创建一个 blockTableRecord (BTR)(来自 Database.BlockTableId)
  3. 将所有实体追加到新创建的BTR中,这里您可能需要创建新实体或转移所有权(参见BlockTableRecord.AssumeOwnershipOf方法)
  4. 创建一个指向 BTR 的新块引用
  5. 打开模型 Space(或论文 Space)并将块引用附加到它
  6. 可选:从模型中删除所有原始实体space(避免 重复),如果您没有更改所有权

提到的 post 可以提供帮助,但它会创建新实体(并且不会从模型移动到块定义(步骤 #3)