首页 > 其他分享 >【AutoCAD .NET】不同Database之间拷贝实体

【AutoCAD .NET】不同Database之间拷贝实体

时间:2022-12-07 15:58:55浏览次数:74  
标签:AutoCAD using Database acCirc1 acCirc2 new acTrans NET document

官方代码例子

https://forums.autodesk.com/t5/net/copy-model-space-to-another-database/m-p/9735648


using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("CopyObjectsBetweenDatabases", CommandFlags.Session)]
public static void CopyObjectsBetweenDatabases()
{
  ObjectIdCollection acObjIdColl = new ObjectIdCollection();
 
  // Get the current document and database
  Document acDoc = Application.DocumentManager.MdiActiveDocument;
  Database acCurDb = acDoc.Database;
 
  // Lock the current document
  using (DocumentLock acLckDocCur = acDoc.LockDocument())
  {
      // Start a transaction
      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
      {
          // Open the Block table record for read
          BlockTable acBlkTbl;
          acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                       OpenMode.ForRead) as BlockTable;
 
          // Open the Block table record Model space for write
          BlockTableRecord acBlkTblRec;
          acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                          OpenMode.ForWrite) as BlockTableRecord;
 
          // Create a circle that is at (0,0,0) with a radius of 5
          Circle acCirc1 = new Circle();
          acCirc1.SetDatabaseDefaults();
          acCirc1.Center = new Point3d(0, 0, 0);
          acCirc1.Radius = 5;
 
          // Add the new object to the block table record and the transaction
          acBlkTblRec.AppendEntity(acCirc1);
          acTrans.AddNewlyCreatedDBObject(acCirc1, true);
 
          // Create a circle that is at (0,0,0) with a radius of 7
          Circle acCirc2 = new Circle();
          acCirc2.SetDatabaseDefaults();
          acCirc2.Center = new Point3d(0, 0, 0);
          acCirc2.Radius = 7;
 
          // Add the new object to the block table record and the transaction
          acBlkTblRec.AppendEntity(acCirc2);
          acTrans.AddNewlyCreatedDBObject(acCirc2, true);
 
          // Add all the objects to copy to the new document
          acObjIdColl = new ObjectIdCollection();
          acObjIdColl.Add(acCirc1.ObjectId);
          acObjIdColl.Add(acCirc2.ObjectId);
 
          // Save the new objects to the database
          acTrans.Commit();
      }
 
      // Unlock the document
  }
 
  // Change the file and path to match a drawing template on your workstation
  string sLocalRoot = Application.GetSystemVariable("LOCALROOTPREFIX") as string;
  string sTemplatePath = sLocalRoot + "Template\\acad.dwt";
 
  // Create a new drawing to copy the objects to
  DocumentCollection acDocMgr = Application.DocumentManager;
  Document acNewDoc = acDocMgr.Add(sTemplatePath);
  Database acDbNewDoc = acNewDoc.Database;
 
  // Lock the new document
  using (DocumentLock acLckDoc = acNewDoc.LockDocument())
  {
      // Start a transaction in the new database
      using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction())
      {
          // Open the Block table for read
          BlockTable acBlkTblNewDoc;
          acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId,
                                             OpenMode.ForRead) as BlockTable;
 
          // Open the Block table record Model space for read
          BlockTableRecord acBlkTblRecNewDoc;
          acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc[BlockTableRecord.ModelSpace],
                                              OpenMode.ForRead) as BlockTableRecord;
 
          // Clone the objects to the new database
          IdMapping acIdMap = new IdMapping();
          acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap,
                                     DuplicateRecordCloning.Ignore, false);
 
          // Save the copied objects to the database
          acTrans.Commit();
      }
 
      // Unlock the document
  }
 
  // Set the new document current
  acDocMgr.MdiActiveDocument = acNewDoc;
}

其他

  1. 发现官方例子中(人为修改图层后再进行拷贝),使用IdMapping拷贝实体时,如果实体所在的图层不存在,会自动创建。

  2. 只拷贝图层而不拷贝图层内的实体的话,可参考:
    https://forums.autodesk.com/t5/net/copy-layer-from-another-dwg-in-c/m-p/11169671

  3. 拷贝所有实体:
    https://forums.autodesk.com/t5/net/issue-of-copying-entities-to-other-layer/m-p/11359267

  4. 拷贝所有内容,更加简洁,相当于复制粘贴了整个dwg:
    https://forums.autodesk.com/t5/net/copy-model-space-to-another-database/m-p/9735648

标签:AutoCAD,using,Database,acCirc1,acCirc2,new,acTrans,NET,document
From: https://www.cnblogs.com/redcode/p/16963292.html

相关文章