找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1280|回复: 11

[研讨] 关于getOrthoProjectedCurve函数

[复制链接]
发表于 2017-3-2 16:06:13 | 显示全部楼层 |阅读模式

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

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

×
    virtual Acad::ErrorStatus getOrthoProjectedCurve(const AcGePlane&,
                                                AcDbCurve*& projCrv) const;

AcDbCurve的这个函数,目前发现两个问题,
1、当曲线是AcDbPolyline时,不支持这个方法。(估计是顶点不含Z坐标的原因);
2、当曲线是AcDb3dPolyline时,支持这个方法,但是得到的曲线是投影到AcGePlane后再投影到世界坐标的  XOY平面的曲线。
不知道是否有哪位大神研究过?是否如此?

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

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-3-2 18:37:30 | 显示全部楼层
你可以查询下 Acad::ErrorStatus 返回值,看看是什么。

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2017-3-2 20:35:44 | 显示全部楼层
本帖最后由 Lispboy 于 2017-3-2 20:46 编辑

用 XDRX API写个LISP测试程序,LWPOLYLINE是可以正交投影的,看演示和数据

曲线正交投影.gif

投影是到垂直于世界坐标系X轴,即法线是世界坐标系Y轴的平面投影。

结果:

选择要投影的曲线<退出>:
投影面原点<0,0,0>:
向法线为(0 1 0)的平面正交投影后,得到1条曲线.
  曲线 1 类型为:LWPOLYLINE,投影后曲线类型为:SPLINE ,顶点数=0
选择要投影的曲线<退出>:
投影面原点<0,0,0>:
向法线为(0 1 0)的平面正交投影后,得到1条曲线.
  曲线 1 类型为:LWPOLYLINE,投影后曲线类型为:LWPOLYLINE ,顶点数=7
选择要投影的曲线<退出>:
投影面原点<0,0,0>:
向法线为(0 1 0)的平面正交投影后,得到1条曲线.
  曲线 1 类型为:ELLIPSE,投影后曲线类型为:LINE ,顶点数=2
选择要投影的曲线<退出>:
投影面原点<0,0,0>:
向法线为(0 1 0)的平面正交投影后,得到1条曲线.
  曲线 1 类型为:ARC,投影后曲线类型为:LINE ,顶点数=2
选择要投影的曲线<退出>:
投影面原点<0,0,0>:
向法线为(0 1 0)的平面正交投影后,得到1条曲线.
  曲线 1 类型为:LINE,投影后曲线类型为:LINE ,顶点数=2
选择要投影的曲线<退出>:
投影面原点<0,0,0>:
向法线为(0 1 0)的平面正交投影后,得到1条曲线.
  曲线 1 类型为:SPLINE,投影后曲线类型为:SPLINE ,顶点数=0


结论:
   1、 LWPOLYLINE投影后,类型可能变化,带弧线段的,投影后会变成SPLINE,否则是LWPOLYLINE
   2、 圆,弧,椭圆投影后可能变成直线,也可能根据投影面不同,变成椭圆。

  1. (defun c:tt ()
  2.   (while (setq e (car (xdrx_entsel
  3.                      "\n选择要投影的曲线<退出>:"
  4.                      '((0 . "LINE,*POLYLINE,ARC,CIRCLE,ELLIPSE,SPLINE"))
  5.                    )
  6.               )
  7.       )

  8.     (progn
  9.       (if (not (setq ori (getpoint "\n投影面原点<0,0,0>:")))
  10.         (setq ori '(0 0 0))
  11.       )
  12.       (if (setq e1 (xdrx_curve_getProjectCurve
  13.                      e
  14.                      (list ori '(1.0 0.0 0.0) '(0. 0. 1.0))
  15.                    )
  16.           )
  17.         (progn
  18.           (xdrx_prompt
  19.             "\n向法线为(0 1 0)的平面正交投影后,得到"
  20.             (sslength e1)
  21.             "条曲线."
  22.           )
  23.           (setq i 0)
  24.           (mapcar
  25.             '(lambda (x)
  26.                (xdrx_setpropertyvalue x "color" (xdrx_math_rand 1 10))
  27.                (setq i (1+ i))
  28.                (xdrx_prompt
  29.                  "\n  曲线 "
  30.                  i
  31.                  " 类型为:"
  32.                  (car (xdrx_object_classname e))
  33.                  ",投影后曲线类型为:"
  34.                  (car (xdrx_object_classname x))
  35.                  " ,顶点数="
  36.                  (length (xdrx_getpropertyvalue x "vertices"))
  37.                )
  38.              )
  39.             (xdrx_pickset->ents e1)
  40.           )
  41.         )
  42.       )
  43.     )
  44.   )
  45.   (princ)
  46. )



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

使用道具 举报

 楼主| 发表于 2017-3-2 22:02:43 | 显示全部楼层
本帖最后由 lionguns 于 2017-3-2 22:10 编辑

可以用以下代码试,空间直线之类是可以的。多段线,直接eNotApplicable。三维多段线,被拍成二维的了。


ads_name eName;
ads_point pt;

if( RTNORM != acedEntSel(_T("\nPlease select a solid "), eName, pt ))
        return;

AcDbObjectId id;
acdbGetObjectId( id, eName );
AcDbObjectPointer<AcDbCurve> pPoly(id, AcDb::kForRead);
AcDbCurve *pCrvOrtho;
Acad::ErrorStatus es;
AcGePlane pln(AcGePoint3d(10, 10, 0), AcGeVector3d(0, 1, 0));
es = pPoly->getOrthoProjectedCurve(pln, pCrvOrtho);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-2 22:04:21 | 显示全部楼层

可以炸开再投影,我是说直接用这个方法是乎是不行。

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-2 22:57:15 | 显示全部楼层

XDRX API就是用ARX写的,LISPBOY的例子看到,直接LWPOLYLINE是能够投影成SPLINE或者LWPOLYLINE的。你试试把你的代码投影平面改到LISPBOY的例子的平面,看看能投影不?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-3 10:59:53 | 显示全部楼层

都有试过,多段线是不行的,
他演示的可以,应该是在函数里对多段线进行了处理了,最后是可以了,事实上应该是个模拟。
多段线的凸度没法表达椭圆,我估计这是CAD不让对它变换的原因吧。

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-3 11:02:56 | 显示全部楼层

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-3 11:06:23 | 显示全部楼层

测试来下LISPBOY的程序,发现了问题

在2016下面,多段线是可以投影的, 在2008下面,多段线不行,

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-3 11:36:09 | 显示全部楼层

修改了下LISPBOY的代码, 在2008下面,可以通过几何库的

AcGeCurve3d::orthoProject Function
AcGeEntity3d *
orthoProject(
const AcGePlane& projectionPlane,
const AcGeTol& tol = AcGeContext::gTol) const;
projectionPlaneInput plane on which curve is to be projected
tolInput tolerance
Returns the entity that is the orthogonal projection of the curve onto the projection plane. The returned entity may not be of the same type as the original curve and may not even be a curve (for instance, a line projects into a point if it is orthogonal to the projection plane). The returned entity is created with the new operator and it is the responsibility of the caller to delete it.

GE曲线投影.gif

在低版本CAD, 你可以先把DB曲线转换成GE曲线,然后用 pGeCrv->orthoProject(plane),投影变换。


  1. 命令: tt
  2. 选择要投影的曲线<退出>:
  3. 投影面原点<0,0,0>:
  4. 向法线为(0 1 0)的平面正交投影后,得到 1  条曲线.
  5.   曲线 1 类型为:LINE,投影后曲线类型为:LINE ,顶点数=2
  6. 选择要投影的曲线<退出>:
  7. 投影面原点<0,0,0>:
  8. 向法线为(0 1 0)的平面正交投影后,得到 1  条曲线.
  9.   曲线 1 类型为:LINE,投影后曲线类型为:LINE ,顶点数=2
  10. 选择要投影的曲线<退出>:
  11. 投影面原点<0,0,0>:
  12. 向法线为(0 1 0)的平面正交投影后,得到 1  条曲线.
  13.   曲线 1 类型为:SPLINE,投影后曲线类型为:SPLINE ,顶点数=0
  14. 选择要投影的曲线<退出>:
复制代码


  1. (defun c:tt ()
  2.   (while (setq e (car (xdrx_entsel "\n选择要投影的曲线<退出>:" '((0 . "LINE,*POLYLINE,ARC,CIRCLE,ELLIPSE,SPLINE")))))
  3.     (progn
  4.       (if (not (setq ori (getpoint "\n投影面原点<0,0,0>:")))
  5.         (setq ori '(0 0 0))
  6.       )
  7.       (setq g (xdge::constructor e))
  8.       (setq gl nil)
  9.       (setq plane (xdge::constructor "kPlane" ori '(0.0 1.0 0.0)))
  10.       (if (= (xdge::type g) "kCompositeCrv3d")
  11.         (setq gl (xdge::getpropertyvalue g "getcurvelist"))
  12.         (setq gl (cons g gl)
  13.               el nil
  14.         )
  15.       )
  16.       (mapcar
  17.         '(lambda (x)
  18.            (setq e (xdge::getpropertyvalue x "orthoproject" plane))
  19.            (setq e (xdge::entity:make e)
  20.                  el (cons e el)
  21.            )
  22.          )
  23.         gl
  24.       )
  25.       (xdrx_curve_join el)
  26.       (xdrx_prompt "\n向法线为(0 1 0)的平面正交投影后,得到 1 " " 条曲线.")
  27.       (setq i 0)
  28.       (xdrx_setpropertyvalue (entlast) "color" (xdrx_math_rand 1 10))
  29.       (setq i (1+ i))
  30.       (xdrx_prompt "\n  曲线 " i " 类型为:" (car
  31.                                                  (xdrx_object_classname
  32.                                                                         (entlast)
  33.                                                  )
  34.                                             ) ",投影后曲线类型为:"
  35.                    (car (xdrx_object_classname (entlast))) " ,顶点数="
  36.                    (length (xdrx_getpropertyvalue e "vertices"))
  37.       )
  38.       (xdge::free)
  39.     )
  40.   )
  41.   (princ)
  42. )




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

使用道具 举报

 楼主| 发表于 2017-3-4 09:35:28 | 显示全部楼层
谢谢大家的讨论。看来确实是CAD低版本的问题。再次感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 22:25 , Processed in 0.308396 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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