286168051 发表于 2013-8-7 08:10:02

ObjectARX 2010 函数详解之一

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

zfbj 发表于 2013-8-29 14:10:37

讲的很细致,不过上面的函数了解acedEntSel就足够了,其他的用的太少。
页: [1]
查看完整版本: ObjectARX 2010 函数详解之一