> **本文回答**：图层状态的"业务级管理器"通常封装为 `showAll / hideOthers / lockOthers / unlockAll / freezeOthers / thawAll`；状态切换后必须 `Engine.regen(true)`；建议用集合方法 `Engine.currentDoc.layers.isLayerVisible(id)` 等做大数据查询。

## 一、推荐封装：图层管理器

```js
class LayerManager {
  // 创建标准图层集
  static createStandardLayers() {
    const defs = [
      { name: '墙体',     color: 1, lineType: 'CONTINUOUS' },
      { name: '门窗',     color: 3, lineType: 'CONTINUOUS' },
      { name: '家具',     color: 4, lineType: 'CONTINUOUS' },
      { name: '标注',     color: 2, lineType: 'CONTINUOUS' },
      { name: '中心线',   color: 1, lineType: 'CENTER' },
      { name: '参考底图', color: 8, lineType: 'CONTINUOUS', isLocked: true }
    ];
    for (const d of defs) {
      Engine.createLayer(d.name, d);
    }
  }

  static showAll() {
    Engine.getLayers().forEach(l => {
      l.layerOn = true;
      l.isFrozen = false;
    });
    Engine.regen(true);
  }

  static hideOthers() {
    const cur = Engine.getCurrentLayer();
    Engine.getLayers().forEach(l => l.layerOn = (l.name === cur));
    Engine.regen(true);
  }

  static lockOthers() {
    const cur = Engine.getCurrentLayer();
    Engine.getLayers().forEach(l => l.isLocked = (l.name !== cur));
  }

  static unlockAll() {
    Engine.getLayers().forEach(l => l.isLocked = false);
  }

  static freezeOthers() {
    const cur = Engine.getCurrentLayer();
    Engine.getLayers().forEach(l => {
      if (l.name !== '0' && l.name !== cur) {
        l.isFrozen = true;
      }
    });
    Engine.regen(true);
  }

  static thawAll() {
    Engine.getLayers().forEach(l => l.isFrozen = false);
    Engine.regen(true);
  }
}

LayerManager.createStandardLayers();
Engine.setCurrentLayer('墙体');
```

MCP 参考：`vjcad/doc/layer/layers.md`（"完整示例 - 图层管理器"）。

## 二、综合 demo

```js
Engine.createLayer('正常状态', { color: 3 });
Engine.createLayer('关闭状态', { color: 1 });
Engine.createLayer('冻结状态', { color: 4 });
Engine.createLayer('锁定状态', { color: 5 });

// 各放些实体...

Engine.getLayerByName('关闭状态').layerOn  = false;
Engine.getLayerByName('冻结状态').isFrozen = true;
Engine.getLayerByName('锁定状态').isLocked = true;
Engine.regen(true);

const ls = Engine.getLayers();
ls.forEach(l => {
  if (l.name !== '0' && l.name !== 'Defpoints') {
    console.log(`${l.name}: on=${l.layerOn}, frozen=${l.isFrozen}, locked=${l.isLocked}`);
  }
});
```

MCP 参考：`vjcad/example/layer/08states.js`。

## 三、ACI 颜色索引 / 图层颜色

| 索引 | 颜色 |
|---|---|
| 1 | 红 |
| 2 | 黄 |
| 3 | 绿 |
| 4 | 青 |
| 5 | 蓝 |
| 6 | 洋红 |
| 7 | 白/黑 |
| 8 | 灰 |
| 256 | ByLayer |
| 0 | ByBlock |

MCP 参考：`vjcad/doc/layer/layers.md`。

## 四、文档级"图层状态保存 / 恢复"

> 该 SDK 是否提供图层状态快照（类似 AutoCAD 的 LAYERSTATE 命令），在已检查来源中没有专门示例 / API 描述；如需要可以用上面的 `LayerManager` 自行封装：保存 `[{name, layerOn, isFrozen, isLocked}, ...]`，恢复时回写。

## 反例

- "切到只显示我这层" 用 `isFrozen=true` 全冻结别人 + 把当前图层也冻结：只有图层面板会拒绝；API 赋值 `layer.isFrozen = true` **直接生效不报错**，当前层被冻结后新画的实体也看不见——代码里要自己跳过当前层。
- 状态切换没 `Engine.regen(true)`：屏幕不刷新。
- 把 `'0'` 图层冻结 / 删除：图层面板会拒绝，但 API（`isFrozen = true`、`Engine.currentDoc.layers.remove(layer)`）不设防、直接生效——自己跳过 `'0'`。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/layer/layers.md`、`vjcad/doc/layer/index.md`
- 示例：`vjcad/example/layer/08states.js`
