天气与日历 切换到窄版

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

ObjectARX_AcDbAttributeDefinition属性定义对象

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
创建带属性的块

            // 根据用户的输入设置块表记录的名称
        TCHAR blkName[40];
        if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blkName) !=RTNORM)
                return;

        // 获得当前图形数据库的块表
        AcDbBlockTable *pBlkTbl = NULL;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
        if (NULL == pBlkTbl)
                return;

        // 创建新的块表记录
        AcDbBlockTableRecord *pBlkTblRcd = new AcDbBlockTableRecord();
        pBlkTblRcd->setName(blkName);
               
        // 将块表记录添加到块表中
        AcDbObjectId blkDefId;
        pBlkTbl->add(blkDefId, pBlkTblRcd);
        pBlkTbl->close();

        // 向块表记录中添加实体
        AcGePoint3d ptStart(-10, 0, 0), ptEnd(10, 0, 0);
        AcDbLine *pLine1 = new AcDbLine(ptStart, ptEnd); // 创建一条直线
        ptStart.set(0, -10, 0);
        ptEnd.set(0, 10, 0);
        AcDbLine *pLine2 = new AcDbLine(ptStart, ptEnd); // 创建一条直线
        AcGeVector3d vecNormal(0, 0, 1);
        AcDbCircle *pCircle = new AcDbCircle(AcGePoint3d::kOrigin,vecNormal, 6);//创建一个圆

        // 创建一个属性块
        AcDbAttributeDefinition *pAttDef = new AcDbAttributeDefinition(ptEnd, _T("默认值"),_T( "标记"), _T("提示"));
       
        AcDbObjectId entId;
        pBlkTblRcd->appendAcDbEntity(entId, pLine1);
        pBlkTblRcd->appendAcDbEntity(entId, pLine2);
        pBlkTblRcd->appendAcDbEntity(entId, pCircle);
        pBlkTblRcd->appendAcDbEntity(entId, pAttDef);
       
        // 关闭实体和块表记录
        pLine1->close();
        pLine2->close();
        pCircle->close();
        pAttDef->close();
        pBlkTblRcd->close();

(3)插入带属性图块:可以直接使用cad提供的INSERT命令

      // 获得用户输入的块定义名称
        TCHAR blkName[40];
        if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blkName) !=RTNORM)
                return;
       
        // 获得当前数据库的块表
        AcDbBlockTable *pBlkTbl = NULL;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
        if (NULL == pBlkTbl)
                return;

        // 查找用户指定的块定义是否存在
        CString strBlkDef;
        strBlkDef.Format(_T("%s"), blkName);
        if (!pBlkTbl->has(strBlkDef))
        {
                acutPrintf(_T("\n当前图形中未包含指定名称的块定义!"));
                pBlkTbl->close();
                return;
        }

        // 获得用户输入的块参照的插入点
        ads_point pt;
        if (acedGetPoint(NULL, _T("\n输入块参照的插入点:"), pt) != RTNORM)
        {
                pBlkTbl->close();
                return;
        }

        AcGePoint3d ptInsert = asPnt3d(pt);
        // 获得用户指定的块表记录
        AcDbObjectId blkDefId;
        pBlkTbl->getAt(strBlkDef, blkDefId);

        // 将块参照添加到模型空间
        AcDbBlockTableRecord *pBlkTblRcd = NULL;
        pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForWrite);
        pBlkTbl->close();
        if (NULL == pBlkTblRcd)
                return;
       
        // 创建块参照对象
        AcDbBlockReference *pBlkRef = new AcDbBlockReference(ptInsert,        blkDefId);
        AcDbObjectId entId;
        pBlkTblRcd->appendAcDbEntity(entId, pBlkRef);

        // 判断指定的块表记录是否包含属性定义
        AcDbBlockTableRecord *pBlkDefRcd = NULL;
        acdbOpenObject(pBlkDefRcd, blkDefId, AcDb::kForRead);
        if (NULL == pBlkDefRcd)
        {
                pBlkRef->close();
                pBlkTblRcd->close();
                return;
        }

        if (pBlkDefRcd->hasAttributeDefinitions())
        {
                AcDbBlockTableRecordIterator *pItr = NULL;
                pBlkDefRcd->newIterator(pItr);
                AcDbEntity *pEnt = NULL;
                AcDbAttributeDefinition *pAttDef = NULL;
                for (pItr->start(); !pItr->done(); pItr->step())
                {
                        pItr->getEntity(pEnt, AcDb::kForRead);

                        // 检查实体是否是属性定义
                        pAttDef = AcDbAttributeDefinition::cast(pEnt);
                        if (pAttDef != NULL)
                        {
                                // 创建一个新的属性对象
                                AcDbAttribute *pAtt = new AcDbAttribute();

                                // 从属性定义获得属性对象的对象特性
                                pAtt->setPropertiesFrom(pAttDef);

                                // 设置属性对象的其他特性
                                pAtt->setInvisible(pAttDef->isInvisible());

                                AcGePoint3d ptBase = pAttDef->position();
                                ptBase += pBlkRef->position().asVector();

                                pAtt->setPosition(ptBase);
                                pAtt->setHeight(pAttDef->height());
                                pAtt->setRotation(pAttDef->rotation());
                                       
                                // 获得属性对象的Tag、Prompt和TextString
                                ACHAR *pStr;
                                pStr = pAttDef->tag();
                                pAtt->setTag(pStr);
                                free(pStr);
                                pStr = pAttDef->prompt();
                                acutPrintf(_T("\n%s%s"), pStr);
                                free(pStr);
                                pAtt->setFieldLength(30);
                                pAtt->setTextString(_T("当前值"));

                                // 向块参照追加属性对象
                                pBlkRef->appendAttribute(pAtt);
                                pAtt->close();
                               
                        }
                        pEnt->close();
                }
                pAttDef->close();
                delete pItr;
        }
        // 关闭数据库的对象
        pBlkRef->close();
        pBlkTblRcd->close();
        pBlkDefRcd->close();

(4)获取参照块的属性

    ads_name ssResult;
        ads_point ssptres;
        acedEntSel(_T("选择一个块:\n"), ssResult, ssptres);

        AcDbObjectId blkRefId;
        acdbGetObjectId(blkRefId, ssResult);

        AcDbBlockReference *pRef = NULL;
        Acad::ErrorStatus es = acdbOpenObject(pRef, blkRefId, AcDb::kForWrite);  
        if (NULL == pRef || es != eOk)
                return ;
       
        AcDbObjectId  blkrecId = pRef->blockTableRecord();
        pRef->close();

        AcDbBlockTableRecord *pBlkDefRcd = NULL;
        es=acdbOpenObject(pBlkDefRcd, blkrecId , AcDb::kForRead);
        if (NULL == pBlkDefRcd || es != eOk)
                return ;

        if (pBlkDefRcd->hasAttributeDefinitions())  //是否有属性
        {
                //当前值
                AcDbObjectIterator* pItr = pRef->attributeIterator();
                for(pItr->start(); !pItr->done(); pItr->step())
                {
                        AcDbObjectId attid = pItr->objectId();
                        AcDbAttribute* pAttr = NULL;
                        pRef->openAttribute(pAttr, attid, AcDb::kForRead);

                        ACHAR* text = pAttr->textString();
                        acutPrintf(_T("当前值:%s\n"), text);
                        pAttr->close();
                        free(text);
                }
                delete pItr;

                //属性
                AcDbBlockTableRecordIterator *pTItr = NULL;
                pBlkDefRcd->newIterator(pTItr);
                AcDbEntity* pEnt = NULL;
                for(pTItr->start(); !pTItr->done(); pTItr->step())
                {
                        pTItr->getEntity(pEnt, AcDb::kForRead);
                        AcDbAttributeDefinition* pAttDef = AcDbAttributeDefinition::cast(pEnt);
                        if(pAttDef != NULL)
                        {
                                ACHAR * strTemp;
                                strTemp = pAttDef->tag();
                                acutPrintf(_T("标记:%s\n"), strTemp);
                                free(strTemp);
                                strTemp = pAttDef->prompt();
                                acutPrintf(_T("提示:%s\n"), strTemp);
                                free(strTemp);
                                strTemp=pAttDef->textString();                       
                                acutPrintf(_T("值:%s\n"), strTemp);
                                free(strTemp);

                                pAttDef->close();
                        }
                        pEnt->close();
                }
                delete pTItr;
        }
        pBlkDefRcd->close();




 

 

 

 

ObjectARX_AcDbAttributeDefinition属性定义对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 12:26 , Processed in 0.155505 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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