找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1914|回复: 9

[ARX程序]:如何得到实体所在的组

[复制链接]
发表于 2002-10-15 20:42:20 | 显示全部楼层 |阅读模式

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

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

×
如何用ARX方法得到实体所在的组。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-10-16 00:37:09 | 显示全部楼层

Re: [ARX程序]:如何得到实体所在的组

最初由 夜语 发布
如何用ARX方法得到实体所在的组。

一个实体可以属于多个组,
组还可以包含组甚至其他。
组实际上是个带反应器的词典。
可以通过遍历各组中的实体来与该实体对比以确定该实体属于哪个组,但有可能得到不止一个组。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-16 00:39:25 | 显示全部楼层

Re: Re: [ARX程序]:如何得到实体所在的组

最初由 rave 发布
[B]
一个实体可以属于多个组,
组还可以包含组甚至其他。
组实际上是个带反应器的词典。
可以通过遍历各组中的实体来与该实体对比以确定?.. [/B]


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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-16 23:07:07 | 显示全部楼层

Re: [ARX程序]:如何得到实体所在的组

最初由 夜语 发布
[B]如何用ARX方法得到实体所在的组。 [/B]


实体属于一个组,在实体上会附加永久反应器,因此,你读出附加在实体上的永久反应器,判断是否是个组。

下面代码是根据实体获得所属于的组。


  1. [FONT=courier new]
  2. // GrpNameCommands.cpp
  3. // ObjectARX defined commands


  4. #include "StdAfx.h"
  5. #include "StdArx.h"
  6. #include "dbgroup.h"
  7. #include "dbdict.h"


  8. // This is command 'GRPNAME'
  9. void GrpName()
  10. {
  11.     ads_name ename;
  12.     ads_point dummy;
  13.     if (RTNORM != acedEntSel("\nSelect entity: ", ename, dummy))
  14.         return;

  15.     AcDbEntity *pEnt;
  16.     AcDbObjectId objId;
  17.     acdbGetObjectId(objId, ename);
  18.     if (Acad::eOk != acdbOpenObject(pEnt, objId, AcDb::kForRead)) {
  19.         acutPrintf("\nCannot open entity.");
  20.         return;
  21.     }

  22.     pEnt->close();
  23.     AcDbDictionary *pGroup;      
  24.     AcDbVoidPtrArray *pReactors;
  25.     pReactors = pEnt->reactors();
  26.     if (pReactors == NULL) {
  27.         acutPrintf("\nEntity does not belong to a group.");
  28.         pEnt->close();
  29.         return;
  30.     }
  31.     int length = pReactors->length();
  32.     void *pSomething;
  33.     for (int i = 0; i < length; ++i) {
  34.         pSomething = (AcDbObject*) pReactors->at(i);
  35.         if (acdbIsPersistentReactor(pSomething)) {
  36.             // Every group reactor is a persistent reactor.
  37.             // Is this a reactor from a group?
  38.             AcDbObjectId persObjId = acdbPersistentReactorObjectId(pSomething);
  39.             AcDbObject *pReactor;
  40.             if (Acad::eOk != acdbOpenObject(pReactor, persObjId, AcDb::kForRead)) {
  41.                 acutPrintf("\nCannot get reactor.");
  42.                 continue;
  43.             }
  44.             if (pReactor->isKindOf(AcDbGroup::desc())) {
  45.                 // This is a group reactor. Get the group name.
  46.                 AcDbObjectId groupId = pReactor->ownerId();
  47.                 if (Acad::eOk != acdbOpenObject(pGroup, groupId, AcDb::kForRead)) {
  48.                     acutPrintf("\nCannot open group.");
  49.                     pReactor->close();
  50.                     continue;
  51.                 }
  52.                 char *groupName;
  53.                 if (Acad::eOk != (pGroup->nameAt(persObjId, groupName))) {
  54.                     acutPrintf("\nCannot get group name.");
  55.                     pReactor->close();
  56.                     pGroup->close();
  57.                     continue;
  58.                 }
  59.                 acutPrintf("\nEntity belongs to group '%s'.", groupName);
  60.                 pGroup->close();
  61.             }
  62.             pReactor->close();
  63.         }
  64.     }
  65. }
  66. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-10-17 00:44:46 | 显示全部楼层

Re: Re: [ARX程序]:如何得到实体所在的组


  1. ...
  2. if (pReactor->isKindOf(AcDbGroup::desc())) {
  3.    AcDbObjectId groupId = pReactor->ownerId();
  4. ...
复制代码

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-17 00:53:36 | 显示全部楼层

Re: Re: Re: [ARX程序]:如何得到实体所在的组

最初由 rave 发布
[B]

  1. ...
  2. if (pReactor->isKindOf(AcDbGroup::desc())) {
  3.    AcDbObjectId groupId = pReactor->ownerId();
  4. ...
复制代码

不解,
请问,组反应器的类型是组吗?
既然已是组了,还有必要取ownerId吗? [/B]


groupId = pReactor->ownerId(); 得到是组对象的所属ID,即:组词典AcDbGroupDictionary的ObjectId

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

使用道具 举报

发表于 2002-10-17 01:00:18 | 显示全部楼层

Re: Re: Re: Re: [ARX程序]:如何得到实体所在的组

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-17 01:25:58 | 显示全部楼层

Re: Re: Re: Re: Re: [ARX程序]:如何得到实体所在的组

最初由 rave 发布
[B]是否应该这样理解:
组反应器应该还是反应器,只不过它的组码与组的组码相同 [/B]


下面是关于表项和词典的关系:
当向一个词典添加一个表项时候,词典自动为表项附加一个反应器。如果对象被删除,词典会得到通知,并会从词典中删除该表项。

应该这样理解:

组词典下面的组和组词典(AcDbGroupDictionary)的关系也是:通知者和反映器的关系,组词典是保存组对象的容器,组和实体间是通知者和反映器的关系。

所以,通过实体的通知,得到反应对象(组)



  1. [FONT=courier new]
  2. pReactors = pEnt->reactors(); [/FONT]
复制代码


得到反应器组后,再用ownerId得到组词典

  1. [FONT=courier new]
  2. AcDbObjectId groupId = pReactor->ownerId();
  3. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-5-8 12:43:54 | 显示全部楼层
经典的讨论啊!两大高手就是牛!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-5-8 12:53:54 | 显示全部楼层
经典的讨论啊!两大高手就是牛!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 06:25 , Processed in 0.409945 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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