用户可给图纸上的对象设置扩展数据,这些扩展数据可以是用户实际需求的专业数据,扩展数据支持字符串,double,int,等类型。每个扩展数据都一个扩展数据名称,每个名称下也可能有多个扩展数据,一个实体可以有多个扩展数据名称,这些扩展数据在内存中是一个链表来存放的,每个链结代表一个数据,每个链结中字符串数据长度不超过200(DWG图纸格式确定了),链表类MxDrawResbuf详细说明参考:
http://www.mxdraw.com/help/IMxDrawResbuf.htm,点击此处下载演示实例。
在DWG文件格式中,所有对象的数据都一个DXF组码,不同的DXF组码代表不同的数据类型,这样可能在百度搜索关键词"DXF组码"找到相关教程。
扩展数据中的每个数据类型也同样有一个DXF组码,比如设置一个字符串数据,并指定dxf组码,使用MxDrawResbuf的AddStringEx函数。
MxDrawResbuf xData = new MxDrawResbuf(); // 设置扩展数据名称 TestApp xData.AddStringEx("TestApp",1001); // 设置字符串数据,DXF组码是1000 xData.AddStringEx("string data", 1000); // 设置一个 Long数据,DXF组码是1071 xData.AddLongEx(77677, 1071); // 把准备好的数据,写到实体上。 ent.SetXData(xData);
DXF组码说明
图元名 | 组码 | 说明 |
---|---|---|
字符串 | 1000 | 扩展数据中的字符串最长为 255 个字节(第 256 个字符将被保存为空字符) |
应用程序名称 | 1001 | 字符串名称最长为 31 个字节(第 32 个字符将被保存为空字符)。 注意:请不要向您的扩展数据中添加组码 1001 |
控制字符串 | 1002 | 一个扩展数据控制字符串即可以是 "{" 也可以是 "}"。这些大括号可以使应用程序通过把数据细分为表来组织它们的数据。左大括号开始表,右大括号结束最近的表。表可以被嵌套 |
3 个实数 | 1010,1020,1030 | 三个实数值的次序为 X、Y 和 Z。它们可被用于表示点或矢量记录 |
世界空间位置 | 1011,1021,1031 | 与简单的三维点不同,世界空间坐标可被移动、缩放、旋转和连同属于扩展数据的上级图元一起产生镜像。当命令 STRETCH 被用于上级图元且此点位于所选窗口中时,世界空间位置也可被拉伸 |
世界空间位移 | 1012,1022,1032 | 同样三维点也可被缩放,旋转和连同上级图元一起产生镜像(但不能被移动或拉伸) |
世界方向 | 1013,1023,1033 | 同样三维点也可被旋转和连同上级图元一起产生镜像(但不能被移动、缩放或拉伸) |
实数 | 1040 | 一个实数 |
距离 | 1041 | 一个可连同上级图元一起被缩放的实数值 |
缩放比例 | 1042 | 同样是一个可连同上级图元一起被缩放的实数值。与距离的区别在于此图元为应用程序定义的 |
整数 | 1070 | 一个 16 位整数(有符号的或无符号的) |
长整数 | 1071 | 一个 32 位符号(长型)整数 |
视频如下:
主要用到函数说明:
MxDrawEntity::SetXData
设置实体的扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] IMxDrawResbuf* pXData | 扩展数据链表 |
c#代码实现如下:
private void SetXData() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity ent = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的实体:")); if (ent == null) { return; } MxDrawResbuf exData = new MxDrawResbuf(); exData.AddStringEx("TestApp", 1001); exData.AddStringEx("甲", 1000); ent.SetXData(exData); }
主要用到函数说明:
MxDrawEntity::GetXData
返回实体的扩展数据。
c#代码实现如下:
private void GetXData() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity ent = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要读扩展数据的实体:")); if (ent == null) { return; } MxDrawResbuf exData = ent.GetXData(""); if (exData.Count == 0) { MessageBox.Show("没有扩展数据"); } else { // 向命令行窗口打印扩展数据。 exData.PrintData(); MessageBox.Show(exData.AtString(1)); } }
主要用到函数说明:
MxDrawEntity::SetxDataString
写一个字符串扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] BSTR val |
字符串值 |
szAppName |
扩展数据名称 |
nItem |
该值所在位置 |
C#代码实现如下:
private void WriteXData() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的对象")); if (selEnt == null) return; if (selEnt.SetxDataString("ExDataName", 0, "ExDataValue")) { MessageBox.Show("写扩展数据成功"); } else { MessageBox.Show("写扩展数据失败"); } }
主要用到函数说明:
MxDrawEntity::GetxDataString2
读取一个字符扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] LONG lItem |
该值所在位置 |
[out, retval] BSTR* pRet |
返回该变量值 |
szAppName |
扩展数据名称 |
C#代码实现如下:
private void ReadXData() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的对象")); if (selEnt == null) return; string val = selEnt.GetxDataString2("ExDataName", 0); if (axMxDrawX1.IsOk()) { MessageBox.Show(val); } else { MessageBox.Show("没有扩展数!"); } }
主要用到函数说明:
MxDrawEntity::SetxDataDouble
写一个Double扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] BSTR val | 字符串值 |
szAppName | 扩展数据名称 |
nItem | 该值所在位置 |
C#代码实现如下:
private void SetxDataDouble() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的对象")); if (selEnt == null) return; if (selEnt.SetxDataDouble("ExDataName", 0, 55.5)) { MessageBox.Show("写扩展数据成功"); } else { MessageBox.Show("写扩展数据失败"); } }
主要用到函数说明:
MxDrawEntity::GetxDataDouble2
读取一个Double扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] LONG lItem | 该值所在位置 |
[out, retval] BSTR* pRet | 返回该变量值 |
szAppName | 扩展数据名称 |
C#代码实现如下:
private void GetxDataDouble() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的对象")); if (selEnt == null) return; double val = selEnt.GetxDataDouble2("ExDataName", 0); if (axMxDrawX1.IsOk()) { MessageBox.Show(val.ToString()); } else { MessageBox.Show("没有扩展数!"); } }
主要用到函数说明:
MxDrawEntity::SetxDataLong
写一个long扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] BSTR val |
字符串值 |
szAppName |
扩展数据名称 |
nItem |
该值所在位置 |
c#代码实现如下:
private void SetxDataLong() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的对象")); if (selEnt == null) return; if (selEnt.SetxDataLong("ExDataName", 0, 123456)) { MessageBox.Show("写扩展数据成功"); } else { MessageBox.Show("写扩展数据失败"); } }
主要用到函数说明:
MxDrawEntity::GetxDataLong2
读取一个Long扩展数据,详细说明如下:
参数 | 说明 |
---|---|
[in] LONG lItem |
该值所在位置 |
[out, retval] BSTR* pRet |
返回该变量值 |
szAppName |
扩展数据名称 |
c#代码实现如下:
private void GetxDataLong() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要写扩展数据的对象")); if (selEnt == null) return; int val = selEnt.GetxDataLong2("ExDataName", 0); if (axMxDrawX1.IsOk()) { MessageBox.Show(val.ToString()); } else { MessageBox.Show("没有扩展数!"); } }
主要用到函数说明:
MxDrawEntity::GetAllAppName
得到所有扩展数据名称,详细说明如下:
参数 | 说明 |
---|---|
[out, retval] IMxDrawResbuf** ppRet | 返回IMxDrawResbuf扩展数据名称数组 |
c#代码实现如下:
private void GetAllAppName() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要读扩展数据的对象")); if (selEnt == null) return; //得到所有扩展数据名称 MxDrawResbuf val = selEnt.GetAllAppName(); if (val == null) { return; } for (var i = 0; i < val.Count; i++) { //返回链表中的指定位置字符串变量值 MessageBox.Show(val.AtString(i)); } }
主要用到函数说明:
MxDrawEntity::DeleteXData
删除扩展数据,详细说明如下:
参数 | 说明 |
---|---|
pzsAppName | 删除的扩展数据名称,如果为空,删除所有扩展数据 |
c#代码实现如下:
private void DeleteXData() { MxDrawUtility mxUtility = new MxDrawUtility(); MxDrawPoint point; MxDrawEntity selEnt = (MxDrawEntity)(mxUtility.GetEntity(out point, "选择要读扩展数据的对象")); if (selEnt == null) return; //删除的扩展数据名称,如果为空,删除所有扩展数据。 if (selEnt.DeleteXData("ExDataName")) { MessageBox.Show("删除扩展数据成功"); } else { MessageBox.Show("删除扩展数据失败"); } }