找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2080|回复: 10

[教学] XDGE几何库应用(32)--动态拖动Pline直边

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-15 16:45:09 | 显示全部楼层 |阅读模式

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

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

×
这里有个 eachy 站长用 AcDb 写的,可以和 Ge 的对比下
http://xdcad.net/forum/thread-671182-1-1.html

有了这些点下面可以执行裁剪
  1. (defun c:tt (/ e p0 pam mat p1 p2 ret lst v gepl gexl gecc3d)
  2.   (defun callback (dynpt / pts n j ptl)
  3.     (redraw)
  4.     (xdge::setpropertyvalue
  5.       gexl
  6.       "set"
  7.       dynpt
  8.       (mapcar '+ dynpt v)
  9.     )
  10.     (if        (/= (setq n (xdge::getpropertyvalue gecc3d "numIntPoints"))
  11.             0
  12.         )
  13.       (progn
  14.         (setq j 0)
  15.         (repeat        n
  16.           (setq        pts
  17.                  (cons (xdge::getpropertyvalue gecc3d "intPoint" j)
  18.                        pts
  19.                  )
  20.           )
  21.           (setq j (1+ j))
  22.         )
  23.         (setq pts
  24.                (vl-sort        pts
  25.                         '(lambda (x1 x2)
  26.                            (< (xdge::getpropertyvalue gexl "paramOf" x1)
  27.                               (xdge::getpropertyvalue gexl "paramOf" x2)
  28.                            )
  29.                          )
  30.                )
  31.         )
  32.         (while pts
  33.           (setq        ptl (cons (list (car pts) (cadr pts)) ptl)
  34.                 pts (cddr pts)
  35.           )
  36.         )
  37.         (mapcar        '(lambda (x)
  38.                    (xdrx_grdraw 1 0 (car x) (cadr x))
  39.                  )
  40.                 ptl
  41.         )
  42.       )
  43.     )
  44.   )
  45.   (if (and (setq e (xdrx_entsel "\nPick pline: "))
  46.            (setq p   (cadr e)
  47.                  pam (apply 'xdrx_curve_getparamatpoint e)
  48.                  e   (car e)
  49.            )
  50.            (eq (xdrx_polyline_segtype e (fix pam)) "kLine")
  51.            (setq lst (xdrx_polyline_getlinesegat e (fix pam)))
  52.       )
  53.     (progn
  54.       (setq gepl   (xdge::constructor e)
  55.             gexl   (xdge::constructor "kLine3d" (car lst) (cadr lst))
  56.             gecc3d (xdge::constructor "kCurveCurveInt3d" gepl gexl)
  57.             v           (apply 'mapcar (cons '- lst))
  58.       )
  59.       (xdrx_pointmonitor "Callback")
  60.       (setq p3 (getpoint p "\nNext Point: "))
  61.       (xdrx_pointmonitor)
  62.     )
  63.   )
  64.   (xdge::free)
  65.   (princ)
  66. )
000.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 16:52:21 | 显示全部楼层
拖动完了,能给裁了不? 这个应该叫 拉线推移。 最好边拉,POLYLINE跟着变化(裁剪掉外面的)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-15 16:57:56 | 显示全部楼层
newer 发表于 2014-11-15 16:52
拖动完了,能给裁了不? 这个应该叫 拉线推移。 最好边拉,POLYLINE跟着变化(裁剪掉外面的)。

可以做一个模拟 Pline 线,动态时不真正裁剪,只是显示像裁剪后的样子,确定后执行真正的裁剪 Pline

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-15 17:02:46 | 显示全部楼层
st788796 发表于 2014-11-15 16:57
可以做一个模拟 Pline 线,动态时不真正裁剪,只是显示像裁剪后的样子,确定后执行真正的裁剪 Pline

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-15 17:07:06 | 显示全部楼层
newer 发表于 2014-11-15 17:02
拉上去裁剪,拉回来恢复就牛X了。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-16 12:32:37 | 显示全部楼层
newer 发表于 2014-11-15 17:02
拉上去裁剪,拉回来恢复就牛X了。

先贴个阶段成果,明天继续
  1. (defun c:tt (/            e           gcc3d  gpl         gxl        index  lpams  myerr
  2.              olderr p           p0          p1         p2        ptl    xpams  xvec
  3.             )
  4.   ;;根据点表绘制屏幕矢量,WCS 点
  5.   (defun _Grdraw (col mod pts)
  6.     (if        (listp (caar pts))
  7.       (foreach x pts
  8.         (apply 'xdrx_grdraw (cons col (cons mod x)))
  9.         ;;(apply 'xdrx_line_make x)
  10.       )
  11.       (apply 'xdrx_grdraw (cons col (cons mod pts)))
  12.     )
  13.   )
  14.   ;;根据屏幕显示获取GeCurve 起始参数到终止参数区间模拟点
  15.   (defun _GetSamplePoints (ge startParam endParam)
  16.     (xdge::getpropertyvalue
  17.       ge
  18.       "getSamplePoints"
  19.       startParam
  20.       endParam
  21.       (* 6. (/ (cadr (getvar "screensize")) (getvar "viewsize")))
  22.     )
  23.   )
  24.   ;;获取相交体的交点参数
  25.   (defun _GetIntParams (cc3d / n i lst j nlst)
  26.     (if        (> (setq n (xdge::getpropertyvalue cc3d "numIntPoints")) 0)
  27.       (progn
  28.         (setq i 0)
  29.         (repeat        n
  30.           (setq        lst (cons (xdge::getpropertyvalue cc3d "intPoint" i)
  31.                           lst
  32.                     )
  33.                 i   (1+ i)
  34.           )
  35.         )
  36.         (setq nlst
  37.                (mapcar
  38.                  '(lambda (x)
  39.                     (list
  40.                       (xdge::getpropertyvalue gpl "paramOf" x)
  41.                       (list (xdge::getpropertyvalue gxl "paramOf" x) x)
  42.                     )
  43.                   )
  44.                  lst
  45.                )

  46.         )
  47.         (list (vl-sort (mapcar 'car nlst) '<)
  48.               (mapcar 'cadr
  49.                       (vl-sort (mapcar 'cadr nlst)
  50.                                '(lambda (a b) (< (car a) (car b)))
  51.                       )
  52.               )
  53.         )
  54.       )
  55.     )
  56.   )
  57.   ;;曲线为非逆时针时反转曲线
  58.   (defun _IsUnClockWize        (curve)
  59.     (and (not (xdrx_curve_direction curve))
  60.          (xdrx_curve_reverse curve)
  61.     )
  62.     t
  63.   )
  64.   (defun _Pnts:PairWise        (pts / ptl len)
  65.     (setq len (length pts))
  66.     (if        (<= len 2)
  67.       pts
  68.       (progn
  69.         (while (> (length pts) 1)
  70.           (setq        ptl (cons (list (car pts) (cadr pts)) ptl)
  71.                 pts (cddr pts)
  72.           )
  73.         )
  74.         (reverse ptl)
  75.       )
  76.     )
  77.   )
  78.   (defun callback (dynpt / pams xpts)
  79.     (xdge::setpropertyvalue
  80.       gxl
  81.       "set"
  82.       dynpt
  83.       (mapcar '+ dynpt xvec)
  84.     )
  85.     (redraw)
  86.     (if        (setq pams (_GetIntParams gcc3d))
  87.       (progn
  88.         (setq lpams (car pams)
  89.               xpts  (cadr pams)
  90.         )
  91.         (_Grdraw 1 0 (_Pnts:PairWise xpts))
  92.         (if (minusp (xdrx_point_dist2line dynpt p1 p2))
  93.           (mapcar
  94.             '(lambda (x)
  95.                (_grdraw 1 0 (_GetSamplePoints gpl (car x) (cadr x)))
  96.              )
  97.             (_Pnts:PairWise lpams)
  98.           ) ;_inside
  99.           (mapcar
  100.             '(lambda (x)
  101.                (_grdraw 1 0 (_GetSamplePoints gpl (car x) (cadr x)))
  102.              )
  103.             (_Pnts:PairWise (cdr lpams))
  104.           )
  105.         )
  106.       )
  107.     )
  108.     (princ)
  109.   )
  110.   (defun myerr (msg /)
  111.     (princ "\n*cancel*")
  112.     (xdrx_pointmonitor)
  113.     (xdrx_entity_setvisible e t)
  114.     (xdge::free)
  115.     (princ)
  116.   )
  117.   (if (and (setq e (xdrx_entsel
  118.                      "\nPick LineSeg On Pline: "
  119.                      '((0 . "lwpolyline"))
  120.                    )
  121.            )
  122.            (setq p     (apply 'xdrx_curve_getclosestpoint e)
  123.                  e     (car e)
  124.                  index (fix (xdrx_curve_getparamatpoint e p))
  125.            )
  126.            (= (xdrx_polyline_segtype e index) "kLine")
  127.            (_IsUnClockWize e)
  128.       )
  129.     (progn
  130.       (setq olderr  *error*
  131.             *error* myerr
  132.       )
  133.       (setq index (fix (xdrx_curve_getparamatpoint e p)))
  134.       (mapcar 'set '(p1 p2) (xdrx_polyline_getlinesegat e index))
  135.       (xd::polyline:resetstartpoint e p1)
  136.       (setq xvec  (mapcar '- p2 p1)
  137.             gpl          (xdge::constructor e) ;_ GetGeCurve of lwpolyline
  138.             gxl          (xdge::constructor "kLine3d" p1 p2) ;_ xline
  139.             gcc3d (xdge::constructor "kCurveCurveInt3d" gpl gxl)
  140.       )
  141.       (xdrx_entity_setvisible e nil)
  142.       (xdrx_pointmonitor "callback")
  143.       (if (setq p0 (getpoint p "\nPosition: "))
  144.         (progn
  145.           (princ "\nok!")
  146.         )
  147.       )
  148.       (xdrx_pointmonitor)
  149.       (xdrx_entity_setvisible e t)
  150.       (xdge::free)
  151.       (setq *error* olderr)
  152.     )
  153.   )
  154.   (princ)
  155. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8612个

财富等级: 富甲天下

发表于 2014-11-16 15:49:26 | 显示全部楼层
出错,说什么参数类型错误

点评

射线法求交点时,有一种情况,折点在射线上,st长老这段代码还没有处理这种情况,遇到这种点的时候出错退出,期待完善  详情 回复 发表于 2014-11-16 15:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-11-16 15:55:54 来自手机 | 显示全部楼层
liuyj 发表于 2014-11-16 15:49
出错,说什么参数类型错误

射线法求交点时,有一种情况,折点在射线上,st长老这段代码还没有处理这种情况,遇到这种点的时候出错退出,期待完善
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-17 16:50:35 | 显示全部楼层
csharp 发表于 2014-11-16 15:55
射线法求交点时,有一种情况,折点在射线上,st长老这段代码还没有处理这种情况,遇到这种点的时候出错退 ...

两Curve 相交时的信息都在 getIntConfigs 中,这个信息说明了 曲线1 是如何和 曲线2 相交的,在 AutoCAD 中所有曲线都是“有向”曲线(xline 是负无穷到正无穷),configs 就说明这个方向, left 表示进入曲线, right 表示离开曲线, overlap 表示重叠,kRightRigth 表示曲线1上交点前后的点都在另一曲线一侧,下面是一个测试

条件:pline 逆时针,xline 正方向 为 x 轴方向

  1. (defun c:tt (/ e1 e2 gpl gxl gcc i)
  2.   (defun _getIntPoints (cc3d / n lst i)
  3.     (if        (> (setq n (xdge::getpropertyvalue cc3d "numIntPoints")) 0)
  4.       (progn
  5.         (setq i 0)
  6.         (repeat        n
  7.           (setq        lst (cons (xdge::getpropertyvalue
  8.                             cc3d "intPoint" i "getIntConfigs" i)
  9.                           lst
  10.                     )
  11.                 i   (1+ i)
  12.           )
  13.         )
  14.         (setq
  15.           lst
  16.            (vl-remove-if
  17.              '(lambda (x)
  18.                 (= (last x) "kRightRight")
  19.               );_去掉一些点
  20.              (vl-sort
  21.                lst
  22.                '(lambda        (x1 x2)
  23.                   (< (xdge::getpropertyvalue gxl "paramOf" (car x1))
  24.                      (xdge::getpropertyvalue gxl "paramOf" (car x2))
  25.                   )
  26.                 )
  27.              );_按 xline 上参数排序
  28.            )
  29.         )
  30.       )
  31.     )
  32.   )
  33.   (if
  34.     (and (setq
  35.            e1 (car (xdrx_entsel "\nPick Pline: " '((0 . "lwpolyline"))))
  36.          )
  37.          (setq e2 (car (xdrx_entsel "\nPick Xline: " '((0 . "xline")))))
  38.     )
  39.      (progn
  40.        (setq gpl (xdge::constructor e1)
  41.              gxl (xdge::constructor e2)
  42.              gcc (xdge::constructor "kCurveCurveInt3d" gpl gxl)
  43.              i 0
  44.        )
  45.        (mapcar
  46.          '(lambda (x)
  47.             (xdrx_entity_setcolor (xdrx_point_make x) (setq i (1+ i)))
  48.           )
  49.          (mapcar 'car (_getIntPoints gcc))
  50.        )
  51.      )
  52.   )
  53.   (xdge::free)
  54.   (princ)
  55. )

20141117164915.jpg

点评

能不能分成几种形式,单独把上面的图扣出来放大,说明下那些RIGHTRIGHT等的意义。  详情 回复 发表于 2014-11-17 17:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-17 17:00:12 | 显示全部楼层
st788796 发表于 2014-11-17 16:50
两Curve 相交时的信息都在 getIntConfigs 中,这个信息说明了 曲线1 是如何和 曲线2 相交的,在 AutoCAD  ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-17 17:12:27 | 显示全部楼层
XDSoft 发表于 2014-11-17 17:00
能不能分成几种形式,单独把上面的图扣出来放大,说明下那些RIGHTRIGHT等的意义。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 19:45 , Processed in 0.220171 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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