visibility-frozen-locked
本文回答:图层三种独立状态——
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)
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)
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)
const ref = Engine.getLayerByName('参考');
ref.isLocked = true;
// 可见,但点选 / 框选 / Ctrl+A 都选不中,无法编辑
MCP 参考:vjcad/example/layer/07locked.js、vjcad/doc/layer/layers.md。
五、综合示例(多图层多状态对比)
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 快速查询(百万级性能)
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