找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 657|回复: 6

[ARX程序]:求助:ARX程序,无法实现,请大虾帮助改正和指正!

[复制链接]
发表于 2004-5-17 16:20:34 | 显示全部楼层 |阅读模式

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

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

×
/////////////////////////////////////////////
程序目的:
在图内,通过鼠标选择第一字符串,把它复制内容下来,再选择第二个字符串,这时第二个字符串的内容变成和第一个字符串的内容相同!(实际上是字符串的内容复制)

[php]
// ObjectARX defined commands

#include "StdAfx.h"
#include "StdArx.h"


// This is command 'STRINGMATCH'
void corillastringmatch()
{
        // TODO: Implement the command
        ads_name ent1;    //实体名变量
        struct resbuf *cb=NULL,*ed=NULL;  //缓冲区
//        char changestr[20];

//        if(acdbEntNext(NULL,ent1)!=RTNORM)
//        {
//                acutPrintf("当前图纸实间没有任何实体!");
               
//        }

if((ed=acdbEntGet(ent1))!=NULL){    //取得实体
       
        for(cb=ed;cb!=NULL;cb=cb->rbnext)  //实体数据
        {
                if(cb->restype==0){     //断定所选实体是否为文本
                        if (strcmp(cb->resval.rstring,"TEXT")!=RTNORM) {
                                acutRelRb(ed);
                                acutPrintf("你选择的实体错误,请指定字符实体!");
                        }
                }

                if (cb->restype==1) {     //修改文本内容
                //        acedGetString(20,"请输入要修改的字符串:",changestr);
                        strcpy(cb->resval.rstring,"11111");       
                }

                if(acdbEntMod(ed)!=RTNORM){   //修改数据库
                        acutRelRb(ed);
                        acutPrintf("修改数据库出错!");
                       
                }
                else{
                        acdbEntUpd(ent1);   //更新文本
                        acutRelRb(ed);
                }
       
        }
}
acutPrintf("为空!");
acutRelRb(ed);

       
/*        ed=acdbEntGet(ent2);
        for(cb=ed;cb!=NULL;cb=cb->rbnext)
        {
                if(cb->restype==0){
                        if (strcmp(cb->resval.rstring,"TEXT")!=RTNORM) {
                                acutRelRb(ed);
                                acutPrintf("你选择的实体错误,请指定字符实体!");
                               
                        }
                }
               
                if (cb->restype==1)
                        strcpy(cb->resval.rstring,changestr);
                if(acdbEntMod(ed)!=RTNORM){
                        acutRelRb(ed);
                        acutPrintf("修改数据库出错!");
                       
                }
                else{
                        acdbEntUpd(ent2);
                }
               
                break;
        }
       
        acutRelRb(ed);
        */

}
[/php]

整个程序经多次更改无法通过实现,出错在何处,望有人能指点迷津!感激不尽!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-17 20:00:04 | 显示全部楼层
if((ed=acdbEntGet(ent1))!=NULL){ //取得实体[/COLOR]

   不是“取得实体”[/COLOR] 而是 “取得实体的数据记录”
You have to call  acedEntSel()  to set ent1 with a valid  value before call acedEntGet():[/COLOR]


  1. ads_name   ent1;
  2. ads_point    pickPt1;
  3. int   k;

  4. k = acedEntSel ("\nPick first text: ",  ent1, pickPt1);
  5. if (k != RTNORM)  {
  6.     .........;
  7.     return;
  8. }

  9. ed = acedEntGet(ent1);
  10. .......

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2004-5-19 14:17:05 | 显示全部楼层
void TextToText()
{
        // TODO: Implement the command
        ads_name ent1,ent2;                                        //实体名变量
        struct resbuf *cb=NULL,*ed=NULL;        //缓冲区
        ads_point    pickPt1,pickPt2;        //拾取点
        char replacestring[20];                //替换过渡变量

//判断当前图纸空间是否存在实体

  if(acdbEntNext(NULL,ent1)!=RTNORM)
   {
        acutPrintf("当前图纸实间没有任何实体!");
        return;               
   }

//判断所选择的是否是文本;取得文本的内容并复制到replacestring变量。
       
if(acedEntSel("\nPick first text: ",  ent1, pickPt1)==RTNORM)//选择实体
{
    if((ed=acdbEntGet(ent1))!=NULL){        //取得实体数据记录
     for(cb=ed;cb!=NULL;cb=cb->rbnext){
                if(cb->restype==0){    //检验实体类型是否为文本(代码为0
                                                  //是记录实体类型吗?
                      if (strcmp(cb->resval.rstring,"TEXT")!=RTNORM) {                         acutRelRb(ed);
                 acutPrintf("你选择的实体错误,请指定字符实体!");
                 return;
        }
                 }

               if (cb->restype==1) {
        strcpy(replacestring,cb->resval.rstring); //把文本的内容
                  //拷贝出来代码为1是记录内容的吗?

        }                                      
           }
     }
    acutRelRb(ed);
}


if(acedEntSel("\nPick first text: ",  ent2, pickPt2)==RTNORM)  //选择第二个实体
{
     if((ed=acdbEntGet(ent2))!=NULL)
      {
          for(cb=ed;cb!=NULL;cb=cb->rbnext)
          {
               if(cb->restype==0){
                      //验证第二个实体的类型是否也为文本
        if (strcmp(cb->resval.rstring,"TEXT")!=RTNORM) {   
                          acutRelRb(ed);
             acutPrintf("你选择的实体错误,请指定字符实体!");
             return;
        }
                 }

//把刚才拷贝的第一文本内容传给第二文本               
              if (cb->restype==1)
                 strcpy(cb->resval.rstring,replacestring);  

//更改数据库
       if(acdbEntMod(ed)!=RTNORM){
        acutRelRb(ed);
        acutPrintf("修改数据库出错!");
        return;
                }
               else
              {
                   acdbEntUpd(ent2);        //更新实体
        }
               break;   //退出循环
           }
           acutRelRb(ed);                //释放缓冲区
   }
}
               
} //程序结束

编译没有错,操作时却实现不了程序的功能--文本间内容的拷贝!请大虾帮帮小弟....
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-19 20:48:36 | 显示全部楼层
1)
if (strcmp(cb->resval.rstring,"TEXT")!=RTNORM[/COLOR]) { acutRelRb(ed);
acutPrintf("你选择的实体错误,请指定字符实体!");
return;
}

--->>> Correct as follow:
if (strcmp (cb->resval.rstring,"TEXT") !=0[/COLOR] ) { acutRelRb(ed);
acutPrintf("你选择的实体错误,请指定字符实体!");
return;
}

-------------
2)
//把刚才拷贝的第一文本内容传给第二文本
if (cb->restype==1)
strcpy(cb->resval.rstring,replacestring); [/COLOR]

--->>>   It is  very dangerous!  It  may Crash AutoCAD! Correct as follow:

struct resbuf *tmp;
char             *sp;

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

使用道具 举报

 楼主| 发表于 2004-5-21 09:39:29 | 显示全部楼层
很感谢楼上的指导,不过由于我的经验不足,加之挺蠢的,到现在为止还是无法把程序完成,功能还是无法实现,不知为什么。。。。。。。。。。
恳请你能不能把我的代码改正过来贴上来呢?感谢感谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-21 21:42:11 | 显示全部楼层

  1. void TextToText()
  2. {
  3.     struct resbuf *cb, *ed1, *ed2, *tmp;
  4.     ads_name   ent1,ent2;
  5.     ads_point  pickPt1,pickPt2;
  6.     char       *sp1, *sp2;
  7.     int        es;


  8.     es = acedEntSel("\nPick first text: ", ent1, pickPt1);
  9.     if (es != RTNORM) return;

  10.     ed1 = acdbEntGet(ent1);
  11.     for (cb =ed1; cb; cb =cb->rbnext) {
  12.         if (cb->restype==0) {
  13.             if (strcmp(cb->resval.rstring,"TEXT") != 0) {
  14.                 acutRelRb(ed1);
  15.                 acutPrintf("你选择的实体错误,请指定字符实体!");
  16.                 return;
  17.             }
  18.         } else if (cb->restype==1) {
  19.             sp1 = cb->resval.rstring;
  20.         }
  21.     }

  22.     es = acedEntSel("\nPick second text: ", ent2, pickPt2);
  23.     if (es != RTNORM) {
  24.         acutRelRb(ed1);
  25.         return;
  26.     }

  27.     ed2 = acdbEntGet(ent2);
  28.     for (cb =ed2; cb; cb =cb->rbnext) {
  29.         if (cb->restype==0) {
  30.             if (strcmp(cb->resval.rstring,"TEXT") != 0) {
  31.                 acutRelRb(ed1);
  32.                 acutRelRb(ed2);
  33.                 acutPrintf("你选择的实体错误,请指定字符实体!");
  34.                 return;  //
  35.             }
  36.         } else if (cb->restype==1) {
  37.             tmp = acutBuildList(RTSTR, sp1, 0);
  38.             sp2 = cb->resval.rstring;
  39.             cb->resval.rstring = tmp->resval.rstring;
  40.             tmp->resval.rstring = sp2;
  41.             acutRelRb(tmp);
  42.             break;
  43.         }
  44.     }

  45.     acdbEntMod(ed2);
  46.     acdbEntUpd(ent2);

  47.     acutRelRb(ed1);
  48.     acutRelRb(ed2);
  49. }
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 18:45 , Processed in 0.413511 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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