唯杰地图 logo唯杰地图
VJMAP
EN

layer-states

vjcad/references/layer/layer-states.md 3.9 KB123 行
原文

本文回答:图层状态的"业务级管理器"通常封装为 showAll / hideOthers / lockOthers / unlockAll / freezeOthers / thawAll;状态切换后必须 Engine.regen(true);建议用集合方法 Engine.currentDoc.layers.isLayerVisible(id) 等做大数据查询。

一、推荐封装:图层管理器

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

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