运用扩展实体构建链表
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;
}
//但是不同的实体可能有相同的一个句柄
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;
}
相关文章推荐
- Linux下运行fork()
- Js给表格每行动态添加input标签
- 【jzoj4603】【颜料大乱斗】【线段树】
- FileHelper(文件工具类)
- mysqldump导出数据
- [置顶] Android 库存加减
- HDU 5775 Bubble Sort
- 关于Spring采用@value环境变量取值null或者‘’问题
- 大型网站架构设计及技术总结
- PID控制算法的C语言实现一 PID算法原理
- 【POJ】1985 - Cow Marathon(树的直径)
- iOS 内存管理
- 【转】C#环形队列
- 欧拉函数总结
- Js高级笔记
- Java编程实战宝典学习笔记——第一章Java的开发运行环境
- java动态代理
- 获取APP的版本信息或者UUID
- Spring Boot实战之导出excel,并上传存入Azure Storage
- 关于Android studio中代码覆盖率