唯杰地图 logo唯杰地图
VJMAP
EN

erase

vjcad/references/edit/erase.md 2.6 KB62 行
原文

本文回答:删除推荐 Engine.eraseEntities(entOrArray),会自动写 undo、把 isAlive 置 false;命令版 ERASE。在自定义命令里也可以走 Engine.currentDoc.currentSpace.erase(entities) + Engine.undoManager.erased_undoMark(entities) 这一对底层方法。

一、最小用法

const line = new LineEnt([0, 0], [100, 0]);
line.setDefaults();
line.color = 1;
Engine.addEntities(line);

// 单个
Engine.eraseEntities(line);
console.log(line.isAlive);     // false

// 批量
Engine.eraseEntities([entA, entB, entC]);

MCP 参考:vjcad/example/edit/06erase.js。

二、查询剩余实体

const remaining = Engine.getEntities(e => e.isAlive);   // 不过滤会把已删除实体也算进去
console.log('剩余:', remaining.length);

MCP 参考:vjcad/example/edit/06erase.js。

三、命令 / 脚本版

Engine.editor.executerWithOp('ERASE');

// 在自定义命令里删除选中实体
const erased = Engine.currentDoc.currentSpace.erase(entities);   // 返回实际删除的数组(EntitiesErasing 可取消/排除)
if (erased.length) Engine.undoManager.erased_undoMark(erased);     // 按实际删除的记撤销,避免重做误删受保护实体
Engine.pcanvas.clearGrip();
Engine.pcanvas.regen();

MCP 参考:vjcad/doc/selection/entity-selection.md(EraseCommand 完整示例)、vjcad/doc/edit/edit-commands.md。

四、isAlive 的意义

  • entity.isAlive === false:表示已被删除,仍可在 undoManager 撤销中恢复(undo 恢复同一对象引用——与 vjmapext 的克隆重建不同)。
  • 在事件处理里如果拿到一个 isAlive=false 的实体,说明它正在被删除 / 已删除。
  • ⚠️ Engine.getEntities() / getEntitiesByType() 返回 [...currentSpace.items] 不过滤 isAlive——erase 后的死实体仍在结果里(vjcad@1.0.16,BlockDefinition.eraseEntities 仅置标志位)。要存活实体用 Engine.currentSpace.aliveItems 或 getEntities(e => e.isAlive)。

MCP 参考:vjcad/example/edit/06erase.js。

反例

  • 直接 Engine.currentSpace.items.splice(...) 删除:会绕过 undo,看似有效但 Ctrl+Z 还能复活并状态混乱。
  • 在循环里逐个 eraseEntities(ent):多次 undo 标记。批量请用 eraseEntities([e1, e2, ...])。
  • 删完不 regen / redraw:屏幕仍看到(部分版本会自动刷新,但不能依赖)。

参考(官方文档 MCP)

  • 文档:vjcad/doc/edit/index.md、vjcad/doc/edit/edit-commands.md、vjcad/doc/selection/entity-selection.md
  • 示例:vjcad/example/edit/06erase.js