Hi Marco,
Tried your latest function and works.
Can you test the latest entPreviousFrom function? and also maybe do a benchmark?
Have not added the part for selection of nested objects inside of blocks.
Here it is the updated function - source code:
static int ads_entpreviousFrom(void)
{
struct resbuf *rb = acedGetArgs();
if (!rb)
{
acutPrintf(_T("\nError: function requires an ENAME argument. \n"));
return RSERR;
}
AcDbObjectId objId;
ads_name objName;
if (rb && (rb->restype == RTENAME))
{
if (acdbGetObjectId(objId, rb->resval.rlname) == Acad::eOk)
{
AcDbObjectPointer<AcDbEntity> pObj(objId, AcDb::kForRead);
if (pObj.openStatus() == Acad::eOk)
{
if (pObj->isKindOf(AcDb2dVertex::desc()))
{
AcDbObjectPointer<AcDb2dPolyline> pPline(pObj->ownerId(), AcDb::kForRead);
if (pPline.openStatus() == Acad::eOk)
{
AcDbObjectIterator* pVertIterator = pPline->vertexIterator();
pVertIterator->setPosition(pObj);
pVertIterator->start(true);
pVertIterator->step(true);
AcDbObjectPointer<AcDb2dVertex> pVertex(pVertIterator->objectId(), AcDb::kForRead);
if (pVertex.openStatus() == Acad::eOk)
{
if (acdbGetAdsName(objName, objId) == Acad::eOk)
{
acedRetName(objName, RTENAME); // return the previous entity
}
}
delete pVertIterator;
}
}
else
{
AcDbBlockTableRecordPointer pBTR(acdbCurDwg()->currentSpaceId(), AcDb::kForRead); //pObj->ownerId()
if (pBTR.openStatus() == Acad::eOk)
{
AcDbBlockTableRecordIterator* pIterator = NULL;
if (pBTR->newIterator(pIterator) == Acad::eOk)
{
AcDbEntity* pEnt = NULL;
if (pIterator->seek(pObj) == Acad::eOk) // if found from ename
{
pIterator->step(false, true); // step back
AcDbObjectId objId;
pIterator->getEntityId(objId);
AcDbObjectPointer<AcDbEntity> pEnt(objId, AcDb::kForRead);
if (pEnt.openStatus() == Acad::eOk)
{
if (acdbGetAdsName(objName, objId) == Acad::eOk)
{
acedRetName(objName, RTENAME); // return the previous entity
}
}
}
delete pIterator;
}
}
}
}
}
}
return (RSRSLT);
}
Thanks.