试试这个例行程序,它会根据需要完成任务。
注意:不要在多段线的弧段上使用例程,否则会产生意外结果。
- (defun c:Test (/ s gr o p a b c d e ang prm pt l f lst)
- ;; Author : Tharwat Al Shoufi ;;
- ;; Date : 04. Sep. 2014 ;;
- (if (and (setq s (entsel "\n Select polyline :"))
- (eq (cdr (assoc 0 (entget (setq o (car s))))) "LWPOLYLINE")
- )
- (progn (while (and (eq (car (setq gr (grread t 15 0))) 5)
- (not (redraw))
- (setq p (vlax-curve-getclosestpointto o (cadr gr))
- a (vlax-curve-getpointatdist o (- (vlax-curve-getdistatpoint o p) (/ 0.1709 2.)))
- b (vlax-curve-getpointatdist o (+ (vlax-curve-getdistatpoint o p) (/ 0.1709 2.)))
- )
- (if (minusp (sin (- (angle a b) (angle b (cadr gr)))))
- (setq ang (angle b a))
- (setq ang (angle a b))
- )
- (setq c (polar (polar a (+ ang (* pi 0.5)) 0.2103) (angle a b) 0.0341)
- d (polar p (+ ang (* pi 1.5)) 0.1823)
- e (polar c (angle a b) 0.1028)
- )
- )
- (grvecs (list -2 a c c d d e e b))
- )
- (if (and a b c d e)
- (progn (setq lst nil
- prm (fix (vlax-curve-getparamatpoint o a))
- pt (vlax-curve-getpointatparam o prm)
- )
- (foreach itm (entget o)
- (if (equal itm (setq f (list 10 (car pt) (cadr pt))) 0.0001)
- (setq lst (cons f lst)
- lst (cons (list 10 (car a) (cadr a)) lst)
- lst (cons (list 10 (car c) (cadr c)) lst)
- lst (cons (list 10 (car d) (cadr d)) lst)
- lst (cons (list 10 (car e) (cadr e)) lst)
- lst (cons (list 10 (car b) (cadr b)) lst)
- )
- (setq lst (cons itm lst))
- )
- (if (eq (car itm) 90)
- (setq lst (cons (cons 90 (+ (cdr itm) 5)) lst))
- )
- )
- (entmod (reverse lst))
- (entupd o)
- )
- )
- )
- )
- (redraw)
- (princ)
- )(vl-load-com)
|