天气与日历 切换到窄版

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

arx 动态块

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

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

 

 

 

 

arx  动态块
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-10-15 18:56:45 | 显示全部楼层
    1. static void FpmSimpleLine_DDynBlockTest(void)
    2.     {
    3.         ads_name en; ads_point p;
    4.         AcTransaction* pTrans = actrTransactionManager->startTransaction();

    5.         if (acedEntSel(_T("\nPick dynamic block: "),en,p) == RTNORM)
    6.         {
    7.             AcDbObjectId eId;

    8.             AcDbBlockReference *pBlkRef;//
    9.             acdbGetObjectId(eId,en);
    10.             

    11.             if (pTrans->getObject( (AcDbObject*&)pBlkRef,eId,AcDb::kForWrite) == Acad::eOk)
    12.             {

    13.                 AcDbObjectId idBlkTblRec = pBlkRef->blockTableRecord();
    14.                 if (AcDbDynBlockReference::isDynamicBlock(idBlkTblRec))
    15.                 {
    16.                     acutPrintf(L"Dynamic block!\n");
    17.                     AcDbDynBlockReference dynBlk(eId);
    18.                     AcDbDynBlockReferencePropertyArray aProps;
    19.                     dynBlk.getBlockProperties(aProps);
    20.                     if (aProps.length() > 0)
    21.                     {
    22.                         acutPrintf(L"There are some properties!\n");
    23.                         AcDbDynBlockReferenceProperty prop;
    24.                         AcDbEvalVariant Var;
    25.                         int i;
    26.                         for (i=0; i < aProps.length(); i++)
    27.                         {
    28.                             prop = aProps[i];
    29.                             Var = prop.value();
    30.                             acutPrintf(L"Property %d name: %s, value: %lg, readonly:%s\n",i+1,prop.propertyName().kTCharPtr(),Var.resval.rreal,prop.readOnly()?L"TRUE":L"FALSE");
    31.                         }
    32.                         
    33.                         prop=aProps[0];
    34.                         if(prop.setValue(500.0)!=Acad::eOk)
    35.                             acutPrintf(_T("\nError setting property: %s"),acadErrorStatusText(prop.setValue(500.0)));
    36.                         
    37.                     }
    38.                 }
    39.                 else
    40.                 {
    41.                     acutPrintf(_T("\nSelected block is not dynamic!"));
    42.                 }
    43.                 pBlkRef->close();
    44.             }
    45.             else
    46.             {
    47.                 acutPrintf(_T("\nError: %s"),pTrans->getObject( (AcDbObject*&)pBlkRef,eId,AcDb::kForWrite));

    48.             }
    49.         }
    50.          
    51.         actrTransactionManager->endTransaction();
    52.     }


    53. //changeBlockDynValue(eId, _T("Расстояние1"), 250.6f);
    54. Acad::ErrorStatus changeBlockDynValue(AcDbObjectId dynblockId, ACHAR* propertyName, double propertyValue)
    55. {
    56.         AcDbObjectPointer<AcDbBlockReference> pBR(dynblockId, AcDb::kForRead);
    57.         Acad::ErrorStatus es = pBR.openStatus();
    58.         if (es == Acad::eWrongObjectType) { return es; }
    59.         if (es != Acad::eOk) { return es; }

    60.         AcDbDynBlockReference* pDynBlkRef = new AcDbDynBlockReference(dynblockId);
    61.         pBR->close();
    62.         if (!pDynBlkRef || !pDynBlkRef->isDynamicBlock()) { es = Acad::eInvalidContext; delete pDynBlkRef; return es; }

    63.         AcDbDynBlockReferencePropertyArray blkPropAry;  pDynBlkRef->getBlockProperties(blkPropAry);
    64.         AcDbDynBlockReferenceProperty blkProp;
    65.         bool isFindPropName = false;
    66.         for (long i = 0; i < blkPropAry.length(); i++)
    67.         {
    68.                 blkProp = blkPropAry[i];
    69.                 if (_tcsicmp(blkProp.propertyName().kACharPtr(), propertyName) != 0) continue;
    70.                 isFindPropName = true;
    71.                 if (blkProp.readOnly()) { es = Acad::eIsWriteProtected; continue; }
    72.                 if ((es = blkProp.setValue(propertyValue)) != Acad::eOk)
    73.                 {
    74.                         continue;
    75.                 }
    76.         }
    77.         delete pDynBlkRef;
    78.         if (!isFindPropName)
    79.                 es = Acad::eInvalidContext;

    80.         return es;
    81. }

    82. static void ChangeDynValue(void)
    83. {
    84.         // Add your code for command TestDynBlk.ChangeDynValue here
    85.         ads_name en; ads_point p;
    86.         if (acedEntSel(_T("\nУкажите динамический блок: "), en, p) != RTNORM) return;
    87.         AcDbObjectId idBR; acdbGetObjectId(idBR, en);
    88.         AcDbObjectPointer<AcDbBlockReference> pBR(idBR, AcDb::kForRead);
    89.         Acad::ErrorStatus es = pBR.openStatus();
    90.         if (es == Acad::eWrongObjectType) { acutPrintf(_T("\nЭто не блок!")); return; }
    91.         if (es != Acad::eOk) { acutPrintf(_T("\nНе могу открыть блок!")); return; }

    92.         AcDbDynBlockReference* pDynBlkRef = new AcDbDynBlockReference(idBR);
    93.         pBR->close();
    94.         if (!pDynBlkRef || !pDynBlkRef->isDynamicBlock()) {
    95.                 acutPrintf(_T("\nЭто не динамический блок!"));
    96.                 delete pDynBlkRef;
    97.                 return;
    98.         }

    99.         ACHAR propName[512] = _T("");
    100.         if (acedGetString(TRUE, _T("\nУкажите имя динамического свойства (тип - действительное число): "), propName) != RTNORM) return;
    101.         double propValue = 0;
    102.         if (acedGetReal(_T("\nУкажите значение динамического свойства - действительное число: "), &propValue) != RTNORM) return;

    103.         AcDbDynBlockReferencePropertyArray blkPropAry;  pDynBlkRef->getBlockProperties(blkPropAry);
    104.         AcDbDynBlockReferenceProperty blkProp;
    105.         bool isFindPropName = false;
    106.         for (long i = 0; i < blkPropAry.length(); i++) {
    107.                 blkProp = blkPropAry[i];
    108.                 if (wcsicmp(blkProp.propertyName().kACharPtr(), propName) != 0) continue;
    109.                 isFindPropName = true;
    110.                 if (blkProp.readOnly()) {
    111.                         acutPrintf(_T("\nСвойство <%s> только для чтения!"), propName); continue;
    112.                 }
    113.                 if ((es = blkProp.setValue(propValue)) != Acad::eOk) {
    114.                         acutPrintf(_T("\nНельзя установить свойству <%s> значение %g! Ошибка: %s"),
    115.                                 propName, propValue, acadErrorStatusText(es));
    116.                         continue;
    117.                 }
    118.         }
    119.         delete pDynBlkRef;
    120.         if (!isFindPropName) {
    121.                 acutPrintf(_T("\nСвойство <%s> не найдено!"), propName);
    122.         }
    123. }
    复制代码

     

     

     

     

    arx  动态块
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-10-15 19:46:03 | 显示全部楼层
    1. ACHAR blockName[255], blockPath[255]; // заполнить данными
    2. double scale = 0.5; // масштабный коэфициент
    3. AcDbObjectId newBlockTableId = importBlockToCurDWGDat abase(blockName,blockPath);
    4. if (newBlockTableId.isNull())
    5. {
    6.     acedAlert(_T("Данный блок не найден"));
    7.     return;
    8. }
    9. AcGePoint3d insPnt;            
    10. acedCommand (RTSTR, _T("_ucs"),RTSTR,_T("_v"),0);
    11. if(acedGetPoint(NULL,_T("\nТочка вставки: "),asDblArray (insPnt))!=RTNORM)
    12. {
    13.     acedCommand(RTSTR,_T("_ucs"),RTSTR,_T("_p"),0);
    14.     return;
    15. }

    16. AcDbBlockReference *blockReference = new AcDbBlockReference(insPnt,newBlockTableId);
    17. blockReference->setRotation(0.0);
    18. blockReference->setNormal (AcGeVector3d (0.0, 0.0, 1.0)) ;
    19. blockReference->setScaleFactors(AcGeScale3d(scale));
    20. AcGeMatrix3d matUcs;
    21. acedGetCurrentUCS(matUcs);
    22. blockReference->transformBy(matUcs);
    23. postToDb(blockReference); // запись в БД


    24. AcDbObjectId importBlockToCurDWGDat abase(const ACHAR *pBlockName, const ACHAR *pFileName)
    25. {
    26.     Acad::ErrorStatus es=Acad::eOk;
    27.     AcDbObjectId idImported; // ID нашего нового блока
    28.     AcDbDatabase* pWorkDatabase = acdbHostApplicationServices()->workingDat abase();
    29.     AcAxDocLock docLock(pWorkDatabase);
    30.     AcDbDatabase* pBlockDatabase = new AcDbDat abase(false,true);
    31.     es = pBlockDatabase->readDwgFile(pFileName);
    32.     if(es!=Acad::eOk){delete pBlockDatabase;return NULL;}
    33.             
    34.     try
    35.     {
    36.         AcDbBlockTable* pBlockTable;
    37.         es=pBlockDatabase->getSymbolTable(pBlockTable,AcDb::kForRead);
    38.         if(es!=Acad::eOk){delete pBlockDatabase;return NULL;} // нет символьной таблицы (блоков вооообще)
    39.                
    40.         AcDbObjectId idInsRecord;      
    41.         es=pBlockTable->getAt(pBlockName,idInsRecord);
    42.         pBlockTable->close();
    43.         if(es!=Acad::eOk){delete pBlockDatabase;return NULL;} // нет такого блока
    44.            
    45.         AcDbDatabase* pTempDB;
    46.         es=pBlockDatabase->wblock(pTempDB,idInsRecord);
    47.         if(es!=Acad::eOk){delete pBlockDatabase;return NULL;} // не скопировался блок в пустую базу
    48.                
    49.         es=pWorkDatabase->insert(idImported,pBlockName,pTempDB);
    50.         delete pTempDB;
    51.         if(es!=Acad::eOk){delete pBlockDatabase;return NULL;} // не вставилась пустая база с блоком в нашу текущую базу
    52.     }catch(...){delete pBlockDatabase;return NULL;}

    53.     delete pBlockDatabase;
    54.     return idImported;
    55. }
    复制代码

     

     

     

     

    arx  动态块
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

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

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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