> **本文回答**：vjcad 提供三类"智能工具"——中心线提取（双线 → 中心线）、云线生成（`generateRevcloudBulgePoints`）和智能块（以选中实体为样板匹配相似图形，`findPatternMatches` → `convertMatchesToBlocks` 转成 `BlockDefinition` + `InsertEnt`）。命令分别对应 `EXTRACTCENTERLINE` / `REVCLOUD` / `SMARTBLOCK`，编程接口在示例里。

## 一、中心线提取（双线 → 中心线）

```js
// 编程式（参见示例）
// vjcad/example/geometry/18centerline.js
```

文档：`vjcad/doc/geometry/centerline.md` 详述了"两条平行线 → 一条中心线"的算法与典型用法，命令 `EXTRACTCENTERLINE` 在交互模式下走"选两条平行直线 / 圆弧 → 输出中心线"。

MCP 参考：`vjcad/doc/geometry/centerline.md`、`vjcad/example/geometry/18centerline.js`。

## 二、云线生成（REVCLOUD）

```js
import { generateRevcloudBulgePoints, PolylineEnt } from 'vjcad';

// 签名: generateRevcloudBulgePoints(pathPoints: PointInput[], options?: RevcloudOptions): BulgePoints
// RevcloudOptions = { arcLength?(默认50) | bulge?(默认1=半圆) | isClosed?(默认false) }
const cloudPoints = generateRevcloudBulgePoints(pathPoints, {
  arcLength: 50,
  bulge: 1,
  isClosed: true
});

const cloud = new PolylineEnt();
cloud.bulgePoints = cloudPoints;
cloud.isClosed = true;
cloud.setDefaults();
Engine.addEntities(cloud);
```

MCP 参考：`vjcad/example/geometry/19revcloud.js`、`vjcad/doc/geometry/revcloud.md`。

> 命令 `REVCLOUD` 走"沿矩形 / 多边形路径生成均匀的弧段串"，常用于审图标记。`generateRevcloudBulgePoints` 是其编程入口。

## 三、智能块（SMARTBLOCK）

本质是**以选中实体为样板（pattern）做相似图形匹配**，再把样板和所有匹配组一起转成块：

- 命令 `SMARTBLOCK` 只是打开"智能块识别"面板，不可脚本化。
- 编程入口（均为顶层导出）：`findPatternMatches(patternEnts, allEnts, options)` → `PatternMatchOutput { matches, patternCenter, totalScanned, elapsedMs, rejectStats }`；`convertMatchesToBlocks(patternEnts, matches, { blockName?, useFirstAsDefinition?, textToAttribute? })` → 新块名或 `null`。
- 适合"图纸里反复出现相同图形（家具 / 阀门 / 螺钉）"的场景。

```js
import { findPatternMatches, defaultPatternMatchOptions, convertMatchesToBlocks,
         getSelections, SelectionInputOptions, InputStatusEnum, Engine } from 'vjcad';

const sel = await getSelections(new SelectionInputOptions());
if (sel.status === InputStatusEnum.OK && sel.value.length) {
  const pattern = sel.value;                                     // 样板实体
  const all     = Engine.getEntities(e => e.isAlive);
  const out     = findPatternMatches(pattern, all, { ...defaultPatternMatchOptions });
  if (out.matches.length) {
    // 样板 + 每个匹配组 → 同一块定义的 InsertEnt，原实体被删除；共 matches.length + 1 个实例
    const blockName = convertMatchesToBlocks(pattern, out.matches, { textToAttribute: false });
  }
}
```

> `convertMatchesToBlocks` 内部用 `pcanvas.addEntity` + `currentSpace.erase`，**不记撤销**；需要撤销时自己包 `start_undoMark/end_undoMark` 并补记。

MCP 参考：`vjcad/example/geometry/20smartblock.js`。

## 四、相关 API

| 想要的 | 方向 |
|---|---|
| 自定义中心线（圆弧 / 多段线） | `vjcad/doc/geometry/centerline.md` |
| 自定义云线（多边形 / 任意多段线） | `generateRevcloudBulgePoints` 参数 + `BulgePoints / BulgePoint` ([entity/polyline](../entity/polyline.md)) |
| 块定义 / 插入 | [entity/block-insert](../entity/block-insert.md) |

## 反例

- 中心线传入两条不平行 / 距离巨大的线：算法产物可能不像直观中心线，先做粗筛距离 / 角度判断。
- 云线在闭合区域开口时画错：`isClosed` 与起止点设置错。
- 智能块对自定义实体（CustomEntityBase）效果差：先 `buildNestEnts()` 把内部还原成基础实体再 SMARTBLOCK。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/geometry/centerline.md`、`vjcad/doc/geometry/revcloud.md`、`vjcad/doc/geometry/index.md`
- 示例：`vjcad/example/geometry/18centerline.js`、`19revcloud.js`、`20smartblock.js`
