- UID
- 47232
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-5-7
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
给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来修改这条线了。 |
|