找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1188|回复: 9

[求助] acedSSGet的返回值,有的是RTNORM,有的是-5001

[复制链接]
发表于 2019-4-30 14:03:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
同一张CAD图形内,对不同的多段线进行acedSSGet选择集操作时,有的返回值是RTNORM,有的是-5001?
谢谢大家了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2019-4-30 14:31:57 | 显示全部楼层
不是RTNORM就是出错了
把你全部的代码贴上来,
并且,你看下出错时候,你的多段线有什么问题没
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-30 15:50:14 | 显示全部楼层
#include "StdAfx.h"
#include "resource.h"
#include <dbpl.h>
#include <gecomp2d.h>
#include "Common\Document\DwgDatabaseUtil.h"
#include "Common\SortCStringArray\SortCStringArray.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("GYDL")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint

wchar_t* char2wchar(const char* cchar)
{
    wchar_t *m_wchar;
    int len = MultiByteToWideChar( CP_ACP ,0,cchar ,strlen( cchar), NULL,0);
    m_wchar= new wchar_t[len+1];
    MultiByteToWideChar( CP_ACP ,0,cchar,strlen( cchar),m_wchar,len);
    m_wchar[len]= '\0';
    return m_wchar;
}

// 根据多段线构建二维几何曲线
static bool PolyToGeCurve(AcDbPolyline *pPline, AcGeCurve2d *&pGeCurve)
{       
        int nSegs;                                                        // 多段线的段数
        AcGeLineSeg2d line, *pLine;                        // 几何曲线的直线段部分
        AcGeCircArc2d arc, *pArc;                        // 几何曲线的圆弧部分
        AcGeVoidPointerArray geCurves;                // 指向组成几何曲线各分段的指针数组                                                               
       
        nSegs = pPline->numVerts() - 1;
       
        // 根据多段线创建对应的分段几何曲线
        for (int i = 0; i < nSegs; i++)
        {
                if (pPline->segType(i) == AcDbPolyline::kLine)
                {
                        pPline->getLineSegAt(i, line);
                        pLine = new AcGeLineSeg2d(line);
                        geCurves.append(pLine);
                }
                else if (pPline->segType(i) == AcDbPolyline::kArc)
                {
                        pPline->getArcSegAt(i, arc);
                        pArc = new AcGeCircArc2d(arc);
                        geCurves.append(pArc);
                }
        }
       
        // 处理闭合多段线最后一段是圆弧的情况
        if (pPline->isClosed() && pPline->segType(nSegs) == AcDbPolyline::kArc)
        {
                pPline->getArcSegAt(nSegs, arc);
                pArc = new AcGeCircArc2d(arc);
                pArc->setAngles(arc.startAng(), arc.endAng() - (arc.endAng() - arc.startAng()) / 100);
                geCurves.append(pArc);
        }
       
        // 根据分段的几何曲线创建对应的复合曲线
        if (geCurves.length() == 1)
        {
                pGeCurve = (AcGeCurve2d *)geCurves[0];
        }
        else
        {
                pGeCurve = new AcGeCompositeCurve2d(geCurves);
        }
       
        // 释放动态分配的内存
        if (geCurves.length() > 1)
        {
                for (int i = 0; i < geCurves.length(); i++)
                {
                        delete geCurves[i];
                }
        }

        return true;
}

// 根据指定的一组点创建一个结果缓冲区链表
struct resbuf* BuildRbFromPtArray(const AcGePoint2dArray &arrPoints)
{
        struct resbuf *retRb = NULL;
        int count = arrPoints.length();
        if (count <= 1)
        {
                acedAlert(TEXT("函数BuildBbFromPtArray中, 点数组包含元素个数不足!"));
                return retRb;
        }
       
        // 使用第一个点来构建结果缓冲区链表的头节点
        ads_point adsPt;
        adsPt[X] = arrPoints[0].x;
        adsPt[Y] = arrPoints[0].y;
        retRb = acutBuildList(RTPOINT, adsPt, RTNONE);
       
        struct resbuf *nextRb = retRb;                // 辅助指针

        for (int i = 1; i < count; i++)                        // 注意:不考虑第一个元素,因此i从1开始
        {
                adsPt[X] = arrPoints[i].x;
                adsPt[Y] = arrPoints[i].y;
                // 动态创建新的节点,并将其链接到原来的链表尾部
                nextRb->rbnext = acutBuildList(RTPOINT, adsPt, RTNONE);
                nextRb = nextRb->rbnext;
        }

        return retRb;
}

// 选择位于多段线内部的所有实体
static bool SelectEntInPoly(AcDbPolyline *pPline, AcDbObjectIdArray &ObjectIdArray, const char *selectMode, double approxEps)
{
        // 判断selectMode的有效性
        if (_tcscmp(char2wchar(selectMode), TEXT("CP")) != 0 && _tcscmp(char2wchar(selectMode), TEXT("WP")) != 0)
        {
                acedAlert(TEXT("函数SelectEntInPline中, 指定了无效的选择模式!"));
                return false;
        }
       
        // 清除数组中所有的ObjectId
        /*for (int i = 0; i < ObjectIdArray.length(); i++)
        {
                ObjectIdArray.removeAt(i);
        }*/
        ObjectIdArray.removeAll();

        AcGeCurve2d *pGeCurve;                                                    // 多段线对应的几何曲线
        Adesk::Boolean bClosed = pPline->isClosed();        // 多段线是否闭合
        if (bClosed != Adesk::kTrue)                                    // 确保多段线作为选择边界时是闭合的
        {
                pPline->setClosed(!bClosed);
        }       

        // 创建对应的几何类曲线
        PolyToGeCurve(pPline, pGeCurve);

        // 获得几何曲线的样本点
        AcGePoint2dArray SamplePtArray;                                // 存储曲线的样本点
        AcGeDoubleArray ParamArray;                                        // 存储样本点对应的参数值
        AcGePoint2d ptStart, ptEnd;                                // 几何曲线的起点和终点
        Adesk::Boolean bRet = pGeCurve->hasStartPoint(ptStart);
        bRet = pGeCurve->hasEndPoint(ptEnd);
        double valueSt = pGeCurve->paramOf(ptStart);
        double valueEn = pGeCurve->paramOf(ptEnd);
        AcGeInterval pInterval;
        //pGeCurve->getInterval(pInterval, ptStart, ptEnd);
        pGeCurve->getInterval(pInterval);
        //pInterval.getBounds(ptStart.x, ptEnd.x);
        //pInterval.getBounds(ptStart.y, ptEnd.y);
        pInterval.getBounds(valueSt, valueEn);
        pGeCurve->getSamplePoints(valueSt, valueEn, approxEps, SamplePtArray, ParamArray);

        delete pGeCurve;                // 在函数PolyToGeCurve中分配了内存

        // 确保样本点的起点和终点不重合
        AcGeTol tol;
        tol.setEqualPoint(0.01);
        AcGePoint2d ptFirst = SamplePtArray[0];
        AcGePoint2d ptLast = SamplePtArray[SamplePtArray.length() - 1];
        if (ptFirst.isEqualTo(ptLast))
        {
                SamplePtArray.removeLast();
        }

        // 根据样本点创建结果缓冲区链表
        struct resbuf *rb;
        rb = BuildRbFromPtArray(SamplePtArray);

        //设置过滤条件
        /*struct resbuf rbFilter;
        TCHAR sbuf[50];
        rbFilter.restype = 0;
        //_tcscpy(sbuf, TEXT("10kV线路-牧野变"));
        _tcscpy(sbuf, TEXT("1"));
        rbFilter.resval.rstring = sbuf;
        rbFilter.rbnext = NULL;*/
        /*struct resbuf *rbFilter;
        rbFilter = acutBuildList(
                8, TEXT("0,10kV线路-牧野变,10kV线路-平东变,10kV线路-朱庄变,110kV变电站,110kV变电站名称,110kV变电站容量,2020年网格边界,分段开关,联络开关,网格编号,线路编号,线路相连"),
                RTNONE);*/


       
        // 使用acedSSGet函数创建选择集
        ads_name ssName;                        // 选择集名称
        int rt = acedSSGet(char2wchar(selectMode), rb, NULL, NULL, ssName);
        //int rt = acedSSGet(char2wchar(selectMode), rb, NULL, rbFilter, ssName);
        //int rt = acedSSGet(char2wchar(selectMode), rb, NULL, &rbFilter, ssName);
        if (rt != RTNORM)
        {
                acutRelRb(rb);                        // 释放结果缓冲区链表
                acedAlert(TEXT("acedSSGet的返回值不等于RTNORM!"));
                return false;
        }
       
        // 将选择集中所有的对象添加到ObjectIdArray
        long length;
        acedSSLength(ssName, &length);
        for (int i = 0; i < length; i++)
        {
                // 获得指定元素的ObjectId
                ads_name ent;
                acedSSName(ssName, i, ent);
                AcDbObjectId objId;
                acdbGetObjectId(objId, ent);

                // 获得指向当前元素的指针
                AcDbEntity *pEnt;
                Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);

                // 选择到作为边界的多段线了,直接跳过该次循环
                if (es == Acad::eWasOpenForWrite)
                {
                        continue;
                }

                ObjectIdArray.append(pEnt->objectId());

                pEnt->close();
        }

        // 释放内存
        acutRelRb(rb);                                                                // 释放结果缓冲区链表
        acedSSFree(ssName);                                                        // 删除选择集

        return true;
}

/*
该函数的功能及处理思路如下:
一、首先将获取的网格编号放入CStringArray类型的GridNOs
    1、根据objectId获取ads_name;
        2、根据ads_name获取其所在的图层名;
        3、判断图层名中是否含有“网格编号”,如果有,说明该图层中都是网格编号的名字
        4、将该图层中都是网格编号的名字写入GridNOs中
二、对GridNOs中网格编号的尾号进行提取并排序
三、生成网格切图的子图文件名称,并通过函数参数输出
*/
void GenerateSubgraphFileName(const AcDbObjectIdArray &InputSubgraphIdArray, CString InputLayerName, CString &OutputSubgraphFileName)
{
        if (InputSubgraphIdArray.isEmpty())
        {
                return;
        }
        //一、将获取的网格编号放入CStringArray
        CStringArray GridNOs;
        GridNOs.RemoveAll();
        for (int j = 0; j < InputSubgraphIdArray.length(); j++)
        {
                AcDbObject *ObjPrt;
                acdbOpenObject(ObjPrt,InputSubgraphIdArray[j],AcDb::kForRead);
                if(ObjPrt->isKindOf(AcDbText::desc()))
                {
                        ads_name objName;
                        struct resbuf *rbTargEnt;
                        struct resbuf *rbTrav;
                        ACHAR lyrName[32];
                        memset(lyrName,'\0',sizeof(lyrName));

                        //1、根据objectId获取ads_name
                        acdbGetAdsName(objName, InputSubgraphIdArray[j]);

                        //2、根据ads_name获取其所在的图层名
                        rbTargEnt = acdbEntGet(objName);
                        if (!rbTargEnt)
                        {
                                acutPrintf(_T("\n获取目标实体数据失败!"));
                                return;
                        }

                        rbTrav = rbTargEnt;
                        while (rbTrav)
                        {
                                switch (rbTrav->restype)
                                {
                                        case 8:
                                                strcpy(reinterpret_cast<char *>(lyrName), reinterpret_cast<const char*>(rbTrav->resval.rstring));
                                                break;
                                }
                                rbTrav=rbTrav->rbnext;
                        }
                        CString layerName;
                        layerName.Format(_T("%s"), lyrName);
                       
                        //3、判断图层名中是否含有“网格编号”,如果有,说明该图层中都是网格编号的名字
                        //4、将该图层中都是网格编号的名字写入GridNOs中
                        if(0 <= layerName.Find(InputLayerName))
                        {
                                AcDbObject *Obj_Prt;
                                acdbOpenObject(Obj_Prt, InputSubgraphIdArray[j], AcDb::kForRead);
                                if(ObjPrt->isKindOf(AcDbText::desc()))
                                {
                                        //Obj_Prt->close();
                                        AcDbText *pent;
                                        acdbOpenObject(pent, InputSubgraphIdArray[j], AcDb::kForRead);
                                        GridNOs.Add(pent->textString());
                                        pent->close();
                                }
                                Obj_Prt->close();
                        }
                }
                ObjPrt->close();
        }

        //二、对GridNOs中网格编号的尾号进行提取并排序
        SortCStringArray sortArray;
        sortArray.RemoveAll();
        if(!GridNOs.IsEmpty())
        {
                for (int k = 0; k < GridNOs.GetCount(); k++)
                {
                        int lastShortLinePos = GridNOs[k].ReverseFind('-');
                        sortArray.Add(GridNOs[k].Mid(lastShortLinePos + 1));
                }
                sortArray.Sort();
        }

        //三、生成网格切图的子图文件名称,并通过函数参数输出
        if(!GridNOs.IsEmpty())
        {
                OutputSubgraphFileName = GridNOs[0].Left(GridNOs[0].ReverseFind('-') + 1);
                for (int m = 0; m < sortArray.GetCount(); m++)
                {
                        OutputSubgraphFileName.Append(sortArray[m]);
                        OutputSubgraphFileName.Append(_T("、"));
                }
                OutputSubgraphFileName.Delete(OutputSubgraphFileName.GetLength()-1);
        }
}

class CSegmentationByGridApp : public AcRxArxApp {

public:
        CSegmentationByGridApp () : AcRxArxApp () {}

        virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
                // TODO: Load dependencies here

                // You *must* call On_kInitAppMsg here
                AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
               
                // TODO: Add your initialization code here

                return (retCode) ;
        }

        virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
                // TODO: Add your code here

                // You *must* call On_kUnloadAppMsg here
                AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

                // TODO: Unload dependencies here

                return (retCode) ;
        }

        virtual void RegisterServerComponents () {
        }

public:

        // - GYDLSegmentationByGrid.dividedByGrid command (do not rename)
        static void GYDLSegmentationByGriddividedByGrid(void)
        {
                // Add your code for command GYDLSegmentationByGrid.dividedByGrid here

                //获取当前图层上所有实体的Id
                //AcDbObjectIdArray allBorderIds = CDwgDatabaseUtil::GetAllEntityIds(TEXT("图层1"));
                //AcDbObjectIdArray allBorderIds = CDwgDatabaseUtil::GetAllEntityIds(TEXT("网格边界"));
                //AcDbObjectIdArray allBorderIds = CDwgDatabaseUtil::GetAllEntityIds(TEXT("0"));
                //AcDbObjectIdArray allBorderIds = CDwgDatabaseUtil::GetAllEntityIds(TEXT("LS——供电单元"));
                AcDbObjectIdArray allBorderIds = CDwgDatabaseUtil::GetAllEntityIds(TEXT("2020年网格边界"));

                //获取当前dwg文件的图形数据库
                AcDbDatabase *pSourceDb = acdbHostApplicationServices()->workingDatabase();

                //创建分图的图形数据库
                AcDbDatabase *pSubgraphDestDb = NULL;

                //建立多段线网格边界的圈交(CP)模式选择集数组
                AcDbObjectIdArray subgraphIdArray;
               
                for (int i = 0; i < allBorderIds.length(); i++)
                {
                        AcDbPolyline *pPolyline = NULL;
                        if (acdbOpenObject(pPolyline, allBorderIds[i], AcDb::kForWrite) == Acad::eOk)
                        {
                                //获取每个多段线网格边界的圈交(CP)模式选择集的Id
                                SelectEntInPoly(pPolyline, subgraphIdArray, "CP", 1);

                                //将多段线网格边界的Id加入当前选择集
                                int lenSubgraphIdArray = subgraphIdArray.length();
                                subgraphIdArray.append(pPolyline->objectId());
                                pPolyline->close();

                                //使用wblock将当前图形数据库中的多段线网格边界及其选择集导出到一个新的图形数据库中
                                Acad::ErrorStatus es = pSourceDb->wblock(pSubgraphDestDb, subgraphIdArray, AcGePoint3d::kOrigin);
                                assert (es == Acad::eOk);

                                //调用GenerateSubgraphFileName生成子图的文件名
                                CString subgraphFileName;
                                GenerateSubgraphFileName(subgraphIdArray, _T("网格编号"), subgraphFileName);

                                //将切分出来的子图存为dwg文件
                                if ("" == subgraphFileName)
                                {
                                        CString d;
                                        d.Format(_T("%d"),i);//整型转字符串
                                        pSubgraphDestDb->saveAs(_T("E:/PartialGraph/" + d + ".dwg")); // 使用saveAs成员函数时,必须指定包含dwg扩展名的文件名称
                                }
                                else
                                {
                                        pSubgraphDestDb->saveAs(_T("E:/PartialGraph/" + subgraphFileName + ".dwg")); // 使用saveAs成员函数时,必须指定包含dwg扩展名的文件名称
                                }

                                pSubgraphDestDb->closeInput(true);
                                delete pSubgraphDestDb;
                                pSubgraphDestDb = NULL;
                        }
                }

                pSourceDb = NULL;
        }
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CSegmentationByGridApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CSegmentationByGridApp, GYDLSegmentationByGrid, dividedByGrid, dividedByGrid, ACRX_CMD_TRANSPARENT | ACRX_CMD_NOINTERNALLOCK, NULL)

点评

你说的有时候行,有时候不行,不行的时候是什么情况? WCS,UCS下用的?  详情 回复 发表于 2019-4-30 16:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2019-4-30 16:30:08 | 显示全部楼层
liankaijingshui 发表于 2019-4-30 15:50
#include "StdAfx.h"
#include "resource.h"
#include

你说的有时候行,有时候不行,不行的时候是什么情况? WCS,UCS下用的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-30 16:48:07 | 显示全部楼层
首先谢谢大家,通过测试,我基本搞清楚原因了。举个例子:一副CAD图,有四个多线段,若将这四个多线段和多线段里面的实体都显示在AutoCAD的窗口之中,则使用acedSSGet进行选择集操作时,则是成功的,返回的是RTNORM;然后我们将CAD图放大,只显示一个多线段及其里面的实体,再使用acedSSGet进行选择集操作时,则返回值不是RTNORM,选择失败。

那么大家遇到这类问题时,如果可以对整张CAD图进行选择集操作,并且能成功呢?

点评

这个是必须的,SSGET除了X以外,其他的都需要显示在屏幕内。 好的代码,应该先ZOOM到屏幕内,把需要的。  详情 回复 发表于 2019-4-30 17:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2019-4-30 17:05:15 | 显示全部楼层
liankaijingshui 发表于 2019-4-30 16:48
首先谢谢大家,通过测试,我基本搞清楚原因了。举个例子:一副CAD图,有四个多线段,若将这四个多线段和多 ...

这个是必须的,SSGET除了X以外,其他的都需要显示在屏幕内。
好的代码,应该先ZOOM到屏幕内,把需要的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-30 18:12:47 | 显示全部楼层
谢谢!除了上述原因之外,有时候,我也把需要的区域显示在屏幕内了,但acedSSGet的返回值还是-5001,现在还没找到原因所在。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2019-5-1 00:45:05 来自手机 | 显示全部楼层
可能的原因之一是捕捉可能会影响acedssget,所以应该先关掉
原因之二就是有相邻重复点,就是连续两个点是一样的,去掉之后就行了。
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-5 10:08:29 | 显示全部楼层
我没有使用acedSetVar设置捕捉模式,那如何去掉相邻的重复点呢?可否举一下例子源码?谢谢!

点评

建立个新表的数组,遍历你的点表,和上一个点的距离小于容差的,你不添加到新表里面。 最后新表就是不重复的了  详情 回复 发表于 2019-5-5 11:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2019-5-5 11:02:08 | 显示全部楼层
liankaijingshui 发表于 2019-5-5 10:08
我没有使用acedSetVar设置捕捉模式,那如何去掉相邻的重复点呢?可否举一下例子源码?谢谢!

建立个新表的数组,遍历你的点表,和上一个点的距离小于容差的,你不添加到新表里面。
最后新表就是不重复的了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-24 13:26 , Processed in 0.227282 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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