明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1609|回复: 1

ObjectARX 2010 函数详解之一

[复制链接]
发表于 2013-8-7 08:10:02 | 显示全部楼层 |阅读模式
通过一个多月的教学,感觉大家普遍希望掌握函数及其用法,从今天起,利用这里,给大家详细的介绍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.
发表于 2013-8-29 14:10:37 | 显示全部楼层
讲的很细致,不过上面的函数了解acedEntSel就足够了,其他的用的太少。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 00:55 , Processed in 0.170212 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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