ARX格式化输出
<FONT face=宋体 size=2>ARX中使用与C中printf函数类似的acedPrintf函数,向ACAD文本窗口输出数据,这种数据输出方式无法在编译时检测到数据的正确性,也无法扩展数据结构输出包括ARX定义的数据结构。格式化输出就是使用类似于C++标准中的方式:<BR>Cout << “文字” << number << endl;<BR>来向ACAD文本窗口数据数据.<BR>1)扩展标准对象<BR>在C++标准对象strstreambuf基础上建立数据缓存对象:<BR>class cadstreambuf : public strstreambuf<BR>{<BR>public:<BR>//……<BR>};<BR>缓存对象中保存需要向ACAD文本窗口的数据,对象构析或者更新时,将缓存中的数据用acedPrintf函数输出到ACAD文本窗口中. 标准的sync函数实现实际的数据输出.<BR>virtual int sync();<BR>virtual ~cadstreambuf()<BR>{<BR>sync();<BR>strstreambuf::~strstreambuf();<BR>}<BR>包含缓存对象的实际输出流对象:<BR>class ocadstream : public ostream<BR>{<BR>private:<BR>cadstreambuf sb_;<BR>public:<BR>ocadstream() : ostream(&sb_){}<BR>};<BR>这样就可以与C++标准相同的方式向ACAD数据文本格式的数据了:<BR>ocadstream os;<BR>os << “输出距离:” << 1000.0 << endl;<BR>控制符号同样可以使用:<BR>os << setwid(10) << 500.4 << setwid(15) << setfill(“*”) << 300.0 << endl;<BR>2)数据格式输出<BR>ARX中有一些常用的数据需要输出,如AcGePoint3d, AcDbObjectIdd等,可以扩展这种数据输出:<BR>ostream& operator << (ostream& s, AcDbObjectId & x)<BR>{<BR>return s << "AcDbObjectId:" << x.asOldId();<BR>}<BR>ostream& operator << (ostream& s, AcGePoint3d & x)<BR>{<BR>return s << "(" << x.x << "," << x.y << "," << x.z << ")";<BR>}<BR>一旦完成数据类型的输出重载,数据的输出就非常简单了,比如:<BR>os << “点的坐标是:” << AcGePoint3d(1000,1000,0) << endl;<BR>这种扩展可以针对任意的数据类型,ARX定义的或者用户定义的,也可以定义:<BR>ostream& operator << (ostream& s, AcDbEntity* x)<BR>{<BR>x->list();<BR>return s;<BR>}<BR>输出AcDbEntity对象时,自动调用对象的list方法.<BR>3)控制输出<BR>ARX有是需要根据内部的系统变量来控制数据的输出格式,典型的是函数:<BR>int acdbRToS(ads_real val,int unit,int prec,char * str);<BR>unit为实数的输出格式,由系统变量LUNITS决定.prec为数据的输出精度,由LUPREC系统变量决定.可以定义对象:<BR>class rtos{<BR>private:<BR>//…..<BR>public:<BR>rtos(double r);<BR>char* str() const;<BR>};<BR>构造对象时调用acdbRtoS将r转换为对应的字符串,调用str获得.<BR>ostream& operator << (ostream& s, const rtos& x)<BR>{<BR>return s<< x.str();<BR>}<BR>这样就可以简单的使用当前的系统变量来输出数据了:<BR>os << rtos(100.0) << endl;</FONT>
页:
[1]