摘 要 : 本文对AutoCAD中扩展图元数据(XDATA)的数据格式进行了详细分析,介绍了扩展图元数据在AutoCAD中添加、访问和使用的方法,讨论了扩展数据在地籍测量中的具体应用,对从事地籍测量工作的技术人员有一定的借鉴作用.
关 键 词 : 图元;扩展数据;地籍测量
中图分类号:P209 文献标识码:A 文章编号:1006-4311(2014)07-0202-03
0 引言
AutoCAD有强大的图形编辑功能,在测绘领域有着广泛的应用,目前国内流行的几种测图软件系统,像南方CASS软件、广州开思,都是以AutoCAD为平台进行二次开发,而CASS软件在国内各个测绘单位占了很大的使用比率,其图形要素的属性,以扩展属性的方式存放在图元上.
AutoCAD的基本图形类型有以下几种:单行文本(Text)、多行文本(MText)、直线(Line)、圆(Circle)、圆弧(Arc)、多段线(PolyLine)、点(Point)、块参照(Insert),其中多段线又分为轻量多段线及二维多段线两种,后者又可分为无拟合、二次拟合、三次拟合等几种形式.
在AutoCAD数据文件中,只是记录着表示图形元素的几何位置、形状、大小的几何坐标和表示图形元素性质(如颜色、层号等)的辅助数据.采用扩展属性,在相应的图元上添加扩展数据,可以拓展AutoCAD在专业方面的应用,使其具有一定的GIS功能.
1.扩展图元数据
AutoCAD的DWG文件,图形对象并不直接存贮属性数据,相反,对属性数据的存贮是通过图形的扩展数据XDATA来实现,利用XDATA设计变量,然后将属性数据赋给这些变量来完成.AutoCAD没有提供相应的菜单命令来直接操作XDATA,要读写属性数据,借助该平台的二次开发,选择一种开发语言:Lisp/Visual Lisp、VBA/VB或C++编写代码来读写这些属性数据.如果图元包括扩展数据,则扩展数据将放在普通定义数据之后.利用扩展图元数据,用户能将用户定义数据添加到任何AutoCAD图元中.
1.1 扩展图元数据码 扩展数据是由 AutoLISP 或 ObjectARX应用程序创建的.如果图元包括扩展数据,则扩展数据将跟在普通定义数据之后.从 1000 到 1071 的组码用来描述扩展数据.
组码 1001 表示扩展数据的开始.与普通图元组码相比,在扩展数据中相同的组码可以出现多次,而且次序非常重要.
扩展数据按照已注册的应用程序名称编组.每一个注册应用程序的组都从组码 1001 开始,其组值为表示应用程序名称的字符串.注册应用程序名称符合 APPID 符号表条目.
如果需要,应用程序可以使用多个 APPID 名称.APPID 名称是永久性的,尽管那些在图形中非当前使用的 APPID 名称将被清理.每个 APPID 名称可以拥有一个附着到每个对象上的数据组.在应用程序的组码中,扩展数据组的序列及其含意由应用程序定义.
扩展数据组码的说明如表1.
1.2 添加扩展图元数据 在为一个图元添加XDATA之前,AutoCAD需要注册应用名.因为一个图形可以为许多不同的应用程序引用.一个应用程序必须将其数据与别的应用程序分开,唯一应用程序识别名(APPID)用于完成这种功能.注册应用程序名之后,可用APPEND函数把扩展图元数据添加到原图元数据表后.下面的代码示例基于ObjectARX2008及VC++2005.
完成添加扩展数据的功能.
void addXdata(CString appName,CString resString,ads_name en)
{
AcDbObject* pObj;
AcDbObjectId ObjectId;
acdbGetObjectId(ObjectId,en);
acdbOpenAcDbObject(pObj,ObjectId,AcDb::kForWrite);
struct resbuf *pRb, *pTemp;
pRb 等于 pObj->xData(appName);
if(pRb !等于 NULL){
for (pTemp 等于 pRb; pTemp->rbnext !等于 NULL;
pTemp 等于 pTemp->rbnext)
{ ; }
}
else {
acdbRegApp(appName);
pRb 等于 acutNewRb(AcDb::kDxfRegAppName);
pTemp 等于 pRb;
pTemp->resval.rstring等于(ACHAR*)malloc((wcslen(appName)+1)*sizeof(ACHAR));
_tcscpy(pTemp->resval.rstring,appName);
}
pTemp->rbnext 等于 acutNewRb(AcDb::kDxfXdAscii
String);
pTemp 等于 pTemp->rbnext;
pTemp->resval.rstring等于(ACHAR*)malloc((wcslen(resString)+1)*sizeof(ACHAR));
_tcscpy(pTemp->resval.rstring,resString);
pObj->upgradeOpen(); pObj->setXData(pRb);
pObj->close();
acutRelRb(pRb);
}
1.3 访问扩展图元数据 访问扩展图元数据时,必须提供应用程序名,下面的代码展示如何获得扩展数据及如何删除扩展数据.
获取图元ent上扩展名为appName的扩展数据,存入csXdata中
void Get_Xdata(ads_name ent,CString appName,CStringArray &csXdata)
{
struct resbuf *eb1等于NULL,*eb2等于NULL,*apps等于NULL;
CString xData;
apps等于acutBuildList(RTSTR,appName,0);
eb1等于acdbEntGetX(ent,apps);
for(eb2等于eb1;eb2!等于NULL;eb2等于eb2->rbnext) {
if(eb2->restype等于等于1000) {
_tcscpy(xData.GetBuffer(1000),eb2->resval.rstr
ing);
xData.ReleaseBuffer();
csXdata.Add(xData);
}
}//for
acutRelRb(apps);
acutRelRb(eb1);
return;
}
删除图元ent上扩展名为appName的扩展数据
int delXdata(ads_name ent,CString appName)
{
struct resbuf *entbuf,*pbuf1,*pbuf2;
TCHAR sbuf[20];
entbuf等于acdbEntGet(ent);
pbuf1等于acutNewRb(-3);
pbuf2等于acutNewRb(1001);
_tcscpy(sbuf,appName.GetBuffer(20));
appName.ReleaseBuffer();
pbuf2->resval.rstring等于sbuf;
pbuf2->rbnext等于NULL;
pbuf1->rbnext等于pbuf2;
entbuf->rbnext等于pbuf1;
acdbEntMod(entbuf);
return RTNORM;
}
2.扩展图元数据的应用
AutoCAD的图层组织较为自由,不同类型的几何实体可以放在同一层中,可以设置不同的颜色.
在DWG文件中,图形对象并不直接存贮属性数据,相反,对属性数据的存贮是通过图形的扩展数据XDATA来实现,利用XDATA设计变量,然后将属性数据赋给这些变量来完成. AutoCAD没有提供相应的菜单命令来直接操作XDATA,要读写属性数据,借助该平台的二次开发,选择一种开发语言:Lisp/Visual Lisp、VBA/VB或C++编写代码来读写这些属性数据.
利用扩展图元数据,可以实现图形数据与属性数据的连接,从而可以实现信息的管理、查询、分析等功能,弥补CAD系统在属性管理方面功能相对较弱的不足.
在地籍测量的内业工作中,需要将采集到的界址点信息以及宗地信息录入计算机进行处理,根据作业要求,一般将地籍数据分为界址点、界址线及宗地三类,依照具体调查要求,将三种不同数据建立数据库,将数据录入其中,进行处理.
界址点主要属性有点号、X坐标、Y坐标等信息,界址线属性包括街坊号、起点点号、终点点号、左宗地号、右宗地号等内容,宗地属性包含街坊号、宗地号、单位性质等权属调查的详细信息,通过界址线表的界址点点号及宗地号,将界址点表和宗地属性表有机的结合起来.
界址线的数据格式的设计采用双重独立式地图编码法(DIME),这种结构是由美国人口统计局用于进行人口普查分析和制图,对于宗地、界址边以及它们邻接关系的检索都很容易.
界址线表是整个数据库系统的关键,它是连接界址点表及宗地属性表的纽带,界址线表是根据双重独立式地图编码法(DIME)来设计的,其原理是,在二维平面上,多边形的任意一条边都只能被两个并且最多被两个多边形共用,因此,对于宗地的界址边来说,某一条界址边只可能属于相邻的两宗地,或只属于某一宗地,其主要字段有“街坊号”、“起点点号”、“终点点号”、“宗地号1”、“宗地号2”、“备注”、“错误内容”这几项,其中“起点点号”和“终点点号”与界址点表中的点号相关联,“宗地号1”和“宗地号2”与属性表中的街坊号相对应.
在生成地籍图的时候,以字段名为扩展属性的应用程序名,字段值为扩展属性值,通过应用程序名,可以读取界址点、界址线的属性信息,这样就使图元和属性结合在一起.通过操作图形的扩展数据,能够自动生成街坊宗地图,自动计算宗地面积,进行宗地边长、宗地地类号、宗地面积的自动注记,并且由宗地图多边形范围,自动判断该宗地图的幅面大小及比例尺,实现宗地图的自动裁剪,而不需要人工干预.
3.结束语
本文探讨了AutoCAD中扩展图元数据格式,采用代码示例的方式,介绍了扩展图元数据的添加、访问和删除方式,讨论了扩展数据在地籍测量内业中的具体应用,提出了一种应用扩展数据进行地籍测量内业数据处理的方法,对于地籍测量内业工作有一定的借鉴意义.