- UID
- 21284
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-12-20
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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; |
|