设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

查找多个AcDbLine的所有交点

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

    [LV.Master]伴坛终老

    发表于 2021-1-14 16:20 | 显示全部楼层 |阅读模式
    1. // These are template classes to allow AcGePoint3d do be used as a Key do CMap class
    2. const double _dTol = 0.0001;

    3. template<> UINT AFXAPI HashKey<AcGePoint3d> (AcGePoint3d key)
    4. {
    5.         CString sPoint;
    6.         sPoint.Format(_T("%f,%f,%f"),key.x, key.y ,key.z);

    7.         UINT iHash = (NULL == &key) ? 0 : HashKey((LPCSTR)sPoint.GetBuffer());
    8.         return iHash;
    9. }

    10. template<> BOOL AFXAPI CompareElements<AcGePoint3d, AcGePoint3d>
    11. (const AcGePoint3d* pElement1, const AcGePoint3d* pElement2)
    12. {
    13.         if ((pElement1 == NULL) || (pElement2 == NULL))
    14.                 return false;

    15.         AcGeTol gTol;
    16.         gTol.setEqualPoint(_dTol); // Point comparison tolerance
    17.         return (pElement1->isEqualTo(*pElement2,gTol));
    18. }


    19. // Collect lines from ModelSpace
    20. Acad::ErrorStatus es;
    21. AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
    22. AcDbBlockTableRecordPointer pBTR(acdbSymUtil()->blockModelSpaceId(pDb),AcDb::kForWrite);

    23. AcDbBlockTableRecordIterator *pIter = NULL;
    24. pBTR->newIterator(pIter, true);
    25. AcDbObjectIdArray arrLines;

    26. while(!pIter->done())
    27. {
    28.         AcDbEntity *pEnt = NULL;
    29.         es = pIter->getEntity(pEnt, AcDb::kForRead);
    30.         if (es == Acad::eOk)
    31.         {
    32.                 if (pEnt->isKindOf(AcDbLine::desc()))
    33.                         arrLines.append(pEnt->objectId());

    34.                 pEnt->close();
    35.         }

    36.         pIter->step(true);
    37. }
    38. delete pIter;
    39. pIter = NULL;

    40. if (arrLines.length() == 0)
    41. {
    42.         acutPrintf(_T("There are no lines in Model Space!\n"));
    43.         return;
    44. }
    45. else
    46. {
    47.         acutPrintf(_T("We've found %d lines in Model Space!\nChecking intersection with tolerance %f...\n"),
    48.                 arrLines.length(), _dTol);
    49. }


    50. // Process lines in pairs
    51. CMap<AcGePoint3d,AcGePoint3d,AcDbObjectIdArray,AcDbObjectIdArray&> mapLines;

    52. acdbTransactionManager->startTransaction();
    53. for (int i=0; i<arrLines.length()-1; i++)
    54. {
    55.         AcDbLine* pLineA = NULL;
    56.         if (acdbTransactionManager->getObject((AcDbObject*&)pLineA,arrLines<i>, AcDb::kForRead) == Acad::eOk)
    57.         {
    58.                 for (int j=i+1; j<arrLines.length(); j++)
    59.                 {
    60.                         AcDbLine* pLineB = NULL;
    61.                         if (acdbTransactionManager->getObject((AcDbObject*&)pLineB,arrLines[j], AcDb::kForRead) == Acad::eOk)
    62.                         {
    63.                                 AcGePoint3dArray arrPts;
    64.                                 if (pLineA->intersectWith(pLineB,AcDb::kOnBothOperands,arrPts) == Acad::eOk)
    65.                                 {
    66.                                         if (arrPts.length() > 0)
    67.                                         {
    68.                                                 for (int p=0; p<arrPts.length(); p++)
    69.                                                 {
    70.                                                         AcDbObjectIdArray arrExist;
    71.                                                         if (mapLines.Lookup(arrPts[p],arrExist) == TRUE)
    72.                                                         {
    73.                                                                 // Existing point...
    74.                                                                 if (arrExist.contains(pLineA->objectId()) == false)
    75.                                                                         mapLines[arrPts[p]].append(pLineA->objectId());

    76.                                                                 if (arrExist.contains(pLineB->objectId()) == false)
    77.                                                                         mapLines[arrPts[p]].append(pLineB->objectId());
    78.                                                         }
    79.                                                         else
    80.                                                         {
    81.                                                                 // New point...
    82.                                                                 AcDbObjectIdArray arrNewEnts;
    83.                                                                 arrNewEnts.append(pLineA->objectId());
    84.                                                                 arrNewEnts.append(pLineB->objectId());
    85.                                                                 mapLines.SetAt(arrPts[p],arrNewEnts);
    86.                                                         }
    87.                                                 }
    88.                                         }
    89.                                 }
    90.                         }
    91.                 }
    92.         }
    93. }

    94. acdbTransactionManager->endTransaction();


    95. // Just as demonstration, walk through points and add an AcDbPoint entity to ModelSpace then print the info
    96. POSITION pos = mapLines.GetStartPosition();
    97. while (pos)
    98. {
    99.         AcGePoint3d ptKey(0,0,0);
    100.         AcDbObjectIdArray arrEnts;
    101.         mapLines.GetNextAssoc(pos,ptKey, arrEnts);

    102.         AcDbPoint* ptEnt = new AcDbPoint(ptKey);
    103.         AcDbObjectId idPointEnt;
    104.         pBTR->appendAcDbEntity(idPointEnt,ptEnt);
    105.         ptEnt->close();

    106.         CString sEnts;
    107.         for (int e=0; e<arrEnts.length(); e++)
    108.         {
    109.                 ACHAR pBuff[255] = _T("");
    110.                 arrEnts[e].handle().getIntoAsciiBuffer(pBuff);
    111.                 CString sBuff;
    112.                 sBuff.Format( (e==arrEnts.length()-1) ? _T("%s"): _T("%s,"), pBuff);
    113.                 sEnts += sBuff;
    114.         }

    115.         CString sPromptReport;
    116.         sPromptReport.Format(_T("Point (%.4f, %.4f, %.4f) - Entities [%s]\n"),ptKey.x, ptKey.y, ptKey.z, sEnts);
    117.         acutPrintf(sPromptReport);
    118. }
    复制代码
    回复


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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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