唯杰地图 logo唯杰地图
VJMAP
EN

list-query

vjcad/references/layer/list-query.md 3.4 KB82 行
原文

本文回答:列出全部图层 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