# 标注实体

线性标注、对齐标注、半径标注、直径标注、角度标注、弧长标注、坐标标注、多重引线。

> ⚠️ **坐标必须传 `Point2D` 实例**，不接受 `[x, y]` 数组——传数组会在构造时崩 `e.clone is not a function`。与 vjmapext 的 `Point2DLike` 习惯不同。
>
> ⚠️ 标注实体 `dim.type` 恒为 `"CUSTOM"`——判别具体类型用 **`dim.customType`**（如 `"ARC_DIMENSION"`）或 `dim.dimensionType`（如 `"ARC_LENGTH"`）。其他示例：`TwoLineAngularDimensionEnt` → `customType="TWO_LINE_ANGULAR_DIMENSION"`/`dimensionType="ANGULAR_2LINE"`；`ThreePointAngularDimensionEnt` → `"THREE_POINT_ANGULAR_DIMENSION"`/`"ANGULAR_3POINT"`。

---

## LinearDimensionEnt — 线性标注

```javascript
const { LinearDimensionEnt, Point2D, Engine } = vjcad;

const dim = new LinearDimensionEnt(
    new Point2D(0, 0),      // startPoint: 标注起点
    new Point2D(100, 0),    // endPoint: 标注终点
    new Point2D(50, 20),    // dimensionLinePoint: 标注线位置
    0                       // dimensionAngle: 0=水平, Math.PI/2=垂直
);
dim.setDefaults();
dim.textHeight = 5;
dim.arrowSize = 3;
dim.textOverride = "L=<>";   // <> 会被替换为测量值
dim.color = 3;
Engine.addEntities(dim);
```

---

## AlignedDimensionEnt — 对齐标注

```javascript
const { AlignedDimensionEnt, Point2D, Engine } = vjcad;

const dim = new AlignedDimensionEnt(
    new Point2D(0, 0),      // xLine1Point: 第一界线点
    new Point2D(100, 50),   // xLine2Point: 第二界线点
    new Point2D(50, 40)     // dimLinePoint: 标注线位置
);
dim.setDefaults();
Engine.addEntities(dim);
```

---

## RadialDimensionEnt — 半径标注

```javascript
const { RadialDimensionEnt, Point2D, Engine } = vjcad;

const dim = new RadialDimensionEnt(
    new Point2D(50, 50),    // center: 圆心
    new Point2D(80, 50),    // chordPoint: 圆周点
    10                      // leaderLength: 引线延伸长度
);
dim.setDefaults();
Engine.addEntities(dim);
```

---

## DiametricDimensionEnt — 直径标注

```javascript
const { DiametricDimensionEnt, Point2D, Engine } = vjcad;

const dim = new DiametricDimensionEnt(
    new Point2D(20, 50),    // chordPoint1: 直径端点1
    new Point2D(80, 50),    // chordPoint2: 直径端点2
    10                      // leaderLength
);
dim.setDefaults();
Engine.addEntities(dim);
```

---

## AngleDimensionEnt — 角度标注

```javascript
const { AngleDimensionEnt, Point2D, Engine } = vjcad;

const dim = new AngleDimensionEnt(
    new Point2D(0, 0),      // vertex: 角度顶点
    new Point2D(100, 0),    // startPoint: 第一条边上的点
    new Point2D(50, 80),    // endPoint: 第二条边上的点
    new Point2D(60, 40)     // arcRadius: 标注弧位置（可传 Point2D 或半径数值）
);
dim.setDefaults();
Engine.addEntities(dim);
```

---

## ArcDimensionEnt — 弧长标注

```javascript
const { ArcDimensionEnt, Point2D, Engine } = vjcad;

const dim = new ArcDimensionEnt(
    new Point2D(50, 50),    // center
    new Point2D(80, 50),    // xLine1Point: 圆弧起点
    new Point2D(50, 80),    // xLine2Point: 圆弧终点
    new Point2D(70, 70)     // arcPoint: 标注位置
);
dim.setDefaults();
Engine.addEntities(dim);
```

---

## OrdinateDimensionEnt — 坐标标注

```javascript
const { OrdinateDimensionEnt, Point2D, Engine } = vjcad;

// 签名：(origin?, definingPoint?, leaderEndPoint?, displayModeOrUseXAxis?) —— 首参 origin 不能省
const dim = new OrdinateDimensionEnt(
    new Point2D(0, 0),      // origin: 坐标原点
    new Point2D(100, 50),   // definingPoint: 被标注点
    new Point2D(120, 70),   // leaderEndPoint: 引线终点
    true                    // useXAxis: true=X坐标, false=Y坐标
);
dim.setDefaults();
Engine.addEntities(dim);
```

---

## MLeaderEnt — 多重引线

```javascript
const { MLeaderEnt, Point2D, Engine } = vjcad;

const mleader = new MLeaderEnt();
mleader.textContent = "标注内容";                    // 属性名 textContent，不是 text
mleader.textPosition = new Point2D(100, 50);        // 先设文字位置（基线方向据此计算）
// 再 addLeaderLine(箭头端点)：自动建引线集群 + 设首顶点 + 算基线方向（不是 leaderPoints 数组）
mleader.addLeaderLine(new Point2D(0, 0));           // 返回 leaderLineIndex；多条引线就多调几次
mleader.textHeight = 5;
mleader.arrowSize = 3;
mleader.setDefaults();
Engine.addEntities(mleader);
```

**相关 API**（d.ts 真实成员）：`addLeader(): number`、`removeLeader(i)`、`addLeaderLine(firstPoint): number`、`addLeaderLineToLeader(leaderIndex): number`、`removeLeaderLine(i)`（⚠️ 仅 `addLeader()` + `addLeaderLineToLeader()` 建出的引线**没有任何顶点**，不会画出引线；要么直接用 `addLeaderLine(firstPoint)`，要么之后 `setFirstVertex(lineIndex, point)` 补首顶点）；属性 `contentType`/`leaderType`/`textContent`/`textPosition`/`enableFrameText`/`enableLanding`/`landingLength`/`landingGap`/`arrowType`/`arrowSize`/`leaderLineColor`/`leaderLineWeight`。

---

## 标注通用属性

| 属性 | 说明 |
|------|------|
| `textHeight` | 文字高度 |
| `arrowSize` | 箭头大小 |
| `textOverride` | 文字覆盖（`<>` 被替换为测量值） |
| `scaleFactor` | 缩放因子 |
| `decimalPlaces` | 小数位数 |

## 标注方法

| 方法 | 说明 |
|------|------|
| `getMeasurement()` | 获取测量值 |
| `getFormattedMeasurement()` | 获取格式化后的文本 |

---

## 关联标注

标注可以关联到源实体，源实体移动时标注自动更新。

```javascript
const { LinearDimensionEnt, LineEnt, Point2D, Engine } = vjcad;

// 创建直线
const line = new LineEnt([0, 0], [100, 0]);
line.setDefaults();
Engine.addEntities(line);

// 创建标注
const dim = new LinearDimensionEnt(
    new Point2D(0, 0), new Point2D(100, 0),
    new Point2D(50, 20), 0
);
dim.setDefaults();
Engine.addEntities(dim);

// 建立关联（必须在 addEntities 之后）
dim.setSourceEntities(
    line.id, -1,     // 起点关联实体 + 段索引：LINE 忽略段索引（填 -1 即可）；PLINE 须填 ≥0 的直线段索引
    line.id, -1,     // 终点关联实体
    'start',         // 起点端点类型
    'end'            // 终点端点类型
);
```

**端点类型**：`'start'`、`'end'`、`'midpoint'`（类型里还有 `'center'`，但 Linear/Aligned 关联**未实现**，回退为起点）

**精确定位**（parameterT，0~1 表示在线段上的比例位置）：

```javascript
dim.setSourceEntities(
    line.id, -1,
    line.id, -1,
    undefined, undefined,
    0.25,       // startParameterT: 1/4 处
    0.75        // endParameterT: 3/4 处
);
```
