> **本文回答**：图层三种独立状态——`layerOn`（开/关）/ `isFrozen`（冻结）/ `isLocked`（锁定，可见但不可选不可编辑）。**关闭与冻结在渲染上等价**（`isLayerVisible = layerOn && !isFrozen`，两者都不显示、不可选），冻结并不比关闭"性能更好"；唯一差别是打开图纸时**已关闭**图层的实体默认延迟加载（`Engine.LAZYLOADCLOSEDLAYERS`），冻结层照常加载。状态切换后必须 `Engine.regen(true)`。
>
> **⚠ "0 图层和当前图层不能被冻结"仅在命令 UI 层成立**（`LayerCommand` 冻结点击回调里拦截并提示）。API 层 `Layer.isFrozen` 是纯 setter **无防护**——`Engine.getLayerByName('0').isFrozen = true` 直接生效、无报错。冻结 0 层/当前层会导致所有实体不可见不可选，自行判断。

## 一、三态对比

| 状态 | 属性 | 可见 | 可选 | 可编辑 | 备注 |
|---|---|:-:|:-:|:-:|---|
| 正常 | `layerOn=true, isFrozen=false, isLocked=false` | ✓ | ✓ | ✓ | |
| 关闭 | `layerOn=false` | ✗ | ✗ | ✗ | 渲染判定与冻结相同；打开图纸时已关闭的层默认延迟加载（实体不在 `items` 中，直到 `layerOn = true`） |
| 冻结 | `isFrozen=true` | ✗ | ✗ | ✗ | 渲染判定与关闭相同；不延迟加载 |
| 锁定 | `isLocked=true` | ✓ | ✗ | ✗ | |

MCP 参考：`vjcad/doc/layer/layers.md`、`vjcad/example/layer/08states.js`。

## 二、关闭 / 打开（`layerOn`）

```js
const layer = Engine.getLayerByName('标注');
layer.layerOn = false;
Engine.regen(true);

// 批量：只显示墙体 / 门窗
function showOnlyLayers(names) {
  Engine.getLayers().forEach(layer => {
    layer.layerOn = names.includes(layer.name);
  });
  Engine.regen(true);
}
showOnlyLayers(['墙体', '门窗']);
```

MCP 参考：`vjcad/example/layer/03visibility.js`、`vjcad/doc/layer/layers.md`。

## 三、冻结 / 解冻（`isFrozen`）

```js
const layer = Engine.getLayerByName('施工图');
layer.isFrozen = true;
Engine.regen(true);
```

MCP 参考：`vjcad/example/layer/06frozen.js`、`vjcad/doc/layer/layers.md`。

> **注意**：`0` 图层和**当前图层**不能被冻结——这只在图层管理面板/命令交互中成立（UI 回调拒绝）。直接给 `Layer.isFrozen` 赋值不设防，见顶部警告。

## 四、锁定 / 解锁（`isLocked`）

```js
const ref = Engine.getLayerByName('参考');
ref.isLocked = true;
// 可见，但点选 / 框选 / Ctrl+A 都选不中，无法编辑
```

MCP 参考：`vjcad/example/layer/07locked.js`、`vjcad/doc/layer/layers.md`。

## 五、综合示例（多图层多状态对比）

```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);
```

MCP 参考：`vjcad/example/layer/08states.js`。

## 六、`Layers` 快速查询（百万级性能）

```js
const layers = Engine.currentDoc.layers;
layers.isLayerVisible(layerId);     // layerOn=true && !isFrozen
layers.isLayerSelectable(layerId);  // 可见 && !isLocked
layers.isLayerFrozen(layerId);
layers.isLayerLocked(layerId);
```

MCP 参考：`vjcad/doc/layer/layers.md`。

## 反例

- 切换 `layerOn / isFrozen` 后没 `Engine.regen(true)`：屏幕不刷新。
- 试图把当前图层冻结：**UI 操作**被拒；但 `layer.isFrozen = true` 直接生效（API 无防护，且 `isLayerFrozen` 立即为 true）。
- 以为 `isFrozen=true` 比 `layerOn=false` 性能更好：两者渲染判定完全相同（`!layerOn || isFrozen` 都进不可见集合）；真正省内存的是"打开图纸时就已关闭"的层被延迟加载。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/layer/layers.md`、`vjcad/doc/layer/index.md`
- 示例：`vjcad/example/layer/03visibility.js`、`vjcad/example/layer/06frozen.js`、`vjcad/example/layer/07locked.js`、`vjcad/example/layer/08states.js`
