ObjectARX 創建AcDbLeader引線附着塊對象實例


 

 三點引線附着塊參照實例

        // 創建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


免責聲明!

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



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