ObjectARX开发教程(转)——第2课:AutoCAD数据库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ObjectARX开发教程(转)——第2课:AutoCAD数据库
第2课:AutoCAD数据库
介绍
AutoCAD数据库的结构
每个AutoCAD图形代表⼀个存储在⼏种对象中的数据库结构。
打开⼯程图时,AutoCAD会⾃⼰创建⼀个有组织的⾼效数据库。
该数据库包含⽤于创建基本⼯程图的最少数据。
最少的数据量由诸如图层,线型,⽂本样式等对象表⽰。
这样,您将获得第0层,标准字体,连续样式等。
在AutoCAD 2000版中,您可以与MDI环境同时使⽤多个图形。
此功能提供了极⼤的灵活性,但在处理多个图纸时也有些⿇烦。
在本课程中,我们将不讨论MDI⽅⾯,但是ObjectARX应⽤程序可能会要求它。
数据如何存储
数据库维护需要绘图的每种对象。
这些对象存储在容器(容器)中,这些容器是为管理相同类型的对象⽽创建的特殊对象。
这样,我们就可以使⽤适当的存储⽅法和过程来存储实体,类,版式等。
存储在数据库中的每个对象都接收⼀个称为ObjectId的标识符。
该标识符在同⼀AutoCAD会话中是唯⼀的,并且在每个对象的整个⽣命周期内有效。
ObjectId由其数据库⽣成,因此您不必关⼼它是如何创建的。
在ObjectARX内部,我们有3种基本类型的对象:
实体:图形对象(直线,圆弧,⽂本等);
容器(隔间):⽤于存储和管理对象集(图层表,轮廓表等)的特殊对象;
对象集:⾮图形对象(组,布局等)。
创建对象
要使⽤ObjectARX创建对象,我们有⼀些基于对象类型和要存储对象的公式(⼤多数情况下,我们需要将对象存储在⾃⼰的隔间中)。
基本上,您将执⾏以下操作:
将指针包含在要创建的对象中,并将其称为new运算符;
使⽤此指针,调⽤对象的适当⽅法以更改其属性;
获取指向您要在其中创建对象的数据库的指针(通常是当前数据库);
打开⼀个存储数据的容器;
通过其指针精确调⽤对象存储⽅法;
获取对象的标识符(ObjectId)(由容器⾃动⽣成);
完成所有对象集(包括隔离专区和刚刚创建的对象)的关闭过程。
显然,您可以巧妙地创建⼀些使流程⾃动化的对象(类),因为它们是统⼀的且易于重⽤。
主要思想是创建⼀种数据库实⽤程序函数,例如:Addlayer,AddLine,AddTextStyle等。
*重要的是不要忘记关闭对象集,因为这将导致AutoCAD⽴即停⽌⼯作。
创建线段(AcDbLine)的简单⽰例
以下代码显⽰了如何在2点之间创建⼀条线。
在这个简单的过程中,代码不会捕获错误,但是主要⽬的是使您熟悉这些概念。
它需要嵌⼊到ObjectARX应⽤程序的结构中才能⼯作。
稍微注意打开和关闭订单。
//⾸先,我们必须声明⼀对点
AcGePoint3d startPt(1.0,1.0,0.0);
AcGePoint3d endPt(10.0,10.0,0.0);
//现在我们将初始化⼀个AcDbLine指针
//在这种情况下,构造函数允许2点
AcDbLine * pLine =新的AcDbLine(startPt,endPt);
//我们将在BlockTable中打开相应的隔离专区
AcDbBlockTable * pBlockTable = NULL;
//⾸先,获取当前数据库,然后获取BlockTable
AcDbDatabase * pDB = acdbHostApplicationServices()-> workingDatabase();
pDB-> getSymbolTable(pBlockTable,AcDb :: kForRead);
//在BlockTable中,打开ModelSpace
AcDbBlockTableRecord * pBlockTableRecord = NULL;
pBlockTable-> getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb :: kForWrite);
//在拥有ModelSpace之后,我们可以关闭BlockTable
pBlockTable-> close();
//使⽤ModelSpace光标,我们可以添加新⾏
AcDbObjectId lineId = AcDbObjectId :: kNull;
pBlockTableRecord-> appendAcDbEntity(lineId,pLine);
//要完成此过程,请关闭ModelSpace和创建的实体
pBlockTableRecord-> close();
pLine-> close();。