(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)
)
不幸的是,这必须是我的方式。。。
如果p不在活动屏幕ACAD界面的可见部分,则(nentselp p)将返回nil。。。
哦,好吧,我没有意识到这一点。
我的蹩脚修改是使用“最大化显示”和“上一个缩放”。(那是因为我不懂lisp数学)
也许 吧:
(defun c:is\u pt\u on\u pl(/fz en ss pt)(setq fz 1e 11)(而(不是en)b](和(princ“\n选择1多段线”(setq ss(ssget(list(cons 0“多段线”cons-4。”F]“
它不适合我,因为我想在特定的物体上试用。
这就完成了我的工作,我只需要更改代码中的vl remove if函数。但这只支持多段线,而不支持圆弧或圆。
非常感谢BIGAL。这是一个很好的解决方案,支持所有圆弧、圆、多段线和椭圆对象。 我没有完全理解你的要求:
(defun IsPTonARC(ptucs arc/pta c r a1 a2 a rtn)(setq pta(trans ptucs 1 arc))(setq c(cdr(assoc 10(entget arc)))(setq r(cdr(assoc 40(entget arc)))(setq a1(cdr(assoc 50(entget arc)))(setq a2(cdr(assoc 51(entget arc))))(setq a(角度c pta))(if(>a1 a2)(setq a1(-a1(*pi)))(if(and(equal(caddr pta(caddr c)1e-6)(等距(trans c arc 1)ptucs)r 1e-6)(if(和(minusp a1)(>a a2))( 砰的一声。。。。谢谢
我对圆有一个错误-当你只检查半径=距离(cen,pt)时,属于球体的任何点都应该返回T,所以我也添加了要检查的点平面。。。
页:
1
[2]