线段打断等分成3段lisp
本帖最后由 李青松 于 2025-1-8 17:54 编辑线段打断等分成3段
3个线变成单独的
3段我是举个例子
也可能是打断成4段等等
怎么写程序
不一定对
(defun c:tt(/ dis en lst n os)
(setq os(getvar "osmode")
en(car (entsel "\nSelect Object:"))
n (getint "\n等分数:")
dis (/ (vlax-curve-getdistatparam
en
(vlax-curve-getendparam en))
n
1.)
n (1- n))
(setvar "osmode" 16419)
(repeat n
(setq
lst (cons (vlax-curve-getpointatdist en (* n dis)) lst)
n (1- n)))
(foreach nlst
(vl-cmdf "break" en "f" n "@")
(setq en (entlast)))
(setvar "osmode" os)) 可以用Break不过...
偏方--->
但依等分后的线段长
算得各断点
删除原线
绘出第一条线后
可改用Copy
也可Line连结各点位
;;需要E派系统的支持
(defun c:tt ()
"曲线等分"
(or nn(setq nn 5))
(setq nn (Uint 1 "" "等分段数" nn))
(setq s1 (car(entsel"\n选择线段: ")))
(mapcar '(lambda (x) (xyp-BreakE s1 x x)) (reverse (xyp-CurveDivNum s1 nn)))
(princ)
)
xyp1964 发表于 2025-1-8 20:17
给个源码吧
用CAD原生的divide+breakatpoint写个lisp试试? 好像有个潜在问题,低版本貌似是没有breakatpoint命令的。。。 (defun c:cv (/ ss x pe pm pc ang k p1)
(setq ss (entsel "\n选取直线:"))
(setq x (getreal "\n等分数:"))
(setq pe (osnap (cadr ss) "END"))
(setq pm (osnap (cadr ss) "MID"))
(setq pc (mapcar '+ pm (mapcar '- pm pe)))
(setq ang (angle pe pm))
(setq k (/ (distance pe pc) x))
(command "_erase" ss "")
(while (> x 0)
(setq x (1- x))
(setq p1 (polar pe ang k))
(command "line" pe p1 "")
(setq pe p1)
)
(princ)
)
本帖最后由 Scarlet2001 于 2025-1-9 10:52 编辑
[*];支持多段线、曲线、直线(理论圆弧和圆也行,在第11行的if里修改一下起点终点判断就行)
[*](defun c:DVV ( / l n k a pt ptlist ptalist pt1 pt2 xl)
[*](setvar "cmdecho" 0)
[*];(setq ss (ssget '((0 . "LINE,LWPOLYLINE"))))
[*](setq l (entsel "\n选择要定数等分的对象"))
[*](setq n (getint "\n选择要定数等分的个数"))
[*](setq a (entget (car l)))
[*](entdel (car l))
[*](setq l (entmakex a))
[*](command "divide" l n)
[*](if (= "LINE" (cdr (assoc 0 a)))
[*] (setq pt1 (cdr (assoc 10 a)) pt2 (cdr (assoc 11 a)))
[*] (setq pt1 (cdr (assoc 10 a)) pt2 (cdr (assoc 10 (reverse a))))
[*])
[*](setq ptlist (list) ptalist (list))
[*](repeat (1- n)
[*] (if pt (setq pt (entnext pt)) (setq pt (entnext l)))
[*] (setq ptlist (cons (cdr (assoc 10 (entget pt))) ptlist))
[*] (setq ptalist (cons pt ptalist))
[*])
[*](entdel l)
[*](setq ptlist (cons pt2 ptlist))
[*](setq ptlist (cons pt1 (reverse ptlist)))
[*](setq k 0)
[*](repeat n
[*] (setq xl (entmakex a))
[*] (command "break" xl (nth k ptlist) pt1)
[*] (command "break" xl (nth (1+ k) ptlist) pt2)
[*] (setq k (1+ k))
[*])
[*](foreach pt ptalist (entdel pt))
[*](setvar "cmdecho" 1)
[*](prin1)
[*])
本帖最后由 uualice2020 于 2025-1-11 11:13 编辑
[*];获取曲线等分点(不含端点,n为等分数量)
[*](defun zx-CurveDivNum (en n / i pp pplis )
[*](setq pplis '() i 0)
[*](repeat (-n 1)
[*](setq pp(vlax-curve-getPointAtDist en
[*] (*(/ (vlax-curve-getdistatparam en(vlax-curve-getendparam en)) n)
[*] (setq i (1+ i))))
[*])
[*](setq pplis (cons pp pplis))
[*])
[*]pplis
[*])
[*];根据曲线等分点打断曲线 (n为等分数量)
[*](defun zx-Break(BreakE_enme n )
[*](foreach x (zx-CurveDivNum BreakE_enme n )
[*](vl-cmdf "BREAK" (list BreakE_enme x) "f" "non" x "non" x)
[*])
[*])
页:
[1]