明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2208|回复: 4

.NET有COM的CopyObjects吗?找到方法了!

[复制链接]
发表于 2009-9-21 00:41 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-9-21 1:43:08 编辑

com有object.CopyObjects(Objects[, Owner][, IDPairs]) ,object是MSITStore:E:\New%20Study\CAD\acadautovba.chm::/idh_database_object.htm">Database, MSITStore:E:\New%20Study\CAD\acadautovba.chm::/idh_document_object.htm">Document用于将一个document的图形复制到另外一个document当中,而且在 CopyObjects 操作期间,被 Objects 参数中的源对象拥有或引用的对象也将被复制。

不知道.net有没有相同功能的函数?查看了对象浏览器的document和database对象,都没有类似的方法

 楼主| 发表于 2009-9-21 01:23 | 显示全部楼层

找到方法了!

使用WblockCloneObjects

注意红色的部分,不过不知道能不能复制块参照,并且把块参照的引用块定义也一起复制过去,com里的copyobjects方法可是可以做到这一点的,我试验过。
 

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;
}
发表于 2009-9-21 09:28 | 显示全部楼层

还有深度Clone

db.DeepCloneObjects(...)

 楼主| 发表于 2009-9-21 19:27 | 显示全部楼层

深度clone有什么不一样吗?

发表于 2009-9-21 19:43 | 显示全部楼层

深层拷贝-复制数据

浅层拷贝-只复制引用

具体的要在使用的过程中去理解它

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-11 00:21 , Processed in 0.155749 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表