> **本文回答**：打断（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` 演示了在给定点把直线 / 弧 / 多段线打断为两段的算法（删除原实体、加两段新实体）。基本流程：

1. 选定实体 + 拾取点，调用 `GeometryCalculator.LineExtToLineExt`（或 ArcExt 等）找到打断点位置参数。
2. `entity.startPoint = ...` / `endPoint = ...` 切成两段，或新建两段。
3. `Engine.eraseEntities([原])` + `Engine.addEntities([段1, 段2])` + `Engine.regen()`。

MCP 参考：`vjcad/example/geometry/16break.js`、`vjcad/doc/geometry/calculations.md`。

## 二、纯几何变换（不操作实体）

```js
// 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`。

## 三、点数组的整体变换

```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

```js
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`
