dimensions
本文回答:四种标注 ——
LinearDimEnt(线性)/AlignedDimEnt(对齐)/AngleDimEnt(角度)/RadialDimEnt(半径)。
⚠️ 所有标注构造都是位置参数,不是 options 对象。
一、线性标注 LinearDimEnt
// new LinearDimEnt(startPoint?, endPoint?, dimLinePoint?, textHeight?)
const dim = new vjmapext.LinearDimEnt([0, 0], [200, 50], [100, 100], 10);
dim.color = 0xff0000;
mapcadLayer.addEntity(dim);
尺寸线自动取水平/垂直:由 dimLinePoint 相对 startPoint→endPoint 两轴偏移量大者决定(d.ts 注释),没有 rotation 属性。
属性(d.ts 真实成员)
| 属性 | 说明 |
|---|---|
startPoint / endPoint |
被测量的两端点(不叫 definition1/2) |
dimLinePoint |
尺寸线位置(影响偏离距离与方向) |
textHeight |
尺寸文字高度 |
arrowSize |
箭头大小 |
extensionLineGap / extensionLineExtend |
延伸线间隙 / 伸出量 |
precision |
数值精度 |
textOverride |
自定义文字,覆盖自动计算 |
textColor |
文字颜色 |
ownerRefs |
关联实体(setOwnerRefs / updateFromOwners) |
二、对齐标注 AlignedDimEnt
构造与 LinearDimEnt 相同:(startPoint, endPoint, dimLinePoint, textHeight)。尺寸线与 startPoint→endPoint 平行:
const dim = new vjmapext.AlignedDimEnt([0, 0], [100, 100], [120, 80], 10);
mapcadLayer.addEntity(dim);
三、角度标注 AngleDimEnt
// new AngleDimEnt(vertex?, startPoint?, endPoint?, arcPoint?, textHeight?)
const dim = new vjmapext.AngleDimEnt(
[0, 0], // 角顶点
[100, 0], // 起始射线端点
[70, 70], // 终止射线端点
[80, 40], // 弧线所在位置
10
);
mapcadLayer.addEntity(dim);
四、半径标注 RadialDimEnt
// new RadialDimEnt(center?, chordPoint?, textHeight?, leaderLength?)
const dim = new vjmapext.RadialDimEnt(
[0, 0], // 圆心
[100, 0], // 圆上一点(chordPoint),决定半径
10,
60 // 引线长度(leaderLength,不是 leaderEndPoint 坐标)
);
mapcadLayer.addEntity(dim);
五、自定义文字
dim.textOverride = '42.5m'; // 覆盖自动测量值
dim.changed();
还原:dim.textOverride = ''; dim.changed();
六、交互编辑
选中后夹点对应构造里的各定义点;拖拽自动重算数值。
七、场景示例:矩形四边标注
const rect = [[0,0],[200,0],[200,100],[0,100]];
const pairs = [
{ a: rect[0], b: rect[1], dimLine: [100, -30] }, // 底
{ a: rect[1], b: rect[2], dimLine: [230, 50] }, // 右
{ a: rect[2], b: rect[3], dimLine: [100, 130] }, // 顶
{ a: rect[3], b: rect[0], dimLine: [-30, 50] } // 左
];
pairs.forEach(p => {
const d = new vjmapext.LinearDimEnt(p.a, p.b, p.dimLine, 10);
mapcadLayer.addEntity(d);
});
八、常见坑
- 构造是位置参数:
new LinearDimEnt(p1, p2, dimLine, textHeight)——传 options 对象会得到全空实体(不报错,同 TextEnt)。 - 属性名:
startPoint/endPoint/chordPoint/leaderLength,不是definition1/2/circlePoint/leaderEndPoint。 - LinearDim 无 rotation:方向由 dimLinePoint 的轴向偏移自动决定。
- 大量标注影响性能:每个 dim 都是多实体组合;超过 1 万建议按 zoom 过滤显示。
- 改定义点后文字没更新:调
changed()让 SDK 重算。 toGeoJSON()里没有文本字符串:标注文字(含textOverride)被矢量字形描边成轮廓几何 feature——想在 GeoJSON 里搜"自定义标注"搜不到,要验证覆盖值看dim.textOverride属性本身。- ownerRefs 关联标注:
setOwnerRefs([{entityId, role:"start"|"end", pointType:"start"|"end"|"mid"|"center", segmentIndex?, parameterT?}])后,owner 实体几何变化调dim.updateFromOwners(cad.store)让 dim 端点跟随(LINE owner move 后 dim.start/end 精确跟随)。想自动跟随(同内置 DIM* 命令的做法):addEntity(dim)之后再mapcadLayer.dimReactorManager.register(dim.id, dim.ownerRefs)——之后 owner 的几何changed()会在下一帧渲染前自动updateFromOwners(只改样式的styleChanged()不触发)。注意 1.0.1 的删除清理读的是entity:deleted里并不存在的entityId字段(实际载荷是{ entity }),owner 被删后标注只是停在原位、注册不会自动摘除;删 dim 前可手动dimReactorManager.unregister(dim.id)。 toJSON/fromJSON会丢标注(1.0.1):Serializer 没有 DIM* 分支——标注存成data: {}、读回被静默丢弃(见 drawing/serialize);需要持久化时自存定义点再重建。