第4章 实体对象

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在 AutoCAD 数据库中,任何实体对象都保存在数据库的某个图块表记录中,或者 说归某个图块表记录所有。每个新创建的图形数据库中有两个缺省的图块表记录: *MODEL_SPACE 和*PAPER_SPACE,分别对应图形数据库的模型空间和图纸空间,当 用户通过 BLOCK 等命令创建块的时候,实际是向图形数据库的块表中添加新的块表记录, 新添加的块表记录和*MODEL_SPACE 以及*PAPER_SPACE 一样,都可以成为实体的容 器。
本章简介8
第 4 章 实体对象
本章将主要讲述以下内容: † 实体对象介绍。 † 实体对象的标识。 † 实体对象属性和操作。
学习要点
† 掌握实体的标识方法。 † 掌握实体对象的常见操作。 † 了解实体对象的属性。
实体对象,就是具有图形表示的数据库对象,是用户与 AutoCAD 交互的主要对象, 也是 AutoCAD 二次开发者主要的开发对象。ObjectARX 技术提供了根据实体标识符提取 实体属性和编辑实体的编程接口。
多义线,对于复杂实体,在其构造、析构等方面还需做一些额外的工作。
AutoCAD 中的二维多义线(AcDb2dPolyline)是由任意多个连续的直线或圆弧段构成
的组合线,它是一种复杂实体,复杂实体由于包含了其他实体定义,所以其操作方式也稍
微复杂一些,在创建、修改的时候都要考虑其包含的实体对象。
创 建 AcDb2dPolyline 对 象 , 首 先 需 要 确 定 多 义 线 的 顶 点 坐 标 数 组 , 在 调 用
4.3 对象的类型判断
由于所有实体都是从 AcDbEntity 派生的,所以当打开一个 AcDbEntity 对象时,开发 者经常需要进一步判断其类型,如判断是一条线还是一个圆等。在实际的开发中,对 ObjectARX 对象进行类型判断需要使用 ObjectARX 提供的类型判断机制。
ObjectARX 中所有的数据库对象都是从 AcRxObject 类派生出来的,AcRxObject 类提 供了运行时类型识别的函数,其中 ObjectARX 对象的运行时类识别信息,如对象的父类、 派生类、类的 ASCII 名等信息包含 AcRxClass 类中。我们可以通过 AcRxObject::desc() 静 态 函 数 返 回 AcRxClass 类 型 的 指 针 , 然 后 调 用 AcRxObject::isA ( ) 或 者 AcRxObject::isKindOf()来进行类型判断,其中 AcRxObject::isA()用于判断对象是否 是所需要的对象类型,而 AcRxObject::isKindOf()可用于判断对象是否是所需要的类型或
n 通过实体的构造函数 new 创建一个新实体对象指针,并设置对应属性; n 通过 AcDbBlockTableRecord::appendAcDbEntity 函数添加实体对象到图块表记录; n 关闭块表记录和实体对象;
以下代码创建一条直线并把直线添加到模型空间中: void CreatLine() { //新建实体对象: AcGePoint3d startPt(4.0, 2.0, 0.0); AcGePoint3d endPt(10.0, 7.0, 0.0); AcDbLine *pLine = new AcDbLine(startPt, endPt); //打开块表记录: AcDbBlockTable *pBlockTable; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord; pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pBlockTable->close(); //添加实体对象到块表记录: AcDbObjectId lineId; pBlockTableRecord->appendAcDbEntity(lineId, pLine); //关闭块表记录和实体: pBlockTableRecord->close();
4.2.1 对象标识符的相互转换
ObjectARX 提供了丰富的实体标识符转换函数,保证开发者采用合适的开发方式获取 或修改实体的属性,如图 4-2 所示:
4
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
图 4-2 对象标识符间互相转换 调用全局函数 acdbOpenObject()传入 AcDbObjectId 将打开对象,得到对象指针。 调 用 AcDbObject ::getAcDbHandle ( ) 可 以获 取对象 的 句柄 AcDbHandle , 通 过 AcDbDatabase:: getAcDbObjectId()可以将对象句柄 AcDbHandle 映射为 AcDbObjectId 对象; 反之,AcDbObjectId::handl(e )函数用于返回 AcDbObjectId 所关联的对象句柄 AcDbHandle。 调 用 acdbGetObjectId ( ) 可 以 ads_name 转 化 为 AcDbObjectId ; 反 之 , 调 用 acdbGetAdsName()则将 AcDbObjectId 转化为 ads_name。 下面的代码通过选取实体对象过程中返回的 ads_name,返回了对象的指针:
->getSymbolTable(pBlockTable, AcDb::kForRead);
//
//得到模型空间
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,
pBlockTableRecord,
AcDb::k2dSimplePoly, ptArr, 0.0, Adesk::kTrue);
//设置颜色
pPolyline->setColorIndex(3);
//
//得到块表对象
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
2
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
pLine->close(); return ; }
一般来讲,实体都直接包含其必要的几何信息或属性,不包含其他实体对象,称为简
单实体;但有些实体是通过包含其他实体来保存几何信息或属性的,称为复杂实体,例如
AcDb::kForWrite);
pBlockTable->close();
//
//附加 AcDb2dPolyline 对象到模型空间
AcDbObjectId plineObjId;
pBlockTableRecord->appendAcDbEntity(plineObjId, pPolyline);
n AcDbObject 对象指针
当一个对象被打开后,AutoCAD 会返回指向 AcDbObject 或其派生类型的一个 C++ 指针,开发者就可以采用标准 C++类对象的方式对实体进行操作。显然,这是 ObjectARX 操作实体的主要方式。
n ads_name
ads_name 是 AutoCAD 定义的一个数据类型,这个数据类型在 AutoCAD 发展到 ADS 开发阶段被引入,并作为 ADSRX 的一部分保留在 ObjectARX 开发方式下。ads_name 一 般用来保存用户交互过程中成功选择实体的结果,通常,选择实体是为了用户能获得并修 改实体的属性,ObjectARX 提供了 ads_name 与对象 ID 的转换函数,从而可以按 ObjectARX 的方式修改实体属性。
n AcDbHandle
DWG 文件中的每一个实体都有获 一取个唯一的打标开识实符体 ,称为句柄,用 AcDbHandle 表示。 实体的句柄可以随 DWG 文件保存,所以即使 DWG 文件没有被 AutoCAD 打开,也可以 根据句柄搜索 DWG 文件获取对象信息Ac, Db句Ob柄jec的t 指唯针一性仅限于其所在的 DWG 文件。
4.1 实体对象
实体就是具有图形表示的数据库对象,如直线、圆、圆弧、文本、三维实体、面域、 样条曲线和椭圆等,这些都是 AutoCAD 本身自带的实体。另外,开发者也可以根据自己 的需求从 AcDbEntity 中派生出具有特定意义和表现形式的实体,称为自定义实体。
不论是 AutoCAD 自带的实体还是开发者开发的自定义实体,其标识方法都是一样的, 在数据库中的所有者关系也相同。
实体和块表记录关系如图 4-1 所示:
1
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
图 4-1 实体和块表记录
通 过 ObjectARX 提 供 的 API 可 以 创 建 实 体 , 新 创 建 的 实 体 需 要 通 过 AcDbBlockTableRecord::appendAcDbEntity()加入到块表记录中,一般实体的创建过程 遵循以下过程:
4.2 对象标A识cDbHandle
ads_name
开发者使用 ObjectARX API 开发转换时,通常需要标转识换所处理的对象,同一个数据库对象 根据所处的阶段不同可以转用换不同的标识符加以标识,不同的阶转段换可以是在 dwg 文件中或者 是当前图形数据库(内存中),以及选Ac择Db集O中bje,ctI通d 常可以通过以下方式标识一个实体。
pBlockTableRecord->close();
//
//设置图层
3
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
pPolyline->setLayer(_T("0")); pPolyline->close(); } 以上代码说明了 AcDb2dPolyline 对象的创建过程,在后面会有专门的部分讲解 AcDb2dPolyline 中顶点的访问以及 AcDb2dPolyline 的删除等操作。
ptArr.setLogicalLength(4);
for (int i = 0; i < 4; i++) {
ptArr[i].set((double)(i/2), (double)(i%2), 0.0);
}
//新建 AcDb2dPolyline 对象
AcDb2dPolyline *pPolyline = new AcDb2dPolyline(
百度文库
n AcDbObjectId
当 DWG 图形被打开后,数据库中的实体对象都会在内存中对应一个唯一的对象 ID (AcDbObjectId),对象 ID 也是与实体对象相关联的唯一的标识符, 与句柄不同,对象 ID 仅存在于其所在的数据库从内存中产生到数据库被删除之间,并且如果操作多个数据库, 对象 ID 在多个数据库之间都是唯一的。
//选择对象,返回 ads_name ads_name en; ads_point pt; acedEntSel(_T("\n 选择对象: "), en, pt); //通过对象标识转换函数得到对象 ID AcDbObjectId eId; acdbGetObjectId(eId, en);
//打开实体,得到 AcDbEntity 指针 AcDbEntity * pEnt; acdbOpenObject(pEnt, eId, AcDb::kForRead);
AcDb2dPolyline 的 构 造 函 数 创 建 AcDb2dPolyline 对 象 时 , 需 要 传 入 此 数 组 , 创 建
AcDb2dPolyline 的顶点对象。
void CreatePolyline()
{
//设置 pline 的顶点坐标
AcGePoint3dArray ptArr;
相关文档
最新文档