找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 379|回复: 0

[教学]:给arx初学者的小礼物

[复制链接]
发表于 2004-3-12 11:40:30 | 显示全部楼层 |阅读模式

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

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

×
给arx初学者的小礼物

转自:http://pchome.net/~/xdsoft/

对于一个arx的初学者来说,能够利用arx来完成一定的工作,需要经过一个比较漫长的过程,通常可能会

在一到两个月的时间里感觉无从下手。

现将本人使用arx中积累的一点小经验发表在本版,起一个抛砖引玉的作用,欢迎大家讨论。

 

[预备]

掌握arx之前应具有的基本知识:

* 能够较为熟练的使用AutoCAD

* c++和面向对象编程的基本概念

* 使用过ads或autolisp等开发工具(没用过也无所谓)

 

利用arx开发的程序在autoCAD中的运行效率、与AutoCAD的协调程度,以及它的灵活深入是其他开发方法所无法比拟的。但arx的致命弱点是它很容易导致一些严重的错误而使得AutoCAD崩溃,甚至使造成严重的死机。这些都要求arx的开发人员养成一个良好的编程习惯,在arx代码中加入进行严谨的错误检查,尽量确保在发现异常后能后及时返回,避免发生严重错误。为了简单起见,在我所给出的所有示例程序中,均省略了错误检查。

对于一个已经能够熟练使用ads进行AutoCAD开发的程序员来讲,一条迅速升级的途径就是使用AdsRx进行开发。所谓的AdsRx就是利用arx(动态连接)接口,采用ads方法编程的的开发方法。这种方法可以保证程序的可靠性,并可以获得折衷的效率。

[open-close方式访问AutoCAD实体]

刚开始接触arx的网友最头疼的问题可能就是如何获取autoCAD中实体的数据,以及如何能够修改这些实体。下面我们就来看一看如何利用arx来访问AutoCAD中的实体。AutoCAD中所谓的实体就是存放在图形数据库中的一些类的对象,比如直线在AutoCAD中对应的类为AcDbLine,

圆弧对应的类为AcDbArc。实体和图层等都是作为数据库对象存储在图形数据库中的(dwg文件)。所不同的是实体是具有图形的对象。而实体之所以具有图形,是因为它们都重载了它们的父类:AcDbEntity的成员函数worldDraw()和viewportDraw(),这两个函数的作用就是在AutoCAD的绘图窗口中绘制对应的实体的图形。下面的代码演示了如何获取一条line的数据。

//由于arx本身没有与用户交互的函数,所以在arx中与用户的交互工作都是用ads函数来实现的。

ads_name en;

ads_point pt;

ads_entsel("\n选择实体: ", en, pt);

//ads_entsel函数所得到的是实体的名字而arx中要访问一个实体必须要知道它的id,下面的函数就是通过一个实体的名字来得到它的id

//acdbGetObjectId是arx的一个全局函数。

acdbGetObjectId(eId, en);

//arx中对各种对象的访问都是通过指针来实现的,

//因此在访问之前,首先要声明一个指针。

//因为不知道用户会选择一个什么样的实体,

//因此声明一个AcDbEntity类的指针。

//因此声明一个AcDbEntity类的指针。

AcDbEntity * pEnt;

//acdbOpenObject是arx提供的一个全局函数,

//它的功能是通过已知的对象的id用指定的打开

//方式将对象打开,所谓的打开就是将要访问的

//对象从磁盘调到内存中。

acdbOpenObject(pEnt, eId, AcDb::kForRead);

//注意,这里必须判断acdbOpenObject的返回值,

//如果它返回值不是Acad::eOk就说明有错误发生

//这时就不能在继续下去了,因为指针错误将导致

//严重的死机。

//下面假定用户选中了一条line

//isKindOf是大多数arx类具有的一个判断类的类型

//的成员函数,这里可以先不去管它。

if(pEnt->isKindOf(AcDbLine::desc())){

//声明一个直线类的指针,用pEnt为它赋值

//pEnt和pLine是等效的

AcDbLine * pLine = (AcDbLine*&)pEnt;

ads_printf("\n你选择了一条直线");

ads_printf("\n直线的起点是:%f,%f,%f",

pLine->startPoint());

ads_printf("\n直线的终点是:%f,%f,%f",

pLine->endPoint());

}// end if

 

//打开了一个对象,对其操作完成之后,必须

//用close()函数将它关闭,否则等待你的就是

//autoCAD的崩溃

 

pEnt->close();

 

上面的程序演示的是一个获取实体信息的一个简单的例子。

想通过这个例子,告诉大家一个最基本的概念:如果你要

访问一个AutoCAD数据库中的对象,那你必须想办法得到

这个对象的指针。获取指针的函数还有:

acdbOpenAcDbEntity 打开一个实体,acdbOpenAcDbObject 打开一个非图形对象(图层等)

这些函数提供的获取对象指针的方法,叫做open-close机制。

使用open-close机制访问autoCAD对象时必须注意:

1.open 和close必须成对出现。

2.打开方式为AcDb::kForRead时,只能查询对象的数据,在

这种方式下,一个对象最多可以同时被打开256次;不能

同时再用AcDb::kForWrite方式打开对象了

3.打开方式为AcDb::kForWrite时,可以对对象进行修改。

用这种方式时,对象只能被打开一次。

 

在访问直线的数据时我们用了startPoint,和endPoint两个函数。其实,AcDbLine的数据结构可能是这样的:

...

private:

AcGePoint3d m_startPoint;//起点

AcGePoint3d m_endPoint; //终点

...

因为它们是私有数据,因此不能直接访问它们,只能用startPoint和endPoint函数访问这些数据,AutoCAD这样作的目的是为了避免对这些成员变量的访问破坏它的undo机制。因此当你需要获取某个对象的数据时,你只要到arx在线文档中找到对应的类,浏览它的Query Functions来查找对你有帮助的函数就可以。

如果将前面的代码改为:

acdbOpenObject(pEnt, eId, AcDb::kForWrite);

你就可以调用AcDbLine的Edit Functions来修改这条线了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 12:50 , Processed in 0.379683 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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