找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 155|回复: 0

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

[复制链接]

1

主题

0

回帖

43

积分

管理员

积分
43
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-11 00:37 , Processed in 0.132523 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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