Skip to content
On this page

字典

在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("目标扩展数据名")