唯杰地图 logo唯杰地图
VJMAP
EN

group

vjcad/references/edit/group.md 1.9 KB66 行
原文

本文回答:分组用 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