> **本文回答**：移动 = `entity.move(from, to)`（位移 = `to - from`）；复制 = `entity.clone()`，再 `Engine.addEntities(...)`；批量移动后**必须 `Engine.regen()`** 才会重绘。命令版用 `MOVE` / `COPY`。

## 一、移动

```js
const circle = new CircleEnt([30, 30], 20);
circle.setDefaults();
circle.color = 1;
Engine.addEntities(circle);

circle.move([0, 0], [50, 30]);
Engine.regen();
```

MCP 参考：`vjcad/example/edit/01move.js`、`vjcad/doc/edit/index.md`。

> **签名以示例为准**：`move(from, to)`。文档表里写 `move(dx, dy)` 与示例不一致，按示例 `(from, to)` 用。

## 二、复制（克隆）

```js
const original = new CircleEnt([30, 50], 20);
original.setDefaults();
original.color = 1;
Engine.addEntities(original);

const copy1 = original.clone();
copy1.move([0, 0], [60, 0]);
copy1.color = 2;
Engine.addEntities(copy1);

const copy2 = original.clone();
copy2.move([0, 0], [120, 0]);
copy2.color = 3;
Engine.addEntities(copy2);
```

MCP 参考：`vjcad/example/edit/02copy.js`。

> `clone()` 创建独立副本，修改副本不影响原实体。复制完成后再 `Engine.addEntities(...)` 把副本加入图纸。

## 三、批量

```js
const moveDelta = (ents, dx, dy) => {
  ents.forEach(e => e.move([0, 0], [dx, dy]));
  Engine.regen();          // 一次重绘
};
```

> 不要每次 move 都 `regen` —— 一次性 `regen` 性能最佳。

## 四、命令版（自带 undo / 用户交互）

```js
Engine.editor.executerWithOp('MOVE');
Engine.editor.executerWithOp('COPY');

// 脚本（已选实体后批量写脚本）
Engine.editor.automate(`MOVE
0,0
100,0

`);
```

MCP 参考：`vjcad/doc/edit/edit-commands.md`。

## 反例

- `circle.move(50, 30)` 直接传 dx/dy：示例里要求 `(from, to)`，传错坐标。
- 移动后没 `Engine.regen()`：屏幕看不到变化。
- 漏 `Engine.addEntities(copy)`：副本没进图纸，没显示。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/edit/index.md`、`vjcad/doc/edit/edit-commands.md`
- 示例：`vjcad/example/edit/01move.js`、`vjcad/example/edit/02copy.js`
