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("\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;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM