探秘AutoCAD中的标注关联

新开一张图,创建一个直线AcDbLine,创建一个对齐标注AcDbAlignedDimension,关联直线的起点和终点。那么CAD创建了哪些对象,通过ARXDBG分析如下:

AcDbLine,句柄271
AcDbAlignedDimension,句柄272
AcDbDictionary,句柄273,名称ACAD_DIMASSOC,属于AcDbAlignedDimension的扩展词典
AcDbFontTableRecord,句柄274,未公开
AcDbLayerTableRecord,句柄275,名称Defpoints
AcDbBlockTableRecord,句柄276,名称*D1,标注的匿名块
AcDbBlockBegin,句柄277,AcDbBlockEnd,句柄278,一直到句柄283,标注内的实体
AcDbDimAssoc,句柄284,直线与标注的关联对象

所以直线与标注能自动关联,其实是多了一个AcDbDimAssoc的中间对象,负责直线改变时通知标注联动。

标注点与直线的端点关联是通过AcDbOsnapPointRef来记录。

不过C#里并没有开放AcDbDimAssoc和AcDbOsnapPointRef的接口,只能通过C++/CLI编程扩展。

封装后的示例如下,lineid是预先创建的直线Id,dimid是预先创建的标注id。

FullSubentPath idPath = new FullSubentPath(lineid, SubentityType.Edge, 0);
OsnapPointRef ptr1 = new OsnapPointRef(PointRef.OsnapType.OsnapStart, idPath, idPath, e.StartPoint);
OsnapPointRef ptr2 = new OsnapPointRef(PointRef.OsnapType.OsnapEnd, idPath, idPath, e.EndPoint);
DimAssoc da = new DimAssoc();
da.DimObjId = dimid;
da.SetPointRef(DimAssoc.PointType.Xline1Point, ptr1);
da.SetPointRef(DimAssoc.PointType.Xline2Point, ptr2);
da.UpdateDimension();
ObjectId dimAssocId = da.PostDimAssoc(dimid);

  

posted @ 2020-12-09 10:48  智图CAD  阅读(815)  评论(0编辑  收藏  举报