天气与日历 切换到窄版

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

ObjectARX为lisp提供重复点去除功能,有容差参数

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
//Cpp文件中定义静态变量
static double ComparePoint3d_Tol;

//定义比较函数

static bool IsEqual(double a, double b, double tol = 1.0E-7)

        {

                return (fabs(a - b) < tol);

        }

        static bool lessPt(const AcGePoint3d& pt1,const AcGePoint3d& pt2)

        {

                if(IsEqual(pt1.x,pt2.x,ComparePoint3d_Tol))

                {

                        if(IsEqual(pt1.y,pt2.y,ComparePoint3d_Tol))

                        {

                                return pt1.z < pt2.z;

                        }

                        return pt1.y < pt2.y;

                }

                return pt1.x < pt2.x;

        }

        static bool equalPt(const AcGePoint3d& pt1,const AcGePoint3d& pt2)

        {

                AcGeTol geTol;

                geTol.setEqualPoint(ComparePoint3d_Tol);

                return pt1.isEqualTo(pt2,geTol);

        }

函数主体

//去除重复的点

        // ----- ads_delsamept symbol (do not rename)

        static int ads_delsamept(void)

        {

                //----- Remove the following line if you do not expect any argument for this ADS function

                struct resbuf *rb =acedGetArgs();

                ComparePoint3d_Tol = 0.001;

                std::vector<AcGePoint3d> pts;

                if (rb== NULL)

                {

                        return acedRetNil();

                }

                else

                {

                        if(rb->restype!=RTLB)

                        {

                                return acedRetNil();

                        }

                        else

                        {

                                rb = rb->rbnext;

                                while(true)

                                {

                                        if (rb->restype == RTPOINT)

                                        {

                                                pts.push_back(AcGePoint3d(rb->resval.rpoint[0],rb->resval.rpoint[1],0));

                                                rb = rb->rbnext;

                                        }

                                        else if (rb->restype == RT3DPOINT)

                                        {

                                                pts.push_back(AcGePoint3d(rb->resval.rpoint[0],rb->resval.rpoint[1],rb->resval.rpoint[2]));

                                                rb = rb->rbnext;

                                        }

                                        else if (rb->restype == 10)

                                        {

                                                pts.push_back(AcGePoint3d(rb->resval.rpoint[0],rb->resval.rpoint[1],rb->resval.rpoint[2]));

                                                rb = rb->rbnext;

                                        }

                                        else if(rb->restype==RTLE)

                                        {

                                                break;

                                        }

                                        else

                                        {

                                                return acedRetNil();

                                        }

                                }

                                if (rb->rbnext == NULL)

                                {

                                        return acedRetNil();

                                }

                                rb = rb->rbnext;

                                if (rb->restype == RTSHORT)

                                {

                                        ComparePoint3d_Tol = rb->resval.rint;

                                }

                                else if (rb->restype == RTREAL)

                                {

                                        ComparePoint3d_Tol = rb->resval.rreal;

                                }

                                else if (rb->restype == RTLONG)

                                {

                                        ComparePoint3d_Tol = rb->resval.rlong;

                                }

                                if (rb->rbnext != NULL)

                                {

                                        return acedRetNil();

                                }

                        }

                       

                }

                std::sort(pts.begin(),pts.end(),lessPt);

                pts.erase(std::unique(pts.begin(),pts.end(),equalPt),pts.end());

                struct resbuf *bufList=NULL;

                for (int i = 0 ;i < pts.size(); i++)

                {

                        if (bufList == NULL)

                                bufList=acutBuildList(RT3DPOINT,pts.at(i),RTNONE);

                        else

                                bufList=acutBuildList(RTRESBUF,bufList,RT3DPOINT,pts.at(i),RTNONE);

                }

                return acedRetList(bufList);

        }

(delsamept (list (list 0 0) (list 10 10) (list 0 10)) 0.001)
(delsamept (list (list 0 0) (list 10 10) (list 0 10)) 0.11)
(delsamept (list (list 0 0) (list 0 0.002) (list 0 10)) 0.11)
(delsamept (list (list 0 0)  (list 0 10) (list 0 0.002)) 0.11)


(delsamept (list (list 0 0)  (list 0 10) T ) 0.11)


(delsamept (list (list 0 0 0 0)  (list 0 10) (list 0 0.002)) 0.11)
(delsamept (list (list 0 0 0)  (list 0 10 0) (list 0 0.002 0)) 0.11)

((0.0 0.0 0.0) (10.0 10.0 0.0) (0.0 10.0 0.0))
((0.0 0.0 0.0) (10.0 10.0 0.0) (0.0 10.0 0.0))
((0.0 0.002 0.0) (0.0 10.0 0.0))
((0.0 0.002 0.0) (0.0 10.0 0.0))
nil
nil
((0.0 0.002 0.0) (0.0 10.0 0.0))
((0.0 0.002 0.0) (0.0 10.0 0.0))
_$

 

 

 

 

ObjectARX为lisp提供重复点去除功能,有容差参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 10:37 , Processed in 0.166993 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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