> **本文回答**：四种标注 —— `LinearDimEnt`（线性）/ `AlignedDimEnt`（对齐）/ `AngleDimEnt`（角度）/ `RadialDimEnt`（半径）。

⚠️ 所有标注构造都是**位置参数**，不是 options 对象。

## 一、线性标注 LinearDimEnt

```js
// 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` 平行：

```js
const dim = new vjmapext.AlignedDimEnt([0, 0], [100, 100], [120, 80], 10);
mapcadLayer.addEntity(dim);
```

## 三、角度标注 AngleDimEnt

```js
// 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

```js
// new RadialDimEnt(center?, chordPoint?, textHeight?, leaderLength?)
const dim = new vjmapext.RadialDimEnt(
  [0, 0],      // 圆心
  [100, 0],    // 圆上一点（chordPoint），决定半径
  10,
  60           // 引线长度（leaderLength，不是 leaderEndPoint 坐标）
);
mapcadLayer.addEntity(dim);
```

## 五、自定义文字

```js
dim.textOverride = '42.5m';      // 覆盖自动测量值
dim.changed();
```

还原：`dim.textOverride = ''; dim.changed();`

## 六、交互编辑

选中后夹点对应构造里的各定义点；拖拽自动重算数值。

## 七、场景示例：矩形四边标注

```js
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](../drawing/serialize.md)）；需要持久化时自存定义点再重建。
