我正在开发AutoCAD插件,在某个时候我需要获得在块内修改过的实体。块仅包含一个实体。我为相应的BlockTableRecord制作了事件处理程序,它响应"Modified"事件。我想得到一个已经修改过的实体,但我通过这个方法得到的只是来自模型空间的实体,这是所需实体的早期版本。这就是我计划如何获得我的实体:
public static Entity GetEntityFromBlock(HooverSpace.Map.WorkSpace ws, BlockReference br, ObjectId entId)
{
Entity ent = null;
ObjectId blockId;
if (ws.acBlkTbl.Has(br.Name))
blockId = ws.acBlkTbl[br.Name];
else
return null;
Entity searchEnt = (Entity)entId.GetObject(OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)ws.acTrans.GetObject(blockId, OpenMode.ForRead);
foreach (ObjectId blkEntId in btr)
{
Entity blockEnt = (Entity)ws.acTrans.GetObject(blkEntId, OpenMode.ForWrite);
if (blockEnt.BlockName == btr.Name && blockEnt.Layer == searchEnt.Layer)
{
ent = blockEnt.Clone() as Entity;
break;
}
}
ent.TransformBy(br.BlockTransform);
return ent;
}
我被困在这个问题上,如果有人能帮助我,我将非常高兴。
编辑:我通过从br.BlockTableRecord
id获取BlockTableRecord解决了这个问题。谢谢大家!
尝试使用var _BTR = ws.acTrans.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
来解决问题