运用扩展实体构建链表

这篇博客介绍了如何在AutoCAD中通过句柄转换来管理链表。首先,通过`AdsNameToHandler`函数将对象ID转换为句柄,然后使用`HandleToObject`将句柄转换回AcDbObject对象。为了将句柄存储到链表,将其转换为CString类型。此外,还展示了如何创建链表、显示链表节点数量和从选择集中获取对象的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//由于句柄在应用程序中可以唯一标示一个实体,因为它是由数据库决定的,不会由于实体的变动而导致变化。对象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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值