天气与日历 切换到窄版

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

ARX合并多线段(部分内容参考其他人)

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
void CCommonModel::AppendPoly( const AcDbObjectIdArray& objArray,AcDbPolyline *pPolyNew )
{
        AcDbObjectIdArray objIdArray = objArray;
        std::multimap<AcGePoint3d,int> mapPoints;                        // AcGePoint3d不能排序,要重载符号“<”;
        std::multimap<AcGePoint3d,int>::iterator ite1;

        std::multimap<AcGePoint3d,int>::iterator ite2;
        for (int i = 0; i < objIdArray.length(); i++)
        {
                AcDbObjectId objId;
                objId = objIdArray.at(i);
                AcGePoint3d ptStart;
                AcGePoint3d ptEnd;
                AcDbObjectPointer<AcDbPolyline> pPoly(objId,AcDb::kForRead);
                pPoly->getStartPoint(ptStart);
                pPoly->getEndPoint(ptEnd);
                if (i == 0)
                {
                        mapPoints.insert(std::make_pair(ptStart,1));
                        mapPoints.insert(std::make_pair(ptEnd,1));
                }
                else
                {
                        ite1 = mapPoints.find(ptStart);
                        ite2 = mapPoints.find(ptEnd);
                        if (ite1 != mapPoints.end())
                        {
                                (ite1->second)++;
                        }
                        else
                        {
                                mapPoints.insert(std::make_pair(ptStart,1));
                        }
                        ite2 = mapPoints.find(ptEnd);
                        if (ite2 != mapPoints.end())
                        {
                                (ite2->second)++;
                        }
                        else
                        {
                                mapPoints.insert(std::make_pair(ptEnd,1));
                        }
                }
        }

        AcGePoint3d ptStartOk;
        for (ite1 = mapPoints.begin(); ite1 != mapPoints.end(); ite1++)
        {
                if (ite1->second == 1)
                {
                        ptStartOk = ite1->first;
                        break;
                }
        }

        int plIndex = 0;
        while(objIdArray.length()>0)                                                               
        {
                for (int i = 0; i < objIdArray.length(); i++)                // 问题,如果几条多线段不是首尾相接的,那么死循环。
                {
                        AcDbObjectId objId;
                        objId = objIdArray.at(i);
                        AcGePoint3d ptStart;
                        AcGePoint3d ptEnd;
                        AcDbObjectPointer<AcDbPolyline> pPoly(objId,AcDb::kForRead);
                        pPoly->getStartPoint(ptStart);
                        pPoly->getEndPoint(ptEnd);

                        AcGePoint2d pt ;
                        double bulge = 0.0;
                        if (ptStartOk == ptStart)                                                        // 判断点相等,用自带的函数或者用点距离
                        {
                                for (int j= 0; j < pPoly->numVerts(); j++ )                // 问题:最后点会被下一个加入点给覆盖掉,即有重合点
                                {
                                        pPoly->getPointAt(j,pt);
                                        pPoly->getBulgeAt(j,bulge);
                                        pPolyNew->addVertexAt(plIndex,pt,bulge);
                                        plIndex++;
                                }
                                ptStartOk = ptEnd;
                                objIdArray.removeAt(i);
                        }
                        else if(ptStartOk == ptEnd)                                                        // 判断点相等,用自带的函数或者用点距离
                        {
                                for(int k = pPoly->numVerts() - 1;k > 0; k--)
                                {
                                        pPoly->getPointAt(k,pt);
                                        if(k > 0)
                                        {
                                                pPoly->getBulgeAt(k - 1,bulge);
                                        }
                                        else
                                        {
                                                pPoly->getBulgeAt(0,bulge);
                                        }
                                        pPolyNew->addVertexAt(plIndex,pt,-bulge);
                                        plIndex++;
                                }
                                ptStartOk = ptStart;
                                objIdArray.removeAt(i);
                        }
                        else
                        {

                        }
                }

        }
}

bool operator < (AcGePoint3d pt3dS,AcGePoint3d pt3dE)
{
        if (pt3dS.x < pt3dE.x)
        {
                return true;
        }
        else if (pt3dS.x == pt3dE.x)
        {
                if (pt3dS.y < pt3dE.y)
                {
                        return true;
                }
                else if (pt3dS.y == pt3dE.y)
                        {
                                return false;
                        }
                else
                {
                        return false;
                }
        }
        else
        {
                return false;
        }
}
改进方法:1.判断map中点出现次数为1次的点有多少个,如果大于2个,提示错误。
                    2.如果几条多线段是从一个闭合的多线段中截取出来的,那么map中点出现次数为1次的点有2或者4个,如果是4个,判断其中2个点是否为原多线段的起始点。然后闭合连接起来。

 

 

 

 

ARX合并多线段(部分内容参考其他人)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 15:26 , Processed in 0.158022 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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