ARX动态块自定义属性获取和修改

在ARX中对于动态块的一些操作的接口是AcDbDynBlockReference类。这个类可以获取动态块的自定义属性名和属性值,判断当前块参照是否是动态块,并设置指定属性的值修改动态块。

构造对象

AcDbDynBlockReference类有两种构造函数:

    AcDbDynBlockReference(ZcDbObjectId blockRefId);
    AcDbDynBlockReference(ZcDbBlockReference* pRef);

第一个直接传入块参照的id即可创建AcDbDynBlockReference对象,便可对该块参照进行数据获取和修改。
第二个传入的是块参照的指针,如果该指针是以读打开的,该AcDbDynBlockReference对象只能进行数据读取,不能修改该块参照。

isDynamicBlock

该函数判断块参照是否是动态块。

块表记录指针

AcDbDynBlockReference对象可以得到该块参照的块表记录id(块定义Id),动态块的块定义与普通块不同,它拥有多个块定义,当你通过修改动态块的自定义属性参数,该块参照会自动创建一个新的匿名块定义。而最原始的块定义是不能修改该块参照的自定义属性。
dynamicBlockTableRecord函数得到块参照最原始的块定义id,也就是你最初创建的块定义。
anonymousBlockTableRecord函数得到当前块参照的块定义id。

得到动态块参照的自定义属性
std::map<CString, CString>  GetCustomParam(const AcDbObjectId& idBlkRef)
{
	std::map<CString, CString> mapName;
	
	AcDbDynBlockReferencePropertyArray DynBlkRefPropArray;	//动态块参照属性数组
	AcDbDynBlockReference DynBlkRef(idBlkRef);			//动态块参照对象
	DynBlkRef.getBlockProperties(DynBlkRefPropArray);
	AcDbDynBlockReferenceProperty DynBlockReferenceProp;	//动态块参照属性
	
	for (int i = 0; i < DynBlkRefPropArray.length(); i++)
	{
		DynBlockReferenceProp = DynBlkRefPropArray.at(i);

		bool bShow = DynBlockReferenceProp.show();			//是否在面板中显示
		auto type = DynBlockReferenceProp.propertyType();	//属性类型
		CString strName = DynBlockReferenceProp.propertyName().kwszPtr();	//属性名
		if (true == bShow)
		{
			
			CString strValue;
			AcDbEvalVariant value = DynBlockReferenceProp.value();//值
			if (DwgDataType::kDwgText == type)
			{
				strValue = value.resval.rstring;
			}
			else if (DwgDataType::kDwgReal == type)
			{
				strValue.Format(_T("%.2f"), value.resval.rreal);
			}
			mapName[strName] = strValue;
		}
	}
	return mapName;
}

其中,AcDbDynBlockReferenceProperty::value函数只能得到该属性当前设置的值。
对于在这里插入图片描述这种情况,可以使用AcDbDynBlockReferenceProperty::getAllowedValues函数。

设置块参照的自定义属性
bool SetCustomParam(const AcDbObjectId& idBlkRef,const std::map<CString, CString>& mapParam)
{
	AcDbDynBlockReferencePropertyArray DynBlkRefPropArray;	//动态块参照属性数组
	AcDbDynBlockReference DynBlkRef(idBlkRef);			//动态块参照对象
	DynBlkRef.getBlockProperties(DynBlkRefPropArray);
	AcDbDynBlockReferenceProperty DynBlockReferenceProp;	//动态块参照属性

	std::map<CString, CString>::const_iterator iter;
	for (iter = mapParam.begin(); iter != mapParam.end(); ++iter)
	{
		CString strKey = iter->first;
		CString strValue = iter->second;
		for (int i = 0; i < DynBlkRefPropArray.length(); i++)
		{
			DynBlockReferenceProp = DynBlkRefPropArray.at(i);

			bool bShow = DynBlockReferenceProp.show();			//是否在面板中显示
			if (false == bShow && DynBlockReferenceProp.readOnly() == true)
				continue;
			CString strName = DynBlockReferenceProp.propertyName().kwszPtr();	//属性名
			if (strName != strKey)
				continue;
			auto type = DynBlockReferenceProp.propertyType();	//属性类型
			if (DwgDataType::kDwgText == type)
			{
				AcDbEvalVariant value(strValue);
				DynBlockReferenceProp.setValue(value);
			}
			else if (DwgDataType::kDwgReal == type)
			{
				AcDbEvalVariant value(_wtof(strValue));
				DynBlockReferenceProp.setValue(value);
			}
		}
	}

	return true;
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值