Copy Objects between Databases
 
 
 

You can copy objects between two databases. The Clone function is used to copy objects within the same database, while the WblockCloneObjects method is used to copy objects from one database to another. The WblockCloneObjects method is a member of the Database object. The WblockCloneObjects method requires the following parameters:

Copy an object from one database to another

This example creates two Circle objects, then uses the WblockCloneObjects method to copy the circles into a new drawing. The example also creates a new drawing using the acad.dwt file before the circles are copied.

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("CopyObjectsBetweenDatabases", CommandFlags.Session)> _
Public Sub CopyObjectsBetweenDatabases()
  Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
 
  '' Get the current document and database
  Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  Dim acCurDb As Database = acDoc.Database
 
  '' Lock the current document
  Using acLckDocCur As DocumentLock = acDoc.LockDocument()
 
      '' Start a transaction
      Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
 
          '' Open the Block table for read
          Dim acBlkTbl As BlockTable
          acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
 
          '' Open the Block table record Model space for write
          Dim acBlkTblRec As BlockTableRecord
          acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                          OpenMode.ForWrite)
 
          '' Create a circle that is at (0,0,0) with a radius of 5
          Dim acCirc1 As Circle = New Circle()
          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
          Dim acCirc2 As Circle = New Circle()
          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()
      End Using
 
      '' Unlock the document
  End Using
 
  '' Change the file and path to match a drawing template on your workstation
  Dim sLocalRoot As String = Application.GetSystemVariable("LOCALROOTPREFIX")
  Dim sTemplatePath As String = sLocalRoot + "Template\acad.dwt"
 
  '' Create a new drawing to copy the objects to
  Dim acDocMgr As DocumentCollection = Application.DocumentManager
  Dim acNewDoc As Document = acDocMgr.Add(sTemplatePath)
  Dim acDbNewDoc As Database = acNewDoc.Database
 
  '' Lock the new document
  Using acLckDoc As DocumentLock = acNewDoc.LockDocument()
 
      '' Start a transaction in the new database
      Using acTrans = acDbNewDoc.TransactionManager.StartTransaction()
 
          '' Open the Block table for read
          Dim acBlkTblNewDoc As BlockTable
          acBlkTblNewDoc = acTrans.GetObject(acDbNewDoc.BlockTableId, _
                                             OpenMode.ForRead)
 
          '' Open the Block table record Model space for read
          Dim acBlkTblRecNewDoc As BlockTableRecord
          acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc(BlockTableRecord.ModelSpace), _
                                                OpenMode.ForRead)
 
          '' Clone the objects to the new database
          Dim acIdMap As IdMapping = New IdMapping()
          acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, _
                                     DuplicateRecordCloning.Ignore, False)
 
          '' Save the copied objects to the database
          acTrans.Commit()
      End Using
 
      '' Unlock the document
  End Using
 
  '' Set the new document current
  acDocMgr.MdiActiveDocument = acNewDoc
End Sub

C#

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.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.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;
}
VBA/ActiveX Code Reference