Reputation: 1471
I am learning about ObjectArx and as far as I know there are 3 common ways to create objects in Arx:
so, my questions is: can someone help me when I should use them in each case? Do they have a big difference in performance with each other?
I am hesitant to use acdbentmake when the number of objects is large compared to the following two methods because I see very few examples that mention it.
Upvotes: 0
Views: 544
Reputation: 1697
I don't know what kind of entity You are creating but:
You don't need to use acdbEntMake
in most cases. I'm using ObjectARX since about 8 years and never used it ;)
Transaction is used in .Net version of ObjectARX but You tagged visual-c++ so I suppose it's not this case.
If You warring about drawing large number of entities just test it. draw in the way You know and measure needed time. As long as You and Your clients accept drawing time, the way You are using is OK. In the future You always can refactor the code to get better performance if necessary.
To create for example line You may use this sample:
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;
}
Upvotes: 1