break-transform
本文回答:打断(BREAK)= 在指定点把直线 / 圆弧 / 多段线拆成两段;几何变换 =
Point2D / BoundingBox等基础类型也支持move/rotate/scale,与实体的move/rotate/scale/mirror行为一致;多框合并mergeBoundingBoxes([...])。
一、打断(BREAK)
命令: BREAK
选择对象: <选择>
指定第二个打断点 或 [第一点(F)]: F
指定第一个打断点: <点击或输入坐标>
指定第二个打断点: <点击或输入坐标>
⚠️ vjcad 没有 BREAK 命令(CommandRegistry 无此注册项,executerWithOp('BREAK') 会打"未知命令")。打断要用几何算法自己实现——vjcad/example/geometry/16break.js 演示了在给定点把直线 / 弧 / 多段线打断为两段的算法(删除原实体、加两段新实体)。基本流程:
- 选定实体 + 拾取点,调用
GeometryCalculator.LineExtToLineExt(或 ArcExt 等)找到打断点位置参数。 entity.startPoint = .../endPoint = ...切成两段,或新建两段。Engine.eraseEntities([原])+Engine.addEntities([段1, 段2])+Engine.regen()。
MCP 参考:vjcad/example/geometry/16break.js、vjcad/doc/geometry/calculations.md。
二、纯几何变换(不操作实体)
// Point2D 自身可变换
const p = new Point2D(100, 0)
.rotate(Math.PI / 4)
.scale(2)
.offset(new Point2D(50, 50));
// BoundingBox 移动
const bb = new BoundingBox(new Point2D(0, 0), new Point2D(100, 100));
bb.move(new Point2D(0, 0), new Point2D(50, 30));
MCP 参考:vjcad/doc/geometry/point2d.md、vjcad/doc/geometry/bounding-box.md、vjcad/example/geometry/17transform.js。
三、点数组的整体变换
import { Point2D } from 'vjcad';
function transformPoints(pts, fromPt, toPt, angle, scale) {
return pts.map(p => {
const pt = new Point2D(p.x, p.y)
.move(fromPt, toPt)
.rotate(angle, toPt)
.scale(scale, toPt);
return pt;
});
}
点数组通用变换没有内置 "一行函数",但
Point2D自身链式 +Array.map已经够用。vjcad/example/geometry/17transform.js给出实战示例。
四、合并 / 扩展 BoundingBox
import { mergeBoundingBoxes, BoundingBox, Point2D } from 'vjcad';
const merged = mergeBoundingBoxes([bb1, bb2, bb3]);
// 自己写:扩展 / 求交
function expand(bb, m) {
return new BoundingBox(
new Point2D(bb.minX - m, bb.minY - m),
new Point2D(bb.maxX + m, bb.maxY + m)
);
}
MCP 参考:vjcad/doc/geometry/bounding-box.md、vjcad/example/geometry/15mergebounds.js。
反例
- 打断后忘记删除原实体:图纸里同时有原直线 + 两段新直线,重叠显示。
- 用
entity.move后又改Point2D自身:重复变换,错位。 - 直接
bb1.move(...)修改了上层逻辑共享的 bbox:先bb1复制再操作。
参考(官方文档 MCP)
- 文档:
vjcad/doc/edit/edit-commands.md、vjcad/doc/geometry/point2d.md、vjcad/doc/geometry/bounding-box.md、vjcad/doc/geometry/calculations.md - 示例:
vjcad/example/geometry/15mergebounds.js、16break.js、17transform.js