找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1943|回复: 17

[求助] objectarx程序

[复制链接]
发表于 2018-5-22 14:37:41 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-22 17:02:50 | 显示全部楼层
多用论坛搜索, 你用 遍历 就能搜索到好多代码

  1. AcDbLayerTable *pLayerTable;
  2.                 AcDbLayerTableRecord *pLayerTblRcd;
  3.                 AcDbLayerTableIterator *pLayerTableIterator;

  4.                 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTable,AcDb::kForWrite);
  5.                 //if(pLayerTbl->has("0")){

  6.                
  7.                 pLayerTable->newIterator(pLayerTableIterator);
  8.                 char *pLayerName;
  9.                 for(int i=1;!pLayerTableIterator->done();pLayerTableIterator->step(),i++)
  10.                 {

  11.                         pLayerTableIterator->getRecord(pLayerTblRcd,AcDb::kForWrite);
  12.                         pLayerTblRcd->getName(pLayerName);
  13.                         pLayerTblRcd->setIsFrozen(0);
  14.                         pLayerTblRcd->setIsOff(0);
  15.                         pLayerTblRcd->setVPDFLT(0);
  16.                         pLayerTblRcd->setIsLocked(0);
  17.                         AcCmColor color;
  18.                         color.setColorIndex(7);
  19.                         pLayerTblRcd->setColor(color);
  20.                         pLayerTblRcd->close();
  21.                         acutPrintf("\n 第%d个层的层名为:%s",i,pLayerName);
  22.                 }
  23.                 delete pLayerTableIterator;
  24.                 pLayerTable->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-5-22 14:44:12 | 显示全部楼层
图层,先得到层表,然后创建遍历器,遍历层表,得到每个层表记录。

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

使用道具 举报

 楼主| 发表于 2018-5-22 16:38:14 | 显示全部楼层
LoveArx 发表于 2018-5-22 14:44
图层,先得到层表,然后创建遍历器,遍历层表,得到每个层表记录。

块等其他的,一样。

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

使用道具 举报

 楼主| 发表于 2018-5-23 14:35:16 | 显示全部楼层
newer 发表于 2018-5-22 17:02
多用论坛搜索, 你用 遍历 就能搜索到好多代码

AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForRead);
pBlkTbl->close();

AcDbBlockTableRecordIterator *pBlkItr;
pBlkTblRcd->newIterator(pBlkItr);

ACHAR *BlkName;
for (pBlkItr->start(); !pBlkItr->done(); pBlkItr->step())
  {
   pBlkTblRcd->getName(BlkName);
   acutPrintf(_T("块名为:%s"),BlkName);
  }
  delete pBlkItr;  
  pBlkTblRcd->close();

可以运行但是块的名字不对,问题出在哪了,谢谢

点评

1、使用遍历器,你要用遍历器的方法获得当前遍历器指向对象 2、你的代码得到模型空间块表记录,然后你简历了模型空间块表记录的遍历器,那么你遍历得到的是模型空间的实体,不是BLOCK。 3、即使你想遍历模型空间,  详情 回复 发表于 2018-5-23 15:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-23 15:12:28 | 显示全部楼层
baoweier 发表于 2018-5-23 14:35
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, ...

1、使用遍历器,你要用遍历器的方法获得当前遍历器指向对象
2、你的代码得到模型空间块表记录,然后你简历了模型空间块表记录的遍历器,那么你遍历得到的是模型空间的实体,不是BLOCK。
3、即使你想遍历模型空间,那么你里面的代码也不对,参见1,要用 AcDbBlockTableRecordIterator::getEntity
获得当前指向的对象。


4、你想得到所有的块名,那么你就不应该去获得模型空间块表记录,而是直接在块表AcDbBlockTable下,创建遍历器,模型空间、图纸空间只是“特殊”的块,他们都在AcDbBlockTable下。

  1. Acad::ErrorStatus es;
  2. AcDbBlockTable *pBlkTbl;
  3. es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);
  4. if (es == eOk)
  5. {
  6.         AcDbBlockTableIterator *pBlkTblItr;
  7.         pBlkTbl->newIterator(pBlkTblItr);
  8.         pBlkTbl->close();
  9.         if (pBlkTblItr)
  10.         {
  11.                 for (pBlkTblItr->start(); !pBlkTblItr->done(); pBlkTblItr->step())
  12.                 {
  13.                         AcDbBlockTableRecord *pBlkTblRcd;
  14.                         es = pBlkTblItr->getRecord(pBlkTblRcd, kForRead);
  15.                         if (es == eOk)
  16.                         {
  17.                                 const ACHAR *BlkName;
  18.                                 pBlkTblRcd->getName(BlkName);
  19.                                 acutPrintf(_T("块名为:%s"), BlkName); //模型空间也是块
  20.                                 pBlkTblRcd->close();
  21.                         }
  22.                 }
  23.                 delete pBlkTblItr;
  24.         }
  25. }


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

使用道具 举报

 楼主| 发表于 2018-5-23 17:22:13 | 显示全部楼层
newer 发表于 2018-5-23 15:12
1、使用遍历器,你要用遍历器的方法获得当前遍历器指向对象
2、你的代码得到模型空间块表记录,然后你简 ...

运行了可以得到块名但是还有之前的

点评

你只打印本图的正常图块,那就过滤 模型空间,图纸空间是布局块,再过滤出外部引用块就行了 加上判断: !pBlkTblRcd->isLayout() && !pBlkTblRcd->isFromOverlayReference() && !pBlkTblRcd->isFromExternalRefe  详情 回复 发表于 2018-5-23 17:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-23 17:23:17 | 显示全部楼层
newer 发表于 2018-5-23 15:12
1、使用遍历器,你要用遍历器的方法获得当前遍历器指向对象
2、你的代码得到模型空间块表记录,然后你简 ...

运行结果如图
TIM截图20180523171719.png

点评

之前的模型空间那些,你加上代码判断去除了不就行了。  详情 回复 发表于 2018-5-23 17:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-5-23 17:36:59 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-23 17:53:39 | 显示全部楼层
baoweier 发表于 2018-5-23 17:22
运行了可以得到块名但是还有之前的

你只打印本图的正常图块,那就过滤
模型空间,图纸空间是布局块,再过滤出外部引用块就行了

加上判断: !pBlkTblRcd->isLayout() && !pBlkTblRcd->isFromOverlayReference() && !pBlkTblRcd->isFromExternalReference()

  1. Acad::ErrorStatus es;
  2. AcDbBlockTable *pBlkTbl;
  3. es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);
  4. if (es == eOk)
  5. {
  6.         AcDbBlockTableIterator *pBlkTblItr;
  7.         pBlkTbl->newIterator(pBlkTblItr);
  8.         pBlkTbl->close();
  9.         if (pBlkTblItr)
  10.         {
  11.                 for (pBlkTblItr->start(); !pBlkTblItr->done(); pBlkTblItr->step())
  12.                 {
  13.                         AcDbBlockTableRecord *pBlkTblRcd;
  14.                         es = pBlkTblItr->getRecord(pBlkTblRcd, kForRead);
  15.                         if (es == eOk)
  16.                         {
  17.                                 if (!pBlkTblRcd->isLayout() && !pBlkTblRcd->isFromOverlayReference() && !pBlkTblRcd->isFromExternalReference())
  18.                                 {
  19.                                         const ACHAR *BlkName;
  20.                                         pBlkTblRcd->getName(BlkName);
  21.                                         acutPrintf(_T("块名为:%s"), BlkName);
  22.                                         pBlkTblRcd->close();
  23.                                 }
  24.                         }
  25.                 }
  26.                 delete pBlkTblItr;
  27.         }
  28. }



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

使用道具 举报

 楼主| 发表于 2018-5-24 11:30:00 | 显示全部楼层
newer 发表于 2018-5-23 17:53
你只打印本图的正常图块,那就过滤
模型空间,图纸空间是布局块,再过滤出外部引用块就行了

谢谢,还想请教下获得所有组名也用遍历器吗,搜索了一下没有。。。

点评

当然,只要是容器类对象,各种符号表,词典都是用遍历器遍历 去看看 AcDbGroupIterator  详情 回复 发表于 2018-5-24 11:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-24 11:39:32 | 显示全部楼层
baoweier 发表于 2018-5-24 11:30
谢谢,还想请教下获得所有组名也用遍历器吗,搜索了一下没有。。。

当然,只要是容器类对象,各种符号表,词典都是用遍历器遍历

去看看         AcDbGroupIterator

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

使用道具 举报

 楼主| 发表于 2018-5-24 14:06:54 | 显示全部楼层
newer 发表于 2018-5-24 11:39
当然,只要是容器类对象,各种符号表,词典都是用遍历器遍历

去看看         AcDbGroupIterator

  Acad::ErrorStatus es;
  AcDbDictionary *pGroupDict;
  acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
  if (es == eOk)
  {
   AcDbDictionaryIterator *pItr;
   pItr=pGroupDict->newIterator();
   pGroupDict->close();
   if (pItr)
   {
    for (; !pItr->done(); pItr->next())
                {
                        AcDbGroup *pGroup=NULL;
      if(Acad::eOk!=pItr->getObject((AcDbObject*&)pGroup,AcDb::kForRead))
       continue;
      ACHAR *pGroupName;
                        if (es == eOk)
                        {
                            pGroup->getName(pGroupName);
                            acutPrintf(_T("组名为:%s"), pGroupName); //模型空间也是块
                            pGroup->close();
                        }
                }
                delete pItr;
   }
  }
编译没错,但是一运行就崩溃了,求救

点评

[/td][/tr] [/table] AcDbGroup::getName Function Acad::ErrorStatusgetName(ACHAR *& name) const;This function returns a pointer to a string containing the group name in the name output paramet  详情 回复 发表于 2018-5-24 14:37
你这个 acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite); if (es == eOk) es 没赋值啊 改:es = acdbHostApplicationServices()->workingDatabase  详情 回复 发表于 2018-5-24 14:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-24 14:27:05 | 显示全部楼层
本帖最后由 newer 于 2018-5-24 14:31 编辑
baoweier 发表于 2018-5-24 14:06
Acad::ErrorStatus es;
  AcDbDictionary *pGroupDict;
  acdbHostApplicationServices()->workingDa ...

你这个

acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
  if (es == eOk)

es 没赋值啊

改:es = acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);

否则你打开了,没执行到里面,pGroupDict 还没关闭啊。

里面的一样

if(Acad::eOk!=pItr->getObject((AcDbObject*&)pGroup,AcDb::kForRead))

es = pItr->getObject((AcDbObject*&)pGroup,AcDb::kForRead);

你要给关键函数返回值赋值,才能继续用

还有,变量声明就近,把 ACHAR *pGroupName; 放到getName的前面,用完,最后要释放free(pGroupName); 因为不是const的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-24 14:37:37 | 显示全部楼层
本帖最后由 newer 于 2018-5-24 14:39 编辑
baoweier 发表于 2018-5-24 14:06
Acad::ErrorStatus es;
  AcDbDictionary *pGroupDict;
  acdbHostApplicationServices()->workingDa ...

  1. Acad::ErrorStatus es;
  2. AcDbDictionary *pGroupDict;
  3. es = acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
  4. if (es == eOk)
  5. {
  6.         AcDbDictionaryIterator *pItr;
  7.         pItr = pGroupDict->newIterator();
  8.         pGroupDict->close();
  9.         if (pItr)
  10.         {
  11.                 for (; !pItr->done(); pItr->next())
  12.                 {
  13.                         AcDbGroup *pGroup = NULL;
  14.                         es = pItr->getObject((AcDbObject*&)pGroup, AcDb::kForRead))
  15.                         if (es != eOk)
  16.                                 continue;
  17.                         ACHAR *pGroupName;
  18.                         if (pGroup->getName(pGroupName) == eOk)
  19.                         {
  20.                                 acutPrintf(_T("\n组名为:%s"), pGroupName); //模型空间也是块
  21.                                 acutDelString(pGroupName);
  22.                         }
  23.                         pGroup->close();
  24.                 }
  25.                 delete pItr;
  26.         }
  27. }




看帮助,
AcDbGroup::getName Function

Acad::ErrorStatus
getName(
ACHAR *& name) const;
nameOutput group name
This function returns a pointer to a string containing the group name in the name output parameter. The caller is responsible for freeing the returned string's memory by calling acutDelString().
This function replaces the deprecated AcDbGroup::name() function.


点评

版主,选择集有没有遍历器,还是只能用循环。或者把对象编组就能用遍历器了吗?  详情 回复 发表于 2018-5-24 18:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 11:00 , Processed in 0.210693 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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