找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2097|回复: 27

[求助]:如何打断光滑曲线?

[复制链接]
发表于 2004-3-12 21:28:45 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-12 23:36:33 | 显示全部楼层

Re: [求助]:如何打断光滑曲线?

最初由 Gxiaofeng 发布
[B]同上 [/B]


任何曲线都可以用:

[php]
virtual Acad::ErrorStatus

getSplitCurves(

const AcGePoint3dArray& points,

AcDbVoidPtrArray& curveSegments) const;

points Input array of points (in WCS coordinates) on the curve

curveSegments Returns with pointers to newly created entities that are

subcurves of the original
[/php]


[php]
virtual Acad::ErrorStatus

getSplitCurves(

const AcGeDoubleArray& params,

AcDbVoidPtrArray& curveSegments) const;

params Input array of parameters on the curve

curveSegments Returns with pointers to newly created entities that are

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

使用道具 举报

 楼主| 发表于 2004-3-13 11:20:10 | 显示全部楼层
我临时写了一段,选择两个实体打断后选的,我试打断其它实体没事,可打断PolyLine的样条曲线就不行了!就是用PE命令S拟合过的!如何解决???
[php]
        AcDbObjectId entId;
        ads_name sget,ename;
        AcGePoint3dArray points;
        ads_ssget(NULL,NULL,NULL,NULL,sget);
        acedSSName(sget,0,ename);
        acdbGetObjectId(entId,ename);
        AcDbEntity *pEnt1,*pEnt2;
        acdbOpenAcDbEntity(pEnt1,entId,AcDb::kForRead);
        acedSSName(sget,1,ename);
        acdbGetObjectId(entId,ename);
        acdbOpenAcDbEntity(pEnt2,entId,AcDb::kForRead);
        pEnt1->intersectWith(pEnt2,AcDb::kOnBothOperands,points,0,0);
        pEnt2->close();
        pEnt1->close();
        double a;
        AcDbCurve* pCurve = NULL;
        acedSSName(sget,1,ename);
        acdbGetObjectId(entId,ename);
        acdbOpenObject(pCurve, entId, AcDb::kForRead);
        if(pCurve == NULL) { pCurve->close(); return;}
        AcDbVoidPtrArray curves;
        AcGeDoubleArray params;
        for (i=0;i<points.length();i++)
        {
                pCurve->getParamAtPoint(points,a);
                params.append(a);
        }
        if (pCurve->getSplitCurves(params,curves) != Acad::eOk )
        {
                pCurve->close();
                acutPrintf("\n错!");
                return;
        }
        pCurve->close();
        acutPrintf("\n%d",curves.length());
        for (i=0;i<curves.length();i++)
                addToModelSpace((AcDbEntity*)curves);

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-13 20:33:34 | 显示全部楼层
最初由 Gxiaofeng 发布
[B]我临时写了一段,选择两个实体打断后选的,我试打断其它实体没事,可打断PolyLine的样条曲线就不行了!就是用PE命令S拟合过的!如何解决???
[php]
        AcDbObjectId entId;
        ads_name sget,ename;
        AcGePoint3dArray poi... [/B]


你测试下:

pCurve->getParamAtPoint(points,a);

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

使用道具 举报

 楼主| 发表于 2004-3-14 11:51:22 | 显示全部楼层
非常感谢XD回复!!希望能帮我解决这个问题,我已经经困惑很久了!!
我测试了没问题的!
        if (pCurve->getParamAtPoint(points,a) == Acad::eOk)
            params.append(a);
        else
           acutPrintf("\n错!");

    只有到这一步才会出错,,也不返回错误信息!????
        if (pCurve->getSplitCurves(params,curves) != Acad::eOk )//
           {
            pCurve->close();
            acutPrintf("\n错!");
            return;
         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-14 23:30:10 | 显示全部楼层
最初由 Gxiaofeng 发布
[B]非常感谢XD回复!!希望能帮我解决这个问题,我已经经困惑很久了!!
我测试了没问题的!
        if (pCurve->getParamAtPoint(points,a) == Acad::eOk)
            params.append(a);
        else
           ... [/B]


下面是XDRX API里面的一个供LISP调用外部函数,你参照下,你也可以修改下代码,把读入LISP参数的部分去掉,自己编译下,看看是否可以。

  1. [font=courier]
  2. int getSplitCurves()
  3. {
  4.         resbuf *rb=ads_getargs();
  5.         if (!rb)
  6.                 return RTNORM;
  7.         if (rb->restype!=RTENAME)
  8.                 return RTNORM;
  9.         AcDbObjectId entId;
  10.         acdbGetObjectId(entId,rb->resval.rlname);
  11.         rb=rb->rbnext;
  12.         BOOL paramFlag=FALSE;
  13.         AcGePoint3dArray splitPointArray;
  14.         AcGeDoubleArray  splitParamArray;
  15.         if (rb)
  16.         {
  17.                 if (rb->restype==RTREAL)
  18.                 {
  19.                         while (rb)
  20.                         {
  21.                                 if (rb->restype==RTREAL)
  22.                                         splitParamArray.append(rb->resval.rreal);
  23.                                 else
  24.                                         return RTNORM;
  25.                                 rb=rb->rbnext;
  26.                         }
  27.                 }
  28.                 else if (rb->restype==RT3DPOINT)
  29.                 {
  30.                         while (rb)
  31.                         {
  32.                                 if (rb->restype==RT3DPOINT)
  33.                                         splitPointArray.append(XdGeUtils::ucsToWcs(asPnt3d(rb->resval.rpoint)));
  34.                                 else
  35.                                         return RTNORM;
  36.                                 rb=rb->rbnext;
  37.                         }
  38.                 }
  39.                 else
  40.                         return RTNORM;
  41.         }
  42.         AcDbCurve *pCurve;
  43.         if (acdbOpenObject(pCurve,entId,AcDb::kForRead)!=Acad::eOk)
  44.                 return RTNORM;
  45.         Acad::ErrorStatus es;
  46.         AcDbVoidPtrArray curveSegments;
  47.         if (!splitPointArray.isEmpty())
  48.                 es=pCurve->getSplitCurves(splitPointArray,curveSegments);
  49.         else
  50.                 es=pCurve->getSplitCurves(splitParamArray,curveSegments);
  51.         if (es==Acad::eOk)
  52.         {
  53.                 if (!curveSegments.isEmpty())
  54.                 {
  55.                         if (pCurve->upgradeOpen()==Acad::eOk)
  56.                         {
  57.                                 AcDbEntity *pEnt=(AcDbEntity *)curveSegments.first();
  58.                                 if (pEnt)
  59.                                 {
  60.                                         curveSegments.removeFirst();
  61.                                         pCurve->handOverTo(pEnt);
  62.                                         delete pCurve;
  63.                                         pCurve=(AcDbCurve *)pEnt;
  64.                                     pCurve->recordGraphicsModified();
  65.                                 }
  66.                         }
  67.                         XdDbUtils::addToModelSpaceAndClose(&curveSegments);
  68.                 actrTransactionManager->flushGraphics();
  69.                         ads_rett();
  70.                 }
  71.         }
  72.         else
  73.                 acadErrorStatusText(es);
  74.         pCurve->close();
  75.         return RTNORM;
  76. }
  77. [/font]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-15 10:27:18 | 显示全部楼层
非常感谢XD给出的例子!  [U]Thanks you![/U]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-15 10:34:57 | 显示全部楼层
最初由 Gxiaofeng 发布
[B]非常感谢XD给出的例子!  [U]Thanks you![/U] [/B]


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

使用道具 举报

 楼主| 发表于 2004-3-15 19:52:23 | 显示全部楼层
XD还是不行啊!!!
   我试过你给的函数了也是存在这个问题.
  另外我还试了一小XDAPI里的函数也是有这个问题.
  是不是用PE命令S拟合过多义线CAD不是用getSplitCurves函数来处理的???? .....郁闷....
没办法了......
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-15 23:29:28 | 显示全部楼层
我也来听听,斑竹不要扣我分啊,我只是想打个标记而已
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-16 00:07:12 | 显示全部楼层
用pe命令S拟合过多义线,可直接用expllode进行打断.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-16 00:46:00 | 显示全部楼层
最初由 Gxiaofeng 发布
[B]XD还是不行啊!!!
   我试过你给的函数了也是存在这个问题.
  另外我还试了一小XDAPI里的函数也是有这个问题.
  是不是用PE命令S拟合过多义线CAD不是用getSplitCurves函数来处理的???? .....郁闷....
没办法了..... [/B]


你的程序中,求得交点后,再用:AcDbCurve::getClosestPointTo 求得曲线上距这个交点最近的点(保证点一定在曲线上),然后再用求得的最近点用AcDbCurve::getSplitCurves 试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-16 18:15:19 | 显示全部楼层

打断光滑曲线

我试过了还不是行,得到的最近点和求得的交点是一样的.....
  还是我哪搞错了?

[PHP]
AcGePoint3dArray points;
AcGePoint3d pointOnCurve;

  for (i=0;i<points.length();i++)
   if (pCurve->getClosestPointTo(points,pointOnCurve,false)==Acad::eOk)
      if (pCurve->getParamAtPoint(pointOnCurve,a) == Acad::eOk)
          params.append(a);
      else
          acutPrintf("\n错!");
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-21 19:29:03 | 显示全部楼层
这是CAD本身的漏洞,打不断的,就是CAD本身的命令,也有打不断的时候。若打断点离控制比较近,就会出现此种情况。另找他法去吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-22 20:37:31 | 显示全部楼层
最初由 penglihui 发布
[B]这是CAD本身的漏洞,打不断的,就是CAD本身的命令,也有打不断的时候。若打断点离控制比较近,就会出现此种情况。另找他法去吧 [/B]


如果我先对样条做一些运算(判断是二次样条还是三次样条然后算出实点在修改此实体.
  我是看AUTO MAP打断样条线后绘出现此结果.
  这样做笨不笨?
  各位高人还有其它高招!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 06:27 , Processed in 0.256960 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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