revcloud
本文回答:修订云线 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 |
七、常见坑
- bulge 正负交替 → 弧段内凸外凹,不像云;保持同号。
- arcLength 过大 → 边数太少,像锯齿;应小于边长的 1/3。
- 尝试用纯
bulges: [0.5, 0.5, ...]对原始矩形 4 边 → 只有 4 个大弧,不是云线;要细分每条边。 - 性能:细分过密会顶点爆炸;建议 arcLength ≥ 10。