- UID
- 681698
- 积分
- 394
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2013-7-14
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 小龙龙 于 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),实际就是由这个全局函数定义的。
示例,根据选择对象,在鼠标选定位置画圆。
 - void xqlMyEntSel()
- {
- ads_name ename;//声明图元名
- ads_point pt;//声明点
- if (acedEntSel(NULL,ename,pt)!=RTNORM)
- {
- return;//选择失败退出
- }
- acedCommand(RTSTR,_T("CHANGE"),RTENAME,ename,RTSTR,_T(""),RTSTR,_T("P"),RTSTR,_T("C"),RTSTR,_T("1"),RTSTR,_T(""),0);//调用命令
- }
示例二定义一个自己的LISP函数(myentsel)[时间紧未经测试大家可以试验一下] - static int ads_myentsel(void)
- {
- //----- Remove the following line if you do not expect any argument for this ADS function
- struct resbuf *rb =acedGetArgs () ;
- ads_name s1;ads_point pt;
- struct resbuf *lis;
- // TODO: add your code here
- if (rb== NULL)
- {
- if (acedEntSel(NULL,s1,pt)!=RTNORM)
- {
- return RTERROR;
- }
-
- lis = acutBuildList(RTENAME,s1,RT3DPOINT,pt,0);
- }
- else
- {
- if (rb->restype == RTSTR)
- {
- if (acedEntSel(rb->resval.rstring,s1,pt)!=RTNORM)
- {
- return RTERROR;
- }
- lis = acutBuildList(RTENAME,s1,RT3DPOINT,pt,0);
- }
- else
- {
- acdbFail(_T("参数错误"));
- return RTERROR;
- }
- }
- rb = rb->rbnext;
- if (rb!=NULL)
- {
- acdbFail(_T("参数太多"));
- return RTERROR;
- }
-
- // TODO: Replace the following line by your returned value if any
- acedRetList( lis);
- acutRelRb(lis);
- return (RSRSLT) ;
- }
上面呢就是ARX全局函数acedEntSel的介绍,下面在LISP中是怎么实现的呢,如下所示:
 - (defun c:myentsel()
- (setq en(entsel))
- (if(/= en nil)
- (progn
- (setq pt(cadr en))
- (command "circle" pt 5)
- ))
- (princ)
- )
希望大家对此能了解这个函数,下一讲我们讲讲acdbEntGet.
|
评分
-
查看全部评分
|