> **本文回答**：列出全部图层 `Engine.getLayers()` / `Engine.currentDoc.layers`；按名查 `Engine.getLayerByName(name)` 或 `doc.layers.itemByName(name)`；按图层取实体用 `Engine.getEntities(e => e.layerId === layer.layerId)`（无 getEntitiesByLayer）。

## 一、列出全部

```js
// 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`。

## 二、按图层查实体

```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`。

## 三、给实体设图层

```js
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`。

## 四、统计每个图层实体数（综合）

```js
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`
