这里,纯香草Lisp程序:
- (defun IsPTonLW ( ptucs lw / pt enx lwdata lwdata1 lwdata2 d1 d2 b r ang a1 a2 rtn )
- (setq pt (trans ptucs 1 0))
- (setq lwdata1 (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (setq enx (entget lw))))
- (setq lwdata1 (mapcar (function (lambda ( x ) (cons 10 x))) (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enx))) lw 0))) (mapcar (function cdr) lwdata1))))
- (setq lwdata2 (vl-remove-if (function (lambda ( x ) (/= (car x) 42))) enx))
- (if (= 1 (logand 1 (cdr (assoc 70 enx))))
- (setq lwdata1 (reverse (cons (car lwdata1) (reverse lwdata1))) lwdata2 (reverse (cons (car lwdata2) (reverse lwdata2))))
- )
- (setq lwdata (mapcar (function (lambda ( a b ) (list a b))) lwdata1 lwdata2))
- (while (cadr lwdata)
- (setq d1 (car lwdata) d2 (cadr lwdata))
- (setq b (cdadr d1))
- (if (zerop b)
- (if (equal (distance (cdar d1) (cdar d2)) (+ (distance (cdar d1) pt) (distance pt (cdar d2))) 1e-6)
- (setq rtn (cons t rtn))
- (setq rtn (cons nil rtn))
- )
- (progn
- (setq r (abs (/ (/ (distance (cdar d1) (cdar d2)) 2) (sin (* 2 (atan b))))))
- (setq ang (abs (* 4 (atan b))))
- (if (<= -1.0 (/ (distance (cdar d1) pt) (* 2 r)) 1.0)
- (setq a1 (abs (* 2 (atan (/ (distance (cdar d1) pt) (* 2 r)) (sqrt (- 1.0 (expt (/ (distance (cdar d1) pt) (* 2 r)) 2)))))))
- (setq a1 nil)
- )
- (if (<= -1.0 (/ (distance (cdar d2) pt) (* 2 r)) 1.0)
- (setq a2 (abs (* 2 (atan (/ (distance (cdar d2) pt) (* 2 r)) (sqrt (- 1.0 (expt (/ (distance (cdar d2) pt) (* 2 r)) 2)))))))
- (setq a2 nil)
- )
- (if (and a1 a2 (equal ang (+ a1 a2) 1e-6))
- (setq rtn (cons t rtn))
- (setq rtn (cons nil rtn))
- )
- )
- )
- (setq lwdata (cdr lwdata))
- )
- (apply (function or) rtn)
- )
|