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();
}
} 回复 sieben 的帖子
新图块建成了,但在程序中修改新块的内容,原块中的内容会跟着修改。
但是退出程序用CAD的块编辑器修改,原块不会变。 非常感谢飞狐版主!真强啊!
想破脑袋也想不出来要这样这才克隆块。 本帖最后由 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版本就有?谢谢斑竹!
本帖最后由 lzh741206 于 2010-12-25 19:50 编辑
Cast是Linq的扩展,是.Net 3.5的,和Cad的版本无关
页:
1
[2]