唯杰地图 logo唯杰地图
VJMAP
EN

revcloud

vjmapext/references/entity/revcloud.md 3.1 KB87 行
原文

本文回答:修订云线 REVCLOUD —— 用边缘圆弧表示审阅标记区域。

一、通过命令绘制

修订云线有专门的命令 REVCLOUD:

mapcadLayer.executeCommand('REVCLOUD');

用户交互:先问弧长(输入数字或图上拾取两点,直接回车保留当前值),再逐点点击顶点;U 撤上一个顶点,C 闭合并完成,Enter/Esc 按当前点收尾为开口云线。结果是一条带 bulge 的 PolylineEnt(命令内强制 fillOpacity = 0)。弧长由 RevcloudCommand.arcLength(静态,默认 50,CAD 单位)控制,生成的弧 bulge 固定为 1(半圆)。

二、程序化生成

以任意闭合路径生成云线:

const basePoly = [[0,0],[200,0],[200,120],[0,120]];
const cloud = new vjmapext.PolylineEnt([], true);
// 折线控制点 → bulgePoints(每条边细分为若干半圆弧)
cloud.bulgePoints = vjmapext.generateRevcloudBulgePoints(basePoly, {
  arcLength: 20,           // 每段弧长(CAD 单位),越小弧越密
  bulge: 1,                // 弧凸度,1=半圆(默认)
  isClosed: true
});
cloud.color = 0xff4444;
cloud.lineWidth = 2;
mapcadLayer.addEntity(cloud);

generateRevcloudBulgePoints(pathPoints, options?) 是真实导出(vjmapext.generateRevcloudBulgePoints),RevcloudOptions = { arcLength?, bulge?, isClosed? }——返回值可直接赋给 bulgePoints。

三、手工构造(小弧段)

function revcloud(pts, arcLen = 15) {
  const out = [], bulges = [];
  const n = pts.length;
  for (let i = 0; i < n; i++) {
    const p1 = pts[i];
    const p2 = pts[(i + 1) % n];
    const dx = p2[0] - p1[0], dy = p2[1] - p1[1];
    const len = Math.hypot(dx, dy);
    const count = Math.max(1, Math.round(len / arcLen));
    for (let k = 0; k < count; k++) {
      const t1 = k / count, t2 = (k + 1) / count;
      out.push([p1[0] + dx * t1, p1[1] + dy * t1]);
      bulges.push(0.5);        // 固定鼓出 0.5
    }
  }
  return { points: out, bulges };
}

const { points, bulges } = revcloud([[0,0],[300,0],[300,200],[0,200]], 25);
const poly = new vjmapext.PolylineEnt();
points.forEach((p, i) => poly.addVertex(p, bulges[i]));
poly.isClosed = true;
poly.color = 0xff0000;
mapcadLayer.addEntity(poly);

四、场景

  • 图纸审阅的修改区域标记
  • 关注区域高亮
  • 变更点包围框

五、与普通 Polyline 差异

本质还是 PolylineEnt,只是每段都带正向 bulge → 每段是一个小弧;视觉像"云朵边缘"。

六、参数调节

参数 建议
arcLength 10–40(单位同图纸)
bulge 0.3–0.7;过大弧过圆,过小近似直线
lineWidth 1.5–3,粗一点显得醒目
颜色 通常红色 0xff0000

七、常见坑

  1. bulge 正负交替 → 弧段内凸外凹,不像云;保持同号。
  2. arcLength 过大 → 边数太少,像锯齿;应小于边长的 1/3。
  3. 尝试用纯 bulges: [0.5, 0.5, ...] 对原始矩形 4 边 → 只有 4 个大弧,不是云线;要细分每条边。
  4. 性能:细分过密会顶点爆炸;建议 arcLength ≥ 10。