找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7626|回复: 8

[求助] 如何获取一个属性块的指定值

[复制链接]

已领礼包: 15个

财富等级: 恭喜发财

发表于 2016-6-12 04:48:17 | 显示全部楼层 |阅读模式

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

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

×
我定义了一个属性块,块名为“BG”,里面有一条属性,用来表示高程的,

然后图形里面这块有若干个,每个块里的属性值都不一样,

我想实现一个功能,就是输入一个命令后提示要我选择这个属性块,完了就直接显示出里面的属性。
如下图所示:

360截图20160612024931239.jpg
下面是我的部分代码
ads_name ssResult;
ads_point ssptres;
AcDbObjectId blkDefId;

acedEntSel(L"选择一个块:", ssResult, ssptres);
acdbGetObjectId(blkDefId, ssResult);
AcDbBlockTableRecord *pBlkDefRcd;
acdbOpenObject(pBlkDefRcd, blkDefId, AcDb::kForRead);  //返回值46,eNotThatKindOfClass),好象是说类型不对.

本想先得到块表记录->判断是否包含属性->遍历Entity->读取TextString。
但上面红色部分代码出问题了,找了一晚上没搞出个什么名堂,各位兄弟麻烦支支招,
或者有完整一点的代码给我研究就最好了,

跪谢~~~

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

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-6-12 08:25:52 | 显示全部楼层
你从 INSERT的ID怎么能打开BLOCK对象呢

你应该先打开AcDbBlockReference *pBlkDef,
然后用 pBlkRef->BlockTableRecord()获得块表记录,然后接着你的代码就可以了。

点评

喔,可以再详细的吗,我一直以为获得AcDbBlockReference需要先得获AcDbBlockRecord?  详情 回复 发表于 2016-6-12 10:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2016-6-12 08:34:41 来自手机 | 显示全部楼层
选择的时候过滤属性块,然后获取BlockReference的属性集合

点评

用哪种选择方法呢?我想做出来的效果是单选  详情 回复 发表于 2016-6-12 10:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 15个

财富等级: 恭喜发财

 楼主| 发表于 2016-6-12 10:21:39 来自手机 | 显示全部楼层
LoveArx 发表于 2016-6-12 08:25
你从 INSERT的ID怎么能打开BLOCK对象呢

你应该先打开AcDbBlockReference *pBlkDef,

喔,可以再详细的吗,我一直以为获得AcDbBlockReference需要先得获AcDbBlockRecord?

点评

你ENTSEL这个对象就是INSERT了,是AcDbBlockReference, ads_name ssResult; ads_point ssptres; AcDbObjectId blkDefId; acedEntSel(L"选择一个块:", ssResult, ssptres); acdbGetObjectId(blkDefId, ssRe  详情 回复 发表于 2016-6-12 15:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 15个

财富等级: 恭喜发财

 楼主| 发表于 2016-6-12 10:23:46 来自手机 | 显示全部楼层
st788796 发表于 2016-6-12 08:34
选择的时候过滤属性块,然后获取BlockReference的属性集合

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2016-6-12 15:00:28 | 显示全部楼层
zjh2785 发表于 2016-6-12 10:21
喔,可以再详细的吗,我一直以为获得AcDbBlockReference需要先得获AcDbBlockRecord?

你ENTSEL这个对象就是INSERT了,是AcDbBlockReference,

ads_name ssResult;
ads_point ssptres;
AcDbObjectId blkDefId;

acedEntSel(L"选择一个块:", ssResult, ssptres);
acdbGetObjectId(blkDefId, ssResult);
AcDbBlockTableRecord *pBlkDefRcd;
AcDbBlockReference *pDef;
Acad::ErrorsStats es;
es=acdbOpenObject(pDef, blkDefId, AcDb::kForRead);  

if (es !=eOk)
   return ;
AcDbObjectId  blkrecId = pDef->BlockTableRecord();
pDef->close();
es=acdbOpenObject(pBlkDefRcd, blkrecId , AcDb::kForRead);  
if (pBlkDefRcd->hasAttributeDefinitions())  //是否有属性
{
    .....
}
pBlkDefRcd->close();
return;

点评

嗯 搞定拉 ~~~不过现在又有个问题, 就是始终读不出属性块的现行值, 读出来的永远是默认值,  详情 回复 发表于 2016-6-12 20:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 15个

财富等级: 恭喜发财

 楼主| 发表于 2016-6-12 20:10:57 | 显示全部楼层
XDSoft 发表于 2016-6-12 15:00
你ENTSEL这个对象就是INSERT了,是AcDbBlockReference,

ads_name ssResult;

嗯 搞定拉  ~~~不过现在又有个问题,   就是始终读不出属性块的现行值,  读出来的永远是默认值,
  1. if(pBlkDefRcd->hasAttributeDefinitions())
  2.     {
  3.       acutPrintf(L"属性块\n");
  4.       AcDbBlockTableRecordIterator *pItr;
  5.       pBlkDefRcd->newIterator(pItr);
  6.       AcDbEntity* pEnt;
  7.       for(pItr->start(); !pItr->done(); pItr->step())
  8.       {
  9.         pItr->getEntity(pEnt, AcDb::kForRead);
  10.         AcDbAttributeDefinition* pAttDef;
  11.         pAttDef = AcDbAttributeDefinition::cast(pEnt);
  12.         if(pAttDef != NULL)
  13.         {
  14.           ACHAR* str;
  15.           str = pAttDef->tag();
  16.           acutPrintf(L"标记:%s\n", str);
  17.           free(str);
  18.           str = pAttDef->prompt();
  19.           acutPrintf(L"提示:%s\n", str);
  20.           free(str);
  21.           str = pAttDef->textString();
  22.           acutPrintf(L"值:%s\n", str);
  23.           free(str);
  24.           pAttDef->close();
  25.         }
  26.         pEnt->close();
  27.       }
  28.       delete pItr;
  29.      }
复制代码

点评

属性块里面是定义,他没有现行值,现在值附在INSERT实体上的AcDbAttribute实体上。  详情 回复 发表于 2016-6-12 20:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-12 20:29:15 | 显示全部楼层
zjh2785 发表于 2016-6-12 20:10
嗯 搞定拉  ~~~不过现在又有个问题,   就是始终读不出属性块的现行值,  读出来的永远是默认值,

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:49 , Processed in 0.329478 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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