唯杰地图 logo唯杰地图
VJMAP
EN

visibility-frozen-locked

vjcad/references/layer/visibility-frozen-locked.md 4.2 KB97 行
原文

本文回答:图层三种独立状态——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