erase
本文回答:删除推荐
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