设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 192|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2021-6-23 14:19
  • 签到天数: 1543 天

    [LV.Master]伴坛终老

    发表于 2020-12-21 19:55 | 显示全部楼层 |阅读模式
    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个点是否为原多线段的起始点。然后闭合连接起来。
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛