唯杰地图 logo唯杰地图
VJMAP
EN

dimensions

vjmapext/references/entity/dimensions.md 4.7 KB106 行
原文

本文回答:四种标注 —— 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);
});

八、常见坑

  1. 构造是位置参数:new LinearDimEnt(p1, p2, dimLine, textHeight)——传 options 对象会得到全空实体(不报错,同 TextEnt)。
  2. 属性名:startPoint/endPoint/chordPoint/leaderLength,不是 definition1/2/circlePoint/leaderEndPoint。
  3. LinearDim 无 rotation:方向由 dimLinePoint 的轴向偏移自动决定。
  4. 大量标注影响性能:每个 dim 都是多实体组合;超过 1 万建议按 zoom 过滤显示。
  5. 改定义点后文字没更新:调 changed() 让 SDK 重算。
  6. toGeoJSON() 里没有文本字符串:标注文字(含 textOverride)被矢量字形描边成轮廓几何 feature——想在 GeoJSON 里搜 "自定义标注" 搜不到,要验证覆盖值看 dim.textOverride 属性本身。
  7. 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)。
  8. toJSON/fromJSON 会丢标注(1.0.1):Serializer 没有 DIM* 分支——标注存成 data: {}、读回被静默丢弃(见 drawing/serialize);需要持久化时自存定义点再重建。