字典
在CAD图纸中有个全局字典对象 McDbDictionary() ,用来存放图纸中的全局信息,开发者可以通过在字典存放扩展记录 McDbXrecord() 的方式来存放自己的全局数据,字典已经内置了一些数据,比如:组,多线样式,布局信息,图片定义等。
点击 字典对象 McDbDictionary()、扩展记录 McDbXrecord() 查看详细属性和方法说明。
遍历字典
字典中可以再存放字典(嵌套存放),也可以存一个扩展记录 McDbXrecord() 。我们可以使用递归的方式去遍历字典中所有数据。
ts
import { McDbDictionary, McDbXrecord } from "mxcad"
// 遍历字典使用的递归函数
function MxTest_DictionaryData(dict: McDbDictionary) {
// 获取字典中所有的对象名
let aryName = dict.getAllObjectName();
// 遍历到每个字典,取出名称.
aryName.forEach((name) => {
console.log(name);
let id = dict.getAt(name);
let obj = id.getMcDbObject();
if (obj instanceof McDbDictionary) {
let dict: McDbDictionary = obj;
console.log(dict);
MxTest_DictionaryData(dict);
}
else if (obj instanceof McDbXrecord) {
let xrec: McDbXrecord = obj;
let data = xrec.getData()
data.PrintData();
}
})
}
function MxTest_GetNamedObjectsDictionary() {
// 得到当前cad对象
let mxcad = MxCpp.getCurrentMxCAD();
// 得到全局字典
let dict = mxcad.getDatabase().getNamedObjectsDictionary();
// 获取字典中所有的对象名
let aryName = dict.getAllObjectName();
// 遍历到每个字典,取出名称.
aryName.forEach((name) => {
console.log(name);
let id = dict.getAt(name);
let obj = id.getMcDbObject();
if (obj instanceof McDbDictionary) {
let dict: McDbDictionary = obj;
console.log(dict);
MxTest_DictionaryData(dict);
}
})
}
// 调用遍历字典方法
MxTest_GetNamedObjectsDictionary()
写扩展记录
我们可以通过扩展记录方式将自定义的全局数据写到DWG图中。写扩展记录的基础步骤为先通过 mxcad 实例对象调用 getDatabase() 方法得到数据对象,再调用 getNamedObjectsDictionary() 方法得到得到图纸的字典对象,最后调用字典对象的 addObject() 方法在该对象中放一个自定义的字典,至此就可以实现在字典写一个扩展记录数据。
ts
import { MxCpp, McDbDictionary, McDbXrecord, MxCADResbuf } from "mxcad"
// 得到当前cad对象
let mxcad = MxCpp.getCurrentMxCAD();
// 得到全局字典
let dict = mxcad.getDatabase().getNamedObjectsDictionary();
// 得到用户自定义字典,sName是字典名称
let sName = "MyDict";
let idDict = dict.getAt(sName);
if (idDict.isNull()) {
// 如果没有,就添加一个字典。
let newDict = new McDbDictionary;
idDict = dict.addObject(sName, newDict);
}
let myDict = idDict.getMcDbDictionary();
if (myDict) {
// 创建扩展记录
let xrec = new McDbXrecord();
// 创建数据链表
let data = new MxCADResbuf();
// 设置值
data.AddString("TestData");
// 设置扩展记录中的数据
xrec.setData(data);
// 字典写入扩展数据
myDict.addObject("MyRecord", xrec);
console.log("write xrecord ok");
}
读扩展数据
我们可以通过调用实体对象的 getxData() 方法获取到该对象的扩展数据。
ts
import { MxCADUiPrEntity, } from "mxcad"
// 读取扩展数据。
async function MxTest_ReadxData() {
// 选择目标对象
let selEntity = new MxCADUiPrEntity();
selEntity.setMessage("选择对象");
let id = await selEntity.go();
if (!id.isValid()) return;
// 获取实体对象
let ent = id.getMcDbEntity();
if (ent === null) return;
// 得到记录中的数据链表。
let data = ent.getxData();
data.forEach((val, type, dxf) => {
console.log(JSON.stringify({ val: val, type: type, dxf: dxf }));
})
//let data = ent.getxDataString("DataName");
//MxFun.acutPrintf(data.val + "\n");
}
删除扩展数据
我们可以通过调用实体对象的 deleteXData() 方法定向删除该对象中的扩展数据。
ts
ent.deletexData("目标扩展数据名")