您的位置:首页 > 其它

运用扩展实体构建链表

2016-08-02 09:22 411 查看
//由于句柄在应用程序中可以唯一标示一个实体,因为它是由数据库决定的,不会由于实体的变动而导致变化。对象ID可能由于多次重复打开而改变。
//但是不同的实体可能有相同的一个句柄
AcDbHandle AdsNameToHandler(ads_nameen)
{
         AcDbObject*pObj;
         AcDbObjectIdpObjId;
         acdbGetObjectId(pObjId,en);
         acdbOpenAcDbObject(pObj,pObjId, AcDb::kForRead);
         AcDbHandlepHanndler;
         pObj->getZcDbHandle(pHanndler);
         returnpHanndler;
}
//Handle转换成AcDbObject对象
AcDbObject* HandleToObject(AcDbHandle pHandle)

{
AcDbObjectId pObjId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->getZcDbObjectId(pObjId, true, pHandle);
if (es != Acad::eOk)
{
return NULL;
}
AcDbObject* mObj;
acdbOpenAcDbObject(mObj, pObjId, AcDb::kForRead);
return mObj;

}

//由于句柄无法直接存入链表中,所以需要将句柄转换成CString类型。
CString HandleToCString(AcDbHandle pHandle)
{
        
         TCHAR*buf = new TCHAR[20];
         pHandle.getIntoAsciiBuffer(buf);
         CStringpChandle(buf);
         returnpChandle;
}
//取出链表,并显示节点个数
void Show_List(AcDbXrecord* pXr)
{
TCHAR* buf = new TCHAR[20];
resbuf* pHead;
pXr->rbChain(&pHead);
resbuf* pNode = pHead;
for (; pNode != NULL; pNode = pNode->rbnext)
{
CString cstr = pNode->resval.rstring;
AcDbHandle pHandle(cstr);
AcDbObject* mObj = HandleToObject(pHandle);
if (mObj == NULL)
{
acutPrintf(_T("NULL"));
}
else
{
ZcRxClass* pClassName = mObj->isA();
acutPrintf(pClassName->name());
}
}

}
 //创建链表
AcDbXrecord* Create_List()
{
         //获取选择集
         ads_namessen;
         intem = acedSSGet(NULL, NULL, NULL, NULL, ssen);
         //遍历选择集然后将其放入xrecord链表中
         if(em != RTNORM)
         {
                   returnNULL;
         }
         ads_nameen;
         longlength;
         acedSSLength(ssen,&length);
         AcDbXrecord*pXr = new AcDbXrecord;
         acedSSName(ssen,0, en);
         AcDbHandlepHandle = AdsNameToHandler(en);
         CStringpChandle = HandleToCString(pHandle);
         if(pChandle.IsEmpty() == true)
                   returnNULL;
         resbuf*pBuf = acutBuildList(AcDb::kDxfXdAsciiString, pChandle, 0);
         resbuf*pHead = pBuf;
         resbuf*pBufNext;
         for(int i = 1; i < length; i++)
         {
                   acedSSName(ssen,i, en);
                   AcDbHandlepHandle = AdsNameToHandler(en);
                   CStringpChandle = HandleToCString(pHandle);
                   if(pChandle.IsEmpty() == true)
                            returnNULL;
                   resbuf*pBufNext = acutBuildList(AcDb::kDxfXdAsciiString, pChandle, 0);
                   pBuf->rbnext= pBufNext;
                   pBuf= pBufNext;
         }
         pBuf->rbnext= NULL;
         pXr->setFromRbChain(*pHead);
         acutRelRb(pHead);
         returnpXr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: