天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 70|回复: 0

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]在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;
}
[/code]

 

 

 

 

ARX动态块自定义属性获取和修改
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:23 , Processed in 0.137478 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表