我正在学习 ObjectArx,据我所知,在 Arx 中创建对象有 3 种常用方法:
- 使用 acdbEntMake
- 使用record.append(实体)
- 使用 record.append 和 transaction 的组合
所以,我的问题是:当我应该在每种情况下使用它们时,有人可以帮助我吗?它们之间的性能差异很大吗?
与以下两种方法相比,当对象数量很大时,我会犹豫是否使用 acdbentmake,因为我看到很少有提到它的示例。
我正在学习 ObjectArx,据我所知,在 Arx 中创建对象有 3 种常用方法:
所以,我的问题是:当我应该在每种情况下使用它们时,有人可以帮助我吗?它们之间的性能差异很大吗?
与以下两种方法相比,当对象数量很大时,我会犹豫是否使用 acdbentmake,因为我看到很少有提到它的示例。
我不知道您正在创建什么样的实体,但是:
acdbEntMake
在大多数情况下,您不需要使用。我使用 ObjectARX 大约有 8 年了,从未使用过它;)
事务在 .Net 版本的 ObjectARX 中使用,但您标记了 visual-c++,所以我想不是这种情况。
如果您担心绘制大量实体,请对其进行测试。以你知道和衡量所需时间的方式画图。只要您和您的客户接受绘图时间,您使用的方式就可以了。将来,如果需要,您始终可以重构代码以获得更好的性能。
创建例如行您可以使用此示例:
Acad::ErrorStatus AddLine(const AcGePoint3d SP , const AcGePoint3d EP , AcDbObjectId& id , AcDbObjectId Block )
{
AcDbLine* Line = new AcDbLine();
Line->setStartPoint(SP);
Line->setEndPoint(EP);
Acad::ErrorStatus es = Add( Line , Block );
if (es != Acad::eOk) { return es ;}
es = Line->close();
id = Line->objectId();
return es ;
}
Acad::ErrorStatus Add( AcDbEntity * pEnt, AcDbObjectId parent)
{
if ( !pEnt ) {
return Acad::eNullEntityPointer ;
}
Acad::ErrorStatus es;
if (parent.isNull()) {
parent = getActiveSpace()->objectId();
}
AcDbObject* pObj = NULL;
es = acdbOpenObject(pObj, parent , AcDb::kForWrite) ;
if (es != Acad::eOk) {
return es;
}
if (!pObj->isKindOf(AcDbBlockTableRecord::desc())) {
pObj->close();
return Acad::eWrongObjectType;
}
AcDbBlockTableRecord* Blok = AcDbBlockTableRecord::cast(pObj);
if ((es = Blok->appendAcDbEntity(pEnt)) != Acad::eOk )
{
Blok->close();
return es;
}
Blok->close();
return Acad::eOk;
}
AcDbBlockTableRecord* getActiveSpace()
{
AcDbBlockTableRecord* pOutVal = NULL;
AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
if (!pDb) return NULL;
AcDbObjectId ActiveStpaceId = pDb->currentSpaceId();
AcDbObject* pObj = NULL;
Acad::ErrorStatus es;
es = acdbOpenObject(pObj, ActiveStpaceId , AcDb::kForRead);
if( es == Acad::eOk)
{
pOutVal = AcDbBlockTableRecord::cast(pObj);
es = pObj->close();
}
return pOutVal;
}