找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2523|回复: 21

[求助] 大神求教,getSamplePoints怎么用的啊,我这样写为什么无效

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-7-30 10:57:37 | 显示全部楼层 |阅读模式

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

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

×
我这样写对无弧多段线,和闭合有弧多段线都不适用,总是只能取到2个样本点。这是为什么呢?照理说如果多段线无弧,应该是取得所有点的吧。现在这样写,只对圆弧椭圆以及未闭合有弧多段线起效,获得的样本点个数是对的。
  1. static void xxxMyGrouptest()
  2.         {
  3.                 AcDbObjectId entId = CSSUtil::selectOne(L"\nselect");
  4.                 AcDbCurve* pCurve = NULL;
  5.                 AcGePoint3dArray points;
  6.                 AcGeDoubleArray paras;
  7.                 double startPa, endPa,tol=0.001;
  8.                 AcGePoint3d pt;
  9.                 if (acdbOpenObject(pCurve,entId,AcDb::kForRead)==Acad ::eOk)
  10.                 {
  11.                         AcGeCurve3d* pGecurve = NULL;
  12.                         ErrorStatus es=pCurve->getAcGeCurve(pGecurve);
  13.                         if (es==Acad ::eOk)
  14.                         {
  15.                                 pCurve->getStartParam(startPa);
  16.                                 pCurve->getEndParam(endPa);
  17.                                 pGecurve->getSamplePoints(startPa, endPa, tol, points, paras);
  18.                                 acutPrintf(L"\n The length of Points is %d", points.length());
  19.                                 delete pGecurve;
  20.                         }
  21.                         pCurve->close();
  22.                 }
  23. }

我按张帆书上这样写也是一样的,是不是因为我用的是acgecurve3d,他用的是acgecurve2d呢?
  1. static void xxxMyGrouptest()
  2.         {
  3.                 AcDbObjectId entId = CSSUtil::selectOne(L"\nselect");
  4.                 AcDbCurve* pCurve = NULL;
  5.                 AcGePoint3dArray points;
  6.                 AcGeDoubleArray paras;
  7.                 AcGePoint3d ptStart, ptEnd;
  8.                 double startPa, endPa,tol=0.001;
  9.                 AcGePoint3d pt;
  10.                 if (acdbOpenObject(pCurve,entId,AcDb::kForRead)==Acad ::eOk)
  11.                 {
  12.                         AcGeCurve3d* pGecurve = NULL;
  13.                         ErrorStatus es=pCurve->getAcGeCurve(pGecurve);
  14.                         if (es==Acad ::eOk && pGecurve->hasStartPoint(ptStart) && pGecurve->hasEndPoint(ptEnd))
  15.                         {
  16.                                 startPa=pGecurve->paramOf(ptStart);
  17.                                 endPa = pGecurve->paramOf(ptEnd);
  18.                                 pGecurve->getSamplePoints(startPa, endPa, tol, points, paras);
  19.                                 acutPrintf(L"\n The length of Points is %d", points.length());
  20.                                 delete pGecurve;
  21.                         }
  22.                         pCurve->close();
  23.                 }
  24. }


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

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-7-30 11:38:10 | 显示全部楼层
直线段想多个,用等分,整数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-30 13:31:44 来自手机 | 显示全部楼层
LoveArx 发表于 2018-7-30 11:38
直线段想多个,用等分,整数。

可是我看书上说,多段线用这个函数是能有效果的啊。直线段会保持原样,弧段会按弦高差取点,我这为什么不行。你用过这个取样本点函数对无线多段线也是失效吗?
来自: 微社区

点评

自己去试试XDRX API的 (xdrx_getamplept ent [整数 or 弦高距]) 吧,就是ARX实现的  详情 回复 发表于 2018-7-30 16:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-7-30 16:29:25 | 显示全部楼层
1121443108qaz 发表于 2018-7-30 13:31
可是我看书上说,多段线用这个函数是能有效果的啊。直线段会保持原样,弧段会按弦高差取点,我这为什么不 ...

自己去试试XDRX API的 (xdrx_getamplept ent [整数 or 弦高距]) 吧,就是ARX实现的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-8-2 11:55:59 来自手机 | 显示全部楼层
newer 发表于 2018-7-30 16:29
自己去试试XDRX API的 (xdrx_getamplept ent [整数 or 弦高距]) 吧,就是ARX实现的

看了,用acgecurve中的acgeinterval,getbound得到上下参数值后用getsamplepoints就成功了
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-4-11 17:20:17 | 显示全部楼层
请问仁兄,如何解决的?可否提供一下源代码?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-4-11 20:58:48 | 显示全部楼层
// 获得几何曲线的样本点
        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);
        pInterval.getBounds(ptStart.x, ptEnd.x);
        pInterval.getBounds(ptStart.y, ptEnd.y);
        pGeCurve->getSamplePoints(valueSt, valueEn, approxEps, SamplePtArray, ParamArray);

我这样加了代码,还是不行

点评

我感觉你用的函数和我的不大一样,我的见下  详情 回复 发表于 2019-4-12 01:52
变量 approxEps 这个值在哪赋值的?  详情 回复 发表于 2019-4-11 21:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2019-4-11 21:23:53 | 显示全部楼层
liankaijingshui 发表于 2019-4-11 20:58
// 获得几何曲线的样本点
        AcGePoint2dArray SamplePtArray;                                // 存储曲线的样本点
        AcGeDoubleArray P ...

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2019-4-12 01:52:53 | 显示全部楼层
本帖最后由 1121443108qaz 于 2019-4-12 01:55 编辑
liankaijingshui 发表于 2019-4-11 20:58
// 获得几何曲线的样本点
        AcGePoint2dArray SamplePtArray;                                // 存储曲线的样本点
        AcGeDoubleArray P ...

我感觉你用的函数和我的不大一样,我的见下
  1.        void xxxxx::getSamplePoint(const AcDbCurve* pCurve, AcGePoint3dArray &points, double approEps /* = 0.001 */){
  2.         AcGeCurve3d *pGeCurve = NULL;
  3.         AcGeDoubleArray paras;
  4.         AcGeInterval val;
  5.         double startPa, endPa;
  6.         if (pCurve->getAcGeCurve(pGeCurve)==Acad ::eOk)
  7.         {
  8.                 pGeCurve->getInterval(val);
  9.                 val.getBounds(startPa, endPa);
  10.                 pGeCurve->getSamplePoints(startPa, endPa, approEps, points, paras,true);
  11.                 delete pGeCurve;
  12.         }
  13. }

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

使用道具 举报

发表于 2019-4-12 11:00:51 | 显示全部楼层
可以加QQ吗?我的QQ是304364034
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-4-12 11:07:16 | 显示全部楼层
谢谢诸位仁兄,成功了!

点评

嗯嗯,你做这个获取样本点是什么用途啊  发表于 2019-4-12 11:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-4-12 17:09:23 | 显示全部楼层
不好意思,我想请教一个问题:通过多段线获得一个选择集之后,我把选择中的实体ObjectId加入到AcDcObjectIdArray中,然后我又作为边界的多段线的ObjectId也加入到AcDcObjectIdArray中,最后通过wblock(AcDbDatabase*& pOutputDb, const AcDcObjectIdArray& outObjIds, const AcGePoint3d& basePoint)的第一种形式存储为新的dwg文件,但是报错。如果不加入多段线的ObjectId,可以保存成功。

点评

或许你没有把作为边界的多段线close()掉,你获取wblock返回的Acad::ErrorStatus 值,再用aacaderrorstatustext()打印出来看看是什么问题,如是还解决不了,你最好上传你的源码大家看看。  详情 回复 发表于 2019-4-12 21:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2019-4-12 21:06:58 | 显示全部楼层
liankaijingshui 发表于 2019-4-12 17:09
不好意思,我想请教一个问题:通过多段线获得一个选择集之后,我把选择中的实体ObjectId加入到AcDcObjectId ...

或许你没有把作为边界的多段线close()掉,你获取wblock返回的Acad::ErrorStatus 值,再用aacaderrorstatustext()打印出来看看是什么问题,如是还解决不了,你最好上传你的源码大家看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-4-13 10:11:22 | 显示全部楼层
非常感谢!就是在wblock之前先把多段线close一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-4-15 17:56:43 | 显示全部楼层
// 根据多段线构建二维几何曲线
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);
        }
        //AcDbEntity *pNewPpline = AcDbEntity::cast(pPline->clone());
        //ObjectIdArray.append(pNewPpline->objectId());   // 将作为边界的多段线本身的Id也加入到所选择实体的数组中
        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线路-牧野变"));
        rbFilter.resval.rstring = sbuf;
        rbFilter.rbnext = NULL;
       
        // 使用acedSSGet函数创建选择集
        ads_name ssName;                        // 选择集名称
        //int rt = acedSSGet(char2wchar(selectMode), rb, NULL, NULL, ssName);
        int rt = acedSSGet(char2wchar(selectMode), rb, NULL, &rbFilter, ssName);
        if (rt != RTNORM)
        {               
                acutRelRb(rb);                        // 释放结果缓冲区链表
                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;
}

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("0"));
                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加入当前选择集
                                subgraphIdArray.append(pPolyline->objectId());
                                pPolyline->close();

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

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

                pSourceDb = NULL;
        }
} ;

现在遇到的主要问题是,在多段线里面选择集另存为dwg文件后,选择集里面是空的。我现在把代码贴上去了,麻烦诸位仁兄看一下吧,谢谢!接着我把原dwg文件传一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:59 , Processed in 0.224870 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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