ObjectARX_命名对象字典

为了使用方便,再此封装了,图形数据库字典项

//绑定命名字典值
bool SetDictdata(const CString& strDictName,const CString strRecord,CString& strDictVal);
//获取命名字典的值
bool GetDictdata(const CString& strDictName,const CString strRecord, CString& strDictVal);
bool CQKQuery::SetDictdata(  const CString& strDictName,const CString strRecord,CString& strDictVal )
{
	// 获得有名对象字典,向其中添加指定的字典项
	AcDbDictionary *pNameObjDict = NULL;
	Acad::ErrorStatus es = m_pDb->getNamedObjectsDictionary(pNameObjDict,AcDb::kForWrite);
	if (Acad::eOk != es || NULL == pNameObjDict)
		return false;

	// 检查所要添加的字典项是否已经存在
	AcDbDictionary *pDict = NULL;
	es = pNameObjDict->getAt(strDictName, (AcDbObject*&)pDict,AcDb::kForWrite);
	if (es == Acad::eKeyNotFound || NULL == pDict)//没有字典项,新建一个
	{
		pDict = new AcDbDictionary;
		AcDbObjectId dictObjId;
		es = pNameObjDict->setAt(strDictName, pDict, dictObjId);
		if (Acad::eOk != es)
		{
			delete pDict;
			pDict = NULL;
			pNameObjDict->close();
			return false;
		}

		AcDbXrecord *pXrec = new AcDbXrecord;
		// 设置扩展记录的内容
		struct resbuf *pRb = NULL;
		pRb = acutBuildList(AcDb::kDxfText, strDictVal,RTNONE);
		if (NULL == pRb)
		{
			delete pXrec;
			pXrec = NULL;
			pDict->close();
			pNameObjDict->close();
			return false;
		}
		pXrec->setFromRbChain(*pRb);
		acutRelRb(pRb);

		AcDbObjectId xrecObjId;
		es = pDict->setAt(strRecord, pXrec, xrecObjId);
		if (Acad::eOk != es)
		{
			delete pXrec;
			pXrec = NULL;
			pDict->close();
			pNameObjDict->close();
			return false;
		}

		pXrec->close();
		pDict->close();
		pNameObjDict->close();
	}
	else//已经存在字典项
	{
		//获得扩展数据
		AcDbXrecord* pXrec = NULL;
		es = pDict->getAt(strRecord, (AcDbObject*&)pXrec, AcDb::kForWrite);
		if (es == Acad::eKeyNotFound || NULL == pXrec)//没有扩展数据
		{
			AcDbXrecord *pXrec = new AcDbXrecord;
			// 设置扩展记录的内容
			struct resbuf *pRb = NULL;
			pRb = acutBuildList(AcDb::kDxfText, strDictVal,RTNONE);
			if (NULL == pRb)
			{
				delete pXrec;
				pXrec = NULL;
				pDict->close();
				pNameObjDict->close();
				return false;
			}
			pXrec->setFromRbChain(*pRb);
			acutRelRb(pRb);

			AcDbObjectId xrecObjId;
			es = pDict->setAt(strRecord, pXrec, xrecObjId);
			if (Acad::eOk != es)
			{
				delete pXrec;
				pXrec = NULL;
				pDict->close();
				pNameObjDict->close();
				return false;
			}

			pXrec->close();
			pDict->close();
			pNameObjDict->close();
		}
		else//有扩展数据
		{
			// 设置扩展记录的内容
			struct resbuf *pRb = NULL;
			pRb = acutBuildList(AcDb::kDxfText, strDictVal,RTNONE);
			if (NULL == pRb)
			{
				pXrec->close();
				pDict->close();
				pNameObjDict->close();
				return false;
			}
			pXrec->setFromRbChain(*pRb);
			acutRelRb(pRb);

			pXrec->close();
			pDict->close();
			pNameObjDict->close();
		}
	}

	return true;
}

bool CQKQuery::GetDictdata( const CString& strDictName,const CString strRecord, CString& strDictVal )
{
	// 获得有名对象字典,向其中添加指定的字典项
	AcDbDictionary *pNameObjDict = NULL;
	AcDbDictionary *pDict = NULL;
	Acad::ErrorStatus es = m_pDb->getNamedObjectsDictionary(pNameObjDict,AcDb::kForRead);
	if (es != Acad::eOk || NULL == pNameObjDict)
		return false;	

	// 检查所要添加的字典项是否已经存在
	AcDbObjectId dictObjId;
	es = pNameObjDict->getAt(strDictName,  (AcDbObject*&)pDict, AcDb::kForRead);
	if (es == Acad::eKeyNotFound || NULL == pDict)
	{
		pNameObjDict->close();
		return false;
	}

	// 获得指定的对象字典
	AcDbXrecord *pXrec = NULL;
	es = pDict->getAt(strRecord, (AcDbObject*&)pXrec, AcDb::kForRead);
	if (es != Acad::eOk || NULL == pXrec)
	{
		pDict->close();
		pNameObjDict->close();
		return false;
	}

	// 获得扩展记录的数据链表并关闭扩展数据对象
	struct resbuf *pRb = NULL;
	es = pXrec->rbChain(&pRb);
	if (es != Acad::eOk || NULL == pRb)
	{
		pXrec->close();
		pDict->close();
		pNameObjDict->close();
		return false;
	}

	strDictVal = pRb->resval.rstring;

	acutRelRb(pRb);
	pXrec->close();
	pDict->close();
	pNameObjDict->close();

	return true;
}

具体用法:

SetDictdata(_T("FLAG"),_T("XRecord"),strId);
GetDictdata(_T("FLAG"),_T("XRecord"),strId);

 

转载于:https://my.oschina.net/u/2930533/blog/1576826

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值