找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3014|回复: 23

[LISP函数]:怎么获得多义线某分段的长度

[复制链接]
发表于 2006-10-22 19:31:48 | 显示全部楼层 |阅读模式

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

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

×
如题,你点击多义线,则显示该分段的长度
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-10-26 12:40:56 | 显示全部楼层
求cen也可以用(osnap pt "cen")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 0 反对 1

使用道具 举报

发表于 2006-10-22 20:01:47 | 显示全部楼层

  1. (defun c:test ()
  2.   (setq ent (entsel "\nselect pline:"))
  3.   (setq obj (vlax-ename->vla-object (car ent)))
  4.   (setq pt (cadr ent))
  5.   (setq        param (vlax-curve-getparamatpoint
  6.                 obj
  7.                 (vlax-curve-getclosestpointto obj pt)
  8.               )
  9.   )
  10.   (setq pre-pt-index (fix param))
  11.   (setq next-pt-index (+ (fix param) 1))
  12.   (setq
  13.     pre-pt (vlax-safearray->list
  14.              (vlax-variant-value
  15.                (vla-get-coordinate obj pre-pt-index)
  16.              )
  17.            )
  18.   )
  19.   (setq
  20.     next-pt (vlax-safearray->list
  21.               (vlax-variant-value
  22.                 (vla-get-coordinate obj next-pt-index)
  23.               )
  24.             )
  25.   )
  26.   (princ (strcat "\n本段长:" (rtos (distance pre-pt next-pt)))
  27.   )
  28.   (princ)
  29. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-22 22:52:54 | 显示全部楼层
两个vlax-curve-getDistAtParam之差
要比(distance pre-pt next-pt)更简明
也更准确~比如有弧段的多义线~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2006-10-23 09:06:19 | 显示全部楼层
bug--->多义线中含有弧线时,结果误。显示的是两顶点的距离,而不是弧线长度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-23 09:41:04 | 显示全部楼层
最初由 dwg001 发布
[B]bug--->多义线中含有弧线时,结果误。显示的是两顶点的距离,而不是弧线长度。 [/B]

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

使用道具 举报

发表于 2006-10-23 10:36:42 | 显示全部楼层
獲取復線某子段信息,長度可以根據信息計算(比較通用)

  1. (defun hy_pickcoordSEG(ename pt / obj PP PA n1 n2 p1 p2 dis mp bulge gongao
  2.                        rad centerp golist);;;獲取點擊子段的信息
  3.   (setq obj (vlax-ename->vla-object ename)
  4.          pp (vlax-curve-getclosestpointto obj (trans pT 1 0))
  5.           pa (vlax-curve-getparamatpoint obj pp))
  6.   (setq n1 (fix pa) n2 (fix (+ 1 pa)))
  7.   ;;(if (> n2 (length (massoc 10 (entget ename)))) (setq n2 0))
  8.   (setq p1 (vlax-curve-getpointatparam obj n1)
  9.         p2 (vlax-curve-getpointatparam obj n2)
  10.         )
  11.   (setq dis (distance p1 p2))
  12.   (SETQ MP (MAPCAR '(LAMBDA (x y) (/ (+ x y) 2)) p1 p2))
  13.   (if (/= 0 (setq bulge (vla-getbulge obj n1)));;凸度=弓高/(* 0.5 弦長)
  14.     (progn
  15.       (setq gongao (abs (* (/ dis 2) bulge)));;弓高
  16.       (setq rad (/ (+ (expt gongao 2) (expt (/ dis 2) 2)) (* 2 gongao )));GET THE RADIUS
  17.       (cond ((> 0 bulge);;;;;;;;;;;;;;;;;;;;;;;;;(and (= 1 (hy_osorns ename)) (> 0 bulge))
  18.                   (setq centerp (polar mp (- (angle p1 p2) (* 0.5 pi)) (- rad gongao))
  19.                         golist (list (cons 0 "ARC")
  20.                                      (CONS "STP" (LIST p2))
  21.                                      (CONS "ENP" (LIST p1))
  22.                                      (CONS "CEN" (list centerp))))
  23.              )
  24.             ((< 0 bulge);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(and (= 1 (hy_osorns ename)) (< 0 bulge))
  25.                  (setq centerp (polar mp (+ (angle p1 p2) (* 0.5 pi)) (- rad gongao))
  26.                        golist (list (cons 0 "ARC")
  27.                                      (CONS "STP" (LIST p1))
  28.                                      (CONS "ENP" (LIST p2))
  29.                                      (CONS "CEN" (list centerp))))
  30.            )
  31.             )
  32.     )
  33.     (setq golist (list (cons 0 "LINE")
  34.                        (CONS "LEN" dis)
  35.                        (CONS "STP" (list p1))
  36.                        (CONS "ENP" (list p2))))
  37.              
  38.   )
  39.   GOLIST
  40.   )

;;;例如返回
;;((0 . "ARC") ("STP" (14.7963 9.04745 0.0)) ("ENP" (10.6489 9.02818 0.0)) ("CEN" (12.7237 8.81554 0.0)))
;;((0 . "LINE") ("LEN" . 2.24709) ("STP" (3.9658 10.5263 0.0)) ("ENP" (5.95223 11.5768 0.0)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2006-10-23 13:11:59 | 显示全部楼层
舟自横兄的ok.
加一段调用:
(defun c:gti(/ ss ename  pt)
(setq ss (entsel "\n选择物体...\n"))
(setq ename (car ss)
      pt    (cadr ss)
)
(hy_pickcoordSEG  ename pt)
)

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-10-23 15:24:54 | 显示全部楼层
多看看 vlax-curve 部分

  1. (defun subSEG (ent pt / pam pam1 p1 p2 dis dis1 pv)
  2.   (setq        pt   (vlax-curve-getclosestpointto ent pt)
  3.         pam  (fix (vlax-curve-getparamatpoint ent pt))
  4.         pam1 (1+ pam)
  5.         dis  (-        (vlax-curve-getdistatparam ent pam1)
  6.                 (vlax-curve-getdistatparam ent pam)
  7.              )
  8.         p1   (vlax-curve-getpointatparam ent pam)
  9.         p2   (vlax-curve-getpointatparam ent pam1)
  10.         dis1 (distance p1 p2)
  11.   )
  12.   (if (equal dis1 dis)
  13.     (list '(0 . "LINE")
  14.           (cons "LEN" dis)
  15.           (cons "STP" p1)
  16.           (cons "ENP" p2)
  17.     )
  18.     (list
  19.       '(0 . "ARC")
  20.       (cons "LEN" dis)
  21.       (cons "STP" p1)
  22.       (cons "ENP" p2)
  23.       (cons
  24.         "CEN"
  25.         (polar pt
  26.                (angle (setq pv (vlax-curve-getsecondderiv
  27.                                  ent
  28.                                  (vlax-curve-getparamatpoint ent pt)
  29.                                )
  30.                       )
  31.                       '(0. 0.)
  32.                )
  33.                (distance pv '(0. 0.))
  34.         )
  35.       )
  36.     )
  37.   )
  38. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-23 23:04:31 | 显示全部楼层
;; 主要是变了一下cen的计算方法.

  1. (defun subSEG2 (ent pt / CEN DIS END LEN P1 P2 PAM1 PAM2 PRN)
  2.   (setq pt (vlax-curve-getclosestpointto ent pt)
  3.         pam1 (fix (vlax-curve-getparamatpoint ent pt))
  4.         pam2 (1+ pam1)
  5.         p1 (vlax-curve-getpointatparam ent pam1)
  6.         p2 (vlax-curve-getpointatparam ent pam2)
  7.         len (-(vlax-curve-getdistatparam ent pam2)(vlax-curve-getdistatparam ent pam1))
  8.         dis (distance p1 p2)
  9.         cen (mapcar '- pt (vlax-curve-getsecondderiv ent(vlax-curve-getparamatpoint ent pt)))
  10.         end (if (equal dis len) (list len p1 p2)(list len p1 p2 cen))
  11.         PRN (mapcar 'cons '("LEN" "STA" "END" "CEN") end)
  12.         prn (IF (=(LENGTH PRN) 3)(cons '(("LINE")) prn)(cons '("ARC") prn))
  13. )
  14. )
  15. (DEFUN C:TTT ()(MAPCAR 'PRINT (APPLY 'SUBSEG2 (ENTSEL)))(PRINC))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-24 21:32:04 | 显示全部楼层
两位老大的算法都是存在bug有~比如一顺时针与一反时针pl线secondderiv 向量是相反的样的~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-25 12:03:41 | 显示全部楼层
yes! 我正是考慮這一點所以要加判斷bugle正負的情況
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-26 00:09:51 | 显示全部楼层
  1. [FONT=courier new](defun c:test211 ()
  2.   (CMDLASC0)
  3.   (setq        ss  (ssget '((0 . "*LINE")))
  4.         ttx ""
  5.         l   0
  6.         i   -1
  7.   )
  8.   (xyp-mkLaCo "线长标注" 4)
  9.   (while (setq s1 (ssname ss (setq i (1+ i))))
  10.     (setq ptlst-a (xyp-get-Vertexes s1 t))
  11.     (while (setq pt1 (car ptlst-a))
  12.       (if (setq ptlst-a (cdr ptlst-a))
  13.         (progn
  14.           (setq        pt2   (car ptlst-a)
  15.                 leng  (distance pt1 pt2)
  16.                 tx    (rtos leng 2 2)
  17.                 ang   (xyp-rad2Ang (angle pt1 pt2))
  18.                 pt-tx (xyp-get-RightPoint pt1 pt2 (* sc 100))
  19.                 ttx   (strcat ttx "+" tx)
  20.                 l     (+ l leng)
  21.           )
  22.           (command "text" "j" "BC" pt-tx (* sc 300) ang tx)
  23.         )
  24.       )
  25.     )
  26.   )
  27.   (if (and ttx l)
  28.     (progn
  29.       (setq ttx (strcat ttx "=" (rtos l 2 2)))
  30.       (while (not (setq pt (getpoint "\n计算式标注点 : "))))
  31.       (command "text" "j" "BC" pt (* sc 300) 0 ttx)
  32.     )
  33.   )
  34.   (CMDLA1)
  35. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-26 13:32:50 | 显示全部楼层
最初由 雨箭风刀 发布
[B]求cen也可以用(osnap pt "cen") [/B]


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-20 13:56 , Processed in 0.484167 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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