# 实体完整目录

所有 VjCAD 实体类型的构造方式、属性和方法。

---

## LineEnt — 直线

```javascript
const { LineEnt, Engine } = vjcad;
const line = new LineEnt([0, 0], [100, 100]);
line.setDefaults();
line.color = 1;
Engine.addEntities(line);
```

| 属性 | 说明 |
|------|------|
| `startPoint` / `endPoint` | 起点/终点（Point2D） |
| `Length` | 长度（只读） |

---

## CircleEnt — 圆

```javascript
const { CircleEnt, Engine } = vjcad;
const circle = new CircleEnt([50, 50], 30);  // 圆心, 半径
circle.setDefaults();
Engine.addEntities(circle);
```

| 属性 | 说明 |
|------|------|
| `center` | 圆心（Point2D） |
| `radius` | 半径 |
| `area` | 面积（只读） |
| `circumference` | 周长（只读） |

---

## ArcEnt — 圆弧

```javascript
const { ArcEnt, Point2D, Engine } = vjcad;

// 方式1：圆心 + 半径 + 角度（弧度）
const arc = new ArcEnt([50, 50], 30, 0, Math.PI / 2);  // 0° 到 90° 逆时针
arc.setDefaults();
Engine.addEntities(arc);

// 方式2：三点定弧
const arc2 = new ArcEnt();
arc2.initBy3Pt(new Point2D(0, 0), new Point2D(50, 30), new Point2D(100, 0));
arc2.setDefaults();
Engine.addEntities(arc2);
```

| 属性 | 说明 |
|------|------|
| `center` | 圆心 |
| `radius` | 半径 |
| `startAngle` / `endAngle` | 起始/终止角度（弧度） |
| `startPoint` / `endPoint` | 起点/终点（只读） |
| `midPoint` | 中点（只读） |
| `length` | 弧长（只读） |
| `totalAngle` | 圆心角（只读） |
| `isClockwise` | 是否顺时针（只读） |

**角度规则**：0 = 正右方（3点钟），逆时针增加，`Math.PI / 2` = 正上方，`Math.PI` = 正左方。

---

## PolylineEnt — 多段线

```javascript
const { PolylineEnt, Engine } = vjcad;

// 方式1：setPoints 批量设置
const pline = new PolylineEnt();
pline.setPoints([[0, 0], [100, 0], [100, 60], [0, 60]]);
pline.isClosed = true;
pline.setDefaults();
Engine.addEntities(pline);

// 方式2：链式 addPoint
const pline2 = new PolylineEnt();
pline2.addPoint([0, 0])
      .addPoint([50, 0], 0.5)   // 带凸度的弧段
      .addPoint([100, 0]);
pline2.setDefaults();
Engine.addEntities(pline2);

// 方式3：带圆弧段
const pline3 = new PolylineEnt();
pline3.setPoints([
    [0, 0],               // 直线段
    [[50, 0], 0.5],       // 弧段（凸度 0.5，逆时针）
    [100, 0],
    [[100, 50], -0.5]     // 弧段（负凸度，顺时针）
]);
pline3.setDefaults();
Engine.addEntities(pline3);
```

**凸度说明**：
- `0` — 直线段
- `1` — 半圆弧（逆时针，圆心角 180°）
- `-1` — 半圆弧（顺时针）
- `bulge = tan(圆心角 / 4)`，圆心角单位为弧度
- 常用值：90° 圆角 → `tan(π/8) ≈ 0.4142`，60° → `≈ 0.2679`，120° → `≈ 0.5774`

**注意**：`bulge=1` 是半圆弧（180°），不是 90° 圆角！绘制圆角矩形应使用 `Math.tan(Math.PI / 8) ≈ 0.4142`。

| 属性 | 说明 |
|------|------|
| `bulgePoints` | 顶点集合（BulgePoints） |
| `isClosed` | 是否闭合 |
| `length` | 总长度（只读） |
| `area` | 面积（只读；仅对无凸度、闭合、不自交的多段线有效，否则返回 `-1`，如圆角矩形） |
| `isCCW` | 是否逆时针（只读） |
| `globalWidth` | 全局宽度 |

| 方法 | 说明 |
|------|------|
| `setPoints(points)` | 批量设置点 |
| `addPoint([x,y], bulge?)` | 添加点（支持链式调用） |
| `addPoints(points)` | 批量追加点 |
| `getPoints()` | 获取所有顶点坐标 |
| `getPointsWithBulge()` | 获取顶点和凸度信息 |
| `getSubEnts()` | 获取子实体（线段和弧段） |

---

## TextEnt — 单行文字

```javascript
const { TextEnt, Engine } = vjcad;
const text = new TextEnt();
text.insertionPoint = [0, 100];
text.text = "Hello WebCAD";
text.height = 10;
text.rotation = 0;           // 弧度
text.textAlignment = 5;      // 居中
text.setDefaults();
Engine.addEntities(text);
```

**文本对齐方式（textAlignment）**：

```
7=左上     8=中上     9=右上
4=左中     5=中心     6=右中
1=左下     2=中下     3=右下
```

**特殊字符**：`%%d` → °（度），`%%c` → Ø（直径），`%%p` → ±（正负）

| 属性 | 说明 |
|------|------|
| `insertionPoint` | 插入点 |
| `text` | 文本内容 |
| `height` | 字高 |
| `rotation` | 旋转角度（弧度） |
| `textAlignment` | 对齐方式（1-9） |
| `widthFactor` | 宽度因子 |
| `obliqueAngle` | 倾斜角度（**度**，与 `rotation` 用弧度不同；直接作为 `obliqueDeg` 传给文字渲染） |

---

## MTextEnt — 多行文字

```javascript
const { MTextEnt, Engine } = vjcad;
const mtext = new MTextEnt();
mtext.insertionPoint = [0, 100];
mtext.text = "第一行\n第二行\n第三行";
mtext.height = 8;
mtext.maxWidth = 80;
mtext.setDefaults();
Engine.addEntities(mtext);
```

**MText 格式代码**（通过 `contents` 属性使用）：

| 代码 | 功能 |
|------|------|
| `\Cn;` | 颜色（1红 2黄 3绿 4青 5蓝 6洋红 7白） |
| `\L` / `\l` | 下划线 开/关 |
| `\O` / `\o` | 上划线 开/关 |
| `\K` / `\k` | 删除线 开/关 |
| `\Hn.nx;` | 相对高度（如 `\H1.5x;`） |
| `\Wn;` | 宽度因子 |
| `\P` | 换行 |
| `{}` | 格式分组 |

```javascript
mtext.contents = "{\\C1;红色}{\\C2;黄色}{\\C3;绿色}";
```

| 属性 | 说明 |
|------|------|
| `insertionPoint` | 插入点 |
| `text` | 文本内容（支持 `\n` 换行） |
| `contents` | 原生 MText 格式内容 |
| `height` | 字高 |
| `maxWidth` | 最大宽度（自动换行） |
| `textAttachment` | 附着点位置（1-9，小键盘布局：7=左上(默认)、5=中心、1=左下；不是 DXF 的 1=左上） |
| `rotation` | 旋转角度 |
| `rowSpcFac` | 行间距因子 |
| `showBorder` | 是否显示边框 |
| `backgroundFill` | 是否启用背景 |
| `backgroundFillColor` | 背景颜色 |
| `backgroundScaleFactor` | 背景扩展比例 |

---

## SplineEnt — 样条曲线

```javascript
const { SplineEnt, Engine } = vjcad;
const spline = new SplineEnt();
spline.setFitPoints([[0, 0], [50, 100], [100, 50], [150, 100]]);
// ⚠️ 必须传 [x,y] 数组——实现按 e[0]/e[1] 索引，传 Point2D 对象会得到 NaN
// isClosed 是只读 getter（首尾点重合即闭合），模块/严格模式下赋值会抛 TypeError
spline.setDefaults();
Engine.addEntities(spline);
```

---

## EllipseEnt — 椭圆

```javascript
const { EllipseEnt, Engine } = vjcad;
const ellipse = new EllipseEnt([50, 50], 40, 20, 0);  // 圆心, 长半轴, 短半轴, 长轴角(弧度)
ellipse.setDefaults();
// majorAxis 是长轴角度（number，弧度），不是向量；radiusRatio 只读（= minorRadius / majorRadius），赋值会抛 TypeError
Engine.addEntities(ellipse);
```

---

## DotEnt — 点

```javascript
const { DotEnt, Engine } = vjcad;
const dot = new DotEnt([50, 50]);
dot.setDefaults();
Engine.addEntities(dot);
```

---

## SolidEnt — 实体填充

```javascript
const { SolidEnt, Engine } = vjcad;

// 三角形填充
const solid = new SolidEnt([0, 0], [100, 0], [50, 80]);
solid.setDefaults();
solid.color = 1;
Engine.addEntities(solid);

// 四边形填充：按周边顺序给点（不是 AutoCAD 的 Z 序，Z 序会画成沙漏）
const solid2 = new SolidEnt([0, 0], [100, 0], [100, 80], [0, 80]);
solid2.setDefaults();
Engine.addEntities(solid2);
```

---

## RayEnt — 射线 / XLineEnt — 构造线

```javascript
const { RayEnt, XLineEnt, Engine } = vjcad;

// 射线（从起点向一个方向无限延伸）；第二参是**弧度制角度**，不是方向点
const ray = new RayEnt([0, 0], Math.PI / 4);   // 45°
ray.setDefaults();
Engine.addEntities(ray);

// 构造线（向两个方向无限延伸）；第二参同为角度（0 = 水平）
const xline = new XLineEnt([50, 50], 0);
xline.setDefaults();
Engine.addEntities(xline);
```

---

## BezierEnt — 贝塞尔曲线

```javascript
const { BezierEnt, Engine } = vjcad;
const bezier = new BezierEnt(bulgePointsCollection);
bezier.setDefaults();
Engine.addEntities(bezier);
```

---

## ImageRefEnt — 图片引用

```javascript
const { ImageRefEnt, Engine } = vjcad;
const img = new ImageRefEnt();
// 需设置图片源和裁剪模式后使用
img.setDefaults();
Engine.addEntities(img);
```

---

## 通用属性（所有实体）

| 属性 | 说明 | 示例 |
|------|------|------|
| `color` | 颜色索引 | 1红 2黄 3绿 4青 5蓝 6洋红 7白，256 随层，0 随块 |
| `layer` | 图层名 | `"图层A"` |
| `lineType` | 线型名 | `"CONTINUOUS"`, `"HIDDEN"`, `"CENTER"` |
| `lineTypeScale` | 线型比例 | `1.0` |
| `lineWeight` | 线宽（0.01mm） | `15`（0.15mm），`-1` 随层 |

## 通用方法（所有实体）

| 方法 | 说明 |
|------|------|
| `setDefaults()` | 应用系统默认属性（**必须在设置其他属性前调用**） |
| `boundingBox()` | 获取边界框 `{ pt1, pt2, width, height, center }` |
| `clone()` | 创建深拷贝 |
| `move(from, to)` | 移动（`Point2D` 或 `[x,y]`） |
| `rotate(center, angle)` | 旋转（弧度；`Point2D` 或 `[x,y]`） |
| `scale(center, factor)` | 缩放（`Point2D` 或 `[x,y]`） |
| `mirror(p1, p2)` | 镜像（`Point2D` 或 `[x,y]`） |

> 上表"数组也行"只对基础实体成立；**标注族（`*DimensionEnt`）与 `MLeaderEnt` 的 move/rotate/scale/mirror 只收 `Point2D`**，传数组会得到 NaN 坐标。
