group
本文回答:分组用
new GroupEnt(name, [entities])创建后Engine.addEntities(group);取消组用group.explode()把子实体放回当前空间,再删除groupEntity。命令GROUP / UNGROUP也直接可用。
一、创建组
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。
二、取消组(炸开)
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。
三、命令版
Engine.editor.executerWithOp('GROUP'); // 选实体后输入组名
Engine.editor.executerWithOp('UNGROUP'); // 选组后解散
四、遍历组成员
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