list-query
本文回答:列出全部图层
Engine.getLayers()/Engine.currentDoc.layers;按名查Engine.getLayerByName(name)或doc.layers.itemByName(name);按图层取实体用Engine.getEntities(e => e.layerId === layer.layerId)(无 getEntitiesByLayer)。
一、列出全部
// 1. 数组形式(含 0、Defpoints 等系统层)
const layerArr = Engine.getLayers(); // 返回 Layer[] 数组
layerArr.forEach(l => console.log(l.name, l.color, l.layerOn, l.isFrozen));
// 2. 集合(更多 API)
const all = Engine.currentDoc.layers;
all.has('墙体'); // 是否存在
all.itemByName('墙体'); // 按名(无 get() 方法)
all.itemById(layerId); // 按 id
MCP 参考:vjcad/example/layer/04getlayers.js、vjcad/doc/layer/layers.md、vjcad/example/layer/08states.js。
二、按图层查实体
// 没有 Engine.getEntitiesByLayer —— 用 getEntities(filter) 自己过滤
const wallEnts = Engine.getEntities(e => e.layer === '墙体'); // e.layer 返回图层名
// 或借 layerId(layerId 是图层 id,layer 才是名字,两者不同)
const layer = Engine.currentDoc.layers.itemByName('墙体');
const wallEnts3 = Engine.getEntities(e => e.layerId === layer.layerId); // Layer 的 id 字段名是 layerId
MCP 参考:vjcad/example/layer/05getentitiesbylayer.js、vjcad/doc/layer/index.md、vjcad/doc/layer/layers.md。
三、给实体设图层
const line = new LineEnt([0, 0], [100, 100]);
line.setDefaults();
// 按名(推荐)
line.layer = '墙体';
// 按 id
line.layerId = Engine.currentDoc.layers.itemByName('墙体').layerId;
// API
Engine.setEntityLayer(line, '墙体');
Engine.addEntities(line);
MCP 参考:vjcad/doc/layer/layers.md。
⚠️ 已关闭图层的延迟加载
打开图纸时,模型空间里已关闭(layerOn=false)图层的实体默认不创建(Engine.LAZYLOADCLOSEDLAYERS = true),只把原始数据存在 currentSpace.lazyEntities 里——它们不在 items 中,Engine.getEntities()、按图层统计、extractTables 都查不到。把该层 layer.layerOn = true 时才会加载进来(setter 内触发 loadLazyEntitiesForLayer)。要统计全部实体,先打开相关图层,或在打开图纸前设 Engine.LAZYLOADCLOSEDLAYERS = false。
四、统计每个图层实体数(综合)
function statisticsByLayer() {
const stats = {};
for (const ent of Engine.currentSpace.aliveItems) {
const name = (Engine.currentDoc.layers.itemById(ent.layerId) || {}).name || '未知';
stats[name] = (stats[name] || 0) + 1;
}
return stats;
}
console.table(statisticsByLayer());
MCP 参考:vjcad/doc/layer/layers.md(LayerManager.getStatistics)。
反例
Engine.getLayers()后没过滤系统层('0'、'Defpoints'),UI 把它们也展示出来。entity.layer === undefined但访问.layer不当:对一些自定义实体先检查类型。- 大数据量逐图层调
Engine.getEntities(e => e.layer === name)N 次:可考虑一次getEntities()全量循环按 layerId 分桶。
参考(官方文档 MCP)
- 文档:
vjcad/doc/layer/index.md、vjcad/doc/layer/layers.md - 示例:
vjcad/example/layer/04getlayers.js、vjcad/example/layer/05getentitiesbylayer.js、vjcad/example/layer/08states.js