唯杰地图 logo唯杰地图
VJMAP
EN

move-copy

vjcad/references/edit/move-copy.md 2.1 KB79 行
原文

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