//插入屬性塊簡單例子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; }