> **本文回答**：删除推荐 `Engine.eraseEntities(entOrArray)`，会自动写 undo、把 `isAlive` 置 false；命令版 `ERASE`。在自定义命令里也可以走 `Engine.currentDoc.currentSpace.erase(entities) + Engine.undoManager.erased_undoMark(entities)` 这一对底层方法。

## 一、最小用法

```js
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`。

## 二、查询剩余实体

```js
const remaining = Engine.getEntities(e => e.isAlive);   // 不过滤会把已删除实体也算进去
console.log('剩余:', remaining.length);
```

MCP 参考：`vjcad/example/edit/06erase.js`。

## 三、命令 / 脚本版

```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`
