三點引線附着塊參照實例
// 創建AcDbLeader引線 ads_point p1,p2,p3; if (RTNORM != acedGetPoint(NULL,_T("\n請選擇引線第一點: "),p1)) return; if (RTNORM != acedGetPoint(p1,_T("\n請選擇引線第二點: "),p2)) return; if (RTNORM != acedGetPoint(p2,_T("\n請選擇引線第三點: "),p3)) return; // ucs點轉換到wcs點 acdbUcs2Wcs(p1,p1,false); acdbUcs2Wcs(p2,p2,false); acdbUcs2Wcs(p3,p3,false); // ads點轉為AcGe點 AcGePoint3d pt1=asPnt3d(p1); AcGePoint3d pt2=asPnt3d(p2); AcGePoint3d pt3=asPnt3d(p3); // 設置第三點為第二點的水平點 pt3.y=pt2.y; AcDbDatabase *pDb=acdbHostApplicationServices()->workingDatabase(); // 使用智能指針打開塊表 AcDbBlockTablePointer pBlkTbl(pDb,AcDb::kForRead); Acad::ErrorStatus es =pBlkTbl.openStatus(); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; } // 獲取指定塊名的塊表記錄ID AcDbObjectId blkDefId; es=pBlkTbl->getAt(_T("123"),blkDefId); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; } // 使用智能指針創建塊參照對象 AcDbObjectPointer<AcDbBlockReference> pBlkRef; es= pBlkRef.create(); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; } pBlkRef->setBlockTableRecord(blkDefId); pBlkRef->setPosition(pt3); pBlkRef->setDatabaseDefaults(); // 使用智能指針打開pDb的當前空間 AcDbBlockTableRecordPointer pBlkRcd(pDb->currentSpaceId(),AcDb::kForWrite); es =pBlkRcd.openStatus(); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; } AcDbObjectId blkRefId; pBlkRcd->appendAcDbEntity(blkRefId,pBlkRef); // 引線的附着對象一定要及時關閉,否則attachAnnotation附着失敗 pBlkRef->close(); // 創建引線對象 AcDbObjectPointer<AcDbLeader> pLeader; es= pLeader.create(); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; } pLeader->appendVertex(pt1); pLeader->appendVertex(pt2); pLeader->appendVertex(pt3); pLeader->setDatabaseDefaults(); // 要先將引線對象添加到數據庫后再執行attachAnnotation附着對象,否則附着失敗 pBlkRcd->appendAcDbEntity(pLeader); // 條件1,附着實體ID,AcDbLeader引線必須是添加到數據庫的對象否則出現,eNotInDatabase // 條件2,附着實體ID對象也必須是數據庫的關閉對象,因為需要對附着對象添加反應器之類操作 es = pLeader->attachAnnotation(blkRefId); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; } es = pLeader->evaluateLeader(); if (Acad::eOk != es) { acutPrintf(_T("\n程序執行失敗,錯誤碼=%s"),acadErrorStatusText(es)); return; }
附着多行文字,參考鏈接 https://adndevblog.typepad.com/autocad/2012/07/create-a-leader-attached-mtext.html