• 动态块


    在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;
    }
  • 相关阅读:
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-2019-结构体&文件
    C博客作业05--2019-指针
    C语言博客作业04--数组
    c语言博客作业03--函数
    C语言博客作业02--循环结构
    深入理解Java线程池原理
    Offer快到碗里来——聊聊线程池
  • 原文地址:https://www.cnblogs.com/xzh1993/p/14084903.html
Copyright © 2020-2023  润新知