复制并重定义块的问题
我是想实现从现有块复制来新建一个块,在新块中需更改原块的部分内容,代码如下:private ObjectId mCloneBlock(ObjectId oldBlockId,string sNewBlockName)
{
ObjectId newBlockId = ObjectId.Null;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForWrite) as BlockTable;
BlockTableRecord btr=db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
BlockTableRecord oldbtr=OldBlockId.GetObject(OpenMode.ForRead) as BlockTableRecord;
IdMapping idmap=new IdMapping();
BlockTableRecord newbtr = oldbtr.DeepClone(btr, idmap, false);
foreach (ObjectId id in newbtr)
{
Entity ent = id.GetObject(OpenMode.ForRead) as Entity;
if (ent != null)
{
ent.UpgradeOpen();
ent.ColorIndex = 210;//更改实体颜色
}
}
newbtr.Name = sNewBlockName;
newBlockId = bt.Add(newbtr);
tr.AddNewlyCreatedDBObject(newbtr, true);
tr.Commit();
}
return newBlockId;
}
但是更改之后原块的内容也被更改了,why?
你是重结构上面改变的肯定要变,你可以做一个实验。你在一幅图里插入另一幅图,不分解。然后再重复操作,CAD对你说,图里面已经有这个块名的对象了,是否覆盖。我想道理是一样的。 我是复制了一份出来呀?跟clone()一样的道理嘛。clone()出来一个实体,你改这个clone()出来的实体,原实体是不会变的! 但是你明明说的是更改了内容。 我是更改了内容,我更改的是复制出来的内容,不是更改原实体的内容啊 “在新块中需更改原块的部分内容”应更正为“在新块中需更改部分实体” 只要你改了后的块名和以前的块名一样,那以前的应该就会变成你改后的块。 我想可能是对Deepclone 没理解透。谁能解释一下? 我看了你的代码,觉得没有问题,以前我好象也这样试过,也是没有成功,后来改用Clone(),请问你的新图块出来了吗?若出来了在下一次事务单独打开新图块,再修改颜色,看旧图块还会不会跟着变?
我以前用VBA写了一个插入属性块的程序,插入的属性块里面的颜色会跟着变。但实际上我是想为每个此名的块定义一个颜色号。
页:
[1]
2