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