唯杰地图 logo唯杰地图
VJMAP
EN

smart-tools

vjcad/references/geometry/smart-tools.md 4.3 KB84 行
原文

本文回答: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