这节将介绍如何在ObjectARX中创建上一节在AutoCAD中创建的相同实体,一个线,一个圆,创建一个图层的代码,改变一条线的颜色,添加一个组到组字典当中去。
1、创建实体
下面的代码创建一条直线,并且将它添加到模型数据库的块表记录当中。(其中的注释为译者加注)
AcDbObjectId
createLine()
{
AcGePoint3d startPt(4.0, 2.0, 0.0);//起点坐标 x:4.0 y:2.0 z: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;//返回实体的ID
}
这个函数首先获得当前图纸的块表。然后以写模式打开模型空间的块表记录,然后添加实体到块表记录中。(译注:实体添加到数据库后调用close关闭,由数据库管理,不用删除。同样获得了数据库的指针后,最后都需调用close关闭指针,让数据库接手管理)
提示:当你使用完任何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);//半径为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;
}
2、创建一个新的图层
下面的代码先获得数据库的图层符号表然后创建一个新的图层表记录,并且命名为: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 properties of
// the layer if they are not otherwise specified.
//
pLayerTable->add(pLayerTableRecord);
pLayerTable->close();
pLayerTableRecord->close();
}
3、打开访问然后关闭ObjectARX对象
下面的代码说明了当你无论什么时候使用了数据库内部对象后应该遵守的协议(当打开和关闭)。这个协议确保当你访问一个数据库对象的时候它是在内存里的,而当你不需要的时候写到硬盘内存里。在你能够修改一个对象前,你需要打开它,用下面的这个函数:
acdbOpenObject(pObject, objId, AcDb::kForWrite);
这个函数有个枚举参数,用来限定你打开这个对象的用途,可以是只读,可写,或者通知。其中当你以写模式打开的时候,你可以修改这个对象。无论你用那种模式打开,当你不在使用这个对象的时候,你必须像下面一样关闭这个对象:
pObject->close();
下面的例子打开一个对象然后改变它的颜色:
Acad::ErrorStatus
changeColor(AcDbObjectId entId, Adesk::UInt16 newColor)
{
AcDbEntity *pEntity;
acdbOpenObject(pEntity, entId,
AcDb::kForWrite);
pEntity->setColorIndex(newColor);
pEntity->close();
return Acad::eOk;
}
有一些函数获得对象的ID的时候同时也打开了这个对象,比如 AcDbBlockTable::getAt()函数。一个对象在添加到数据库之前不能close,你拥有这个对象的控制,可以删除它。然而,一旦这个对象被添加到数据库里面了后,你就不能直接删除它了,要删除它,你可以调用它的基类函数AcDbObject::erase()来删除,这个函数标记一个对象被删除了,被标记删除的对象还存在在数据库里,直到这个数据库对象消失。但是数据库保存的时候被标记删除的对象不会保存(译注:下次打开就没有了)。
警告:直接删除一个被添加到数据库中的对象会导致AutoCAD立即结束程序。
4、添加一个组到组字典
下面的代码建立一个组,这个组由AcDbObjectIdArray里面的对象组成。然后将这个组添加到组字典中。注意组字典是如何打开,修改和关闭的。
void
createGroup(AcDbObjectIdArray& objIds, char* pGroupName)
{
AcDbGroup *pGroup = new AcDbGroup(pGroupName);//新建组,名字为pGroupName
for (int i = 0; i < objIds.length(); i++) {
pGroup->append(objIds[i]);//组中添加对象
}
// Put the group in the group dictionary that resides
// in the named object dictionary.
//
AcDbDictionary *pGroupDict;
acdbHostApplicationServices()->workingDatabase()
->getGroupDictionary(pGroupDict, AcDb::kForWrite);//获得组字典
AcDbObjectId pGroupId;
pGroupDict->setAt(pGroupName, pGroup, pGroupId);
pGroupDict->close();
pGroup->close();
}