明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4666|回复: 25

[讨论] 如何求曲线上两点沿曲线长度?

  [复制链接]
发表于 2011-7-5 16:24:28 | 显示全部楼层 |阅读模式
曲线上有两点,可以求得两点沿曲线长度吗?
可以打断后提取断线长度,但是打断后变成三根不好控制~~~~
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-7-5 16:38:49 | 显示全部楼层
vlax-curve-getDistAtPoint  返回曲线从开始点到指定点的曲线段的长度
两点分别到开始点的长度差即两点间的曲线长度
 楼主| 发表于 2011-7-5 17:21:52 | 显示全部楼层
可以举一例吗,谢谢啦 。。。。
发表于 2011-7-5 19:14:58 | 显示全部楼层
本帖最后由 Gu_xl 于 2011-7-5 19:15 编辑

回复 tm20038175 的帖子

  1. (if (and
  2.       (setq en (car(entsel "\n 选择曲线: ")))
  3.      (setq p1 (getpoint "\n 选择曲线上第一点: "))
  4.      (setq p2 (getpoint "\n 选择曲线上第二点: "))
  5.      )
  6.   (abs
  7.   (- (vlax-curve-getDistAtPoint en (vlax-curve-getclosestpointto en p1))
  8.      (vlax-curve-getDistAtPoint en (vlax-curve-getclosestpointto en p2))
  9.      )
  10.   )
  11.   )
 楼主| 发表于 2011-7-5 19:31:19 | 显示全部楼层
谢谢,就是这个。。。。
只是曲线哪边是起点,哪边是终点怎么判断呢?可以改变方向吗?
发表于 2011-7-5 19:45:12 | 显示全部楼层
有现成的函数
vlax-curve-getStartPoint
vlax-curve-getEndPoint
将得到的点顺序reverse一下,然后更新数据
 楼主| 发表于 2011-7-5 19:55:41 | 显示全部楼层
恩,好的,谢谢 !………
发表于 2011-7-5 22:29:14 | 显示全部楼层
;;;子程序:pline顶点逆序
(defun reverselwp (ent1 / a pl how li1 li2 li3)
  (setq        pl  (entget ent1 '("*"))
        how nil
  ) ;_ 结束setq
  (foreach an pl
    (if        (setq a (member (car an) '(10 40 41 42)))
      (setq how t)
    ) ;_ 结束if
    (cond ((not how) (setq li1 (cons an li1)))
          ((and how a)
           (cond ((= (car an) 40) (setq an (cons 41 (cdr an))))
                 ((= (car an) 41) (setq an (cons 40 (cdr an))))
                 ((= (car an) 42) (setq an (cons 42 (- 0 (cdr an)))))
                 (t an)
           ) ;_ 结束cond
           (setq li2 (cons an li2))
          )
          ((and how (not a)) (setq li3 (cons an li3)))
    ) ;_ 结束cond
  ) ;_ 结束foreach
  (entmod
    (append (reverse li1)
            (append (cdddr li2) (list (car li2) (cadr li2) (caddr li2)))
            (reverse li3)
    ) ;_ 结束append
  ) ;_ 结束entmod
) ;_ 结束defun
;;;;;;;;;;;;;;;;;;;;;;;;
忘了是谁写的,好像是gu-xl。反正我一直在用。
 楼主| 发表于 2011-7-5 23:44:26 | 显示全部楼层
回复 mandala 的帖子

要的就是这个啊,很好哈,谢谢~~~~
发表于 2011-7-6 00:35:34 | 显示全部楼层
本帖最后由 chlh_jd 于 2011-7-6 00:38 编辑

推荐个PLINE线逆序函数gile写的

  1. (defun gile-reverse-pl (ent / e_lst vtx v_lst p_lst l_vtx)
  2.   (setq e_lst (entget ent))
  3.   (cond
  4.     ((= (cdr (assoc 0 e_lst)) "POLYLINE")
  5.      (setq vtx (entnext ent))
  6.      (while (= (cdr (assoc 0 (entget vtx))) "VERTEX")
  7.        (setq v_lst (cons (entget vtx) v_lst)
  8.       vtx   (entnext vtx)
  9.        )
  10.      )
  11.     )
  12.     ((= (cdr (assoc 0 e_lst)) "LWPOLYLINE")
  13.      (setq p_lst (vl-remove-if-not
  14.      '(lambda (x)
  15.         (member (car x) '(10 40 41 42))
  16.       )
  17.      e_lst
  18.   )
  19.     e_lst (vl-remove-if
  20.      '(lambda (x)
  21.         (member x p_lst)
  22.       )
  23.      e_lst
  24.   )
  25.      )
  26.      (while p_lst
  27.        (setq v_lst (cons
  28.        (list (car p_lst) (cadr p_lst) (caddr p_lst) (cadddr p_lst))
  29.        v_lst
  30.      )
  31.       p_lst (member (assoc 10 (cdr p_lst)) (cdr p_lst))
  32.        )
  33.      )
  34.     )
  35.   )
  36.   (setq l_vtx (last v_lst)
  37. l_vtx (subst (cons 40 (cdr (assoc 41 (car v_lst))))
  38.        (assoc 40 l_vtx)
  39.        l_vtx
  40.        )
  41. l_vtx (subst (cons 41 (cdr (assoc 40 (car v_lst))))
  42.        (assoc 41 l_vtx)
  43.        l_vtx
  44.        )
  45. l_vtx (subst (cons 42 (- (cdr (assoc 42 (car v_lst)))))
  46.        (assoc 42 l_vtx)
  47.        l_vtx
  48.        )
  49.   )
  50.   (setq v_lst
  51. (mapcar
  52.     '(lambda (x y)
  53.        (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) x)
  54.       x (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) x)
  55.       x (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x)
  56.        )
  57.      )
  58.     v_lst
  59.     (cdr v_lst)
  60. )
  61.   )
  62.   (if (= (logand 1 (cdr (assoc 70 e_lst))) 1)
  63.     (setq v_lst (append (list l_vtx) v_lst))
  64.     (setq v_lst (append v_lst (list l_vtx)))
  65.   )
  66.   (cond
  67.     ((= (cdr (assoc 0 e_lst)) "POLYLINE")
  68.      (mapcar 'entmake
  69.       (append (list e_lst) v_lst (list (entget vtx)))
  70.      )
  71.      (entdel ent)
  72.     )
  73.     ((= (cdr (assoc 0 e_lst)) "LWPOLYLINE")
  74.      (setq e_lst (append e_lst (apply 'append v_lst)))
  75.      (entmod e_lst)
  76.     )
  77.   )
  78. )


我自己用的是箭头可以倒向的

  1. (defun ss-reverse-pl (en / ent pl_vetex b is fst est lst n)
  2.   (setq ent (entget en '("*")))
  3.   (setq pl_vetex nil
  4. b nil
  5. is T
  6. fst nil
  7. est nil
  8.   )
  9.   (foreach n ent ;_(setq e (assoc 10 ent))
  10.     (if (= (car n) 210)
  11.       (setq is nil)
  12.     )
  13.     (cond ((and (or (= 10 (car n))
  14.       (= 40 (car n))
  15.       (= 41 (car n))
  16.       (= 42 (car n))
  17.   )
  18.   is
  19.     )
  20.     (setq b (cons (cdr n) b))
  21.     (if (= 4 (length b))
  22.       (setq pl_vetex (append pl_vetex (list b))
  23.       b
  24.       nil
  25.     )
  26.    )
  27.     )
  28.     (is
  29.       (setq fst (cons n fst))
  30.     )
  31.     (T (setq est (cons n est)))
  32.   ))
  33.   (setq lst nil)
  34.   (foreach a pl_vetex
  35.     (setq lst (append (list (cons 10 (cadddr a))
  36.        (cons 40 (caddr a))
  37.        (cons 41 (cadr a))
  38.        (cons 42 ( -(car a)))
  39.         )
  40.         lst
  41.        )
  42.     )
  43.   )
  44.   (setq lst (append (reverse fst)
  45.       lst
  46.       (reverse est)
  47.      )
  48.   )
  49.   (setq ent lst)
  50.   (entmod ent)
  51. )


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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-29 03:50 , Processed in 0.180017 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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