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

作者: admin 分类: C++,CAD,ObjectARX 发布时间: 2020-08-05 20:19

转自:https://blog.csdn.net/phd17621680432/article/details/90697089

在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函数只能得到该属性当前设置的值。

20190530144425152.png


对于这种情况,可以使用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;
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云