找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C++ CAD 高亮显示要素

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-9-26 10:27:49 | 显示全部楼层 |阅读模式
  1. void CTransUtil::ZoomWindow(AcDbDatabase* pDb, AcDbExtents& ext)
  2. {
  3.         assert(pDb);
  4.        
  5.         //AcDbViewportTable* pViewportTable = NULL;
  6.         //if (pDb->getViewportTable(pViewportTable, AcDb::kForRead) == Acad::eOk)
  7.         {
  8.                 //AcDbViewportTableRecord* pRecord = NULL;
  9.                 //if (pViewportTable->getAt(TEXT("*ACTIVE"), pRecord, AcDb::kForWrite) == Acad::eOk)
  10.                 {
  11.                         AcGePoint3d center = CGeometryOper::GetMiddlePoint(ext.minPoint(), ext.maxPoint());
  12.                         double height = ext.maxPoint().y - ext.minPoint().y;
  13.                         double width = ext.maxPoint().x - ext.minPoint().x;
  14.                         /*pRecord->setCenterPoint(CGeometryOper::Pt3dTo2d(center));
  15.                         pRecord->setHeight(height * 1.01);
  16.                         pRecord->setWidth(width * 2.0);
  17.                         pRecord->close();*/
  18.                         AcDbViewTableRecord pVwRec;
  19.                         pVwRec.setCenterPoint(CGeometryOper::Pt3dTo2d(center));
  20.                         pVwRec.setWidth(width * 1.01);
  21.                         pVwRec.setHeight(height * 2.0);
  22.                         acedSetCurrentView(&pVwRec, NULL);
  23.                 }
  24.                
  25.                 //pViewportTable->close();
  26.         }       
  27. }
复制代码




  1. ACHAR layerName[100];
  2. if (acedGetString(Adesk::kFalse, _T("\n输入句柄:\n"), layerName) != RTNORM)
  3. {
  4.         return;
  5. }
  6. CString nstr = layerName;
  7. AcApDocument* pDoc = acDocManager->curDocument();
  8. CString filePath = pDoc->fileName();
  9. int nPos = filePath.ReverseFind(_T('\\'));
  10. if (nPos == -1)
  11. {
  12.         return;
  13. }
  14. acDocManager->lockDocument(pDoc, AcAp::kWrite, NULL, NULL, true);
  15. AcTransaction* pTrans = actrTransactionManager->startTransaction();
  16. if (!pTrans)
  17. {
  18.         acDocManager->unlockDocument(pDoc);
  19.         return;
  20. }
  21. HRESULT hr;
  22. AutoCAD::IAcadApplication* pAcad = nullptr;
  23. hr = NOERROR;
  24. LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
  25. hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);
  26. if (SUCCEEDED(hr)) {
  27.         //pAcad->ZoomAll();
  28.         pAcad->ZoomExtents();
  29.         pAcadDisp->Release();
  30.         pAcad->Release();
  31.         acdbHostApplicationServices()->workingDatabase()->updateExt(TRUE);
  32. }
  33. // 选择JZD图层上的所有多线段
  34. struct resbuf* rb; // 结果缓冲区链表
  35. ads_name jzdssname; //选择集名称
  36. rb = acutBuildList(RTDXF0, TEXT("POLYLINE"), 8, _T("JZD"), AcDb::kDxfRegAppName, _T("SOUTH"), RTNONE);//LWPOLYLINE POLYLINE
  37. acedSSGet(_T("A"), NULL, NULL, rb, jzdssname);
  38. acutRelRb(rb);
  39. long jzdlen;
  40. if (RTNORM != acedSSLength(jzdssname, &jzdlen))
  41. {
  42.         acedSSFree(jzdssname);
  43.         acDocManager->unlockDocument(acDocManager->curDocument());
  44.         return;
  45. }
  46. //修改鼠标等待样式
  47. CWaitCursor WaitCursor;
  48. ads_name  sset_temp;
  49. //遍历选择集
  50. for (int i = 0; i < jzdlen; i++)
  51. {
  52.         ads_name jzdent;
  53.         if (RTNORM != acedSSName(jzdssname, i, jzdent))
  54.         {
  55.                 continue;
  56.         }
  57.         AcDbObjectId jzdId;
  58.         if (Acad::eOk != acdbGetObjectId(jzdId, jzdent))
  59.         {
  60.                 acedSSFree(jzdent);
  61.                 continue;
  62.         }               
  63.         //句柄
  64.                        
  65.         ACHAR handbuf[7] = { 0 };
  66.         AcDbHandle handle = jzdId.handle();
  67.         handle.getIntoAsciiBuffer(handbuf);
  68.         CString str = handbuf;
  69.         if (str == nstr)
  70.         {
  71.                 AcDbObjectPointer<AcDbEntity> jzdEnt(jzdId, AcDb::kForRead);
  72.                 if (Acad::eOk != jzdEnt.openStatus())
  73.                 {
  74.                         continue;
  75.                 }
  76.                 AcDbExtents ext;
  77.                 if (jzdEnt->getGeomExtents(ext) == Acad::eOk) //输出实体的ext
  78.                 {
  79.                         CTransUtil::ZoomWindow(pDoc->database(), ext);
  80.                         //acutPrintf(_T("\n找到!\n"));
  81.                 }
  82.                 //jzdEnt->highlight();
  83.                 //acedUpdateDisplay();       
  84.                 acedSSAdd(jzdent, NULL, sset_temp); //初始化一个选择
  85.                 break;
  86.         }
  87.         acedSSFree(jzdent);
  88. }
  89. acedSSFree(jzdssname);
  90. WaitCursor.Restore();
  91. actrTransactionManager->endTransaction();
  92. acDocManager->unlockDocument(pDoc);
  93. acedSSSetFirst(sset_temp, NULL);
  94. acedSSFree(sset_temp);
  95. acutPrintf(_T("\n完成!\n"));
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-27 21:46 , Processed in 0.132065 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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