将当前cad图中实体复制到另一个新的dwg的块中,并插入块——CAD c#实现

发布于:2024-12-18 ⋅ 阅读:(63) ⋅ 点赞:(0)

 本案例为:将当前cad图中实体复制到另一个cad的块中,并插入块。

目前代码尚未调试成功,找bug中......

  public class Demo 
  {
    [CommandMethod("xx1")]
    public void XXA()
    {
            // 获取当前文档和数据库
            Document currentDoc = Application.DocumentManager.MdiActiveDocument;
            Database currentDb = currentDoc.Database;
            Editor ed = currentDoc.Editor;
            
            // 定义块名称
            string blockName = "ExportedBlock";

            try
            {
                // 存储模型空间对象的 ObjectId 到数组中
                ObjectIdCollection objectIds = new ObjectIdCollection();

                using (Transaction tr = currentDb.TransactionManager.StartTransaction())
                {
                    BlockTable bt = (BlockTable)tr.GetObject(currentDb.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

                    // 遍历模型空间中的对象,存储它们的 ObjectId
                    foreach (ObjectId objId in modelSpace)
                    {
                        objectIds.Add(objId);
                    }

                    tr.Commit();
                }

                if (objectIds.Count == 0)
                {
                    ed.WriteMessage("\n模型空间中没有图元对象。");
                    return;
                }

                // 创建一个新图并插入块
                OpenNewDrawingAndInsertBlockFromArray(objectIds, currentDb, blockName);
            }
            catch (Autodesk.AutoCAD.Runtime .Exception ex)
            {
                ed.WriteMessage($"\n发生错误: {ex.Message}");
            }
        }

        private void OpenNewDrawingAndInsertBlockFromArray(ObjectIdCollection objectIds, Database sourceDb, string blockName)
        {
            // 打开新图
            Application.DocumentManager.Add("");
            Document newDoc = Application.DocumentManager.MdiActiveDocument;
            Database newDb = newDoc.Database;

            Editor newEd = newDoc.Editor;

            try
            {
                using (Transaction tr = newDb.TransactionManager.StartTransaction())
                {
                    // 创建一个新的块定义
                    BlockTable newBt = (BlockTable)tr.GetObject(newDb.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord newBlock = new BlockTableRecord
                    {
                        Name = blockName
                    };

                    // 将新块定义添加到块表中
                    newBt.UpgradeOpen(); // 切换为写模式
                    ObjectId newBlockId = newBt.Add(newBlock);
                    tr.AddNewlyCreatedDBObject(newBlock, true);

                    // 克隆源数据库中的对象到新块定义
                    IdMapping idMap = new IdMapping();
                    sourceDb.WblockCloneObjects(objectIds, newBlockId, idMap, DuplicateRecordCloning.Replace, false);

                    // 在新图中插入块
                    BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject(newBt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                    BlockReference blockRef = new BlockReference(Point3d.Origin, newBlockId);
                    modelSpace.AppendEntity(blockRef);
                    tr.AddNewlyCreatedDBObject(blockRef, true);

                    tr.Commit();

                    newEd.WriteMessage($"\n块 '{blockName}' 已成功插入到新图中。");
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                newEd.WriteMessage($"\n发生错误: {ex.Message}");
            }
        }
  }


网站公告

今日签到

点亮在社区的每一天
去签到