天气与日历 切换到窄版

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

ObjectARX插入属性块简单例子

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]//插入属性块简单例子2020-10-11 by www.cnblogs.com/edata
        //指定块名
        CString blkName=_T("123");
        //指定块插入点
        AcGePoint3d insertPoint(100,100,0);
        //ARX智能指针打开块表
        AcDbBlockTablePointer pBlkTbl(curDoc()->database(),AcDb::kForRead);
        if (Acad::eOk != pBlkTbl.openStatus())
        {
            acutPrintf(_T("\n打开块表失败,错误码= %s"),acadErrorStatusText(pBlkTbl.openStatus()));
            return;
        }
        //判断是否有块定义
        if (!pBlkTbl->has(blkName))
        {
            acutPrintf(_T("\n块定义名< %s >不存在!"),blkName);
            return;
        }
        //获取块定义objectId
        AcDbObjectId blkId;
        pBlkTbl->getAt(blkName,blkId);
        if (blkId.isNull())
        {
            acutPrintf(_T("\n获取块定义ID失败!"));
            return;
        }
        //ARX智能指针创建块参照
        AcDbObjectPointer<AcDbBlockReference> pBlkRef;
        if (Acad::eOk != pBlkRef.create())
        {
            acutPrintf(_T("\n块参照创建失败,可能内存已满!"));
            return;
        }        
        pBlkRef->setDatabaseDefaults();
        pBlkRef->setPosition(insertPoint);
        pBlkRef->setBlockTableRecord(blkId);
        //ARX智能指针打开当前空间的块表记录
        AcDbBlockTableRecordPointer pBlkRcd(curDoc()->database()->currentSpaceId(),AcDb::kForWrite);
        if(Acad::eOk != pBlkRcd.openStatus())
        {
            acutPrintf(_T("\n打开当前空间的块表记录失败,错误码= %s"),acadErrorStatusText(pBlkRcd.openStatus()));
            return;
        }
        //添加块参照到数据库
        pBlkRcd->appendAcDbEntity(pBlkRef);
        //缩放旋转块
        AcGeMatrix3d mat;        
        mat.setToScaling(3,insertPoint);        
        pBlkRef->transformBy(mat);
        mat.setToRotation(3.1415*0.25,AcGeVector3d::kZAxis,insertPoint);
        pBlkRef->transformBy(mat);

        //ARX智能指针打开块定义块表记录
        AcDbBlockTableRecordPointer pBlkDef(blkId,AcDb::kForRead);
        if (Acad::eOk != pBlkDef.openStatus())
        {
            acutPrintf(_T("\n打开块定义块表记录失败,错误码= %s"),acadErrorStatusText(pBlkDef.openStatus()));
            return;
        }
        //判断块定义是否包含属性定义
        if (pBlkDef->hasAttributeDefinitions())
        {
            //获取迭代器
            AcDbBlockTableRecordIterator *pItr=NULL;
            pBlkDef->newIterator(pItr);
            if (pItr==NULL)
            {
                acutPrintf(_T("\n获取迭代器失败!"));
                return;
            }
            //获取块参照的Transform变换矩阵
            AcGeMatrix3d blkXform=pBlkRef->blockTransform();        
            AcDbObjectId entId;
            for (pItr->start(); !pItr->done(); pItr->step())
            {
                pItr->getEntityId(entId);
                if (entId.isNull())
                {
                    continue;
                }
                //ARX智能指针打开属性定义AcDbAttributeDefinition
                AcDbObjectPointer<AcDbAttributeDefinition> pAttDef(entId,AcDb::kForRead);
                if (Acad::eOk != pAttDef.openStatus())
                {
                    continue;
                }
                //ARX智能指针创建一个属性参照AcDbAttribute
                AcDbObjectPointer<AcDbAttribute> pAtt;
                if (Acad::eOk != pAtt.create())
                {
                    continue;
                }   
                //设置从块中获取属性定义相关数据
                pAtt->setAttributeFromBlock(pAttDef,blkXform);            
                //设置属性值,此处省略区分属性标记对应属性值,全部设置为一个值
                pAtt->setTextString(_T("40"));               
                // 向块参照追加属性对象
                pBlkRef->appendAttribute(pAtt);
            }
            delete pItr;
            pItr=NULL;
        }
[/code]

 

 

 

 

ObjectARX插入属性块简单例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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