找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1057|回复: 26

[求助]:HELP! 如何炸开尺寸标注!?

[复制链接]
发表于 2003-7-2 16:45:11 | 显示全部楼层 |阅读模式

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

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

×
我想通过ARX实现炸开尺寸标注,如图中所示,
代码如下:
//尺寸变文字
void DimToText()
{
ads_name ssDim,EntityName;
AcDbEntity *pEnt = NULL;
struct resbuf pRb;
AcDbObjectId objId;

AcGePoint3d DmLPt,TxtPt,EPt1,EPt2,TmpPt;
AcDbObjectId DimStyId;
       
//获取选择集过滤List(由实体名称过滤)
char sbuf[50]; // Buffers to hold strings
pRb.restype = 0;        //实体名称
strcpy(sbuf, "Dimension");
strupr(sbuf);
pRb.resval.rstring = sbuf;
pRb.rbnext = NULL;

//选取尺寸标注并对选择集中的实体进行过滤
ads_printf("\n请选择要变文字的标注");
int ss= ads_ssget(NULL,NULL,NULL,&pRb,ssDim);

//取得选择集中实体个数
long NumOfEntity;
ss = ads_sslength(ssDim,&NumOfEntity);
       
//遍历实体
for(long i = 0 ; i<NumOfEntity;i++)
{
AcDbDimension *pDim = NULL;
AcDbVoidPtrArray SetEntArr;
AcDbEntity *pSetEnt = NULL;
AcDbMText *pMTxt = NULL;
Acad::ErrorStatus es;

ads_ssname(ssDim,i,EntityName);
       
acdbGetObjectId(objId,EntityName);
               
if(acdbOpenObject(pEnt,objId,AcDb::kForRead)!=Acad::eOk)
{
ads_printf("\n打开实体时出错!");
        return;
}

if((es=pEnt->explode(SetEntArr)) != Acad::eOk)
pEnt->close();
       
if(!SetEntArr.isEmpty())
{
int Num = SetEntArr.length();
for(int i = 0;i < Num;i++)
{
pSetEnt = (AcDbEntity*)(SetEntArr.at(i));
if(pSetEnt->isKindOf(AcDbMText::desc()))
pMTxt = (AcDbMText*)SetEntArr.at(i);
                       
}
}
pMTxt->close();
SetEntArr.remove(0);
pSetEnt->close();                                       
}
}

我想用上面的代码实现炸开尺寸标注,然后提取其中的AcDbMText,但是在炸开始总是说不能炸开(Adesk::eNotApplicable.
),而且把EXPLMODE设置为1也不行,请高手指点。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-7-3 09:46:00 | 显示全部楼层

Re: [求助]:HELP! 如何炸开尺寸标注!?

最初由 Echoyin 发布
[B]我想通过ARX实现炸开尺寸标注,如图中所示,
代码如下:
//尺寸变文字
void DimToText()
{
ads_name ssDim,EntityName;
AcDbEntity *pEnt = NULL;
struct resbuf pRb;
AcDbObjectId objId;

AcGePoint3d D... [/B]


用只读打开好像不行,用写打开试试

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

使用道具 举报

 楼主| 发表于 2003-7-3 10:57:50 | 显示全部楼层
hehe ,好久不见

嗯,Write我也用过了,但不行的
CAD里面是说如果尺寸在比例不一致的块里面的时候是不能炸开的
这个时候要设置系统变量EXPLMODE为1,但我在程序里面设置为1了好像也不能炸开这个尺寸标注。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-3 15:06:27 | 显示全部楼层

  1.   [FONT=courier new]
  2. 下面是经过重新整理的代码:
  3. //尺寸变文字

  4. void DimToText()
  5. {
  6.       ads_name ssDim,EntityName;
  7.       AcDbEntity *pEnt = NULL;
  8.       struct resbuf pRb;
  9.       AcDbObjectId objId;

  10.       AcGePoint3d DmLPt,TxtPt,EPt1,EPt2,TmpPt;
  11.       AcDbObjectId DimStyId;
  12.        
  13.       //获取选择集过滤List(由实体名称过滤)

  14.       char sbuf[50]; // Buffers to hold strings
  15.       pRb.restype = 0;
  16.       strcpy(sbuf, "Dimension");
  17.       strupr(sbuf);
  18.       pRb.resval.rstring = sbuf;
  19.       pRb.rbnext = NULL;

  20.       //选取尺寸标注并对选择集中的实体进行过滤

  21.        ads_printf("\n请选择要变文字的标注");
  22.       int ss= ads_ssget(NULL,NULL,NULL,&pRb,ssDim);

  23.       //取得选择集中实体个数

  24.        long NumOfEntity;
  25.       ss = ads_sslength(ssDim,&NumOfEntity);
  26.        
  27.       //遍历实体

  28.        for(long i = 0 ; i < NumOfEntity; i++)
  29.       {
  30.               AcDbDimension *pDim = NULL;
  31.               AcDbVoidPtrArray SetEntArr;
  32.               AcDbEntity *pSetEnt = NULL;
  33.               AcDbMText *pMTxt = NULL;
  34.               Acad::ErrorStatus es;

  35.               ads_ssname(ssDim,i,EntityName);
  36.        
  37.               acdbGetObjectId(objId,EntityName);
  38.                
  39.                if(acdbOpenObject(pEnt,objId,AcDb::kForRead)!=Acad::eOk)
  40.                {
  41.                       ads_printf("\n打开实体时出错!");
  42.                       return;
  43.                 }

  44.                   //设置系统变量EXPLMODE

  45.                   gGlobal.SetVar("EXPLMODE",1);
  46.                
  47.                  if((es=pEnt->explode(SetEntArr)) != Acad::eOk)
  48.                 pEnt->close();
  49.        
  50.                   if(!SetEntArr.isEmpty())
  51.                   {
  52.                        for(int i = 0;i < SetEntArr.length(); i++)
  53.                      {
  54.                           pSetEnt = (AcDbEntity*)(SetEntArr.at(i));
  55.                             if(pSetEnt->isKindOf(AcDbMText::desc()))
  56.                               pMTxt = (AcDbMText*)SetEntArr.at(i);
  57.                       }
  58.                    }

  59.                    pMTxt->close();
  60.                    SetEntArr.remove(0);
  61.                    pSetEnt->close();                                       
  62.        }
  63. }

  64. 我想用上面的代码实现炸开尺寸标注,然后提取其中AcDbMText,但是在炸开始总是说不能炸开(Adesk::eNotApplicable.),而且把EXPLMODE设置为1也不行,请高手指点。。。

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

使用道具 举报

发表于 2003-7-3 17:38:45 | 显示全部楼层
我选择一个尺寸测试了下,炸开是没问题的。你自己再看看事不是别的问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-3 17:45:36 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2003-7-3 17:49:28 | 显示全部楼层
晕阿
我用这个程序炸开的时候
if((es=pEnt->explode(SetEntArr)) != Acad::eOk)
                pEnt->close();
里面SetEntArr总是空的哦。。。就是炸开失败了。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

 楼主| 发表于 2003-7-4 08:53:12 | 显示全部楼层
stoneball
你好
下面是我炸开的尺寸标注(*.Dwg)文件,请帮我看看问题出在那里,谢谢了
其中绿色的是自己定义的尺寸标注,白色的CAD系统自己的标注,但是现在都不能炸开。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-7-4 09:02:31 | 显示全部楼层

测试


  1. void ZYexDim()
  2. {
  3. #ifdef OARXWIZDEBUG
  4.         acutPrintf ("\nOARXWIZDEBUG - ZYexDim() called.");
  5. #endif // OARXWIZDEBUG

  6.         // TODO: Implement the command
  7.                 ads_name ssDim,EntityName;
  8.                 AcDbEntity *pEnt = NULL;
  9.                 struct resbuf pRb;
  10.                 AcDbObjectId objId;
  11.                
  12.                 AcGePoint3d DmLPt,TxtPt,EPt1,EPt2,TmpPt;
  13.                 AcDbObjectId DimStyId;
  14.                
  15.                 //获取选择集过滤List(由实体名称过滤)
  16.                
  17.                 char sbuf[50]; // Buffers to hold strings
  18.                 pRb.restype = 0;
  19.                 strcpy(sbuf, "Dimension");
  20.                 strupr(sbuf);
  21.                 pRb.resval.rstring = sbuf;
  22.                 pRb.rbnext = NULL;

  23.                 //我添加的代码
  24.                 AcDbBlockTable *pBlockTable;
  25.                 acdbHostApplicationServices()->workingDatabase()
  26.                         ->getSymbolTable(pBlockTable, AcDb::kForRead);
  27.                 AcDbBlockTableRecord *pSpace;
  28.                 pBlockTable->getAt(ACDB_MODEL_SPACE,pSpace,
  29.                         AcDb::kForWrite);
  30.                 pBlockTable->close();
  31.                
  32.                 //选取尺寸标注并对选择集中的实体进行过滤
  33.                
  34.                 ads_printf("\n请选择要变文字的标注");
  35.                 int ss= ads_ssget(NULL,NULL,NULL,&pRb,ssDim);
  36.                
  37.                 //取得选择集中实体个数
  38.                
  39.                 long NumOfEntity;
  40.                 ss = ads_sslength(ssDim,&NumOfEntity);
  41.                
  42.                 //遍历实体
  43.                
  44.                 for(long i = 0 ; i < NumOfEntity; i++)
  45.                 {
  46.                         AcDbDimension *pDim = NULL;
  47.                         AcDbVoidPtrArray SetEntArr;
  48.                         AcDbEntity *pSetEnt = NULL;
  49.                         AcDbMText *pMTxt = NULL;
  50.                         Acad::ErrorStatus es;
  51.                        
  52.                         ads_ssname(ssDim,i,EntityName);
  53.                        
  54.                         acdbGetObjectId(objId,EntityName);
  55.                        
  56.                         if(acdbOpenObject(pEnt,objId,AcDb::kForRead)!=Acad::eOk)
  57.                         {
  58.                                 ads_printf("\n打开实体时出错!");
  59.                                 return;
  60.                         }
  61.                        
  62.                         //设置系统变量EXPLMODE
  63.                        
  64. //                        gGlobal.SetVar("EXPLMODE",1);
  65.                        
  66.                         //炸开没有任何问题
  67.                         if((es=pEnt->explode(SetEntArr)) != Acad::eOk)
  68.                                 pEnt->close();
  69.                        
  70.                         if(!SetEntArr.isEmpty())
  71.                         {
  72.                                 for(int i = 0;i < SetEntArr.length(); i++)
  73.                                 {
  74.                                         pSetEnt = (AcDbEntity*)(SetEntArr.at(i));
  75.                                         if(pSetEnt->isKindOf(AcDbMText::desc()))
  76.                                                 pMTxt = (AcDbMText*)SetEntArr.at(i);
  77.                                         //我添加的代码
  78.                                         //绘实体
  79.                                         pSpace->appendAcDbEntity(objId,pSetEnt);
  80.                                        
  81.                                 }
  82.                         }
  83.                         pEnt->close();
  84.                        
  85.                         pMTxt->close();
  86.                         SetEntArr.remove(0);
  87.                         pSetEnt->close();                                       
  88.                 }
  89.                 //我添加的代码
  90.                 pSpace->close();
  91.        
  92. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-4 09:19:30 | 显示全部楼层
..............
+了你的代码后炸开的情况还是跟以前一样。。。。
SetEntArr还是空的 。。。郁闷。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-7-4 09:40:51 | 显示全部楼层
我把我ACAD的系统变量发给你,用UE等比较一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-4 10:12:46 | 显示全部楼层
谢谢先。。。

不过应该跟系统变量没有太大关系吧?
否则我这个小东西不是写的太失败了!?  :(

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

使用道具 举报

 楼主| 发表于 2003-7-4 10:16:52 | 显示全部楼层
AcDbDimension在比例不一致的块中不能炸开
但据说只要把系统变量EXPLMODE设置为1就可以炸开的 。。。
我看你的是设置为1了,我的也是,就是是R14而已,我弄到14下看看怎样。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-4 11:02:12 | 显示全部楼层
上面stoneball朋友给出的程序在2000下炸开实体没有问题
但在14下面却不能炸开。。。
请高手指点在14下应如何更改才能炸开尺寸标注。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 00:39 , Processed in 0.246777 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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