static int ads_EntPreviousFrom(void)
{
struct resbuf *rb = acedGetArgs();
if (!rb) return RSERR;
AcDbObjectId objId;
ads_name objName;
AcDbObjectId objIdFirst;
if (rb && rb->restype != RTENAME) { acutPrintf(_T("\nError: function requires an ENAME argument. \n")); return RSERR; }
if (acdbGetObjectId(objId, rb->resval.rlname) != Acad::eOk) return RSERR;
AcDbObjectPointer<AcDbEntity> pObj(objId, AcDb::kForRead);
if (pObj.openStatus() != Acad::eOk) return RSERR;
GetObjectIdFirstEntityOnCurrentSpace(objIdFirst);
if (objIdFirst == objId && acdbGetAdsName(objName, objIdFirst) == Acad::eOk)
{
acedRetName(objName, RTENAME);
}
else
{
if (pObj->isKindOf(AcDb2dVertex::desc()))
{
AcDbObjectPointer<AcDb2dPolyline> pPline(pObj->ownerId(), AcDb::kForRead);
if (pPline.openStatus() == Acad::eOk)
{
AcDbObjectIterator* pVertIterator = pPline->vertexIterator();
pVertIterator->start();
pVertIterator->setPosition(pObj->objectId());
pVertIterator->step(true);
AcDbObjectPointer<AcDb2dVertex> pVertex(pVertIterator->objectId(), AcDb::kForRead);
if (pVertex.openStatus() == Acad::eOk && acdbGetAdsName(objName, pVertex->objectId()) == Acad::eOk)
{
acedRetName(objName, RTENAME);
}
else if (acdbGetAdsName(objName, pPline->objectId()) == Acad::eOk)
{
acedRetName(objName, RTENAME);
}
delete pVertIterator;
}
}
else if (pObj->isKindOf(AcDbAttribute::desc()))
{
AcDbObjectPointer<AcDbBlockReference> pBlockReference(pObj->ownerId(), AcDb::kForRead);
if (pBlockReference.openStatus() == Acad::eOk)
{
AcDbObjectIterator* pAttributeIterator = pBlockReference->attributeIterator();
pAttributeIterator->start(true);
pAttributeIterator->setPosition(pObj->objectId());
pAttributeIterator->step(true);
AcDbObjectPointer<AcDbAttribute> pAttribute(pAttributeIterator->objectId(), AcDb::kForRead);
if (pAttribute.openStatus() == Acad::eOk && acdbGetAdsName(objName, pAttribute->objectId()) == Acad::eOk)
{
acedRetName(objName, RTENAME);
}
else if (acdbGetAdsName(objName, pBlockReference->objectId()) == Acad::eOk)
{
acedRetName(objName, RTENAME);
}
delete pAttributeIterator;
}
}
else
{
AcDbObjectId id;
GetPreviousEntityObjectId(pObj, id);
if (id.isValid())
{
GetPreviousEname(objIdFirst, id, rb, objName);
if (id.isValid())
{
acedRetName(objName, RTENAME);
}
}
else // use the optional argument if any
{
GetPreviousEname(objIdFirst, id, rb, objName);
if (id.isValid())
{
acedRetName(objName, RTENAME);
}
else
{
// is part of a nest object?
// use the method with the optional argument:
// usage:
// (setq data (nentsel))
// (setq e (EntPreviousFrom (car data) (car (last data))))
}
}
}
}
return (RSRSLT);
}