zoukankan      html  css  js  c++  java
  • ObjectARX插入属性块简单例子

            //插入属性块简单例子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("
    打开块表失败,错误码= %s"),acadErrorStatusText(pBlkTbl.openStatus()));
                return;
            }
            //判断是否有块定义
            if (!pBlkTbl->has(blkName))
            {
                acutPrintf(_T("
    块定义名< %s >不存在!"),blkName);
                return;
            }
            //获取块定义objectId
            AcDbObjectId blkId;
            pBlkTbl->getAt(blkName,blkId);
            if (blkId.isNull())
            {
                acutPrintf(_T("
    获取块定义ID失败!"));
                return;
            }
            //ARX智能指针创建块参照
            AcDbObjectPointer<AcDbBlockReference> pBlkRef;
            if (Acad::eOk != pBlkRef.create())
            {
                acutPrintf(_T("
    块参照创建失败,可能内存已满!"));
                return;
            }        
            pBlkRef->setDatabaseDefaults();
            pBlkRef->setPosition(insertPoint);
            pBlkRef->setBlockTableRecord(blkId);
            //ARX智能指针打开当前空间的块表记录
            AcDbBlockTableRecordPointer pBlkRcd(curDoc()->database()->currentSpaceId(),AcDb::kForWrite);
            if(Acad::eOk != pBlkRcd.openStatus())
            {
                acutPrintf(_T("
    打开当前空间的块表记录失败,错误码= %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("
    打开块定义块表记录失败,错误码= %s"),acadErrorStatusText(pBlkDef.openStatus()));
                return;
            }
            //判断块定义是否包含属性定义
            if (pBlkDef->hasAttributeDefinitions())
            {
                //获取迭代器
                AcDbBlockTableRecordIterator *pItr=NULL; 
                pBlkDef->newIterator(pItr); 
                if (pItr==NULL)
                {
                    acutPrintf(_T("
    获取迭代器失败!"));
                    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;
            }
  • 相关阅读:
    枚举--分巧克力--蓝桥杯--二分法
    枚举笔记之哈希表 四个平方和
    枚举 蓝桥杯 四个平方数和2--暴力解法 超时
    枚举例题之平方十位数思路无代码
    LeetCode----盛最多水的容器「贪心」
    2020校招笔试
    2020校招美团点评笔试
    2020校招搜狗笔试
    2020网易校招笔试
    2020校招途家名宿开发笔试
  • 原文地址:https://www.cnblogs.com/edata/p/13800210.html
Copyright © 2011-2022 走看看