找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 873|回复: 19

[讨论]:有没有办法获取某一层上的实体

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

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

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

×
如题:有没有办法获取某一层上的实体

层不是一个实体容器,但在acad的应用上,给人直观印象就是一个平台,好像实际上层成为了实体的某一属性。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-4-30 11:01:53 | 显示全部楼层
给你一个获取层上实体的函数

  1.   [FONT=courier new]
  2. // 输入想要获取实体的那个层名,传出那个层上的所有实体ID数组
  3. Acad::ErrorStatus
  4. getAllEntsInLayerByLayername(const char* szLayerName,
  5.                                                         AcDbObjectIdArray& eIds)
  6. {
  7.         eIds.setPhysicalLength(0);
  8.         Acad::ErrorStatus es = Acad::eOk;

  9.         // 判断是否存在层名szLayerName
  10.         AcDbLayerTable *pLayerTable = NULL;
  11.     es = acdbHostApplicationServices()->workingDatabase()
  12.         ->getSymbolTable(pLayerTable, AcDb::kForRead);
  13.         if (es != Acad::eOk) return es;
  14.     AcDbLayerTableRecord *pLayerTableRecord = NULL;
  15.         es = pLayerTable->getAt(szLayerName, pLayerTableRecord,
  16.                 AcDb::kForRead);
  17.         if (es != Acad::eOk) {
  18.                 pLayerTable->close();
  19.                 acutPrintf("层'%s'不存在!", szLayerName);
  20.                 return es;
  21.         }
  22.         pLayerTableRecord->close();
  23.        
  24.         // 得到模型空间的块表记录,并遍历它得到所需要的实体
  25.         AcDbBlockTable *pBlockTable = NULL;
  26.     es = acdbHostApplicationServices()->workingDatabase()
  27.         ->getSymbolTable(pBlockTable, AcDb::kForRead);
  28.         if (es != Acad::eOk) return es;
  29.        
  30.     AcDbBlockTableRecord *pBlockTableRecord = NULL;
  31.     es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
  32.         AcDb::kForRead);
  33.         if (es != Acad::eOk) {
  34.                 pBlockTable->close();
  35.                 return es;
  36.         }
  37.     pBlockTable->close();
  38.        
  39.     AcDbBlockTableRecordIterator *pBlockIterator = NULL;
  40.     pBlockTableRecord->newIterator(pBlockIterator);
  41.        
  42.         AcDbEntity *pEntity = NULL;
  43.     for (; !pBlockIterator->done(); pBlockIterator->step()) {
  44.         es = pBlockIterator->getEntity(pEntity, AcDb::kForRead);
  45.                 if (es != Acad::eOk) continue;
  46.                
  47.                 // 得到实体所属于的层,并比较是否是我们需要的层
  48.                 // 是则添加到我们ID数组中去
  49.                 char *cLayer = pEntity->layer();
  50.                 if (strcmp(cLayer, szLayerName) == 0) {
  51.                         eIds.append(pEntity->objectId());
  52.                 }
  53.                 acutDelString(cLayer);
  54.                
  55.         pEntity->close();
  56.                 pEntity = NULL;
  57.     }
  58.     delete pBlockIterator;
  59.     pBlockTableRecord->close();

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

使用道具 举报

 楼主| 发表于 2005-4-30 12:05:41 | 显示全部楼层
非常感谢,其实在发完这个贴后,马上就看到了该函数,所以立马又发了个FAQ的建议贴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-30 13:46:47 | 显示全部楼层
谢谢rackyye ,让人受益非浅!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2005-5-12 10:04:01 | 显示全部楼层
我想请问下楼主,,你这个取得一个层里面所有的实体,那如果我要只取一个范围里面的呢?我试过用acedSSGet("W",pt1,pt2,&eb,sname);来取,然后,用
struct resbuf * ebuf = acdbEntGet(sname) 来的存储,最后读取ebuf->resval.rstring.
为什么在CAD中运行是,报错了呢?能不能指点下呢?我想很可能是我的函数有问题.
先谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-5-12 11:18:43 | 显示全部楼层
用选择集的筛选时,走到组码2就报错,这是什么原因?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-12 12:26:30 | 显示全部楼层
最初由 xiaoyubujimo 发布
[B]我想请问下楼主,,你这个取得一个层里面所有的实体,那如果我要只取一个范围里面的呢?我试过用acedSSGet("W",pt1,pt2,&eb,sname);来取,然后,用
struct resbuf * ebuf = acdbEntGet(sname) 来的存储,最后读取ebuf->res... [/B]


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

使用道具 举报

发表于 2005-5-14 11:41:23 | 显示全部楼层
struct resbuf eb;
        char sbuf[10];
        eb.restype = 8; // Layer
        strcpy(sbuf, "CLXB");
        eb.resval.rstring = sbuf; // Layer name
        eb.rbnext = NULL;
       
        acedSSGet("C", pt1,pt2, &eb, ssname);
我本想得到经过pt1,pt2矩形框中的实体(应为4个),但结果却是2个实体,以上语句有问题么,什么原因阿。。。?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-18 17:33:50 | 显示全部楼层
建议你将pt1和pt2两个参数对调一下试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-19 08:19:20 | 显示全部楼层
对调了pt1和pt2,还是不行,怎么感觉后画的两条线acedSSGet没有“认”出来,不解?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-19 09:16:42 | 显示全部楼层
那你先确认一下未选中的两个实体是否是在“CLXB”图层上,还有过pt1、pt2两个对角顶点做一矩形框,看两个实体是否在矩形框范围内。
补充:你检查一下几个实体的Z坐标,看是否一致?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-23 09:27:43 | 显示全部楼层
是不是没有被选种的那两个实体和选种的那两个不在同一层上?
我也遇到过类似的问题.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 10:23 , Processed in 0.222684 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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