arx & c++ 开发技巧讲解

本文介绍了AutoCAD ARX编程中的图块设计技术,包括图块的引用机制、属性块的插入方法以及图块在数据库中的检索。详细讲述了如何在ARX应用程序中创建和管理图块,包括设置插入点、旋转角和比例系数,以及属性块的附加属性。同时,还探讨了如何遍历图块中的属性进行操作。此外,文章还涉及了数据库中图块的检索、块表记录的操作和符号表的管理,如层表、字体样式和尺寸标注样式等。
摘要由CSDN通过智能技术生成

以下是做CAD二次開發一年多來的一些讀書筆記﹕
节选于《AutoCAD高级开发技术:ARX编程及应用》

跟大家分享
一.图块设计技术:

在AutoCAD数据库中,以各图块实际上市存储在块表记录里的实体集合。每个图块从一格AcDbBlockBegin对象开始,紧接着是一个或多个AcDbEntity对象,最后以AcDbBolckEnd对象结束,按其所属关系得层次结构分为三层:第一层为块表,是属于数据库管理的根对象;第二层为块表记录,是属于块表管理的对象;第三层为组成图块的实体对象,是属于块表记录管理的基本对象。因而,在AutoCAD数据库中,定义图块的第一个过程式向块表中加入一条新的块表记录,然后将组成图块的实体对象写入该块表记录中。

1.AutoCAD数据库中图块的引用
在AutoCAD系统中插入已定义的块并不是将块中所有实体复制到数据库中,而是通过块引用机制向块表记录增加一个AcDbBlockReference类引用对象。所谓的块引用实际上是用户用Insert命令或ARX引用程序向AutoCAD数据库中插入的图块。在ARX应用程序中,利用定义的AcDbBlockReference类实例及相应的成员函数可以设置插入块的有关特性,如插入点、旋转角以及XYZ方向的比例系数等。插入不带属性的简单图块的编程技术相对比较简单,做法如下:
A.创建一个指向AcDbBlockReference类对象实例的指针。
B.调用该类的成员函数setBlockTableRecord()设置引用图块的ID号。
C.调用该类的成员函数setPosition(),setRotation()和setScaleFactors()分别设置块引用的插入点、旋转角和XYZ方向的比例系数等。
D.打开当前图形模型空间的块表,利用getBlockTable()函数获得指向当前图形的块表指针。
E.调用appendAcDbEntity()函数将块引用加入当前数据库模型空间块表记录中。

2. 属性块的引用:
在块定义中的附加属性信息必须通过调用AcDbBlockReference类的成员函数appendAttribute()才能加入到块引用中。
定义属性块时,属性实质上是附加于构成图块的某一实体上的一个或多个非图形信息。因此,在插入属性时必须检索出属性块定义时的所有附加信息,然后将其附加于块引用的相应实体上,这就需要遍历块中的全部实体。
通过属性块的ID号打开其块表记录,从而获得指向块表记录的指针。程序代码为:
AcDbBlockTableRecord *pBlockDef; //定义指向块表记录的指针
acdbOpenObject(pBlockDef,blockid,AcDb::kForRead); //获得指向块表记录的指针
参数blockid为属性的ID号,然后,定义一个用于遍历块表记录的浏览器,获得指向块表记录的浏览器指针,如:
AcDbBlockTableIterator *pIterator; //定义指向块表记录浏览器的指针
pBlockDef->newIterator(pIterator); //获得指向块表记录的浏览器指针
成员函数newIterator()用于创建块表记录的浏览器对象,参数pIterator为指向块表记录的浏览器指针。在此基础上建立一个循环结构,用于遍历图块中的全部实体,得到指向某一实体的指针,其结构如下:
AcDbEntity *pEnt; //定义指向实体的指针
AcDbAttributeDefinition *pAttdef; //定义指向属性定义的指针
For (pIterator->state(); !pterator->done(); pIterator->step())
{
pIterator->getEntity(pEnt,AcDb::kForRead); //得到指向实体的指针
pAttdef = AcDbAttributeDefinition::cast(pEnt); //得到指向属性定义的指针
//处理属性插入的代码
……
pEnt->close(); //关闭实体对象
}
实体属性的插入代码的执行机理如下:
1). 创建AcDbAttribute类对象,获得指向该对象的指针。
如: AcDbAttribute *pAtt = new AcDbAttribute;
2). 设置新建的AcDbAttribute类对象的属性值及特性,如属性位置,字高,旋转角度,属性文本等.
3) . 调用appendAttribute()函数将属性附加于pBlkRef指向的块引用中。
如: pBlkRef->appendAttribute(attid,pAtt);
其中,pBlkRef为指向块引用的指针,pAtt为前面创建的AcDbAttribute类对象的指针。

3. AutoCAD数据库中图块的检索
对于AutoCAD数据库来说,图块的检索主要包括用户定义的有名块和图形中已插入的块引用两个方面。
1). 先介绍当前图形数据库中块的检索技术:
用ads_tblnext()函数可以得到当前图形的数据库中表示块定义得链表,将改链表存储于结果缓冲区类型的变量中,利用结果缓冲区中的联合体成员就可以获得块名、基点等信息。重复调用ads_tblnext()函数将遍历整个数据库链表中的所有块表记录,从而得到全部已定义的图块信息。
2) . 用户定义数据库中块的检索:
对于在ARX应用中定义的其他数据库,只能用ARX库的函数才能检索出该数据库中所定义的图块,程序的主要设计技术如下:
A. 利用AcDbBlockTable类的成员函数newIterator()创建块表浏览器.
如: pBTable->newiterator(pBIterator);
pBTable为AcDbBlockTable类指针;pBIterator为AcDbBlockTableIterator类块表浏览器指针.
B. 利用循环结构和块表浏览器遍历块表。
C.利用AcDbBlockTableIterator类成员函数getRecord()获得块表记录。
如:pIterator->getRecord(pBTRecord,AcDb::kForRead);
D. 利用块表记录类的成员函数getName()得到块名。
4. 块中实体的检索:
在检索任意数据库中的图块时,主要是利用块表浏览器遍历块表,从而获得图块名。而在获得块名的前提下,利用ARX库提供的块表记录浏览器遍历块表记录中的所有实体,从而实现对块中实体的检索。方法为:
A.用一种合适的方式获得图块名,得到指向该图快的块表记录。
B.生成块表记录浏览器。
C.遍历块中的多有实体,得到检索结果。

现在知道图框的名字是A3,要求遍历图框中属性:pBlkRef为AcDbBlockReference实体。
AcDbObjectIterator *pBlkRefAttItr=pBlkRef->attributeIterator();
for (pBlkRefAttItr->start(); !pBlkRefAttItr->done();pBlkRefAttItr->step())
{
AcDbObjectId attOb

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值