找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2926|回复: 14

[求助] 求教AcDbAttributeDefinition如何获取实际值?

[复制链接]
发表于 2014-12-3 11:05:51 | 显示全部楼层 |阅读模式

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

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

×
我想读取一个属性块里面AcDbAttributeDefinition类型的实际值,但是通过->textString(),读取的只是默认值,请问该如何处理?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6个

财富等级: 恭喜发财

发表于 2014-12-3 11:22:21 | 显示全部楼层
属性还有默认值?你问的是尺寸吧?

点评

不是尺寸。 [attachimg]11856[/attachimg] 我希望读取属性块里面的一个AcDbAttributeDefinition类型是值,但是每次读取的都是默认值。  详情 回复 发表于 2014-12-3 11:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-3 11:28:01 | 显示全部楼层
CSharpBoy 发表于 2014-12-3 11:22
属性还有默认值?你问的是尺寸吧?

不是尺寸。
QQ截图20141203112547.png
我希望读取属性块里面的一个AcDbAttributeDefinition类型是值,但是每次读取的都是默认值。

点评

你想读上面的哪个值? 标签,提示,还是默认值? textstring()读的是默认值,默认值只是初始化时候的的值,不是单独的一个常量,这个值是可以改变的,你改成什么就读出什么。  详情 回复 发表于 2014-12-3 11:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2014-12-3 11:31:27 | 显示全部楼层
tiansq 发表于 2014-12-3 11:28
不是尺寸。

我希望读取属性块里面的一个AcDbAttributeDefinition类型是值,但是每次读取的都是默认值 ...

你想读上面的哪个值? 标签,提示,还是默认值? textstring()读的是默认值,默认值只是初始化时候的的值,不是单独的一个常量,这个值是可以改变的,你改成什么就读出什么。

点评

[attachimg]11857[/attachimg] 图中A3,就是刚才的属性块,他的默认值是123,“A3”是用户自己更改的数值,我现在希望读取出A3这个值,但是使用textstring读取的只是123。  详情 回复 发表于 2014-12-3 11:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-3 11:39:38 | 显示全部楼层
CSharpBoy 发表于 2014-12-3 11:31
你想读上面的哪个值? 标签,提示,还是默认值? textstring()读的是默认值,默认值只是初始化时候的的值 ...

QQ截图20141203113755.png

图中A3,就是刚才的属性块,他的默认值是123,“A3”是用户自己更改的数值,我现在希望读取出A3这个值,但是使用textstring读取的只是123。

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-3 11:44:54 | 显示全部楼层
tiansq 发表于 2014-12-3 11:39
图中A3,就是刚才的属性块,他的默认值是123,“A3”是用户自己更改的数值,我现在希望读取出A3这个 ...

把DWG图传上来吧,帮你看看。

点评

附图如下,还请指点,我现在希望读出图中的A3,但每次都是读出123  详情 回复 发表于 2014-12-3 11:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-3 11:50:52 | 显示全部楼层
newer 发表于 2014-12-3 11:44
把DWG图传上来吧,帮你看看。

附图如下,还请指点,我现在希望读出图中的A3,但每次都是读出123

图签.rar

186.08 KB, 下载次数: 6

点评

帮你写个简单的测试程序 运行结果: 命令: tt 选择对象: A3 命令: 可以看到读出的是A3 属性的数据定义打印如下: 命令: (entget (entnext e)) ((-1 . ) (0 . "ATTRIB") (330 . ) (5 . "6A44D"  详情 回复 发表于 2014-12-3 12:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-3 12:04:00 | 显示全部楼层
tiansq 发表于 2014-12-3 11:50
附图如下,还请指点,我现在希望读出图中的A3,但每次都是读出123

帮你写个简单的测试程序

  1. (defun c:tt()
  2.   (if (setq e (car (entsel)))
  3.      (progn
  4.         (princ (xdrx_getpropertyvalue (entnext e) "textstring"))
  5.      )
  6.   )
  7.   (princ)
  8. )



运行结果:
命令: tt
选择对象: A3

命令:


可以看到读出的是A3

属性的数据定义打印如下:
命令: (entget (entnext e))
((-1 . <图元名: -136558>) (0 . "ATTRIB") (330 . <图元名: -136560>) (5 . "6A44D") (100
. "AcDbEntity") (67 . 0) (410 . "Model") (8 . "YJ_HQ") (62 . 3) (100 .
"AcDbText") (10 38574.6 4130.12 0.0) (40 . 3.5) (1 . "A3") (50 . 0.0) (41 .
0.7) (51 . 0.0) (7 . "tf01") (71 . 0) (72 . 1) (11 38576.7 4131.87 0.0) (210
0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "图幅代号") (70 . 12) (73 . 0) (74 . 2)
(280 . 0))


里面根本就没123的信息,不知道你是从哪里读出的,你把完整的代码贴下吧,应该是代码的问题。

点评

AcDbBlockTableRecordIterator *pItr_tf; //块表 pRecord_tq->newIterator(pItr_tf); AcDbEntity  详情 回复 发表于 2014-12-3 13:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-3 13:06:25 | 显示全部楼层
块属性对象是AcDbAttribute,而非AcDbAttributeDefinition!

点评

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

使用道具 举报

 楼主| 发表于 2014-12-3 13:19:04 | 显示全部楼层
newer 发表于 2014-12-3 12:04
帮你写个简单的测试程序

                                                           AcDbBlockTableRecordIterator *pItr_tf;                                //块表
                                                                        pRecord_tq->newIterator(pItr_tf);
                                                                        AcDbEntity *pEnt_tf;
                                                                        for(pItr_tf->start();!pItr_tf->done();pItr_tf->step())     //遍历块中实体
                                                                        {
                                                                                pItr_tf->getEntity(pEnt_tf,AcDb::kForWrite);
                                                                                AcDbAttributeDefinition *pAttDef_tf;                 

                                                                                pAttDef_tf=AcDbAttributeDefinition::cast(pEnt_tf);    //块属性
                                                                                if(pAttDef_tf!=NULL)
                                                                                {
                                                                                        ACHAR *pStr;
                                                                                        pStr=pAttDef_tf->textString();            //得到块属性文字内容
                                                                                                                                                               
                                                                                        pAtt_temp->close();
                                                                                }
                                                                                pEnt_tf->close();
                                                                        }
                                                                        delete pItr_tf;

得到的pStr是“123”,而不是A3

点评

你遍历的是块定义而非图块属性!AcDbBlockReference *pBlkRef; if (Acad::eOk!=acdbOpenObject(pBlkRef,entId,AcDb::kForRead))return; AcDbObjectIterator *pItr = pBlkRef->attributeIterator(); for (pItr->s  详情 回复 发表于 2014-12-3 13:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-3 13:19:57 | 显示全部楼层
牢固 发表于 2014-12-3 13:06
块属性对象是AcDbAttribute,而非AcDbAttributeDefinition!

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-3 13:28:16 | 显示全部楼层
本帖最后由 牢固 于 2014-12-3 13:30 编辑
tiansq 发表于 2014-12-3 13:19
AcDbBlockTableRecordIterator *pItr_tf;  ...

你遍历的是块定义而非图块属性!AcDbBlockReference *pBlkRef;
if (Acad::eOk!=acdbOpenObject(pBlkRef,entId,AcDb::kForRead))return;

AcDbObjectIterator *pItr = pBlkRef->attributeIterator();
for (pItr->start();!pItr->done();pItr->step())
                {
                        AcDbEntity *pE;
                        AcDbObjectId attId = pItr->objectId();
                        if (Acad::eOk != acdbOpenObject(pE,attId,AcDb::kForRead))
                                continue;
                        AcDbAttribute *pAtt = AcDbAttribute::cast(pE);
                        ACHAR textstr[133],tagstr[40];
                        _tcscpy(textstr,pAtt->textString());
                       pE->close();
}
delete pItr;pBlkRef->close();

点评

果然是这个原因,自己没弄清楚,多谢指点  详情 回复 发表于 2014-12-3 13:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-3 13:48:13 | 显示全部楼层
牢固 发表于 2014-12-3 13:28
你遍历的是块定义而非图块属性!AcDbBlockReference *pBlkRef;
if (Acad::eOk!=acdbOpenObject(pBlkRef,e ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-3 14:06:30 来自手机 | 显示全部楼层
桌子搞得这些弯太多,每个object都得先认领,主儿不对啥都免谈
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-3 14:47:06 来自手机 | 显示全部楼层
牢固 发表于 2014-12-3 13:28
你遍历的是块定义而非图块属性!AcDbBlockReference *pBlkRef;
if (Acad::eOk!=acdbOpenObject(pBlkRef,e ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 14:24 , Processed in 0.476825 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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