创建和编辑基本图形对象.ppt
《创建和编辑基本图形对象.ppt》由会员分享,可在线阅读,更多相关《创建和编辑基本图形对象.ppt(49页珍藏版)》请在三一办公上搜索。
1、第三章 创建和编辑基本图形对象,在学习ObjectARX的时候,大多数曾经试图直接去学习数据库的操作、几何类等概念,结果并不理想。经过一段时间的摸索,将创建和编辑基本图形对象作为突破口,逐步深入,在学习过程中成就感很强。,3.1.1 说明本实例运行的结果是在AutoCAD 2008中,创建一条直线,该直线的起点是(0,0,0),终点是(100,100,0)。除此之外,不准备再做更多的事情。麻雀虽小,五脏俱全。通过这个程序,你将要开始了解AutoCAD数据库的基本结构,3.1 创建直线,3.1.2 思路首先来看看,在AutoCAD中,使用LINE命令创建一条直线,需要哪些东西:命令:_line
2、指定第一点:0,0 指定下一点或 放弃(U):100,100 指定下一点或 放弃(U):从上面的命令提示可以看出,创建一条直线,需要用户指定起点和终点。,在继续之前,必须给大家介绍一点数据库最基础的几个名词:表:表是数据库的组成单位,一个数据库至少包含一个表。记录:记录是表的组成单位,一个表可能包含多条记录,也可能不包含任何记录。,上图用来描述AutoCAD数据库的基本结构再好不过了。从图中来看,实体包含在块表记录中,因此要创建一个图形对象,需要遵循下面的基本步骤:(1)确定要创建对象的图形数据库;(2)获得图形数据库的块表;(3)获得一个存储实体的块表记录,所有模型空间的实体都存储在模型空间
3、的特定记录中。(4)创建实体类的一个对象,将该对象附加到特定的块表记录中。,3.1.3 步骤(1)使用向导创建一个命令(名称为MyLine)。,(2)函数中,添加创建直线对象(在ObjectARX中,AcDbLine类代表直线)的代码:/在内存上创建一个新的AcDbLine对象AcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(100,100,0);AcDbLine*pLine=new AcDbLine(ptStart,ptEnd);注意,基于AutoCAD内部的实现机制,必须在堆上创建对象,而不能用下面的语句创建直线的对象:AcDbLine line(p
4、tStart,ptEnd);此时,直线对象仅被在内存上创建,并没有添加到图形数据库中,因此不可能会显示在图形窗口中。,(3)在函数中,添加获得指向块表的指针的相关代码:/获得指向块表的指针AcDbBlockTable*pBlockTable;acdbHostApplicationServices()-workingDatabase()-getBlockTable(pBlockTable,AcDb:kForRead);acdbHostApplicationServices()-workingDatabase()能够获得一个指向当前活动的图形数据库的指针,这在后面还要经常遇到。,getBlockT
5、able是AcDbDatabase类的一个成员函数,用于获得指向图形数据库的块表的指针,其定义为:inline Acad:ErrorStatus getBlockTable(AcDbBlockTable*该函数的返回值Acad:ErrorStatus是ObjectARX中定义的一个枚举类型,主要用于判断函数的返回状态,如果函数成功执行会返回Acad:eOk。第一个参数pTable返回指向块表的指针;第二个参数同样是一个枚举类型的变量,其类型AcDb:OpenMode包含了AcDb:kForRead、AcDb:kForWrite和AcDb:kForNotify三个可取的值,创建直线的时候不需要更
6、改块表,因此这里打开的模式为AcDb:kForRead。,(4)在函数中,添加获得指向特定块表记录的指针的相关代码:/获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord*pBlockTableRecord;pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForWrite);getAt函数是AcDbBlockTable类的一个成员函数,用于获得块表中特定的记录,其定义为Acad:ErrorStatus getAt(const char*entryName,AcDbBlockTableRecord*
7、,第一个参数用于指定块表记录的名称,ACDB_MODEL_SPACE是ObjectARX中定义的一个常量,其内容是“*Model_Space”;第二个参数用于返回指向块表记录的指针;第三个参数指定了块表记录打开的模式,下一步要向块表记录中添加实体,所以就用写的模式(AcDb:kForWrite)打开;第四个参数指定是否查找已经被删除的记录,这里暂时不深入介绍,后面在合适的地方我会谈到它,一般使用默认的参数值。,(5)在函数中,添加向块表记录中附加实体的代码:/将AcDbLine类的对象添加到块表记录中AcDbObjectId lineId;pBlockTableRecord-appendAcD
8、bEntity(lineId,pLine);appendAcDbEntity是AcDbBlockTableRecord类的成员函数,用于将pEntity指向的实体添加到块表记录和图形数据库中,其定义为:Acad:ErrorStatus appendAcDbEntity(AcDbObjectId 第一个参数返回图形数据库为添加的实体分配的ID号;第二个参数指定了所要添加的实体。,(6)在函数中,添加关闭图形数据库各种对象的代码:/关闭图形数据库的各种对象pBlockTable-close();pBlockTableRecord-close();pLine-close();在操作图形数据库的各种对
9、象时,必须遵守AutoCAD的打开和关闭对象的协议。该协议确保当对象被访问时在物理内存中,而未被访问时可以被分页存储在磁盘中。创建和打开数据库的对象之后,必须在不用的时候关闭它。,(7)最后,来看一下完整的代码:void ZffCHAP2CreateLine()/在内存上创建一个新的AcDbLine对象AcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(100,100,0);AcDbLine*pLine=new AcDbLine(ptStart,ptEnd);/获得指向块表的指针 AcDbBlockTable*pBlockTable;acdbHostApp
10、licationServices()-workingDatabase()-getBlockTable(pBlockTable,AcDb:kForRead);/获得指向特定的块表记录(模型空间)的指针 AcDbBlockTableRecord*pBlockTableRecord;pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForWrite);/将AcDbLine类的对象添加到块表记录中 AcDbObjectId lineId;pBlockTableRecord-appendAcDbEntity(lineId,pLine);
11、/关闭图形数据库的各种对象 pBlockTable-close();pBlockTableRecord-close();pLine-close();,3.2 修改图形对象的属性3.2.1 说明上一节的学习,你已经能创建一条直线了,本节介绍的例子则会改变直线的颜色。所要实现的效果非常简单:创建一条直线之后,将它的颜色变为红色。,3.2.2 思路如果是在创建时修改直线的颜色,就可以直接在上节函数中加入下面的代码(放在关闭图形数据库各种对象之前):pLine-setColorIndex(1);运行程序中注册的命令,创建的直线颜色变为红色。在实际编程中,并不是每一次都可以在创建对象时将其特性设置到合适
12、的状态,相反,更多的时候可能在创建对象之后才修改其特性,本节正要解决这个问题。,1打开和关闭图形数据库的对象访问图形数据库中对象的特性,必须在该对象被打开(对象创建时也会被打开)的状态下,用对象的指针进行访问,并且在访问结束后要及时关闭该对象,不然就会引起AutoCAD的错误终止。创建一个对象,必须在创建之后关闭该对象,那么如何在某个时候再访问该对象?这就要用到上面介绍的AcDbObjectId,也就是对象的ID号。在创建对象时,可以将图形数据库分配给该对象的ID保存起来,在需要访问该对象时,根据这个ID从数据库中获得指向该对象的指针,就可以修改或者查询该对象的特性。,AcDbBlockTab
13、leRecord类的appendAcDbEntity函数能够将一个实体添加到图形数据库中;全局函数acdbOpenAcDbEntity用于从实体的ID号获得指向图形数据库中实体的指针,其定义为:Acad:ErrorStatus acdbOpenAcDbEntity(AcDbEntity*,第一个参数返回指向图形数据库实体的指针;第二个参数输入了要获得的实体的ID号;第三个参数指定了打开该实体的方式,如果仅是查询该实体的特性用“读”模式打开即可,要修改实体的特性就必须用“写”模式打开;第四个参数指定是否允许访问一个已经被删除的实体。,ObjectARX提供了另外两个全局函数acdbOpenAcD
14、bObject和acdbOpenObject来实现类似的功能,这三个函数的区别在与适用范围:acdbOpenAcDbEntity:适用于打开继承于AcDbEntity的数据库常驻对象,这类对象一般都能在图形窗口中显示,如直线、圆等。acdbOpenAcDbObject:适用于打开未继承于AcDbEntity的数据库常驻对象,这类对象不能在图形窗口中显示,如层表、线型表等。acdbOpenObject:如何不知道要打开的对象是否继承于AcDbEntity类,可以使用这个函数。打开某个对象之后,使用close函数就可以将其关闭。,对象标识开发者使用ObjectARX API开发时,通常需要标识所处
15、理的对象,同一个数据库对象根据所处的阶段不同可以用不同的标识符加以标识,不同的阶段可以是在dwg 文件中或者是当前图形数据库(内存中),以及选择集中,通常可以通过以下方式标识一个实体。AcDbHandleDWG 文件中的每一个实体都有一个唯一的标识符,称为句柄,用AcDbHandle表示。实体的句柄可以随DWG 文件保存,所以即使DWG 文件没有被AutoCAD 打开,也可以根据句柄搜索DWG 文件获取对象信息,句柄的唯一性仅限于其所在的DWG 文件。,AcDbObjectId当DWG 图形被打开后,数据库中的实体对象都会在内存中对应一个唯一的对象ID(AcDbObjectId),对象ID 也
16、是与实体对象相关联的唯一的标识符,与句柄不同,对象ID仅存在于其所在的数据库从内存中产生到数据库被删除之间,并且如果操作多个数据库,对象ID 在多个数据库之间都是唯一的。,AcDbObject对象指针当一个对象被打开后,AutoCAD 会返回指向AcDbObject或其派生类型的一个C+指针,开发者就可以采用标准C+类对象的方式对实体进行操作。显然,这是ObjectARX操作实体的主要方式。,ads_nameads_name 是AutoCAD 定义的一个数据类型,这个数据类型在AutoCAD 发展到ADS开发阶段被引入,并作为ADSRX 的一部分保留在ObjectARX 开发方式下。ads_n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 创建 编辑 基本 图形 对象
链接地址:https://www.31ppt.com/p-6040983.html