天气与日历 切换到窄版

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

[每日一码] 查找多个AcDbLine的所有交点

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-3-14 20:12:14 | 显示全部楼层 |阅读模式
    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. Next, we will collect the AcDbLine entities in ModelSpace:
    20. 普通浏览复制代码
    21. // Collect lines from ModelSpace
    22. Acad::ErrorStatus es;
    23. AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
    24. AcDbBlockTableRecordPointer pBTR(acdbSymUtil()->blockModelSpaceId(pDb),AcDb::kForWrite);
    25. AcDbBlockTableRecordIterator *pIter = NULL;
    26. pBTR->newIterator(pIter, true);
    27. AcDbObjectIdArray arrLines;
    28. while(!pIter->done())
    29. {
    30.         AcDbEntity *pEnt = NULL;
    31.         es = pIter->getEntity(pEnt, AcDb::kForRead);
    32.         if (es == Acad::eOk)
    33.         {
    34.                 if (pEnt->isKindOf(AcDbLine::desc()))
    35.                         arrLines.append(pEnt->objectId());
    36.                 pEnt->close();
    37.         }
    38.         pIter->step(true);
    39. }
    40. delete pIter;
    41. pIter = NULL;
    42. if (arrLines.length() == 0)
    43. {
    44.         acutPrintf(采用T("There are no lines in Model Space!\n"));
    45.         return;
    46. }
    47. else
    48. {
    49.         acutPrintf(采用T("We've found %d lines in Model Space!\nChecking intersection with tolerance %f...\n"),
    50.                 arrLines.length(), 采用dTol);
    51. }
    52. Ok, with the lines collected we will then build our CMap with the information we need:
    53. 普通浏览复制代码
    54. // Process lines in pairs
    55. CMap<AcGePoint3d,AcGePoint3d,AcDbObjectIdArray,AcDbObjectIdArray&> mapLines;
    56. acdbTransactionManager->startTransaction();
    57. for (int i=0; i<arrLines.length()-1; i++)
    58. {
    59.         AcDbLine* pLineA = NULL;
    60.         if (acdbTransactionManager->getObject((AcDbObject*&)pLineA,arrLines<i>, AcDb::kForRead) == Acad::eOk)
    61.         {
    62.                 for (int j=i+1; j<arrLines.length(); j++)
    63.                 {
    64.                         AcDbLine* pLineB = NULL;
    65.                         if (acdbTransactionManager->getObject((AcDbObject*&)pLineB,arrLines[j], AcDb::kForRead) == Acad::eOk)
    66.                         {
    67.                                 AcGePoint3dArray arrPts;
    68.                                 if (pLineA->intersectWith(pLineB,AcDb::kOnBothOperands,arrPts) == Acad::eOk)
    69.                                 {
    70.                                         if (arrPts.length() > 0)
    71.                                         {
    72.                                                 for (int p=0; p<arrPts.length(); p++)
    73.                                                 {
    74.                                                         AcDbObjectIdArray arrExist;
    75.                                                         if (mapLines.Lookup(arrPts[p],arrExist) == TRUE)
    76.                                                         {
    77.                                                                 // Existing point...
    78.                                                                 if (arrExist.contains(pLineA->objectId()) == false)
    79.                                                                         mapLines[arrPts[p]].append(pLineA->objectId());
    80.                                                                 if (arrExist.contains(pLineB->objectId()) == false)
    81.                                                                         mapLines[arrPts[p]].append(pLineB->objectId());
    82.                                                         }
    83.                                                         else
    84.                                                         {
    85.                                                                 // New point...
    86.                                                                 AcDbObjectIdArray arrNewEnts;
    87.                                                                 arrNewEnts.append(pLineA->objectId());
    88.                                                                 arrNewEnts.append(pLineB->objectId());
    89.                                                                 mapLines.SetAt(arrPts[p],arrNewEnts);
    90.                                                         }
    91.                                                 }
    92.                                         }
    93.                                 }
    94.                         }
    95.                 }
    96.         }
    97. }
    98. acdbTransactionManager->endTransaction();
    99. To demonstrate the use of this information, we then use our CMap data to create AcDbPoint entities on ModeSpace and also print a small report at the command prompt:
    100. 普通浏览复制代码
    101. // Just as demonstration, walk through points and add an AcDbPoint entity to ModelSpace then print the info
    102. POSITION pos = mapLines.GetStartPosition();
    103. while (pos)
    104. {
    105.         AcGePoint3d ptKey(0,0,0);
    106.         AcDbObjectIdArray arrEnts;
    107.         mapLines.GetNextAssoc(pos,ptKey, arrEnts);
    108.         AcDbPoint* ptEnt = new AcDbPoint(ptKey);
    109.         AcDbObjectId idPointEnt;
    110.         pBTR->appendAcDbEntity(idPointEnt,ptEnt);
    111.         ptEnt->close();
    112.         CString sEnts;
    113.         for (int e=0; e<arrEnts.length(); e++)
    114.         {
    115.                 ACHAR pBuff[255] = 采用T("");
    116.                 arrEnts[e].handle().getIntoAsciiBuffer(pBuff);
    117.                 CString sBuff;
    118.                 sBuff.Format( (e==arrEnts.length()-1) ? 采用T("%s"): 采用T("%s,"), pBuff);
    119.                 sEnts += sBuff;
    120.         }
    121.         CString sPromptReport;
    122.         sPromptReport.Format(采用T("Point (%.4f, %.4f, %.4f) - Entities [%s]\n"),ptKey.x, ptKey.y, ptKey.z, sEnts);
    123.         acutPrintf(sPromptReport);
    124. }
    复制代码

     

     

     

     

    [每日一码] 查找多个AcDbLine的所有交点
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-11-1 13:24 , Processed in 0.132843 second(s), 26 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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