0

我正在学习 ObjectArx,据我所知,在 Arx 中创建对象有 3 种常用方法:

  • 使用 acdbEntMake
  • 使用record.append(实体)
  • 使用 record.append 和 transaction 的组合

所以,我的问题是:当我应该在每种情况下使用它们时,有人可以帮助我吗?它们之间的性能差异很大吗?

与以下两种方法相比,当对象数量很大时,我会犹豫是否使用 acdbentmake,因为我看到很少有提到它的示例。

4

1 回答 1

1

我不知道您正在创建什么样的实体,但是:

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;
}
于 2020-02-13T07:39:48.893 回答