明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1469|回复: 9

排除重复点

[复制链接]
发表于 2011-6-1 19:10:38 | 显示全部楼层 |阅读模式
如何显现从AcGePoint3dArray ptArr中排除重复点...请会的指导一下...
发表于 2011-6-1 19:56:31 | 显示全部楼层
AcGePoint3d::isEqualTo 这个可以指定一个Tol,容许误差范围,希望可以帮到你
 楼主| 发表于 2011-6-2 00:23:28 | 显示全部楼层
bluelightcsy 发表于 2011-6-1 19:56
AcGePoint3d::isEqualTo 这个可以指定一个Tol,容许误差范围,希望可以帮到你

谢谢,我查看帮助具体用法先试试...
 楼主| 发表于 2011-6-18 09:23:19 | 显示全部楼层
试了多次,但是没有成功,请高手们在百忙之中抽出一点时间,帮写出排查重复点的局部示范代码
发表于 2011-6-18 14:54:13 | 显示全部楼层
回复 chpmould 的帖子

先创建一个类,譬如CPoint3d

  1. #pragma once
  2. #include "c:\objectarx 2012\inc\gepnt3d.h"    //--->根据你的目录来定
  3. class CPoint3d : public AcGePoint3d
  4. {
  5. private:
  6. double fuzz;
  7. public:
  8. CPoint3d(void):fuzz(0.0){}
  9. ~CPoint3d(void){}
  10. void SetFuzz(double tol)
  11. {
  12.   fuzz = tol;
  13. }
  14. void copy(c**t AcGePoint3d & pt)
  15. {
  16.   this->x=pt.x;
  17.   this->y=pt.y;
  18.   this->z=pt.z;
  19. }
  20. bool isEqualTo(double x1,double x2) c**t
  21. {
  22.         double delta = x1 - x2;
  23.   return (delta <= fuzz && delta >= (-fuzz));
  24. }
  25. bool operator < ( c**t CPoint3d& pt) c**t
  26. {
  27.   if (isEqualTo(this->x,pt.x))
  28.    if (isEqualTo(this->y,pt.y))
  29.     return (this->z < pt.z);
  30.    else
  31.     return (this->y < pt.y);
  32.   return (this->x < pt.x);
  33. }
  34. };

发表于 2011-6-18 15:03:45 | 显示全部楼层
本帖最后由 highflybird 于 2011-6-18 21:20 编辑

回复 chpmould 的帖子

然后在程序中这样用:
#include <set>
#include <algorithm>
using namespace std;

以下为测试:
在你的函数中这样添加:


  1.   //过滤选择CAD的点(PointArray)对象
  2.   resbuf filter;
  3.   filter.restype=0;
  4.   filter.resval.rstring=_T("POINT");
  5.   filter.rbnext = NULL;
  6.   ads_name sel;
  7.   int ret=acedSSGet(NULL,NULL,NULL,&filter,sel);
  8.   if( ret!=RTNORM)
  9.   {
  10.    acedSSFree(sel);
  11.    return;
  12.   }
  13.   long len;
  14.   ads_name ent;
  15.   AcDbObjectId ObjId;
  16.   AcDbPoint *pEnt;
  17.   acedSSLength(sel,&len);
  18.   AcGePoint3dArray ptset;
  19.   for (long i = 0;i<len;i++)
  20.   {
  21.    acedSSName(sel,i,ent);
  22.    acdbGetObjectId(ObjId,ent);
  23.    if (acdbOpenObject(pEnt,ObjId,AcDb::kForRead)!=Acad::eOk)
  24.     continue;
  25.    ptset.append(pEnt->position());
  26.    pEnt->close();
  27.   }
  28.   acedSSFree(sel);

  29.   len = ptset.length();

  30.   //这样得到了AcGePoint3dArray,然后运用set,排除重复点:
  31.   set<CPoint3d> pts;
  32.   CPoint3d tempPt;
  33.   tempPt.SetFuzz(1e-4);
  34.   for (int i = 0; i < ptset.length();i++)
  35.   {
  36.    tempPt.copy(ptset[ i ]);
  37.    pts.insert(tempPt);
  38.   }
  39.   //利用set迭代器,构建新的AcGePoint3dArray:
  40.   size_t newlen = pts.size();
  41.   acutPrintf(_T("New size is %d"),newlen);
  42.   ptset.removeAll();
  43.   ptset.setLogicalLength(newlen);
  44.   AcGePoint3d Pt3d;
  45.   set<CPoint3d>::iterator pItr;
  46.   int i = 0;
  47.   for (pItr = pts.begin();pItr!=pts.end();pItr++)
  48.   {
  49.    acutPrintf(_T("\nPoint [%d] is : %f,%f,%f"),i,(*pItr).x,(*pItr).y,(*pItr).z);
  50.    Pt3d.x=(*pItr).x;
  51.    Pt3d.y=(*pItr).y;
  52.    Pt3d.z=(*pItr).z;
  53.    ptset[ i ] = Pt3d;
  54.    i++;
  55.   }

 楼主| 发表于 2011-6-18 16:16:05 | 显示全部楼层
本帖最后由 chpmould 于 2011-6-18 16:17 编辑
highflybird 发表于 2011-6-18 15:03
回复 chpmould 的帖子

然后在程序中这样用:


谢你的热心帮助,目前还没有看懂,先下来慢慢消化...能否不用定义一个类啊
发表于 2011-6-18 19:08:01 | 显示全部楼层
本帖最后由 highflybir 于 2011-6-18 19:14 编辑

回复 chpmould 的帖子

不学走,先要跑,是行不通的方法。
C++,类要必须掌握。
我只能说,如果这个题目不用类的方法,代码更多,更 复杂,局限性更大。
简单几句定义了类后,核心代码只有几句:

//这样得到了AcGePoint3dArray,然后运用set,排除重复点:
  set<CPoint3d> pts;
  CPoint3d tempPt;
  tempPt.SetFuzz(1e-4);
  for (int i = 0; i < ptset.length();i++)
  {
   tempPt.copy(ptset[ i ]);
   pts.insert(tempPt);
  }
发表于 2011-6-18 21:07:08 | 显示全部楼层
本帖最后由 highflybird 于 2011-6-19 15:15 编辑

回复 chpmould 的帖子

如果在点数不是很多情况下,可以这样:这样不需要排序,所以直接列举就可以了:

  1. AcGeTol tol;
  2.   tol.setEqualPoint(1e-4);
  3.   AcGePoint3dArray  NewPtSet = ptset;              //-->ptset原来 AcGePoint3dArray,  NewPtSet,就是以后要删除重复点的点集
  4.   long newLen = NewPtSet.length();
  5.   for (int i = 0;i < newLen;i++)
  6.   {
  7.    for (int j = i+1;j < newLen;j++)
  8.    {
  9.     if (NewPtSet[ j ].isEqualTo(NewPtSet[ i ],tol))
  10.     {
  11.      NewPtSet.removeAt(j);
  12.      j--;
  13.      newLen--;
  14.     }
  15.    }
  16.   }


 楼主| 发表于 2011-6-19 09:31:57 | 显示全部楼层
highflybir 发表于 2011-6-18 19:08
回复 chpmould 的帖子

不学走,先要跑,是行不通的方法。

谢谢指正,后续慢慢纠正...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:00 , Processed in 0.178016 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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