> **本文回答**：`HatchEnt` 填充 —— 外环 + 内环挖洞、颜色填充、图案填充、透明度。

## 一、纯色填充

构造只收外环点集（位置参数，不是 options 对象）；颜色/透明度用属性赋值：

```js
const hatch = new vjmapext.HatchEnt([[0,0], [200,0], [200,100], [0,100]]);
hatch.fillColor = 0xffcc44;
hatch.fillOpacity = 0.5;
mapcadLayer.addEntity(hatch);
```

外环会由 SDK 自动闭合（`closeRing`），但最好自行保证首尾一致。

## 二、带洞的填充

用 `addInnerLoop` 加内环挖洞：

```js
const hatch = new vjmapext.HatchEnt([[0,0], [400,0], [400,200], [0,200]]);
hatch.addInnerLoop([[50,50],[120,50],[120,120],[50,120]]);
hatch.addInnerLoop([[200,80],[280,80],[280,170],[200,170]]);
hatch.fillColor = 0x00aaff;
hatch.fillOpacity = 0.4;
mapcadLayer.addEntity(hatch);
```

环结构存在 `hatch.loops: { points, type: 'outer'|'inner' }[]`。也可以 `addOuterLoop` 追加第二个外环。

## 三、图案填充

```js
const hatch = new vjmapext.HatchEnt([[0,0],[200,0],[200,200],[0,200]]);
hatch.patternName = 'ANSI31';   // 图案名（属性赋值，非构造参数）
hatch.patternScale = 10;
hatch.patternAngle = 45 * Math.PI / 180;   // 字段存弧度；45° 要自己换算
hatch.color = 0x000000;
mapcadLayer.addEntity(hatch);
```

常见内置图案：`SOLID`（实色）、`ANSI31`（斜线）、`ANSI37`（交叉斜线）、`NET`（网格）、`LINE`、`DASH`、`EARTH`、`GRASS`。

### 自定义 PAT 图案

```js
vjmapext.HatchEnt.registerPattern('*MYHATCH,自定义\n45, 0,0, 0,10');  // PAT 格式字符串
vjmapext.HatchEnt.getCustomPatternNames();                          // 已注册名列表
vjmapext.HatchEnt.getPatternDef('ANSI31');                          // 查 PAT 定义
hatch.patternName = 'MYHATCH';
```

`hatch.isSolid` getter 可判当前是否实色填充。另有 `hatch.origin: Point2D` 控制图案原点（默认 (0,0)，参与 generateHatch 的 originX/Y）。

## 四、运行时修改

```js
hatch.loops[0].points[0] = vjmapext.Point2D.fromArray([-10, -10]);
hatch.addInnerLoop([[250,30],[350,30],[350,100],[250,100]]);
hatch.changed();
```

## 五、与 Polygon / Fill 的差别

| 维度 | HatchEnt | PolylineEnt(闭合, 带填充) | [primitive/polygon-fill](../../../vjmap/references/primitive/polygon-fill.md) |
|---|---|---|---|
| 数据源 | CAD 实体 | CAD 实体 | GeoJSON + fill 图层 |
| 带洞 | ✅ `addInnerLoop` | ❌ | ✅ |
| 图案填充 | ✅ | 基础 | 需要 `fillPattern` |
| 大量填充 | 慢 | 慢 | 快（WebGL 批量） |

## 六、性能

| 数量 | 建议 |
|---|---|
| < 1000 | HatchEnt 可用 |
| > 1000 | 转 GeoJSON + fill 图层 |
| 大图案纹理 | patternScale 变大减少图元 |

## 七、常见坑

1. **构造是位置参数**：`new HatchEnt(outerPoints)`——没有 `outerLoop`/`holes` options 键；内环走 `addInnerLoop`。
2. **洞在外环外面** → 被忽略。先判断点在多边形内。
3. **patternAngle 单位** → 字段存**弧度**（UI 输入框才按度显示，bundle 内部 `×Math.PI/180` 转换）；直接赋值 `45` 是 45 rad 不是 45°。
4. **以为 fillColor 默认不填** → 默认就是 `0x3BB2D0`（`fillOpacity=0.4`），本来就填充；想换色直接赋值。
5. **外环自相交** → 渲染有锯齿 / 错误；先做自交检测。
6. **patternScale 过小** → 图元密成一片像实色；从 5 开始调。
