> **本文回答**：分组用 `new GroupEnt(name, [entities])` 创建后 `Engine.addEntities(group)`；取消组用 `group.explode()` 把子实体放回当前空间，再删除 `groupEntity`。命令 `GROUP / UNGROUP` 也直接可用。

## 一、创建组

```js
const { GroupEnt } = vjcad;

const line1 = new LineEnt([-20, 0], [20, 0]);
const line2 = new LineEnt([0, -20], [0, 20]);
const circle = new CircleEnt([0, 0], 15);
[line1, line2, circle].forEach(e => e.setDefaults());

const group = new GroupEnt('MyGroup1', [line1, line2, circle]);
group.setDefaults();
Engine.addEntities(group);

console.log(group.type);          // 'GROUP'
console.log(group.name);          // 'MyGroup1'
console.log(group.items.length);  // 3
```

MCP 参考：`vjcad/example/edit/08group.js`。

## 二、取消组（炸开）

```js
function ungroupEntity(groupEntity) {
  if (groupEntity.type !== 'GROUP') return;

  const exploded = groupEntity.explode();
  exploded.forEach(sub => Engine.addEntities(sub));

  Engine.eraseEntities([groupEntity]);
  Engine.pcanvas.regen(true);
}
```

MCP 参考：`vjcad/example/edit/08group.js`。

## 三、命令版

```js
Engine.editor.executerWithOp('GROUP');     // 选实体后输入组名
Engine.editor.executerWithOp('UNGROUP');   // 选组后解散
```

## 四、遍历组成员

```js
group.items.forEach((item, i) => {
  console.log(`[${i}] type=${item.type}, color=${item.color}`);
});
```

MCP 参考：`vjcad/example/edit/08group.js`。

## 反例

- 把 `GroupEnt` 当普通容器，直接修改 `group.items` 数组：会跳过 undo，且画布不会自动刷新。
- 炸开后忘记 `Engine.eraseEntities([groupEntity])`：原 GroupEnt 还在画布里（`isAlive=true` 照样渲染）。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/edit/index.md`
- 示例：`vjcad/example/edit/08group.js`
