找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1684|回复: 5

[ARX程序]:那位高手有从AcDbDictionary读数据的ARX程序吗

[复制链接]
发表于 2002-7-25 08:53:48 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-25 09:04:56 | 显示全部楼层

Re: [ARX程序]:那位高手有从AcDbDictionary读数据的ARX程序吗

最初由 yousuika 发布
[B]那位高手有从AcDbDictionary,AcDbXrecord读数据的ARX程序。急用,是一个公司面试题 [/B]


下面代码是XDRX_API里面的函数,列出所有组名。


  1. [FONT=courier new]
  2. int ListGroup()
  3. {
  4.         resbuf *rb=ads_getargs();//
  5.         if (rb!=NULL)
  6.                 return RTNORM;
  7.         AcDbDictionary  *pGroupDict;
  8.         Acad::ErrorStatus es;
  9.         es=acdbCurDwg()->getGroupDictionary(pGroupDict, AcDb::kForRead); //打开组辞典准备读
  10.         if (Acad::eOk!=es)
  11.                 return RTNORM;
  12.         AcDbObject *pObj;
  13.        
  14.         AcDbDictionaryIterator *pIter;
  15.         pIter = pGroupDict->newIterator(AcRx::kDictSorted);//建立组辞典叠代器,遍历组辞典得到组名
  16.         if (!pIter) {
  17.                 pGroupDict->close();
  18.                 return RTNORM;
  19.         }
  20.         CStringArray groupName;
  21.         CString gname;
  22.         for (;!pIter->done();pIter->next()){ //根据叠代器循环遍历整个组辞典
  23.                
  24.                 if (Acad::eOk != pIter->getObject(pObj, AcDb::kForRead)) { //使用叠代器方法getObject()得到当前位置的对象,打开读
  25.                         continue;
  26.                 }
  27.                 if (!pObj->isKindOf(AcDbGroup::desc())) {
  28.                         pObj->close(); //关闭对象
  29.                         continue;// 组辞典里面包含不是组的对象,略掉
  30.                 }
  31.                 gname=pIter->name(); //使用叠代器指针对象的name()方法得到组名
  32.                 groupName.Add(gname);//将组名添加到CStringArray
  33.                 pObj->close();//对对象操作完毕,关闭对象
  34.         }
  35.         pGroupDict->close();//关闭辞典
  36.         return RTNORM;
  37. }[/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-25 18:08:41 | 显示全部楼层
那么,如何读词典中的数据呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-25 18:40:31 | 显示全部楼层
最初由 yousuika 发布
[B]那么,如何读词典中的数据呢 [/B]


组本身就是词典啊,上面的方法也就适合一般词典的操作。

es=acdbCurDwg()->getGroupDictionary(pGroupDict, AcDb::kForRead); //

这行是获得组词典对象,如果你读命名对象词典,那么把这行改成打开命名对象词典对象就可以了。

用AcDbDatabase::getNamedObjectsDictionary得到。可以改成

es=acdbCurDwg()->getNamedObjectsDictionary(pDict, AcDb::kForRead);

剩下下面的代码,就是AcDbDictionary对象提供的方法了。

如果你多看ARX代码,那么会发现,ARX读取对象数据库的程序结构基本是一样的,打开对象读或者写,然后对对象进行操作,最后关闭对象。

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

使用道具 举报

 楼主| 发表于 2002-7-26 13:26:42 | 显示全部楼层
其实这个题的原意是将一个VBA开发的改用ARX,循环迭代读出几层图的扩张记录(非图形数据).然后用Tree控件和 List控件显示。 源代码大概如下
dim obj as object
int inest = 0
f is a csv file
obj =ThisDrawing.Dictionaries
show-dicObject(inext, obj, f)

sub show-dicObject(inest as int,obj as object, file as object)
  if obj.ObjectName  = "AcDbDictionary" then
     if inest0then file.write obj.Name end if
  endif
  inest = inest + 1
  if obj.ObjectName =  "AcDbXrecord" then
  obj.getXRecordData outtype, outdata
     for i =  outtype.min to outtype.max
        outtype(i) = 1 file.write "文字:" outdata(i)
        outtype(i) = 10 file.write "坐标:" outdata(i)
             长度 -----
      next i
end if
for obj.Count call show-dicObject(inest, obj.Item(ii), file)
end sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-29 08:39:34 | 显示全部楼层
再请教,VBA中的ThisDrawing.Dictionaries 是不是有名对象词典。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 14:22 , Processed in 0.414848 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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