唯杰地图 logo唯杰地图
VJMAP
EN

hatch

vjmapext/references/entity/hatch.md 3.3 KB88 行
原文

本文回答: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 变大减少图元

七、常见坑

  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 开始调。