本案例为:将当前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}");
}
}
}