找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1514|回复: 6

[ARX程序]:一个圆编号程序,请指正并建议!

[复制链接]
发表于 2004-7-28 09:21:36 | 显示全部楼层 |阅读模式

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

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

×
程序功能:
能通过框选出一个圆的选择集,对集内的圆进行编号,把编号以文本实体形式存放到新建的层内!

程序运行命令: zhb

本程序所碰到的问题:
A): 本程序经过N次修改,个人觉得这个程序还是写得很乱,烦琐,望有人高人能指点或修改一下,能简化程序.使程序的可读性加强些.

B):这个程序在连续运行到第三次时,即连续编三次号时,出现问题(按默认值进行操作),在求指定层上的文本最大编号时,求出来的值是第二次编号时的最大值,原因不明!!!-------重点要解决的问题!

C) 附上已经调试编译出来的ARX文件!者支持CAD2002,其它版本未知!


  1. void corillazhb()
  2. {
  3.         AcDbDatabase *pDb = NULL;                                //数据库指针
  4.         AcGePoint3dArray arrCenter;                                //取放圆心坐标的数组
  5.         char newLayerName[20];                                        //存放编号的层名
  6.         char kw[10];                                                        //关键字
  7.         int cmpMax=0, cmpText=0;                                //文本比较的过渡变量(取文本的最大值MAX)
  8.         AcDbObjectId LayerId;                                        //层ID号
  9.         AcDbLayerTable *pLayerTable;                        //层记录指针
  10.         AcDbLayerTableRecord *pLayerTableRecord;//层表记录指针
  11.         int rc;                                                                        //函数返回码

  12.        
  13.        
  14.         if((pDb = acdbHostApplicationServices()->workingDatabase()) == NULL)        //取得当前数据库指针
  15.         {
  16.                 acdbFail("\n错误::当前数据库为空!");
  17.                 return ;
  18.         }


  19.        
  20.         if(pDb->getSymbolTable(pLayerTable, AcDb::kForWrite) != Acad::eOk)        //取得层表
  21.         {
  22.                 acdbFail("\n错误::获取层表指针失败.");
  23.                 pLayerTable->close();
  24.                 return ;
  25.         }


  26.         rc = acedGetString(1,"\n提示::请输入一个新的层名用来存储编号文本,默认值为<zbh>: ", newLayerName);        //输入层名
  27.         switch(rc) {

  28.         case RTCAN:
  29.                  acutPrintf("\n提示::用户取消操作.");
  30.                  pLayerTable->close();
  31.                  return ;
  32.                  break;
  33.         case RTERROR:
  34.                  acdbFail("\n错误::取得新层名失败.");
  35.                  pLayerTable->close();
  36.                  return ;
  37.                  break;
  38.         case RTNORM:
  39.                  if(stricmp(newLayerName,"\0") == 0) //如果用户输入为空,则取默认值
  40.                  {
  41.                          strcpy(newLayerName, "zbh");
  42.                  }
  43.                  break;
  44.         }
  45.                        
  46.         if(pLayerTable->has(newLayerName))//如果输入层存在
  47.         {
  48.                 acedInitGet(NULL, "Yes No");
  49.                 rc = acedGetKword("\n注意::输入层名已经存在,是否继续 - [Yes/No]<Yes>: ", kw);//用户决定是否继续
  50.                 switch(rc) {
  51.                 case RTCAN:
  52.                          acutPrintf("\n提示::用户按下取消键.");
  53.                          pLayerTable->close();
  54.                          return ;
  55.                          break;
  56.                 case RTNONE:
  57.                          strcpy(kw,"Yes");
  58.                          break;
  59.                          
  60.                 case RTNORM:
  61.                          break;
  62.                          
  63.                 case RTERROR:
  64.                          acdbFail("\n错误::取得关键字失败.");
  65.                          pLayerTable->close();
  66.                          return ;
  67.                          break;
  68.                 }
  69.                
  70.                 if (stricmp(kw,"Yes") == 0) {        //用户选择继续
  71.                         pLayerTable->close();
  72.                         AcDbBlockTable *pBlockTable;
  73.                         if(pDb->getSymbolTable(pBlockTable, AcDb::kForRead)!=Acad::eOk)        //取得块表
  74.                         {
  75.                                 acdbFail("\n错误::取得块表指针失败.");
  76.                                 pBlockTable->close();
  77.                                 return ;
  78.                         }
  79.                        
  80.                         AcDbBlockTableRecord *pBlockTableRecord;
  81.                         if(pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite)!=Acad::eOk)//取得块表记录
  82.                         {
  83.                                 acdbFail("\n错误::打开块表记录失败.");
  84.                                 pBlockTableRecord->close();
  85.                                 pBlockTable->close();
  86.                                 return ;
  87.                         }
  88.                         pBlockTable->close();

  89.                         AcDbBlockTableRecordIterator *pIterator;
  90.                         if(pBlockTableRecord->newIterator(pIterator) != Acad::eOk)        //创建一个遍历器
  91.                         {
  92.                                 delete pIterator;
  93.                                 pBlockTableRecord->close();
  94.                                 return ;
  95.                         }
  96.                        
  97.                         AcDbText *pTextTmp = NULL;
  98.                        
  99.                         for(pIterator->start();!pIterator->done();pIterator->step())//遍历整个数据库
  100.                         {
  101.                                 AcDbEntity *entity=NULL;
  102.                                 if(pIterator->getEntity(entity,AcDb::kForRead)!=Acad::eOk)//打开实体为可读
  103.                                 {
  104.                                         delete pIterator;pIterator=NULL;
  105.                                         pBlockTableRecord->close();
  106.                                         pTextTmp->close();
  107.                                         return ;
  108.                                 }
  109.                                
  110.                                 if(stricmp(entity->layer(),newLayerName) == 0) //获取指定层上的实体
  111.                                 {
  112.                                         if(entity->isKindOf(AcDbText::desc())) //过滤为文本实体
  113.                                         {
  114.                                                 pTextTmp = AcDbText::cast(entity);

  115.                                                 cmpText = atoi(pTextTmp->textString());//把字符串转为整数
  116.                                                
  117.                                                 if (cmpText > cmpMax) //取出最大值
  118.                                                 {
  119.                                                         cmpMax = cmpText;

  120.                                                 }
  121.                                         }
  122.                                 }

  123.                                 entity->close();

  124.                         }

  125.                         pTextTmp->close();
  126.                         delete pIterator;
  127.                         pBlockTableRecord->close();
  128.                        
  129.                 }
  130.                 else //用户选择NO放弃
  131.                 {
  132.                         acutPrintf("\n提示::用户放弃操作.");
  133.                         pLayerTable->close();
  134.                         return ;
  135.                 }
  136.         }
  137.         else//如果输入层不存在
  138.         {

  139.                 pLayerTableRecord = new AcDbLayerTableRecord;
  140.                 if(pLayerTableRecord->setName(newLayerName)!=Acad::eOk)        //往记录中加入层名
  141.                 {
  142.                         acdbFail("\n错误::添加层表记录失败.");
  143.                         pLayerTableRecord->close();
  144.                         pLayerTable->close();
  145.                         return ;
  146.                 }

  147.                 if(pLayerTable->add(LayerId, pLayerTableRecord)!=Acad::eOk)//在层表中加入记录
  148.                 {
  149.                         acdbFail("\n错误::追加层表记录失失败.");
  150.                         pLayerTableRecord->close();
  151.                         pLayerTable->close();
  152.                         return ;
  153.                 }

  154.                 pLayerTable->close();       
  155.                 pLayerTableRecord->close();               

  156.         }

  157. //==============================================================


  158.         struct resbuf *filter;                                //过滤器变量
  159.         ads_name getCircle,temEnt;                        //实体名
  160.         ads_real inputRadius = 0;                        //过滤圆的半径
  161.         ads_point startPoint,endPoint;                //框选的矩形对角点

  162.         acedInitGet(RSG_NONULL|RSG_NOZERO|RSG_NONEG,NULL);
  163.         rc = acedGetReal("\n提示::请输入要编号的圆的半径(R): ", &inputRadius);//输入过滤的圆半径
  164.         switch(rc)
  165.         {

  166.         case RTCAN:
  167.                  acutPrintf("\n提示::用户取消操作.");
  168.                  return ;
  169.                  break;
  170.         case RTERROR:
  171.                  acdbFail("\n错误::取得圆半径失败.");
  172.                  return ;
  173.                  break;
  174.         default:
  175.                  break;
  176.         }


  177.         filter = acutBuildList(RTDXF0, "CIRCLE", 40, inputRadius, 0);        //创建过滤器

  178.         if(acedGetPoint(NULL,"\n提示::拖出一个矩形框选出要进行编号的圆集: ",startPoint) != RTNORM)//框选矩形始角点
  179.         {
  180.                 acdbFail("\n错误::取得起始对角点失败.");
  181.                 acutRelRb(filter);
  182.                 return ;
  183.         }

  184.         acedInitGet(RSG_DASH,NULL);//虚线

  185.         if(acedGetCorner(startPoint,NULL,endPoint) != RTNORM)//框选矩形终角点
  186.         {
  187.                 acdbFail("\n错误::取得终止对角点失败.");
  188.                 acutRelRb(filter);
  189.                 return ;
  190.         }

  191.         if(acedSSGet("W",startPoint,endPoint,filter,/*&eb1,*/getCircle) != RTNORM)        //创建框选内实体的选择集
  192.         {
  193.                 acdbFail("\n错误::创建选择集失败或当前没有符合条件的圆实体.");
  194.                 acutRelRb(filter);
  195.                 return ;       
  196.         }

  197.         acutRelRb(filter);        //释放过滤器
  198.        
  199. //=====================================================
  200.        
  201.         long lenLast;                //存储选择集长度(实体个数)的变量
  202.         AcDbEntity *pEnt;        //实体指针变量       
  203.         AcDbCircle *pCirc;        //圆指针变量
  204.        
  205.         if(acedSSLength(getCircle, &lenLast) != RTNORM)        //取得选择集长度
  206.         {
  207.                 acdbFail("\n错误::取得选择集的长度失败.");
  208.                 acedSSFree(getCircle);
  209.                 return ;
  210.         }

  211.         for(int k=0; k < lenLast;  k++)        //循环
  212.         {       
  213.                 AcDbObjectId pEntId;                //对象ID
  214.                 if(acedSSName(getCircle, k, temEnt) != RTNORM)
  215.                 {
  216.                         acdbFail("\n错误::取得实体选择集失败.");
  217.                         acedSSFree(getCircle);
  218.                         return ;
  219.                 }

  220.                 if(acdbGetObjectId(pEntId, temEnt) != Acad::eOk)
  221.                 {
  222.                         acdbFail("\n错误::取得实体ID失败.");
  223.                         acedSSFree(getCircle);
  224.                         return ;
  225.                 }

  226.                 if(acdbOpenObject(pEnt, pEntId, AcDb::kForRead) != Acad::eOk)
  227.                 {
  228.                         acdbFail("\n错误::打开实体失败.");
  229.                         acedSSFree(getCircle);
  230.                         return ;
  231.                 }

  232.                 pCirc = AcDbCircle::cast(pEnt);                //给圆指针赋值
  233.                 arrCenter.append(pCirc->center());        //追加圆心到圆心数组变量
  234.                
  235.         }
  236.        
  237.         pCirc->close();
  238.         pEnt->close();
  239.         acedSSFree(getCircle);        //释放选择集

  240. //=================================================================

  241.         int startNum = 1;                //编号的起始数值
  242.         char TextString[10];        //转变int编号为string变量       
  243.        
  244.         AcDbBlockTable *pBlockTable;
  245.         if(pDb->getSymbolTable(pBlockTable, AcDb::kForRead)!=Acad::eOk)        //取得块表
  246.         {
  247.                 acdbFail("\n错误::取得块表指针失败.");
  248.                 pBlockTable->close();
  249.                 return ;
  250.         }

  251.         AcDbBlockTableRecord *pBlockTableRecord;
  252.         if(pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite)!=Acad::eOk)        //取得块表记录
  253.         {
  254.                 acdbFail("\n错误::打开块表记录失败.");
  255.                 pBlockTable->close();
  256.                 return ;
  257.         }
  258.         pBlockTable->close();

  259.         if (cmpMax != 0)//判断桩编号层的最大文本编号是否为零
  260.         {
  261.                
  262.                 acutPrintf("\n注意::当前桩编号层上的最大编号是 %d!",cmpMax);
  263.                 acedInitGet(NULL, "Yes No");
  264.                 rc=acedGetKword("\n提示::是否要续写上次最大编号? - [Yes/No]<Yes>: ", kw);//用户决定是否继续

  265.                 switch(rc) {
  266.                 case RTCAN:
  267.                          acutPrintf("\n提示::用户取消操作.");
  268.                          pBlockTableRecord->close();
  269.                          return ;
  270.                          break;
  271.                          
  272.                 case RTNONE:        //直接回车
  273.                          strcpy(kw,"Yes");
  274.                          startNum = cmpMax+1;
  275.                          break;

  276.                 case RTNORM:
  277.                          if (stricmp(kw,"Yes") == 0)//用户输入YES
  278.                          {

  279.                                 startNum = cmpMax+1;
  280.                          }
  281.                          else
  282.                          {
  283.                                 acedGetInt("\n提示::请输入一个新的起始号<1>: ",&startNum);//NO
  284.                          }
  285.                          
  286.                          break;

  287.                 }

  288.         }
  289.         else//为0
  290.         {
  291.                 acedGetInt("\n提示::请输入一个新的起始号<1>: ",&startNum);
  292.         }
  293.        

  294.        
  295.         for(int i=0; i< arrCenter.length(); i++)        //循环
  296.         {
  297.                
  298.                 if(acdbRToS(startNum,-1,-1,TextString) != RTNORM)        //整型转为字符串
  299.                 {
  300.                         acdbFail("\n错误::整型数敏转化为字符串时失败.");
  301.                         pBlockTableRecord->close();
  302.                         return ;
  303.                 }
  304.                
  305.                 AcDbObjectId TextId = NULL;
  306.                 AcDbText *pText = new AcDbText(arrCenter[i], TextString, TextId, 20.0, 0.0);

  307.                 pText->setLayer(LayerId,Adesk::kTrue);


  308.                 if(pBlockTableRecord->appendAcDbEntity(TextId, pText)!=Acad::eOk)
  309.                 {
  310.                         acdbFail("\n错误::添加文本到新建层表记录失败.");
  311.                         pBlockTableRecord->close();
  312.                         return ;
  313.                 }

  314.                 startNum++;

  315.                 pText->close();
  316.         }

  317.         pBlockTableRecord->close();


  318. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-8-5 14:58:26 | 显示全部楼层
下载看一看,给你一块钱
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-5 18:02:07 | 显示全部楼层
附件我没有设收费啊.晕死!!这个贴的问题已经解决了, 袋熊大哥,帮我看看我另一个贴,关于多义线点组排序问题的好吗???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 20:42:40 | 显示全部楼层
这么长的代码,看不懂!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 21:27:39 | 显示全部楼层
看错了,原来还有免费的东东
这年头,什么都要钱,就是爱心币不用钱
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-18 11:28:58 | 显示全部楼层
是啊,下载什么都要钱,每天做施工图才能养地起啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-1-8 14:38:34 | 显示全部楼层
哈哈,这个东东还不知道怎么用啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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