layer-states
本文回答:图层状态的"业务级管理器"通常封装为
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