CAD数据库 创建简单的对象

来源:互联网 发布:linux 查看nginx配置 编辑:程序博客网 时间:2024/05/01 08:08

1、介绍
每个AutoCAD图样代表保存了几种类型对象的结构化数据库。当你打开一个新的图样时,AutoCAD会在后台创建一个组织过并且高效的数据库。这个数据库拥有最少允许你创建基本图形的数据。
这个最少数据基本上表现为像层,线型,文本样式等等的对象。这样你就有了层0,标准文本样式,连续的线型及其它。
自从AutoCAD 2000起你就能同时与多个图形一起工作,这个就是我们说的多文档界面(MDI)环境。这个功能在带来了更多的灵活的同时,也让处理多个图形变得额外复杂。这个课程里我们不讨论多文档界面,但是这个可能会是未来ObjectARX应用程序里要求的。

2、数据如何存取
数据库保存一个图样展现必须的所有各类的对象。这些对象都存取在适当的容器里,这些容器是用来管理同类对象的特殊对象。通过这种方式,我们就有了合适的方法和过程用于存取实体,层,文本样式等等。每个存储在数据库中的对象有一个被称为ObjectId的标识符。这个标识符在同一个AutoCAD session里是唯一的,在每个对象的生命周期内都是有效的。ObjectId由数据库自行生成 ,我们不用关心如何创建它。

在ObjectARX内容我们有三个基本的对象:
实体:用于表现图形的对象(线,弧线,文本……);
容器:用于存储和管理集合的特殊对象(层表,线型表……);
对象:没有图形显示的对象 (组,布局……)

3、AutoCAD的数据结构
a、创建对象
通过ObjectARX创建对象有一些方法,根据你想创建哪种对象和你想要在哪里存储它来定(大部分情况下我们保存对象在它特有的容器内)。但基本上,你将要依照下面的顺序:

为你想要创建的对象类型定义一个指针,然后调用它的new操作;
由这个指针,调用这个对象的适当方法改变它的特性;
获得你想创建对象的数据库的指针(大部情况下是当前数据库);
打开存储它的适当容器;
调用特定的容器方法,传递它的指针,存储它。
自动接收由所在容器创建的ObjectId;
完成操作,关闭所有打开的对象,包括容器和你刚创建的对象。

很明显你要创建一些方便的类将这个过程自动化,因为它们是如此的相似,很容易重用。最主要的思想是创建一种数据库实用方法,如 AddLayer, AddLine, AddCircle, AddTextStyle,等等。
*关闭打开的对象是很重要的一件事,因为这个会导致AutoCAD终止运行。

b、创建直线的简单代码(AcDbLine)
这个代码用来说明如何在两点间创建一条简单的线。过程很简单,并且没有错误处理。这个代码需要被放到ObjectARX 应用程序结构里来工作。主要是思想是向你展示一些概念。此处我们将创建能工作的代码。请注意打开的关闭操作的顺序。

// 现在我们需要实例化一个AcDbLine指针
// 在这个例子里,它的构造构造函数允许我传递两个点的参数
AcDbLine *pLine = new AcDbLine(startPt, endPt);
// 现在需要打开适当的容器,就是BlockTable
AcDbBlockTable *pBlockTable = NULL;
// 首先,得到当前数据库,然后取得BlcokTable
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和实体entity
pBlockTableRecord->close();
pLine->close();

原创粉丝点击