ObjectARX 创建AcDbLeader引线附着块对象实例

 三点引线附着块参照实例

        // 创建AcDbLeader引线
        ads_point p1,p2,p3;
        if (RTNORM != acedGetPoint(NULL,_T("
请选择引线第一点: "),p1))
            return;
        if (RTNORM != acedGetPoint(p1,_T("
请选择引线第二点: "),p2))
            return;
        if (RTNORM != acedGetPoint(p2,_T("
请选择引线第三点: "),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("
程序执行失败,错误码=%s"),acadErrorStatusText(es));
            return;
        }
        // 获取指定块名的块表记录ID
        AcDbObjectId blkDefId;
        es=pBlkTbl->getAt(_T("123"),blkDefId);
        if (Acad::eOk != es)
        {
            acutPrintf(_T("
程序执行失败,错误码=%s"),acadErrorStatusText(es));
            return;
        }
        // 使用智能指针创建块参照对象
        AcDbObjectPointer<AcDbBlockReference> pBlkRef;
        es= pBlkRef.create();
        if (Acad::eOk != es)
        {
            acutPrintf(_T("
程序执行失败,错误码=%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("
程序执行失败,错误码=%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("
程序执行失败,错误码=%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("
程序执行失败,错误码=%s"),acadErrorStatusText(es));
            return;
        }
        es = pLeader->evaluateLeader();
        if (Acad::eOk != es)
        {
            acutPrintf(_T("
程序执行失败,错误码=%s"),acadErrorStatusText(es));
            return;
        }

附着多行文字,参考链接 https://adndevblog.typepad.com/autocad/2012/07/create-a-leader-attached-mtext.html

原文地址:https://www.cnblogs.com/edata/p/13340428.html