set-defaults
本文回答:
entity.setDefaults()把Engine.CECOLOR / CELTYPE / CELTSCALE与Engine.currentDoc.CLAYER(系统当前默认绘图属性)应用到实体,同时把透明度重置为 ByLayer(transpMgr.setValue(-1));不设线宽(lineWeight保持原值,构造默认 -1=ByLayer)。调用顺序:先new XxxEnt(...)→setDefaults()→ 再写自定义颜色 / 图层 / 线型,最后Engine.addEntities(...)。
一、最小用法
Engine.CECOLOR = 1; // 当前颜色
Engine.CELTYPE = 'HIDDEN'; // 当前线型
Engine.CELTSCALE = 1.5; // 当前线型比例
const line1 = new LineEnt([0, 0], [100, 0]);
line1.setDefaults(); // 应用默认值(color=1, lineType='HIDDEN')
Engine.addEntities(line1);
console.log(line1.color, line1.lineType, line1.lineTypeScale);
// 1 HIDDEN 1.5
// 修改默认后再创建
Engine.CECOLOR = 3;
Engine.CELTYPE = 'CENTER';
const line2 = new LineEnt([0, 30], [100, 30]);
line2.setDefaults();
Engine.addEntities(line2);
console.log(line2.color, line2.lineType); // 3 'CENTER'
MCP 参考:vjcad/example/property/06setdefaults.js。
二、不调用 setDefaults()
const line3 = new LineEnt([0, 60], [100, 60]);
// 没 setDefaults()
Engine.addEntities(line3);
console.log(line3.color, line3.lineType, line3.lineTypeScale, line3.lineWeight, line3.layer);
// 256 'ByLayer' 1 -1 '0' —— EntityBase 构造默认(全部随层、图层 '0'),不会反映 Engine.CE* / CLAYER 的当前值
MCP 参考:vjcad/example/property/06setdefaults.js。
不
setDefaults的实体一般"按图层显示"。如果业务希望"用户用 Ribbon 改了颜色,再画的图就是新颜色",必须setDefaults。
三、自定义属性的正确顺序
const c = new CircleEnt([0, 0], 30);
c.setDefaults(); // ① 先吸纳系统默认
c.color = 5; // ② 再覆盖(不会被默认值再覆盖)
c.layer = '辅助'; // 图层须已存在(Engine.createLayer),否则静默落到 '0'
c.lineType = 'CONTINUOUS';
Engine.addEntities(c);
MCP 参考:vjcad/example/property/01color.js(注释显式说"必须先 setDefaults(),再设置颜色,否则颜色会被默认值覆盖")。
四、Engine 系统变量速查
| 变量 | 含义 |
|---|---|
Engine.CECOLOR |
当前绘图颜色(ACI / RGB) |
Engine.CELTYPE |
当前线型 |
Engine.CELTSCALE |
当前线型比例 |
Engine.currentDoc.CLAYER |
当前图层名(字符串)。⚠️ Engine.CLAYER 不存在 |
Engine.OSMODE |
对象捕捉模式 |
Engine.ORTHOMODE |
正交模式(0/1) |
Engine.GRIDMODE |
栅格 |
Engine.OFFSETDIST |
偏移距离 |
详见 core/engine。
反例
- 顺序写反:
new Xxx → color = 1 → setDefaults()——setDefaults把颜色又改回CECOLOR。 - 在不同子线程 / 异步 callback 里穿插改
Engine.CECOLOR又 new 实体:默认值串味,导致颜色错乱。 - 完全不
setDefaults:图层切换后的实体没法继承图层属性。
参考(官方文档 MCP)
- 文档:
vjcad/doc/property/index.md、vjcad/doc/command/api-reference.md - 示例:
vjcad/example/property/06setdefaults.js、vjcad/example/property/01color.js