hatch
本文回答:
HatchEnt填充 —— 外环 + 内环挖洞、颜色填充、图案填充、透明度。
一、纯色填充
构造只收外环点集(位置参数,不是 options 对象);颜色/透明度用属性赋值:
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 加内环挖洞:
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 追加第二个外环。
三、图案填充
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 图案
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)。
四、运行时修改
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 |
|---|---|---|---|
| 数据源 | CAD 实体 | CAD 实体 | GeoJSON + fill 图层 |
| 带洞 | ✅ addInnerLoop |
❌ | ✅ |
| 图案填充 | ✅ | 基础 | 需要 fillPattern |
| 大量填充 | 慢 | 慢 | 快(WebGL 批量) |
六、性能
| 数量 | 建议 |
|---|---|
| < 1000 | HatchEnt 可用 |
| > 1000 | 转 GeoJSON + fill 图层 |
| 大图案纹理 | patternScale 变大减少图元 |
七、常见坑
- 构造是位置参数:
new HatchEnt(outerPoints)——没有outerLoop/holesoptions 键;内环走addInnerLoop。 - 洞在外环外面 → 被忽略。先判断点在多边形内。
- patternAngle 单位 → 字段存弧度(UI 输入框才按度显示,bundle 内部
×Math.PI/180转换);直接赋值45是 45 rad 不是 45°。 - 以为 fillColor 默认不填 → 默认就是
0x3BB2D0(fillOpacity=0.4),本来就填充;想换色直接赋值。 - 外环自相交 → 渲染有锯齿 / 错误;先做自交检测。
- patternScale 过小 → 图元密成一片像实色;从 5 开始调。