xdata
本文回答:扩展数据通过
entity.setExtData(appName, dataObj)写、entity.extData读、entity.hasExtData()判断、entity.clearExtData()清;底层格式entity.xdataRaw = { '1001': appName, '1000': JSON字符串 }。导出 DWG 后重新加载数据仍保留,是给业务实体绑业务字段的标准做法。每个实体只存一组 appName + 一个 JSON:setExtData是整体覆盖(换 appName 会把旧 appName 的数据一起冲掉),多个业务模块请共用一个 appName、在 JSON 里分字段;extData每次读都是JSON.parse出来的新对象,改它不影响实体,必须再setExtData写回。
一、写
const sensor = new LineEnt([0, 0], [100, 0]);
sensor.setDefaults();
sensor.setExtData('SENSOR_DATA', {
name: '温度传感器',
value: 25.5,
unit: '℃',
isActive: true,
lastUpdate: '2026-01-29'
});
Engine.addEntities(sensor);
MCP 参考:vjcad/example/property/07xdata.js。
二、读
sensor.hasExtData(); // true
sensor.extDataAppName; // 'SENSOR_DATA'
const data = sensor.extData; // 已自动 JSON.parse
console.log(data.value); // 25.5
MCP 参考:vjcad/example/property/07xdata.js。
三、改 / 清
// 修改:基于现有数据(extData 是解析出的副本,改完必须写回)
const cur = pipe.extData;
cur.flow = 180.5;
cur.lastCheck = '2026-01-28';
pipe.setExtData('PIPE_ATTR', cur);
// 整段替换
sensor.setExtData('SENSOR_DATA', { value: 30.2, alarm: true });
// 清除
sensor.clearExtData();
sensor.hasExtData(); // false
MCP 参考:vjcad/example/property/07xdata.js。
四、原始格式(高级)
const raw = sensor.xdataRaw;
// {
// '1001': 'SENSOR_DATA', // AppName
// '1000': '{"name":"温度传感器", ...}' // JSON 字符串
// }
MCP 参考:vjcad/example/property/07xdata.js。
AutoCAD 标准 XData 用 group code 1000~1071。vjcad 把 1001=AppName / 1000=JSON 这一对最常用的字段封装成了
setExtData / extData。
五、批量查询带 XData 的实体
const allEnts = Engine.getEntities();
const withXdata = allEnts.filter(e => e.hasExtData?.());
const byAppName = {};
withXdata.forEach(e => {
const name = e.extDataAppName;
(byAppName[name] = byAppName[name] || []).push(e);
});
MCP 参考:vjcad/example/property/07xdata.js。
六、属性面板(手动查看)
UI 选中实体后,右侧属性面板会显示"扩展数据"行;点击右边按钮可打开详细编辑对话框。详见 vjcad/example/property/07xdata.js 的"提示"部分。
反例
- 把整个 DOM Element / 函数 / 循环引用塞进
setExtData的 data:会JSON.stringify失败 / 数据不完整。 - 用同一个
appName但写入完全不同的 schema:读取时容易破坏现有逻辑。建议给每个 appName 一个稳定的字段集。 - 试图用
entity.xdata = {...}直接赋值:EntityBase没有xdata属性(存储字段是私有_xdata),这样只会挂一个无关的普通字段,不显示、不保存、不导出。用setExtData(name, data),或底层entity.xdataRaw = { '1001': appName, '1000': jsonStr }。 cur = e.extData; cur.x = 1;后忘了setExtData写回:extData每次返回新解析的对象,修改丢失。- 同一实体先
setExtData('A', …)再setExtData('B', …):A 的数据被整体覆盖,不是追加第二个 appName。
参考(官方文档 MCP)
- 文档:
vjcad/doc/property/index.md - 示例:
vjcad/example/property/07xdata.js