624777395 发表于 2024-10-17 16:16:01

直线和多段线两端画额外的线段

求助一下大佬,有什么办法可以如图所示,框选直线或非闭合多段线,之后会自动在两端生成额外的可自定长度的直线

你有种再说一遍 发表于 2024-10-17 16:29:01

重画一条啊,那么简单...

xyp1964 发表于 2024-10-17 23:26:44



(defun c:tt ()
"tt(两端画线)"
(defun abc (s1 / p1 p2 r1 r2 l1 l2)
    (setq p1 (vlax-curve-getStartPoint s1)
          p2 (vlax-curve-getEndPoint s1)
    )
    (if (not (equal p1 p2 1e-3))
      (setq r1 (xyp-AngleAtPoint s1 p1)
            r2 (xyp-AngleAtPoint s1 p2)
            l1 (xyp-Line p1 (polar p1 r1 (- dd)))
            l2 (xyp-Line p2 (polar p2 r2 dd))
      )
    )
)
(setq dd (Udist 7 "" "线长<输入或鼠标直接量取>" dd nil))
(setq i -1)
(if (setq ss (ssget '((0 . "*line,arc"))))
    (while (setq s1 (ssname ss (setq i (1+ i))))
      (abc s1)
    )
)
(princ)
)

飞雪神光 发表于 2024-10-17 19:21:42

(setq ss (ssget '((0 . "LWPOLYLINE,LINE"))))
(setq dis (getint "\n输入长度:"))
(foreach ty (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex ss)))
        (setq
                spt (vlax-curve-getStartPoint ty)
                ept (vlax-curve-getEndPoint ty)
                an (angle spt ept)
                pt1 (polar spt an (- dis))
                pt2 (polar ept an dis)
        )
        (entmake (list '(0 . "LINE") (cons 62 1) (cons 10 spt) (cons 11 pt1)))
        (entmake (list '(0 . "LINE") (cons 62 1) (cons 10 ept) (cons 11 pt2)))
)

624777395 发表于 2024-10-17 16:38:33

你有种再说一遍 发表于 2024-10-17 16:29
重画一条啊,那么简单...

原先的线也要保留啊

你有种再说一遍 发表于 2024-10-17 16:45:46

624777395 发表于 2024-10-17 16:38
原先的线也要保留啊

再画一条不就保留了吗

kozmosovia 发表于 2024-10-17 18:46:29

都是写代码,方式很多的,先算点,在生成直线

qazxswk 发表于 2024-10-17 19:00:55

本帖最后由 qazxswk 于 2024-10-17 20:08 编辑

直线和两点的多段线很容易,多点带转角的多段线有点麻烦,怕实现不了。

qazxswk 发表于 2024-10-17 19:51:58

飞雪神光 发表于 2024-10-17 19:21


你的最后画的线,在原来的线外了。楼主要在原来的线内或原来的线上画线
应该把这里改一下
pt1 (polar spt an dis)
pt2 (polar ept an (- dis))

kozmosovia 发表于 2024-10-17 20:26:03

本帖最后由 kozmosovia 于 2024-10-17 20:32 编辑

任意曲线的,拐弯也不怕,端点曲线也相切

(Defun Extend2Ends (crv dis / _Angle ANG EPT SPT)
(Defun _Angle(crv)
    (mapcar (function (lambda (x)
      (angle '(0. 0.)
             (vlax-curve-getFirstDeriv
         crv
         x
             )
      )
          )
      )
      (list (vlax-curve-getstartparam crv)
      (vlax-curve-getendparam crv)
      )
    )
)
(and (setq spt (vlax-curve-getstartpoint crv))
       (setq ept (vlax-curve-getendpoint crv))
       (not (equal spt ept 0.01))
       (setq ang (_Angle crv))
       (entmakex (list (cons 0 "line")
         (cons 10 spt)
         (cons 11 (polar spt (car ang) (- dis)))
   )
       )
       (entmakex (list (cons 0 "line")
         (cons 10 ept)
         (cons 11 (polar ept (cadr ang) dis))
   )
       )
)
)
(Defun c:tt () (Extend2Ends (Car (entsel)) 123.45))

qazxswk 发表于 2024-10-17 20:48:34

本帖最后由 qazxswk 于 2024-10-17 20:49 编辑

kozmosovia 发表于 2024-10-17 20:26
任意曲线的,拐弯也不怕,端点曲线也相切
还是你厉害,我跟飞雪神光大神的思路差不多,不过他用的是foreach函数,我想到的是用repeat函数。就是拐弯的多段线,实现不了。
页: [1] 2
查看完整版本: 直线和多段线两端画额外的线段