marko_ribar 发表于 2022-7-5 17:14:41

这里,纯香草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)
)

Grrr 发表于 2022-7-5 17:20:17

不幸的是,这必须是我的方式。。。
如果p不在活动屏幕ACAD界面的可见部分,则(nentselp p)将返回nil。。。

marko_ribar 发表于 2022-7-5 17:21:11

 
哦,好吧,我没有意识到这一点。
我的蹩脚修改是使用“最大化显示”和“上一个缩放”。(那是因为我不懂lisp数学)

Grrr 发表于 2022-7-5 17:26:37

 
也许 吧:
(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]“

David Bethel 发表于 2022-7-5 17:28:40

 
它不适合我,因为我想在特定的物体上试用。
 
 
这就完成了我的工作,我只需要更改代码中的vl remove if函数。但这只支持多段线,而不支持圆弧或圆。

satishrajdev 发表于 2022-7-5 17:32:15

 
非常感谢BIGAL。这是一个很好的解决方案,支持所有圆弧、圆、多段线和椭圆对象。

satishrajdev 发表于 2022-7-5 17:34:28

我没有完全理解你的要求:
 
(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))(

marko_ribar 发表于 2022-7-5 17:37:50

砰的一声。。。。谢谢

satishrajdev 发表于 2022-7-5 17:40:53

 
我对圆有一个错误-当你只检查半径=距离(cen,pt)时,属于球体的任何点都应该返回T,所以我也添加了要检查的点平面。。。

marko_ribar 发表于 2022-7-5 17:44:03

页: 1 [2]
查看完整版本: 断开圆弧