smart-tools
本文回答:vjcad 提供三类"智能工具"——中心线提取(双线 → 中心线)、云线生成(
generateRevcloudBulgePoints)和智能块(以选中实体为样板匹配相似图形,findPatternMatches→convertMatchesToBlocks转成BlockDefinition+InsertEnt)。命令分别对应EXTRACTCENTERLINE/REVCLOUD/SMARTBLOCK,编程接口在示例里。
一、中心线提取(双线 → 中心线)
// 编程式(参见示例)
// vjcad/example/geometry/18centerline.js
文档:vjcad/doc/geometry/centerline.md 详述了"两条平行线 → 一条中心线"的算法与典型用法,命令 EXTRACTCENTERLINE 在交互模式下走"选两条平行直线 / 圆弧 → 输出中心线"。
MCP 参考:vjcad/doc/geometry/centerline.md、vjcad/example/geometry/18centerline.js。
二、云线生成(REVCLOUD)
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。 - 适合"图纸里反复出现相同图形(家具 / 阀门 / 螺钉)"的场景。
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/block-insert |
反例
- 中心线传入两条不平行 / 距离巨大的线:算法产物可能不像直观中心线,先做粗筛距离 / 角度判断。
- 云线在闭合区域开口时画错:
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