找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 729|回复: 8

[求助] 块中的标注炸开的问题

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2016-12-9 23:38:11 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 aeo 于 2016-12-9 23:49 编辑

今天问题比较奇葩
由于块里面的标注,因为比例关系,炸开后里面的值会变化,
所以想一步炸开成文字和线。

但问题出现了,炸开后的标注位置到了 原点,(相当于没有乘上块的变换矩阵)
而且比例是1:1的状态,不管原来是什么比例,不等比例也这样。
(如果exlode命令,先炸块,再炸独立出来的标注,肯定是在原来的位置,就是文字不对)

看看代码有问题吗? (只看标注部分)


  1. void
  2. explodeBlockRef(AcDbBlockReference *pRef){
  3.         AcDbVoidPtrArray newArray;
  4.         Acad::ErrorStatus es;
  5.         AcDbObjectId objId;
  6.         es = pRef->explode(newArray);
  7.         for(int i = 0;i< newArray.length();i++){
  8.                 AcDbEntity* pE1 =static_cast<AcDbEntity*>( newArray[ i ]);
  9.         
  10.                 AcDbDimension* pDim;
  11.                 AcDbBlockReference* pBlkref;
  12.                
  13.                 if((pBlkref = AcDbBlockReference::cast(pE1))!= NULL){
  14.                         explodeBlockRef(pBlkref);
  15.                         delete pE1;
  16.                 }
  17.                 else if((pDim = AcDbDimension::cast(pE1))!= NULL){  //////这里的问题
  18.                         AcDbVoidPtrArray dimArr;
  19.                         es = pE1->explode(dimArr);
  20.                         for (int k = 0;k<dimArr.length();k++)
  21.                         {
  22.                                 AcDbEntity* pE2 =static_cast<AcDbEntity*>( dimArr[k]);
  23.                                 postToDb(pE2,objId);        
  24.                         }
  25.                         delete pE1;
  26.                 }
  27.                 else{
  28.                         postToDb(pE1,objId);                        
  29.                 }        
  30.         }
  31. }





下面是晓东那贴里面的 posttodb

  1. Acad::ErrorStatus postToDb(AcDbEntity* ent, AcDbObjectId& objId)
  2. {
  3.    Acad::ErrorStatus       es;
  4.    AcDbBlockTable*       pBlockTable;
  5.    AcDbBlockTableRecord*  pSpaceRecord;

  6.     if (NULL == ent)
  7.         return Acad::eNullObjectPointer;
  8.     if (NULL == acdbHostApplicationServices()->workingDatabase())
  9.         return Acad::eNoDatabase;

  10.    if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))!= Acad::eOk)
  11.         return es;

  12.    if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,pSpaceRecord,AcDb::kForWrite))!= Acad::eOk)
  13.     {
  14.         pBlockTable->close();
  15.         return es;
  16.     }
  17.    pBlockTable->close();

  18.    if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk)
  19.     {
  20.         pSpaceRecord->close();
  21.     return es;
  22.    }
  23.    pSpaceRecord->close();
  24.    return ent->close();
  25. }

复制代码


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

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-12-10 08:48:06 | 显示全部楼层
你应该从AcDbBlockReference得到AcDbBlobkTableRecord,进块定义里面,transformedCopy实体,作用上变换矩阵然后添加到当前空间。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-12-10 10:26:15 | 显示全部楼层

对呀,本来炸开就是没办法的办法。

我只是奇怪,为什么会不对,我写的逻辑上应该没问题,
因为如果到标注为止,不继续炸开,位置是对的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-12-10 10:42:31 | 显示全部楼层

你都没仔细看
AcDbBlobkTableRecord里面只要dim的信息,没有炸碎标注以后的信息,你不会说追到无名块里面吧。
而且都按你这意思,explode方法就没必要存在。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-12-10 11:42:10 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-12-10 11:43:36 | 显示全部楼层

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2016-12-10 12:15:53 | 显示全部楼层
explode命令不仅仅是调用了 pEnt->explode(),很多"特别”的实体,要进一步处理。你的代码发现尺寸不对了,就去单独处理它。找到炸开前的位置信息,然后恢复。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2017-1-12 00:18:08 | 显示全部楼层

dim就是一个无名块,我觉得autodesk偷懒,非得加入到库里面的时候更新。

第三方开发的实体呢?它本身可以用 explode命令炸碎

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 23:23 , Processed in 0.307863 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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