move-copy
本文回答:移动 =
entity.move(from, to)(位移 =to - from);复制 =entity.clone(),再Engine.addEntities(...);批量移动后必须Engine.regen()才会重绘。命令版用MOVE/COPY。
一、移动
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)用。
二、复制(克隆)
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(...)把副本加入图纸。
三、批量
const moveDelta = (ents, dx, dy) => {
ents.forEach(e => e.move([0, 0], [dx, dy]));
Engine.regen(); // 一次重绘
};
不要每次 move 都
regen—— 一次性regen性能最佳。
四、命令版(自带 undo / 用户交互)
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