找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1353|回复: 5

[求助] [求助]:请晓东帮个忙

[复制链接]
发表于 2002-2-5 21:27:14 | 显示全部楼层 |阅读模式

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

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

×
我想把图纸比例参数保存在dwg文件里,我在网上看了你的一篇有关词典的文章,我不太了解具体细节,你能否贴一个把比例参数保存和读出在dwg文件里ARX例子,多谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-5 23:24:45 | 显示全部楼层

Re: [求助]:请晓东帮个忙

最初由 ARX 发布
[B]我想把图纸比例参数保存在dwg文件里,我在网上看了你的一篇有关词典的文章,我不太了解具体细节,你能否贴一个把比例参数保存和读出在dwg文件里ARX例子,多谢! [/B]


以前在老的001开发论坛,我贴过关于保存非对象数据到图中词典的方法。

首先要理解词典(AcDbDictionary)的概念,词典和符号表不同,符号表(AcDbSymbolTable)内只能存放一个类的对象,而词典不同,词典是个容器对象,他可以存储任意的AcDb类对象,注意:存储的是对象,而非数据(非对象),比如你的比例数据就不能直接存储在词典内。那有什么办法把非对象数据存储到词典里面呢?,答案是可以通过AcDbXRecord(扩展记录)对象间接做,因为扩展记录是AcDb对象,所以可以保存到词典容器里面。而扩展记录对象内可以附着非对象数据,可以是任何的ADS数据,通过一个结果缓冲区链表RESBUF,结果缓冲区链表可以结构可以存储ACAD的需要的非对象数据,比如字符串、实体名、点、实数、整数等等,而通过AcDbXRecord对象的setFromRbChain方法,可以把RESBUF链表加到扩展对象中。

Acad::ErrorStatus
setFromRbChain(
    const resbuf& rb,

    AcDbDatabase* pAuxDb = NULL);

rb        Input the first resbuf (not its address) in a linked list of resbufs that contain the data for the xrecord
pAuxDb        Not currently used

通过上面的,就可以通过AcDbXRecord对象作为桥梁,把非对象数据保存到词典里面,这也是ADESK设立AcDbXRecord对象的动机。

下面说下实现方法,首先要在命名对象词典(根词典)建立一个词典记录,然后把扩展记录对象存储到这个子词典中,当然也可以直接把扩展记录存到根下,但是推荐存到子词典内,这和我们平时的硬盘的树状管理道理是一样的。整个ACAD数据库就是一个树,所有的对象和数据都保存在这个树状结构中,我们在屏幕上能看到的,仅仅是放到块表中的实体通过对象自身的方法显示自己到屏幕才看到的。

建立一个子词典,首先要判断是否这个子词典以前你建立过了,若没有,新建,若有,那就略过,直接把扩展记录保存到这个子词典里面就可以了

说明:ARX的对对象的操作方法都是一样的,代码结构是通用的,都是要打开对象进行读写,然后根据对象方法进行操作,最后要关闭数据库,下面是示例代码:


  1. AcDbDictionary *pNameObj;
  2. es=acdbCurDwg()->getNamedObjectsDictionary(pNameObj,AcDb::kForWrite);//打开命名对象词典对象进行写
  3. if (es!=Acad::eOk)
  4.    return; //打开不成功,返回

  5. if (pNameObj->getAt(pszDict,(AcDbObject *&)pDict,AcDb::kForRead)==Acad::eKeyNotFound)
  6. //判断你的子词典是否存在pszDict,不存在建立
  7. {
  8.     pDict=new AcDbDictionary; //新建个词典对象
  9.     AcDbObjectId dictId;
  10.     //添加子词典到根下
  11.     pNameObj->setAt(_strupr(pszDict),pDict,dictId);
  12. }
  13. pNameObj->close();//关闭命名对象词典对象
复制代码


同上面操作,我们保证根词典下有了你的子词典,子词典的KEY是pszDict

下面我们该做怎么把非对象数据保存到扩展记录里面。

首先把你的非对象数据保存到RESBUF链表里面
resbuf *rbChain=ads_newrb(RTREAL);
rbChain->resval.rreal=mScale; //比例值
rbChain->rbnext=NULL;

下面把这个RESBUF链表保存到一个词典的通用函数

参数:
   pszKey--存储扩展记录的KEY
   pDict--词典对象
   Xdata--resbuf 链表引用   


  1. BOOL addXdataToDictionary(AcDbDictionary * &pDict,char * pszKey,resbuf * &Xdata)
  2. {
  3.         if (!pDict)
  4.                 return FALSE;

  5.         if (!Xdata)
  6.                 return FALSE;

  7.         AcDbXrecord *pXrec=new AcDbXrecord;
  8.         AcDbObjectId xrecObjId;
  9.         char *pKey=_strupr(pszKey);
  10.         AcDbObjectId objId;
  11.         Acad::ErrorStatus es;
  12.         es=pDict->getAt(pKey,objId);
  13.         if (Acad::eOk==es)
  14.         {
  15.                 pDict->remove(pKey);
  16.         }
  17.         es=pDict->setAt(pKey,pXrec,xrecObjId);
  18.         if (es==Acad::eOk)
  19.         {
  20.                 pXrec->setFromRbChain(*Xdata);
  21.                 pXrec->close();
  22.                 return TRUE;
  23.         }
  24.         return FALSE;
  25. }
复制代码


在你的主程序中,用:


  1.         if (addXdataToDictionary(pDict,pszKey,rbChain))
  2.                 ads_rett();
  3.         pDict->close(); //关闭词典,因为不需要了
  4.         if (rbChain)
  5.            ads_relrb(rbChain); //如果resbuf链表不空,释放内存
复制代码


ok!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-2-6 22:04:49 | 显示全部楼层
请再把读数据的例子贴出来,多谢!另外是否需要include和词典有关的什么文件,我编译时怎么提示错误
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-2-7 12:34:19 | 显示全部楼层
#include "rxobject.h"
#include "rxregsvc.h"
#include"Dbxrecrd.h"
void createdict()
{
        AcDbDictionary *pnamedobj;
        Acad::ErrorStatus es;
        es=acdbCurDwg()->getNamedObjectsDictionary(pnamedobj,AcDb::kForWrite);
        if(es!= Acad::eOk)
                return;
        AcDbDictionary *pdict;
        pdict=new AcDbDictionary;
        if(pnamedobj->getAt("XLX_DICT",(AcDbObject *&)pdict,AcDb::kForRead)==Acad::eKeyNotFound)
        {
       
        AcDbObjectId dictid;
    pnamedobj->setAt("XLX_DICT",pdict,dictid);
        }
    pnamedobj->close();
        AcDbXrecord *pxdata1=new AcDbXrecord;
        AcDbObjectId xdataid;
        pdict->setAt("CHANSHU",pxdata1,xdataid);
    pdict->close();
    struct resbuf *xhead;
        xhead=ads_buildlist(AcDb::kDxfText,"xlx",AcDb::kDxfReal,5.7,0);
    pxdata1->setFromRbChain(*xhead);
        ads_relrb(xhead);
        pxdata1->close();
        //return Acad::eOk;
}
void printdict()
{
        AcDbDictionary *pnamedobj;
        acdbCurDwg()->getNamedObjectsDictionary(pnamedobj,AcDb::kForRead);
        AcDbDictionary *pdict;
        pdict=new AcDbDictionary;
        pnamedobj->getAt("XLX_DICT",(AcDbObject *&)pdict,AcDb::kForRead);
        pnamedobj->close();
        AcDbXrecord *pxdata1;
        pdict->getAt("CHANSHU",(AcDbObject *&)pxdata1,AcDb::kForRead);
    pdict->close();
    struct resbuf *xhead;
    pxdata1->rbChain(&xhead);
    pxdata1->close();
        printlist(xhead);
        ads_relrb(xhead);
        //return Acad::eOk;
}
void printlist(struct resbuf *xhead)
{
        int rt,i;
        for(i=0;xhead!=NULL;i++,xhead=xhead->rbnext)
        {
                if(xhead->restype<10 && xhead->restype>=0)
                        rt=RTSTR;
                else if(xhead->restype<38)
            rt=RT3DPOINT;
                else if(xhead->restype<60)
            rt=RTREAL;
                switch(rt){
                case RTSTR:
                        if(xhead->restype==RTSTR)
                                ads_printf("RTSTR:%s\n",xhead->resval.rstring);
                        else
                                ads_printf("(%d.%s)\n",xhead->restype,xhead->resval.rstring);
                        break;
                case RTREAL:
                        if(xhead->restype==RTREAL)
                                ads_printf("RTREAL:%0.3f\n",xhead->resval.rstring);
                        else
                                ads_printf("(%d.%f)\n",xhead->restype,xhead->resval.rstring);
                        break;
                }

        }
        return;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-2-8 10:30:48 | 显示全部楼层
用这种方式保存在dwg里的数据,如果普通用户在autocad里执行了错误命令是否会无意中删除了数据?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-2-8 16:43:52 | 显示全部楼层
最初由 ARX 发布
[B]用这种方式保存在dwg里的数据,如果普通用户在autocad里执行了错误命令是否会无意中删除了数据? [/B]


错误的命令是不会删除词典里面你的数据的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-5 02:51 , Processed in 0.444378 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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