找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2113|回复: 3

[教学] XDGE几何库应用(18)--AcGeCurveCurveInt3d简介

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-27 09:24:05 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2014-11-1 08:07 编辑

AcGe 类库中,除了 AcGeLinearEnt AcGeCircArc  AcGeEllipArc 有 intersectWith() 方法,其它曲线求交只能使用这个相交体

另外求 Pline 自相交点时可以将 CompositeCrv3d 构造自己和自己的相交体
参见 http://www.xdcad.net/forum/forum.php?mod=redirect&goto=findpost&ptid=675963&pid=3529921

构造方法

1 (setq gcc (xdge::constructro "kCurveCurveInt3d"))
默认构造,构造完成后可以使用 set 方法添加组成构造体的 GeCurve

2 (setq gcc (xdge::constructor "kCurveCurveInt3d" ge1 ge2 normal)

3 (setq gcc (xdge::constructor "kCurveCurveInt3d" ge1 ge2 interval1 interval2 normal)
构造曲线的一部分间相交体,interval 是 AcGeInterval  实体

一个测试

  1. (defun c:tt (/ e1 e2 ge1 ge2 gcc n i ptl pl)
  2.   (if
  3.     (and (setq
  4.            e1 (car (xdrx_entsel
  5.                      "\nPick Curve1: "
  6.                      '((0 . "*Polyline,Line,spline,circle,ellipse,arc"))
  7.                    )
  8.               )
  9.          )
  10.          (setq
  11.            e2 (car (xdrx_entsel
  12.                      "\nPick Curve1: "
  13.                      '((0 . "*Polyline,Line,spline,circle,ellipse,arc"))
  14.                    )
  15.               )
  16.          )
  17.          (setq ge1 (xdge::constructor e1)) ;_构造曲线一的 GeCurve
  18.          (setq ge2 (xdge::constructor e2)) ;_构造曲线一的 GeCurve
  19.          (setq gcc (xdge::constructor "kCurveCurveInt3d")) ;_构造曲线相交体
  20.          (xdge::setpropertyvalue
  21.            gcc
  22.            "set"
  23.            ge1
  24.            ge2
  25.            (xdrx_getpropertyvalue e1 "Normal")
  26.          )
  27.          (> (setq n (xdge::getpropertyvalue gcc "numIntPoints")) 0) ;_判断交点数量
  28.     )
  29.      (progn
  30.        (xdge::getpropertyvalue gcc "orderWrt2") ;_将交点按曲线一的参数排升序
  31.        (setq i -1)
  32.        (repeat n
  33.          (setq ptl
  34.                    (cons
  35.                      (xdge::getpropertyvalue gcc "intPoint" (setq i (1+ i))) ;_索引处交点
  36.                      ptl
  37.                    )
  38.                pl  (cons (xdge::getpropertyvalue gcc "getIntParams" i) pl) ;_交点索引处参数(位于两个曲线上的)
  39.          )
  40.        )
  41.        (princ "\n第一条曲线交点参数为: ")
  42.        (princ (mapcar 'car pl)) ;_曲线一上的交点参数
  43.        (princ "\n第二条曲线交点参数为: ")
  44.        (princ (mapcar 'cadr pl)) ;_曲线一上的交点参数
  45.        (setq i 0)
  46.        (mapcar
  47.          '(lambda (x)
  48.             (xdrx_entity_setcolor (xdrx_point_make x) (setq i (1+ i)))
  49.           )
  50.          ptl
  51.        )
  52.      )
  53.   )
  54.   (xdge::free)
  55.   (princ)
  56. )

gcc.gif

本帖被以下淘专辑推荐:

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

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-9-27 10:21:34 | 显示全部楼层
XDAPI 中 xdrx_polyline_xtrim 自相交点断开的 Lisp 方式
  1. (defun Polyline:XTrim (e / ge gcc n i lst rangs pams)
  2.   (if (and (setq ge (xdge::constructor e))
  3.            (setq gcc (xdge::constructor "kCurveCurveInt3d"));_最新版本直接构造方法无效
  4.            (xdge::setpropertyvalue gcc "set" ge ge '(0. 0. 1.));_用 set 方法构造
  5.            (> (setq n (xdge::getpropertyvalue gcc "numIntPoints")) 0)

  6.       )
  7.     (progn
  8.       (setq i -1)
  9.       (repeat n
  10.         (setq lst (cons        (xdge::getpropertyvalue
  11.                           gcc
  12.                           "getIntParams"
  13.                           (setq i (1+ i))
  14.                         )
  15.                         lst
  16.                   ) ;_这里的参数是长度
  17.         )
  18.       )
  19.       (setq pams
  20.              (vl-sort
  21.                (mapcar
  22.                  '(lambda (x)
  23.                     (apply '+
  24.                            (xdge::getpropertyvalue ge "globalToLocalParam" x)
  25.                     ) ;_转换为本地参数
  26.                   )
  27.                  (mapcar 'car lst)
  28.                )
  29.                '<
  30.              )
  31.       )
  32.       (apply 'xdrx_curve_getsplitcurves (cons e pams));_目前API版本该方法无效了,期待下一版本改进
  33.     )
  34.   )
  35.   (xdge::free)
  36.   t
  37. )
  38. (defun c:tt (/ e)
  39.   (if (setq e (car (xdrx_entsel "\npick pline: " '((0 . "lwpolyline")))))
  40.     (polyline:xtrim e)
  41.   )
  42.   (princ)
  43. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-9-27 16:48:07 | 显示全部楼层
本帖最后由 st788796 于 2014-9-27 17:09 编辑
st788796 发表于 2014-9-27 10:21
XDAPI 中 xdrx_polyline_xtrim 自相交点断开的 Lisp 方式

更正一下
这里只能用参数断开,每个交点可能代表两个以上参数位置
  1. (defun Polyline:XTrim (e / ge gcc n i lst rangs pams)
  2.   (if (and (setq ge (xdge::constructor e))
  3.            (setq gcc (xdge::constructor "kCurveCurveInt3d"))
  4.            (xdge::setpropertyvalue gcc "set" ge ge '(0. 0. 1.))
  5.            (> (setq n (xdge::getpropertyvalue gcc "numIntPoints")) 0)

  6.       )
  7.     (progn
  8.       (setq i -1)
  9.       (repeat n
  10.         (setq lst (cons        (xdge::getpropertyvalue
  11.                           gcc
  12.                           "getIntParams"
  13.                           (setq i (1+ i))
  14.                         )
  15.                         lst
  16.                   ) ;_这里的参数是长度
  17.         )
  18.       )
  19.       (setq pams
  20.              (vl-sort
  21.                (apply 'append
  22.                       (mapcar
  23.                         '(lambda (x)
  24.                            (list (apply        '+
  25.                                         (xdge::getpropertyvalue
  26.                                           ge
  27.                                           "globalToLocalParam"
  28.                                           (car x)
  29.                                         )
  30.                                  ) ;_转换为
  31.                                  (apply        '+
  32.                                         (xdge::getpropertyvalue
  33.                                           ge
  34.                                           "globalToLocalParam"
  35.                                           (cadr x)
  36.                                         )
  37.                                  )
  38.                            )
  39.                          )
  40.                         lst
  41.                       )
  42.                )
  43.                '<
  44.              )
  45.       )
  46.       (apply 'xdrx_curve_getsplitcurves (cons e pams))
  47.     )
  48.   )
  49.   (xdge::free)
  50.   t
  51. )
  52. (defun c:tt (/ e)
  53.   (if (setq e (car (xdrx_entsel "\npick pline: " '((0 . "lwpolyline")))))
  54.     (polyline:xtrim e)
  55.   )
  56.   (princ)
  57. )

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-10-1 15:34:36 | 显示全部楼层
本帖最后由 csharp 于 2014-10-1 15:37 编辑

试试  XdGe 几何库
  1. (defun getoverlap (ge1 ge2 / cc3d n index)
  2.   (setq cc3d (xdge::constructor "kCurveCurveInt3d" ge1 ge2))
  3.   (if (> (setq n (xdge::getpropertyvalue cc3d "overlapCount")) 0)
  4.     (progn
  5.       (setq index -1)
  6.       (repeat n
  7.         (setq lst (cons        (xdge::getpropertyvalue
  8.                           cc3d
  9.                           "getOverlapRanges"
  10.                           (setq index (1+ index))
  11.                         )
  12.                         lst
  13.                   )
  14.         )
  15.       )
  16.       (setq lst
  17.              (list
  18.                (mapcar
  19.                  '(lambda (x)
  20.                     (xdge::getpropertyvalue x "lowerBound" "upperBound")
  21.                   )
  22.                  (mapcar 'car lst)
  23.                )
  24.                (mapcar
  25.                  '(lambda (x)
  26.                     (xdge::getpropertyvalue x "lowerBound" "upperBound")
  27.                   )
  28.                  (mapcar 'cadr lst)
  29.                )
  30.              )
  31.       )
  32.     )
  33.   )
  34.   (xdge::free)
  35.   lst
  36. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 19:54 , Processed in 0.443451 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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