找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1186|回复: 2

[每日一码] 计算曲线上两点间的距离

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2021-1-21 11:04:14 | 显示全部楼层 |阅读模式

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

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

×

dbp2.JPG

  1. ;;; Calculate distance between 2 specified points on curve object
  2. ;;; Required Subroutines: AT:DrawX
  3. ;;; Alan J. Thompson, 03.20.10 / 03.28.10
  4. (defun c:DBP (/ *error* #Obj #Pnt #Pnt2 #D1 #D2 #List #Dist ent)
  5.   (vl-load-com)
  6.   (redraw)
  7.   (setq *error* (lambda (m) (and (= (type #Obj) 'VLA-OBJECT)  (vla-highlight #Obj :vlax-false))))
  8.   (and
  9.     (AT:DrawX (setq #Pnt (getpoint "\nSpecify first point on curve: "))  3)
  10.     (or  (setq #Obj
  11.                   (ssget "c"
  12.                         (polar #Pnt -0.7854 (* 0.01 (getvar 'viewsize)))
  13.                         (polar #Pnt 2.3562 (* 0.01 (getvar 'viewsize)))
  14.                         '((0 . "ARC,CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE"))
  15.                   )
  16.         )
  17.         (alert "Point must be on curve!")
  18.     ) ;_ or
  19.     (AT:DrawX  (setq #Pnt2 (getpoint #Pnt "\nSpecify next point on curve: ")) 3)
  20.     (or (and
  21.             (setq #Obj
  22.                     (ssget "c"
  23.                             (polar #Pnt2 -0.7854 (* 0.01 (getvar 'viewsize)))
  24.                             (polar #Pnt2 2.3562 (* 0.01 (getvar 'viewsize)))
  25.                             '((0 . "ARC,CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE"))
  26.                     )
  27.             )
  28.             (vl-some (function
  29.                         (lambda (x)
  30.                             (and (setq ent x)
  31.                                   (vlax-curve-getdistatpoint x (trans #Pnt 1 0))
  32.                                   (vlax-curve-getdistatpoint x (trans #Pnt2 1 0))
  33.                             )
  34.                         )
  35.                     )
  36.                     (vl-remove-if 'listp (mapcar 'cadr (ssnamex #Obj)))
  37.             )
  38.             (setq #D2 (vlax-curve-getDistAtPoint (setq #Obj (vlax-ename->vla-object ent)) (trans #Pnt2 1 0)))
  39.             (setq #D1 (vlax-curve-getDistAtPoint #Obj (trans #Pnt 1 0)))
  40.             (not (vla-highlight #Obj :vlax-true))
  41.         ) ;_ and
  42.         (alert "Points must be on curve!")
  43.     ) ;_ or
  44.     (progn
  45.       (setq #Dist (car (setq #List (vl-sort (list #D1 #D2) '<))))
  46.       (while (< #Dist (- (cadr #List) (/ (cadr #List) 100.)))
  47.         (grdraw
  48.           (trans (vlax-curve-getPointAtDist #Obj #Dist) 0 1)
  49.           (trans (vlax-curve-getPointAtDist #Obj (setq #Dist (+ (/ (cadr #List) 100.) #Dist))) 0 1)
  50.           1
  51.         ) ;_ grdraw
  52.       ) ;_ while
  53.       (princ)
  54.       (alert (strcat "Distance between points on curve: "
  55.                     (rtos (abs (- #D1 #D2)) (getvar 'lunits) (getvar 'luprec))
  56.             ) ;_ strcat
  57.       ) ;_ alert
  58.     ) ;_ progn
  59.   ) ;_ and
  60.   (*error* nil)
  61.   (princ)
  62. ) ;_ defun


  63. ;;; Draw and "X" vector at specified point
  64. ;;; P - Placement point for "X"
  65. ;;; C - Color of "X" (must be integer b/w 1 & 255)
  66. ;;; Alan J. Thompson, 10.31.09 / 03.26.10
  67.   (defun AT:DrawX (P C / d n)
  68.     (if (and (vl-consp P)
  69.             (setq d (* (getvar "VIEWSIZE") 0.02))
  70.         ) ;_ and
  71.       (progn (grvecs (cons C
  72.                           (mapcar
  73.                             (function (lambda (#)  (polar P (* # pi) d) ))
  74.                             '(0.25 1.25 0.75 1.75)
  75.                           ) ;_ mapcar
  76.                     ) ;_ cons
  77.             ) ;_ grvecs1
  78.             P
  79.       ) ;_ progn
  80.     ) ;_ if
  81.   ) ;_ defun


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

已领礼包: 64个

财富等级: 招财进宝

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

使用道具 举报

发表于 2022-6-9 09:31:21 | 显示全部楼层
看到好贴必点赞,感谢分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 02:13 , Processed in 0.171188 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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