使用C#以编程方式将AutoCAD实体加入块中

时间:2015-05-25 21:40:49

标签: c# autocad autocad-plugin

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

        /// <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;

        }

我的问题是我不知道如何或是否有可能获取实体列表并将它们连接到块引用中。

2 个答案:

答案 0 :(得分:4)

基恩在他的博客中提到了这一点:Creating an AutoCAD block using .NET

答案 1 :(得分:2)

总结:

  1. 使用Editor.Getselection,以便用户可以选择实体
  2. 在BlockTable上创建一个blockTableRecord(BTR) Database.BlockTableId)
  3. 将所有实体附加到新创建的BTR,在这里您可能需要创建新实体或移动所有权(请参阅BlockTableRecord.AssumeOwnershipOf方法)
  4. 创建一个指向BTR的新块引用
  5. 打开模型空间(或图纸空间)并将块引用附加到它
  6. 可选:从模型空间中删除所有原始实体(避免 重复),如果您还没有改变所有权
  7. 提到的帖子可以提供帮助,但它会创建新实体(并且不会从模型转移到块定义(步骤#3)