Каков наилучший способ создания нескольких объектов Autocad? - PullRequest
0 голосов
/ 13 февраля 2020

Я изучаю ObjectArx, и, насколько мне известно, существует 3 распространенных способа создания объектов в Arx:

  • использование acdbEntMake
  • использование record.append (entity)
  • используйте комбинацию record.append и транзакции

, поэтому мои вопросы таковы: может ли кто-нибудь помочь мне, когда я должен использовать их в каждом случае? У них есть большая разница в производительности друг с другом?

Я не решаюсь использовать acdbentmake, когда число объектов велико по сравнению со следующими двумя методами, потому что я вижу очень мало примеров, в которых это упоминается.

1 Ответ

1 голос
/ 13 февраля 2020

Я не знаю, какую сущность вы создаете, но:

В большинстве случаев вам не нужно использовать 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;
}
...