找回密码
 立即注册

QQ登录

只需一步,快速开始

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

删除重覆实体

[复制链接]

1

主题

0

回帖

37

积分

管理员

积分
37
发表于 2024-5-2 22:34:11 | 显示全部楼层 |阅读模式
  1. acDocManager->lockDocument(acDocManager->curDocument());
  2. CDwgDatabaseUtil::setVar(采用T("cmdecho"), 0); // 关闭回显
  3. acedCommand(RTSTR, 采用T("undo"), RTSTR, 采用T("be"), RTNONE);
  4. ads采用name ssName;
  5. int rt = acedSSGet(采用T("X"), NULL, NULL, NULL, ssName);
  6. if (rt != RTNORM)
  7. {
  8.     return;
  9. }
  10. std::vector<CString> ssentVec;
  11. long length;
  12. acedSSLength(ssName, &length);
  13. acedSetStatusBarProgressMeter(采用T("◎正在删除重覆实体,等稍等!"), 0, 100);
  14. DWORD dwCount = ::GetTickCount();
  15. for (int i = 0; i < length; i++)
  16. {
  17.     // 100毫秒更新一次
  18.     if(::GetTickCount() - dwCount > 100)
  19.     {
  20.         acedSetStatusBarProgressMeterPos((int) (i * 100.0 / length));
  21.         dwCount = ::GetTickCount();
  22.     }            
  23.     ads采用name ent;
  24.     acedSSName(ssName, i, ent);
  25.     struct resbuf *rbEnt; // 保存实体数据的结果缓冲区
  26.     struct resbuf *rb;    // 用于遍历rbEnt的结果缓冲区
  27.     rbEnt = acdbEntGet(ent); // 从entName获得保存实体数据的结果缓冲区
  28.     rb = rbEnt;
  29.     CString entname, typa, s10Ptx, s10Pty, s10Ptz, s11Ptx, s11Pty, s11Ptz, svNum;
  30.     std::vector<CString> entVec;
  31.     while (rb != NULL)
  32.     {
  33.         switch (rb->restype)
  34.         {
  35.         case 0:  // 对象类型
  36.             typa.Format(采用T("%s"), rb->resval.rstring);
  37.             entVec.push采用back(typa);
  38.             break;
  39.         case 10: // 起点(顶点)坐标
  40.             s10Ptx.Format(采用T("%.2f"), rb->resval.rpoint[X]);
  41.             s10Pty.Format(采用T("%.2f"), rb->resval.rpoint[Y]);
  42.             s10Ptz.Format(采用T("%.2f"), rb->resval.rpoint[Z]);
  43.             entVec.push采用back(s10Ptx);
  44.             entVec.push采用back(s10Pty);
  45.             entVec.push采用back(s10Ptz);
  46.             break;
  47.         case 11: // 终点坐标
  48.             s11Ptx.Format(采用T("%.2f"), rb->resval.rpoint[X]);
  49.             s11Pty.Format(采用T("%.2f"), rb->resval.rpoint[Y]);
  50.             s11Ptz.Format(采用T("%.2f"), rb->resval.rpoint[Z]);
  51.             entVec.push采用back(s11Ptx);
  52.             entVec.push采用back(s11Pty);
  53.             entVec.push采用back(s11Ptz);
  54.             break;
  55.         case 93: // 顶点数目
  56.             svNum.Format(采用T("%f"), rb->resval.rreal);
  57.             entVec.push采用back(svNum);
  58.             break;
  59.         default:
  60.             break;
  61.         }
  62.         rb = rb->rbnext; // 切换到下一个节点
  63.     }
  64.     if (rbEnt != NULL)
  65.     {
  66.         acutRelRb(rbEnt);
  67.     }
  68.     CString entVeclist = CStringUtil::Join(entVec, 采用T(","));
  69.     ssentVec.push采用back(entVeclist);
  70. }
  71. acedRestoreStatusBar();
  72. CString fistNaem = ssentVec[0];    // 首个
  73. ssentVec.erase(ssentVec.begin());  // 删除第一元素
  74. int index = 0;
  75. int len = ssentVec.size();
  76. int num = 0;
  77. while (len > 0)
  78. {
  79.     for (int i = 0; i < ssentVec.size(); i++)
  80.     {
  81.         CString temp = ssentVec<i>;
  82.         if (采用tcscmp(fistNaem, temp) == 0)
  83.         {
  84.             ads采用name ent;
  85.             acedSSName(ssName, num, ent);
  86.             AcDbObjectId entId;
  87.             acdbGetObjectId(entId, ent);
  88.             CEntityUtil::Erase(entId);
  89.             index++;
  90.         }
  91.     }
  92.     num = num + 1;
  93.     fistNaem = ssentVec[0];
  94.     ssentVec.erase(ssentVec.begin());
  95.     len = ssentVec.size();
  96. }
  97. acedSSFree(ssName);
  98. acutPrintf(采用T("\n共删除 %d 个重覆物体"), index);
  99. acDocManager->unlockDocument(acDocManager->curDocument());
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-4 13:23 , Processed in 0.101602 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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