;请试用以下程序
;采用传统的LISP方法求解 by yshf
- (defun c:cc()
- (while (progn
- (setq en1 (entsel "\n请选择直线段:") ent1 (car en1))
- (or (= en1 nil) (not (= (setq na (cdr (assoc 0 (setq lin (entget ent1))))) "LINE")))
- )
- (alert "选中的不是直线,请重新选择直线段!")
- )
- (while (progn
- (setq en2 (entsel "请选择圆:") ent2 (car en2))
- (or (= en2 nil) (not (= (setq na (cdr (assoc 0 (setq lin (entget ent2))))) "CIRCLE")))
- )
- (alert "选中的不是圆,请重新选择圆!")
- )
- (command "_undo" "be")
- (setq p10 (cdr (assoc 10 (entget ent1)))
- p11 (cdr (assoc 11 (entget ent1)))
- ptb nil
- pjd nil
- )
- (while (progn (command "_extend" ent2 "" (list ent1 p10) "")
- (setq pjd (cdr (assoc 10 (entget ent1))))
- (not (equal p10 pjd))
- )
-
- (setq ptb (cons pjd ptb)
- p10 pjd
- )
- )
- (while (progn (command "_extend" ent2 "" (list ent1 p11) "")
- (setq pjd (cdr (assoc 11 (entget ent1))))
- (not (equal p11 pjd))
- )
-
- (setq ptb (cons pjd ptb)
- p11 pjd
- )
- )
- (command "_undo" "e")(command "u")
- (cond ((= ptb nil) (alert "直线与圆没有交点!"))
- ((= (length ptb) 1)
- (alert
- (strcat "直线与圆只有一个交点:("
- (rtos (car (car ptb)) 2 3) ", " (rtos (cadr (car ptb)) 2 3) ")"
- )
- )
- )
- ((= (length ptb) 2)
- (alert (strcat "直线与圆的两个交点为:"
- "\n (" (rtos (car (car ptb)) 2 3) ", " (rtos (cadr (car ptb)) 2 3) ")"
- "\n (" (rtos (car (cadr ptb)) 2 3) ", " (rtos (cadr (cadr ptb)) 2 3) ")"
- "\n距离为:" (rtos (distance (car ptb) (cadr ptb)) 2 3)
- )
- )
- )
- )
- (princ)
- )
|