找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3928|回复: 9

[老徐讲堂] ObjectARX 2010全局函数详解之一

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2013-8-7 08:06:47 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 小龙龙 于 2013-8-7 14:22 编辑

通过一个多月的教学,感觉大家普遍希望掌握函数及其用法,从今天起,利用这里,给大家详细的介绍ObjectARX 2010的全局函数及示例,希望大家能够把这个呢弄懂、学透,大部分的全局函数都在LISP中有对应,不妨让我们对比着学习。
这个不是按照什么顺序而是按照分类来讲解,这个我认为与英语水平没有什么关系,以acdbEntSel函数为例,我们一般可以这么来看这个全局函数,前面4个均为小写,是前缀例如aced——编辑相关,acdb—数据库相关等等.中间凡是大写字母开头呢都是某一单词的缩写,很容易记忆比如Ent就是代表实体,Sel是选择等等,方便我们记忆。特别是有了VC助手之后呢可以更加方便我们的应用。
今天呢就先向大家介绍有关实体操作的几个Ent族函数—acedEntSel  acdbEntGet  acdbEntMake acdbEntNext acdbEntLast  acdbEntDel acdbEntMakeX.

首先登场的是函数 acedEntSel.
这个函数呢,含义就是接受用户的选择,返回图元名和用户选择时鼠标的位置。
参数定义如下:int acedEntSel (const ACHAR *str, ads_name entres, ads_point ptres)
第一个参数:字符串,如果为NULL,则默认提示选择对象,如果定义呢则按用户的文字提示进行选择。
第二个参数:图元名,选择成功后,返回的图元名.
第三个参数:坐标点,选择成功后,返回的鼠标拾取点。
返回值:返回RTNORM代表成功,返回值需要用if语句或者Acad::ErrorStatus进行容错处理,否则出现崩溃。

Lisp中对应的函数(entsel),实际就是由这个全局函数定义的。

示例,根据选择对象,在鼠标选定位置画圆。
  1. void xqlMyEntSel()
  2. {   
  3. ads_name ename;//声明图元名
  4.   ads_point pt;//声明点
  5.      if (acedEntSel(NULL,ename,pt)!=RTNORM)
  6.      {
  7.    return;//选择失败退出
  8.      }
  9.   acedCommand(RTSTR,_T("CHANGE"),RTENAME,ename,RTSTR,_T(""),RTSTR,_T("P"),RTSTR,_T("C"),RTSTR,_T("1"),RTSTR,_T(""),0);//调用命令
  10. }


示例二定义一个自己的LISP函数(myentsel)[时间紧未经测试大家可以试验一下]
  1. static int ads_myentsel(void)
  2. {
  3.   //----- Remove the following line if you do not expect any argument for this ADS function
  4.   struct resbuf *rb =acedGetArgs () ;
  5.   ads_name s1;ads_point pt;
  6.   struct resbuf *lis;
  7.   // TODO: add your code here
  8.   if (rb== NULL)
  9.   {
  10.    if (acedEntSel(NULL,s1,pt)!=RTNORM)
  11.    {
  12.     return RTERROR;
  13.    }
  14.          
  15.     lis = acutBuildList(RTENAME,s1,RT3DPOINT,pt,0);
  16.   }
  17.   else
  18.   {
  19.    if (rb->restype == RTSTR)
  20.    {
  21.                 if (acedEntSel(rb->resval.rstring,s1,pt)!=RTNORM)
  22.                 {
  23.      return RTERROR;
  24.                 }
  25.      lis = acutBuildList(RTENAME,s1,RT3DPOINT,pt,0);
  26.    }
  27.    else
  28.    {
  29.     acdbFail(_T("参数错误"));
  30.     return RTERROR;
  31.    }
  32.   }
  33.    rb = rb->rbnext;
  34.    if (rb!=NULL)
  35.    {
  36.     acdbFail(_T("参数太多"));
  37.     return RTERROR;
  38.    }
  39.   
  40.   // TODO: Replace the following line by your returned value if any
  41.      acedRetList( lis);
  42.        acutRelRb(lis);
  43.   return (RSRSLT) ;
  44. }

上面呢就是ARX全局函数acedEntSel的介绍,下面在LISP中是怎么实现的呢,如下所示:
  1. (defun c:myentsel()
  2.   (setq en(entsel))
  3.   (if(/= en nil)
  4.     (progn
  5.       (setq pt(cadr en))
  6.       (command "circle" pt 5)
  7.       ))
  8.   (princ)
  9.   )

希望大家对此能了解这个函数,下一讲我们讲讲acdbEntGet.


评分

参与人数 1D豆 +3 收起 理由
SmallBlackCat + 3 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-8-7 08:41:52 | 显示全部楼层
从入门学起,看懂了一点点,期待以后更精彩!:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-8-7 09:31:42 | 显示全部楼层
本帖最后由 牢固 于 2013-8-7 12:20 编辑

判断参数太多似乎应在判断第一个参数是字串之后紧接着判断,否则如果第一个参数是字串,后面还有参数,会出现先选择对象,后提示参数太多!
如果不提供参数,还要rb->rbnext,会出错!我改了下:
  1.   static int ads_myentsel(void)
  2.   {
  3.     //----- Remove the following line if you do not expect any argument for this ADS function
  4.     struct resbuf *rb =acedGetArgs () ;
  5.     ads_name s1;ads_point pt;
  6.     struct resbuf *lis;
  7.     // TODO: add your code here
  8.     if (rb== NULL)
  9.     {
  10.       if (acedEntSel(NULL,s1,pt)!=RTNORM)
  11.       {
  12.         return RTERROR;
  13.       }

  14.       lis = acutBuildList(RTENAME,s1,RT3DPOINT,pt,0);
  15.     }
  16.     else
  17.     {
  18.       if (rb->restype == RTSTR)
  19.       {
  20.         
  21.         if (rb->rbnext!=NULL)
  22.         {
  23.           acdbFail(_T("参数太多1"));
  24.           return RTERROR;
  25.         }
  26.         else if (acedEntSel(rb->resval.rstring,s1,pt)!=RTNORM)
  27.         {
  28.           return RTERROR;
  29.         }
  30.         lis = acutBuildList(RTENAME,s1,RT3DPOINT,pt,0);
  31.       }
  32.       else
  33.       {
  34.         acdbFail(_T("参数错误1"));
  35.         return RTERROR;
  36.       }
  37.     }
  38.    

  39.     // TODO: Replace the following line by your returned value if any
  40.     acedRetList( lis);
  41.     acutRelRb(lis);
  42.     return (RSRSLT) ;
  43.   }

可是不提供参数时会出现提示选择对象,然后还出一个指定一个点:的提示,选择点,返回值为点,不选择点,返回ientsel的选择结果!没搞明白啥原因???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 221个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 305个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 22:02 , Processed in 0.188244 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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