雪山飞狐_lzh 发表于 2010-12-24 19:50:19

对容器类调用deepclone有点奇怪,呵呵      
      public static void Test10()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;

            using (var tr = db.TransactionManager.StartTransaction())
            {
                var bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                var blkdef = tr.GetObject(bt["1"], OpenMode.ForRead) as BlockTableRecord;
                var blkdefnew = new BlockTableRecord();
                blkdefnew.Name = "2";
                var id = bt.Add(blkdefnew);
                tr.AddNewlyCreatedDBObject(blkdefnew, true);

                var ids = new ObjectIdCollection(blkdef.Cast<ObjectId>().ToArray());
                db.DeepCloneObjects(ids, id, new IdMapping(), true);

                var ents =
                  blkdefnew.Cast<ObjectId>()
                  .Select(i => tr.GetObject(i, OpenMode.ForWrite) as Entity);

                foreach (var ent in ents)
                  ent.ColorIndex = 2;

                tr.Commit();
            }

      }

mkhsj928 发表于 2010-12-25 13:16:13

回复 sieben 的帖子

新图块建成了,但在程序中修改新块的内容,原块中的内容会跟着修改。
但是退出程序用CAD的块编辑器修改,原块不会变。

mkhsj928 发表于 2010-12-25 14:14:34

非常感谢飞狐版主!真强啊!
想破脑袋也想不出来要这样这才克隆块。

sieben 发表于 2010-12-25 17:15:29

本帖最后由 sieben 于 2010-12-25 17:21 编辑

回复 lzh741206 的帖子

这里虽然使用的是DeepCloneObjects函数,其实还是把旧块记录里面的实体一个个打开,再克隆,最后放进新块记录里面。若块记录内实体无其他特殊关连数据,与使用Clone函数应该是一样的作用及效率.
-----------------
var ids = new ObjectIdCollection(blkdef.Cast<ObjectId>().ToArray());
var ents = blkdefnew.Cast<ObjectId>().Select(i => tr.GetObject(i, OpenMode.ForWrite) as Entity);
这两行代码很炫呀!Cast是新东西还是0708版本就有?谢谢斑竹!

雪山飞狐_lzh 发表于 2010-12-25 19:49:31

本帖最后由 lzh741206 于 2010-12-25 19:50 编辑

Cast是Linq的扩展,是.Net 3.5的,和Cad的版本无关
页: 1 [2]
查看完整版本: 复制并重定义块的问题