明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1401|回复: 1

第六讲 在ObjectARX中创建对象

[复制链接]
发表于 2013-9-25 15:21 | 显示全部楼层 |阅读模式
在ObjectARX中创建对象

本节中的ObjectARX源代码创建了与之前完全相同的实体(直线和圆),并演示了创建一个新层、改变线的颜色和添加到组词典中的过程.
创建实体



下列代码创建了直线并将其添加到模型空间块表记录中:

AcDbObjectId  createLine()//创建直线
{
    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();
    pLine->close();
    return lineId;
}

createLine()程序从当前图形中获取块表,然后以写模式打开模型空间块表记录.关闭块表后,添加实体到块表记录并关闭块表记录和实体.
注意
当用完任何ObjectARX对象后,必须尽早地将其关闭
下面的 createCircle() 程序创建一个圆并将其添加到模型空间块表记录中.

AcDbObjectId  createCircle()
{
    AcGePoint3d center(9.0, 3.0, 0.0);
    AcGeVector3d normal(0.0, 0.0, 1.0);
    AcDbCircle *pCirc = new AcDbCircle(center,normal, 2.0);
    AcDbBlockTable *pBlockTable;
   acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable,AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId circleId;
    pBlockTableRecord->appendAcDbEntity(circleId,pCirc);
    pBlockTableRecord->close();
    pCirc->close();
    return circleId;
}

创建新层


下面的代码从数据库中获得层表,创建一个新的层表记录,并将其命名为ASDK_MYLAYER,然后将层表记录添加到层表中

void createNewLayer()
{
    AcDbLayerTable *pLayerTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pLayerTable,AcDb::kForWrite);
    AcDbLayerTableRecord *pLayerTableRecord =
        new AcDbLayerTableRecord;
   pLayerTableRecord->setName("ASDK_MYLAYER");
    // Defaults are used for other propertiesof
    // the layer if they are not otherwisespecified.
    //
    pLayerTable->add(pLayerTableRecord);
    pLayerTable->close();
    pLayerTableRecord->close();
}

打开和关闭ObjectARX对象


上述所有程序的例子都说明了打开和关闭对象的协议,每当我们操作数据库驻留对象时都要遵守该协议.该协议确保当对象被访问时在物理内存中,而当对象未被访问时可以被分页存储到磁盘中。在我们可以修改对象之前,必须打开它,例如:
acdbOpenObject(pObject,objId, AcDb::kForWrite);
打开函数有一个模式参数,用来说明要打开的对象是用于读、写或是通知操作.当以写模式打开对象时,我们可以对其进行修改;当我们使用完对象后,必须如下例那样关闭对象,不管以什么模式打开对象,都以同一方式关闭:
pObject->close();
下面是一个改变实体颜色的程序代码示例:

Acad::ErrorStatuschangeColor(AcDbObjectIdentId, Adesk::UInt16 newColor)
{
    AcDbEntity *pEntity;
    acdbOpenObject(pEntity, entId,
        AcDb::kForWrite);
    pEntity->setColorIndex(newColor);
    pEntity->close();
    return Acad::eOk;
}

一个对象的新实例在打开时,缺省是用于写操作的.某些函数,如AcDbBlockTable::getAt()函数,获取对象ID的同时打开对象.对象被添加到数据库之后才能将其关闭;在对象被添加到数据库之前,我们拥有对象并可以随时删除对象.
然而,一旦对象已经被添加到数据库后,我们就不能够直接删除它;我们可以通过调用AcDbObject::erase()函数,将对象标记为删除;被标记为删除的对象仍然保留在数据库中,直到数据库被析构为止,但是当保存时,不保存被标记为删除的对象.
警告
如果直接删除已经被.添加到数据库的对象,将导致AutoCAD终止.
在组词典中添加组


下列源代码将前面createLine()函数创建的直线和createCircle()函数创建的圆创建为一个编组(pGroup),并将其放进一个组词典中.线和圆的对象ID是通过参数传入函数的.请注意下面的程序是如何以写模式打开组词典,进行修改,然后将其关闭的.

void createGroup(AcDbObjectIdArray&objIds, char* pGroupName)
{
    AcDbGroup *pGroup = newAcDbGroup(pGroupName);
    // Put the group in the group dictionarywhich resides
    // in the named object dictionary.
    //
    AcDbDictionary *pGroupDict;
   acdbHostApplicationServices()->workingDatabase()
        ->getGroupDictionary(pGroupDict,AcDb::kForWrite);
    AcDbObjectId pGroupId;
    pGroupDict->setAt(pGroupName, pGroup,pGroupId);
    pGroupDict->close();
    // Now that the group has been added, ithas an ObjectID.
    // This is important since the group willbecome a persistent
    // reactor for the added entities...
    for (int i = 0; i < objIds.length();i++) {
        pGroup->append(objIds);
        }
    pGroup->close();
}
发表于 2014-2-16 18:10 | 显示全部楼层
学习了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-6-6 20:16 , Processed in 0.236960 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表