选择多条多段线并
此lisp将多段线线段转换为圆弧。一次只做一行。我需要为次选择1000条多段线。我是autolisp新手,我知道代码中有什么变化:(defun c:lwsegs2arced ( / massoclst nthmassocsubst v^v unit _ilp doc lw enx gr enxb p1 p2 p3 b i n )
(vl-load-com)
(defun massoclst ( key lst )
(if (assoc key lst) (cons (assoc key lst) (massoclst key (cdr (member (assoc key lst) lst)))))
)
(defun nthmassocsubst ( n key value lst / k slst p j plst m tst pslst )
(setq k (length (setq slst (member (assoc key lst) lst))))
(setq p (- (length lst) k))
(setq j -1)
(repeat p
(setq plst (cons (nth (setq j (1+ j)) lst) plst))
)
(setq plst (reverse plst))
(setq j -1)
(setq m -1)
(repeat k
(setq j (1+ j))
(if (equal (assoc key (member (nth j slst) slst)) (nth j slst) 1e-6)
(setq m (1+ m))
)
(if (and (not tst) (= n m))
(setq pslst (cons (cons key value) pslst) tst t)
(setq pslst (cons (nth j slst) pslst))
)
)
(setq pslst (reverse pslst))
(append plst pslst)
)
(defun v^v ( u v )
(mapcar '(lambda ( s1 s2 a b ) (+ ((eval s1) (* (nth a u) (nth b v))) ((eval s2) (* (nth a v) (nth b u))))) '(+ - +) '(- + -) '(1 0 0) '(2 2 1))
)
(defun unit ( v )
(mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
)
(defun _ilp ( p1 p2 o nor / p1p p2p op tp pp p )
(if (not (equal (v^v nor (unit (mapcar '- p2 p1))) '(0.0 0.0 0.0) 1e-7))
(progn
(setq p1p (trans p1 0 (v^v nor (unit (mapcar '- p2 p1))))
p2p (trans p2 0 (v^v nor (unit (mapcar '- p2 p1))))
op(trans o 0 (v^v nor (unit (mapcar '- p2 p1))))
op(list (car op) (cadr op) (caddr p1p))
tp(polar op (+ (* 0.5 pi) (angle '(0.0 0.0 0.0) (trans nor 0 (v^v nor (unit (mapcar '- p2 p1)))))) 1.0)
)
(if (inters p1p p2p op tp nil)
(progn
(setq p (trans (inters p1p p2p op tp nil) (v^v nor (unit (mapcar '- p2 p1))) 0))
p
)
nil
)
)
(progn
(setq pp (list (car (trans p1 0 nor)) (cadr (trans p1 0 nor)) (caddr (trans o 0 nor))))
(setq p (trans pp nor 0))
p
)
)
)
(or doc (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))))
(vla-startundomark doc)
(if (and (setq lw (entsel "\nPick LWPOLYLINE..."))
(= (cdr (assoc 0 (setq enx (entget (car lw))))) "LWPOLYLINE")
)
(progn
(setq i (fix (vlax-curve-getParamAtPoint
(car lw)
(vlax-curve-getClosestPointToProjection (car lw) (trans (cadr lw) 1 0) '(0.0 0.0 1.0))
) ;_vlax-curve-getParamAtPoint
) ;_fix
p1 (vlax-curve-getPointAtParam (car lw) i)
p3 (vlax-curve-getPointAtParam (car lw) (1+ i))
lw (car lw)
)
(setq enxb (massoclst 42 enx))
(while (= 5 (car (setq gr (grread t))))
(setq p2 (_ilp (trans (cadr gr) 1 0) (mapcar '+ (trans (cadr gr) 1 0) '(0.0 0.0 1.0)) p1 (cdr (assoc 210 (entget lw)))))
(setq b ((lambda (a) (/ (sin a) (cos a)))
(/ (- (angle (trans p2 0 lw) (trans p3 0 lw)) (angle (trans p1 0 lw) (trans p2 0 lw))) 2.0)
)
)
(setq n -1)
(foreach dxf42 enxb
(setq n (1+ n))
(if (= n i)
(setq enx (nthmassocsubst n 42 b enx))
(setq enx (nthmassocsubst n 42 (+ (cdr dxf42) b) enx))
)
)
(entupd (cdr (assoc -1 (entmod enx))))
)
)
(prompt "\n Nothing selected or picked object not a LWPOLYLINE ")
)
(vla-endundomark doc)
(princ)
)
另一种建议vla setbulge方法
仅LWpoly
;another old thread
(defun c:test ( / foo s i _bulge )
;hanhphuc 02.04.2018
(defun _bulge ( en n / l i ) (setq i -1 l (entget en))
(repeat (if (zerop (cdr (assoc 70 l)))
(1- (cdr (assoc 90 l)))
(cdr (assoc 90 l))
)
(vla-setBulge (vlax-ename->vla-object en) (setq i (1+ i)) n )
)
)
(if
(setq ss (ssget ":L" '((0 . "LWPOLYLINE"))))
(repeat (setq i (sslength ss))
(_bulge (ssname ss (setq i (1- i))) -0.5 ) ; 0.5 or -0.5 default bulge
)
(princ "\nLWPolyline only!")
)
(princ)
)
(vl-load-com)
我们不知道你们的LW多段线都是顺时针方向还是其他方向?
也许您需要过滤方向、反转和清除零长度测试。。 尝试多种选择:
(defun c:lwsegs2arced
(/ massoclst nthmassocsubst v^v unit _ilp d doc lw enx gr enxb p p1 p2 p3 b i n)
(vl-load-com)
(defun massoclst (key lst)
(if (assoc key lst)
(cons (assoc key lst) (massoclst key (cdr (member (assoc key lst) lst))))
)
)
(defun nthmassocsubst (n key value lst / k slst p j plst m tst pslst)
(setq k (length (setq slst (member (assoc key lst) lst))))
(setq p (- (length lst) k))
(setq j -1)
(repeat p (setq plst (cons (nth (setq j (1+ j)) lst) plst)))
(setq plst (reverse plst))
(setq j -1)
(setq m -1)
(repeat k
(setq j (1+ j))
(if (equal (assoc key (member (nth j slst) slst)) (nth j slst) 1e-6)
(setq m (1+ m))
)
(if (and (not tst) (= n m))
(setq pslst (cons (cons key value) pslst)
tst t
)
(setq pslst (cons (nth j slst) pslst))
)
)
(setq pslst (reverse pslst))
(append plst pslst)
)
(defun v^v (u v)
(mapcar
'(lambda (s1 s2 a b) (+ ((eval s1) (* (nth a u) (nth b v))) ((eval s2) (* (nth a v) (nth b u)))))
'(+ - +)
'(- + -)
'(1 0 0)
'(2 2 1)
)
)
(defun unit (v) (mapcar '(lambda (x) (/ x (distance '(0.0 0.0 0.0) v))) v))
(defun _ilp (p1 p2 o nor / p1p p2p op tp pp p)
(if (not (equal (v^v nor (unit (mapcar '- p2 p1))) '(0.0 0.0 0.0) 1e-7))
(progn
(setq p1p (trans p1 0 (v^v nor (unit (mapcar '- p2 p1))))
p2p (trans p2 0 (v^v nor (unit (mapcar '- p2 p1))))
op(trans o 0 (v^v nor (unit (mapcar '- p2 p1))))
op(list (car op) (cadr op) (caddr p1p))
tp(polar op
(+ (* 0.5 pi)
(angle '(0.0 0.0 0.0) (trans nor 0 (v^v nor (unit (mapcar '- p2 p1)))))
)
1.0
)
)
(if (inters p1p p2p op tp nil)
(progn (setq p (trans (inters p1p p2p op tp nil) (v^v nor (unit (mapcar '- p2 p1))) 0)) p)
nil
)
)
(progn (setq pp (list (car (trans p1 0 nor)) (cadr (trans p1 0 nor)) (caddr (trans o 0 nor))))
(setq p (trans pp nor 0))
p
)
)
)
(or doc (setq doc (vla-get-activedocument (vlax-get-acad-object))))
(vla-startundomark doc)
;; RJP - added multiple selection 04.02.2018
(if (setq s (ssget ":L" '((0 . "lwpolyline"))))
(foreach lw (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
(setq i(fix (vlax-curve-getparamatpoint
lw
(vlax-curve-getclosestpointtoprojection
lw
(trans (setq p (vlax-curve-getstartpoint lw)) 1 0)
'(0.0 0.0 1.0)
)
) ;_vlax-curve-getParamAtPoint
) ;_fix
p1 (vlax-curve-getpointatparam lw i)
p3 (vlax-curve-getpointatparam lw (1+ i))
)
(setq enxb (massoclst 42 (setq enx (entget lw))))
(setq p2 (_ilp (trans p 1 0)
(mapcar '+ (trans p 1 0) '(0.0 0.0 1.0))
p1
(cdr (assoc 210 (entget lw)))
)
)
(setq
b ((lambda (a) (/ (sin a) (cos a)))
(/ (- (angle (trans p2 0 lw) (trans p3 0 lw)) (angle (trans p1 0 lw) (trans p2 0 lw)))
2.0
)
)
)
(setq n -1)
(foreach dxf42 enxb
(setq n (1+ n))
(if (= n i)
(setq enx (nthmassocsubst n 42 b enx))
(setq enx (nthmassocsubst n 42 (+ (cdr dxf42) b) enx))
)
)
(entupd (cdr (assoc -1 (entmod enx))))
)
(prompt "\n Nothing selected or picked object not a LWPOLYLINE ")
)
(vla-endundomark doc)
(princ)
) 同样的问题。
页:
[1]