• 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

  • 相关阅读:
    jquery选择器
    frameset的target属性
    最长回文子串 南邮NOJ 1100
    最长回文子串 南邮NOJ 1100
    最长回文子串 南邮NOJ 1100
    NOJ 蛇形填数 1094
    NOJ 蛇形填数 1094
    NOJ 蛇形填数 1094
    NOJ 蛇形填数 1094
    开灯问题 南邮NOJ 1589 (另一种解法)
  • 原文地址:https://www.cnblogs.com/edata/p/13340428.html
Copyright © 2020-2023  润新知