在数据库之间复制对象
 
 

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:

用户可以在两个数据库之间复制对象。Clone 函数用于在同一个数据库内部复制对象,而 WblockCloneObjects 方法用于从一个数据库复制对象到另一个数据库。WblockCloneObjects 方法是 Database 对象的成员。WblockCloneObjects 方法需要下列参数:

从一个数据库复制对象到另一个数据库中

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.

本例创建两个圆对象,然后使用 WblockCloneObjects 方法复制圆到一个新的图形中。示例在复制圆之前利用 acad.dwt 文件创建一个新的图形。

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)
 
          '' 创建一个圆心为(0,0,0),半径为 5 的圆    Create a circle that is at (0,0,0) with a radius of 5
          Dim acCirc1 As Circle = 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)
 
          '' 创建一个圆心为(0,0,0),半径为 7 的圆   Create a circle that is at (0,0,0) with a radius of 7
          Dim acCirc2 As Circle = 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()
      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;
 
          // 创建一个圆心为(0,0,0),半径为 5 的圆    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);
 
          // 创建一个圆心为(0,0,0),半径为 7 的圆   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;
}
VBA/ActiveX 代码参考