找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: lijun126136

[求助] 什么是块参照?

[复制链接]
发表于 2016-7-27 16:08:36 | 显示全部楼层
lijun126136 发表于 2016-7-27 15:55
1、可以先取出块表记录,然后与ACDB_MODEL_SPACE对比得到ACDB_MODEL_SPACE(模型空间),再从ACDB_MODEL_ ...

那个空间记录是自己命名的,我原来取*MODEL_SPACE下的数据ID是为空的,所以自己命名的记录有没有什么标识?

点评

你自定义的只能根据你定义的名称来过滤了,你自定义的块表记录名其实就是块名,可以用insert来查询  详情 回复 发表于 2016-7-27 16:45
所有的块定义都保存在AcDbBlockTable里面,特殊的两个是 *MODEL_SPACE, ***0_SPACE,***1_SPACE.. 这几个名字分别代表模型空间块表记录,图纸0...图纸空间块表记录。 你定义的其他名字,就是普通的块定义,可以用I  详情 回复 发表于 2016-7-27 16:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-27 16:41:54 | 显示全部楼层
zlc409057173 发表于 2016-7-27 16:08
那个空间记录是自己命名的,我原来取*MODEL_SPACE下的数据ID是为空的,所以自己命名的记录有没有什么标识 ...

所有的块定义都保存在AcDbBlockTable里面,特殊的两个是 *MODEL_SPACE, ***0_SPACE,***1_SPACE.. 这几个名字分别代表模型空间块表记录,图纸0...图纸空间块表记录。

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

使用道具 举报

已领礼包: 100个

财富等级: 招财进宝

 楼主| 发表于 2016-7-27 16:45:09 | 显示全部楼层
zlc409057173 发表于 2016-7-27 16:08
那个空间记录是自己命名的,我原来取*MODEL_SPACE下的数据ID是为空的,所以自己命名的记录有没有什么标识 ...

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-27 16:46:57 | 显示全部楼层
zlc409057173 发表于 2016-7-27 15:54
那个块表记录命名是自己命名的,我根据*MODEL_SPACE查找是个空的,块表记录命名也是不确定的命名,一个块 ...

你自己命名的,就用 getAt 方法 查找这个名字,找到后打开。


  1. AcDbBlockTable::getAt Function Acad::ErrorStatus

  2. getAt(

  3. const ACHAR* entryName,

  4. AcDbObjectId& recordId,

  5. bool getErasedRec = false) const;

  6. entryName Input name of record to search for
  7. recordId Returns with object ID of record with name entryName
  8. getErasedRec Input bool indicating whether or not to find an erased record

  9. This function searches the block table for the record with name entryName and, if found, returns the AcDbObjectId of the record in recordId. If getErasedRec==true, then matches against erased records are possible.

  10. Possible return ErrorStatus codes are: Acad::eOk, Acad::eKeyNotFound, or Acad::ePermanentlyErased.


  11. --------------------------------------------------------------------------------

  12. Acad::ErrorStatus

  13. getAt(

  14. const ACHAR* entryName,

  15. AcDbBlockTableRecord*& pRec,

  16. AcDb::OpenMode openMode,

  17. bool openErasedRec = false) const;

  18. entryName Input name of record to search for
  19. pRec Returns pointing to the opened record
  20. openMode Input mode in which to open the record in; possible modes are:
  21. AcDb::kForRead
  22. AcDb::kForWrite
  23. AcDb::kForNotify
  24. openErasedRec Input bool indicating whether or not to find an erased record

  25. This function searches the block table for the record with name EntryName. If found, it opens the record in the mode specified by openMode, and, if the open operation succeeds, returns with pRec pointing to the opened record. If openErasedRec==true, then erased records will be opened.

  26. Possible return ErrorStatus codes are: Acad::eOk, Acad::eKeyNotFound, Acad::ePermanentlyErased, Acad::eAtMaxReaders, Acad::eWasOpenForNotify, Acad::eWasNotifying, Acad::eWasOpenForUndo, Acad::eWasOpenForWrite, or Acad::eWasOpenForRead

  27.   


点评

但是自己命名不是确定的,有可能这个图是这样的命名,但是另外一张图就是另外的叫法,所以这个地方我也不知道他具体的名字,你看下面那张图,用battman命令打开,为什么我用java取到的数据都是图形中的,而用CAD取到  详情 回复 发表于 2016-7-27 17:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-7-27 17:03:12 | 显示全部楼层
newer 发表于 2016-7-27 16:46
你自己命名的,就用 getAt 方法 查找这个名字,找到后打开。

但是自己命名不是确定的,有可能这个图是这样的命名,但是另外一张图就是另外的叫法,所以这个地方我也不知道他具体的名字,你看下面那张图,用battman命令打开,为什么我用java取到的数据都是图形中的,而用CAD取到的数据就是模型空间的,我现在只要模型空间的数据,但是我在java中用getModelSpaceId取到的数据都是空的,因为图形中都是自定义的块,CAD中是用了INSERT这个判断了一下,那我在java中怎么根据这个去判断啊?
cad.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-7-27 17:05:43 | 显示全部楼层
lijun126136 发表于 2016-7-27 16:45
你自定义的只能根据你定义的名称来过滤了,你自定义的块表记录名其实就是块名,可以用insert来查询

但是自己命名不是确定的,有可能这个图是这样的命名,但是另外一张图就是另外的叫法,所以这个地方我也不知道他具体的名字,你看下面那张图,用battman命令打开,为什么我用java取到的数据都是图形中的,而用CAD取到的数据就是模型空间的,我现在只要模型空间的数据,但是我在java中用getModelSpaceId取到的数据都是空的,因为图形中都是自定义的块,CAD中是用了INSERT这个判断了一下,那我在java中怎么根据这个去判断啊?
cad.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 100个

财富等级: 招财进宝

 楼主| 发表于 2016-7-27 17:20:29 | 显示全部楼层
zlc409057173 发表于 2016-7-27 17:05
但是自己命名不是确定的,有可能这个图是这样的命名,但是另外一张图就是另外的叫法,所以这个地方我也不 ...

用getAt()获得模型空间的ID,还有模型空间上的数据肯定是非空的,要不和你块属性管理器就不一致了,你现在的问题是读取模型空间没读出来,也没获得其ID,你再看看你的程序看看哪里的问题,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-27 17:25:37 | 显示全部楼层
zlc409057173 发表于 2016-7-27 17:03
但是自己命名不是确定的,有可能这个图是这样的命名,但是另外一张图就是另外的叫法,所以这个地方我也不 ...

那你就用  AcDbBlockTable->getIterator(); 然后循环遍历块表,按照你的要求去查找符合的,再不唯一,也一定有规律的地方,比如某个前缀,如果都是随机的,就是之前的程序生成的时候有问题了。


  1. AcDbTable::getIterator Function AcDbTableIterator*

  2. getIterator(

  3. const AcCellRange* pRange,

  4. AcDb::TableIteratorOption nOption) const;

  5. pRange Input range to iterate. This can be NULL to iterate the whole table.
  6. nOption Input iterator option

  7. Gets the iterator for iterating the table.

  8. Returns the iterator. The returned pointer should be deleted after using it.


  9. --------------------------------------------------------------------------------

  10. AcDbTableIterator*

  11. getIterator() const;

  12. Gets the iterator for iterating the table.

  13. Returns the iterator. The returned pointer should be deleted after using it.

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

使用道具 举报

发表于 2016-7-27 17:27:01 | 显示全部楼层
lijun126136 发表于 2016-7-27 17:20
用getAt()获得模型空间的ID,还有模型空间上的数据肯定是非空的,要不和你块属性管理器就不一致了,你 ...

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

使用道具 举报

发表于 2016-7-27 17:37:20 | 显示全部楼层
newer 发表于 2016-7-27 17:25
那你就用  AcDbBlockTable->getIterator(); 然后循环遍历块表,按照你的要求去查找符合的,再不唯一,也 ...

你看我程序主要代码就是那个,数据就是这些,*MODEL_SPACE和***_SPACE中都没有数据,都是自定义的块中,但是自定义的块中也包含了我不需要的数据,而那些数据在CAD中显示的就是在图形中找到的
1.png
2.png
3.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-7-27 17:39:23 | 显示全部楼层
lijun126136 发表于 2016-7-27 17:20
用getAt()获得模型空间的ID,还有模型空间上的数据肯定是非空的,要不和你块属性管理器就不一致了,你 ...

你看我程序主要代码就是那个,数据就是这些,*MODEL_SPACE和***_SPACE中都没有数据,都是自定义的块中,但是自定义的块中也包含了我不需要的数据,而那些数据在CAD中显示的就是在图形中找到的
1.png
2.png
3.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-27 17:52:59 | 显示全部楼层
zlc409057173 发表于 2016-7-27 17:39
你看我程序主要代码就是那个,数据就是这些,*MODEL_SPACE和***_SPACE中都没有数据,都是自定义的块中, ...

你ObjId->hasNext() 的循环里面,处理完一个,指到下一个了吗? 没看到你代码里面有有给遍历器递增的语句啊,另外,你的模型空间里面画东西了吗?
为什么不用  done,step 的FOR循环?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-27 17:59:21 | 显示全部楼层
zlc409057173 发表于 2016-7-27 17:39
你看我程序主要代码就是那个,数据就是这些,*MODEL_SPACE和***_SPACE中都没有数据,都是自定义的块中, ...

另外,对模型空间和图纸空间,是没有 getBlockReferenceId 的,用这个你当然遍历不到了。你可以打印下数组的长度看看,只有普通的块定义才有。

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

使用道具 举报

发表于 2016-7-27 18:07:50 | 显示全部楼层
newer 发表于 2016-7-27 17:52
你ObjId->hasNext() 的循环里面,处理完一个,指到下一个了吗? 没看到你代码里面有有给遍历器递增的语句 ...

我也不知道有没有在模型空间画东西,因为这个图是别人给我们的,我们只是来解析这个图的数据,然后导成csv表格,“ObjId->hasNext() 的循环里面,处理完一个”就指向下一个,这个没错的,是java的语法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2016-7-27 18:23:55 | 显示全部楼层
zlc409057173 发表于 2016-7-27 18:07
我也不知道有没有在模型空间画东西,因为这个图是别人给我们的,我们只是来解析这个图的数据,然后导成cs ...

模型空间和图纸空间的实体,不能用块表的getBlockReferenceId得到,要用块表的遍历器遍历得到。看你帖子,你好像对ACAD自身的使用不多,BlockReference是INSERT实体(引用AcDbBlockTable中的实体,除去模型空间,图纸空间),派生于AcDbEntity。

  1.         AcDbBlockTableRecordIterator* pBlockIterator=NULL;
  2.         Acad::ErrorStatus es = blockRec.newIterator(pBlockIterator, Adesk::kTrue,
  3.                 Adesk::kFalse);
  4.         ASSERT(es==Acad::eOk && !!pBlockIterator);
  5.         for (pBlockIterator->start(); !pBlockIterator->done();  pBlockIterator->step())     
  6.         {
  7.                 AcDbEntity *pEntity;
  8.                 es = pBlockIterator->getEntity(pEntity, AcDb::kForRead, Adesk::kTrue);
  9.                 ASSERT(es==Acad::eOk);
  10.                 ...
  11.         }


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-22 02:34 , Processed in 0.298205 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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