乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 28|回复: 1

ObjectARX 2010 函数详解之一

[复制链接]

28

主题

56

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
168
发表于 2013-8-7 08:10:00 | 显示全部楼层 |阅读模式
通过一个多月的教学,感觉大家普遍希望掌握函数及其用法,从今天起,利用这里,给大家详细的介绍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.
回复

使用道具 举报

34

主题

372

帖子

7

银币

中流砥柱

Rank: 25

铜币
508
发表于 2013-8-29 14:10:00 | 显示全部楼层
讲的很细致,不过上面的函数了解acedEntSel就足够了,其他的用的太少。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 07:55 , Processed in 0.187257 second(s), 56 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表