天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 59|回复: 0

实用的ObjectARX插件 高程点移位

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
acDocManager->lockDocument(acDocManager->curDocument());

int iosmode = 0;
CDwgDatabaseUtil::GetVar(_T("osmode"), iosmode); // 获取捕捉状态值
CDwgDatabaseUtil::setVar(_T("osmode"), 0);  // 设置捕获关
CDwgDatabaseUtil::setVar(_T("cmdecho"), 0); // 关闭回显
acedCommand(RTSTR, _T("undo"), RTSTR, _T("be"), RTNONE);

bool result = true;
AcGePoint3dArray ptArray;
ads_name ss;
// 建立缓冲区链表
AcDbObjectIdArray entIds;
struct resbuf *rb, *retRb;
CString myXdata = _T("202101");
rb = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("gc200"), RTNONE);
if (CCassUtil::PromptSelectEnts(_T("X"), myXdata, rb, entIds))
{
    long length = entIds.length();
    for (int i = 0; i < length; i++)
    {
        AcDbEntity *pEnt = NULL;
        if (acdbOpenObject(pEnt, entIds[i], AcDb::kForWrite) == Acad::eOk)
        {
            CString layerName = pEnt->layer(); //图层名
            AcGePoint2d zxPt, ysPt; // 文本的左下角点、右上角点
            AcDbBlockReference *pBlk = AcDbBlockReference::cast(pEnt);
            AcGePoint3d pt3d = pBlk->position();
            double ptz = pt3d.z;
            AcDbObjectIterator *pAttrIter = pBlk->attributeIterator();
            AcDbAttribute *pAttr = NULL;
            AcDbObjectId attrObjId = NULL;

            CString strHeight;
            AcGePoint3d AlimPt, textPt;
            attrObjId = pAttrIter->objectId();
            acdbOpenObject(pAttr, attrObjId, AcDb::kForWrite);

            strHeight = pAttr->textString();
            double hh = pAttr->height(); // 文字高度
            double ww = pAttr->widthFactor(); // 宽度比例系数

            double ll = CTextUtil::getTextLength(strHeight, hh, ww); // 文字长度

            AlimPt = pAttr->alignmentPoint(); // 对齐点
            textPt = pAttr->position(); // 文本的位置点(左下角点)
            AcGePoint3d yPt1 = CGePointUtil::PolarPoint(textPt, 0.0, ll); // 向右
            AcGePoint3d yPt2 = CGePointUtil::PolarPoint(yPt1, CMathUtil::PI() * 0.5, hh); // 向上
            zxPt = CConvertUtil::ToPoint2d(textPt); // 文本的位置点(左下角点)
            ysPt = CConvertUtil::ToPoint2d(yPt2);   // 文本的位置点(右上角点)

            CViewUtil::Set(textPt, yPt2, 3);

            retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE);
            int rt = acedSSGet(_T("C"), asDblArray(zxPt), asDblArray(ysPt), retRb, ss);
            if (rt != RTNORM)
            {
                pAttr->close();
                delete pAttrIter;
                pBlk->close();
                pEnt->close();
                acutRelRb(retRb);
                acedSSFree(ss);
                result = false;
                continue;
            }
            else
            {
                acutRelRb(retRb);
                acedSSFree(ss);
                result = true;
            }
            AcGePoint2d ydPt1, ydPt2, xdPt1, xdPt2, xdPt3, xdPt4, xdPt5, xdPt6, xdPt7, xdPt8;
            if (result)
            {
                // 设定向下移动限制
                double xzLen = hh;
                double yLen = 0;
                while (yLen < xzLen)
                {
                    yLen = yLen + hh * 0.25;
                    ydPt1 = CGePointUtil::PolarPoint(zxPt, CMathUtil::PI() * 1.5, yLen);
                    ydPt2 = CGePointUtil::PolarPoint(ysPt, CMathUtil::PI() * 1.5, yLen);

                    retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE);
                    int rt = acedSSGet(_T("C"), asDblArray(ydPt1), asDblArray(ydPt2), retRb, ss);
                    if (rt != RTNORM)
                    {
                        // 文本的位置点
                        AcGePoint3d setPosPt(ydPt1.x, ydPt1.y, ptz);
                        AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
                        pAttr->setHorizontalMode(AcDb::kTextLeft);   // 左对齐
                        pAttr->setVerticalMode(AcDb::kTextVertMid);  // 左中
                        pAttr->setPosition(setPosPt);
                        pAttr->setAlignmentPoint(setAliPt);
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = false;
                        break;
                    }
                    else
                    {
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = true;
                    }
                }
            }
            if (result)
            {
                // 设定向左移动限制
                double yzLen = hh * 4;
                double yLen = 0;
                while (yLen < yzLen)
                {
                    yLen = yLen + hh * 0.25;
                    xdPt1 = CGePointUtil::PolarPoint(ydPt1, CMathUtil::PI(), yLen);
                    xdPt2 = CGePointUtil::PolarPoint(ydPt2, CMathUtil::PI(), yLen);

                    retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE);
                    int rt = acedSSGet(_T("C"), asDblArray(xdPt1), asDblArray(xdPt2), retRb, ss);
                    if (rt != RTNORM)
                    {
                        AcGePoint3d setPosPt(xdPt1.x, xdPt1.y, ptz);
                        AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
                        pAttr->setHorizontalMode(AcDb::kTextLeft);   // 左对齐
                        pAttr->setVerticalMode(AcDb::kTextVertMid);  // 左中
                        pAttr->setPosition(setPosPt);
                        pAttr->setAlignmentPoint(setAliPt);
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = false;
                        break;
                    }
                    else
                    {
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = true;
                    }
                }
            }
            if (result)
            {
                // 设定向上移动限制
                double yzLen = hh * 2;
                double yLen = 0;
                while (yLen < yzLen)
                {
                    yLen = yLen + hh * 0.25;
                    xdPt3 = CGePointUtil::PolarPoint(xdPt1, CMathUtil::PI() * 0.5, yLen);
                    xdPt4 = CGePointUtil::PolarPoint(xdPt2, CMathUtil::PI() * 0.5, yLen);

                    retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE);
                    int rt = acedSSGet(_T("C"), asDblArray(xdPt3), asDblArray(xdPt4), retRb, ss);
                    if (rt != RTNORM)
                    {
                        AcGePoint3d setPosPt(xdPt3.x, xdPt3.y, ptz);
                        AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
                        pAttr->setHorizontalMode(AcDb::kTextLeft);
                        pAttr->setVerticalMode(AcDb::kTextVertMid);
                        pAttr->setPosition(setPosPt);
                        pAttr->setAlignmentPoint(setAliPt);
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = false;
                        break;
                    }
                    else
                    {
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = true;
                    }
                }
            }
            if (result)
            {
                // 设定向右移动限制
                double yzLen = hh * 4;
                double yLen = 0;
                while (yLen < yzLen)
                {
                    yLen = yLen + hh * 0.25;
                    xdPt5 = CGePointUtil::PolarPoint(xdPt3, 0.0, yLen);
                    xdPt6 = CGePointUtil::PolarPoint(xdPt4, 0.0, yLen);

                    retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE);
                    int rt = acedSSGet(_T("C"), asDblArray(xdPt5), asDblArray(xdPt6), retRb, ss);
                    if (rt != RTNORM)
                    {
                        AcGePoint3d setPosPt(xdPt5.x, xdPt5.y, ptz);
                        AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
                        pAttr->setHorizontalMode(AcDb::kTextLeft);
                        pAttr->setVerticalMode(AcDb::kTextVertMid);
                        pAttr->setPosition(setPosPt);
                        pAttr->setAlignmentPoint(setAliPt);
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = false;
                        break;
                    }
                    else
                    {
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = true;
                    }
                }
            }
            if (result)
            {
                // 设定向下移动限制
                double yzLen = hh;
                double yLen = 0;
                while (yLen < yzLen)
                {
                    yLen = yLen + hh * 0.25;
                    xdPt7 = CGePointUtil::PolarPoint(xdPt5, CMathUtil::PI() * 1.5, yLen);
                    xdPt8 = CGePointUtil::PolarPoint(xdPt6, CMathUtil::PI() * 1.5, yLen);

                    retRb = acutBuildList(-4, _T("<NOT"), 2, _T("GC200"), -4, _T("NOT>"), RTNONE);
                    int rt = acedSSGet(_T("C"), asDblArray(xdPt7), asDblArray(xdPt8), retRb, ss);
                    if (rt != RTNORM)
                    {
                        AcGePoint3d setPosPt(xdPt7.x, xdPt7.y, ptz);
                        AcGePoint3d setAliPt = CGePointUtil::PolarPoint(setPosPt, CMathUtil::PI() * 0.5, hh * 0.5);
                        pAttr->setHorizontalMode(AcDb::kTextLeft);
                        pAttr->setVerticalMode(AcDb::kTextVertMid);
                        pAttr->setPosition(setPosPt);
                        pAttr->setAlignmentPoint(setAliPt);
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = false;
                        break;
                    }
                    else
                    {
                        acutRelRb(retRb);
                        acedSSFree(ss);
                        result = true;
                    }
                }
                if (result)
                {
                    ptArray.append(pt3d);
                }
            }
            pAttr->close();
            delete pAttrIter;
            pBlk->close();
            pEnt->close();
        }
    }
    acutRelRb(rb);
    if (ptArray.length() > 0)
    {
        CLayerUtil::Add(_T("检查"), 1);
        int i = 0;
        for (i; i < ptArray.length(); i++)
        {
            AcGeVector3d vec(0, 0, 1);
            AcDbCircle *pCircle = new AcDbCircle(ptArray[i], vec, 2.0);
            pCircle->setLayer(_T("检查"));
            CDwgDatabaseUtil::PostToModelSpace(pCircle);
        }
        acutPrintf(_T("\n高程点处理完毕,有: %d 个未处理。已画圆为标记请检查!"), i);
    }
}
else
{
    AfxMessageBox(_T("只限定CASS的合成高程点!"));
    acutRelRb(rb);
}
CDwgDatabaseUtil::setVar(_T("osmode"), iosmode); // 还原捕捉状态值
acDocManager->unlockDocument(acDocManager->curDocument());

 

 

 

 

实用的ObjectARX插件 高程点移位
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:32 , Processed in 0.121858 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表