找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 717|回复: 0

[原创]:ARX格式化文本输出

[复制链接]
发表于 2004-8-22 19:55:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 00:45 , Processed in 0.256659 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表