有學生問到一個 AutoLISP 程式設計的需求,
這是一個很典型的 AutoLISP 題目,非常適合用來教學,
所以,把它 po 在這邊分享。
程式裡面已經有詳細的注解,他的目的是 讓使用者在
AutoCAD 裡面選擇一些圖元,這個程式會幫他加總線段的
總長度,大家 欣賞欣賞。
cpp 代码
- ; file: sum-01.LSP
-
- ; (cal-dist p1 p2)
- (defun cal-dist(p1 p2 / x1 x2 y1 y2 dx dy)
- (setq x1 (car p1) x2 (car p2)
- y1 (cadr p1) y2 (cadr p2))
- (setq dx (- x2 x1) dy (- y2 y1))
-
- (eval (sqrt (+ (* dx dx) (* dy dy))))
- ); end of cal-dist()
- ; -----------------------------------------------
-
- (defun c:sum-line( / s1 l1 p1 p2)
- (princ "\nSelect some LINEs: ")
- (setq s1 (ssget))
- (setq l1 (sslength s1))
-
- ; for i=0 to (i < l1) do ...
- (setq i 0 l2 0 sum1 0.0)
- (while (< i l1)
- (setq e1 (ssname s1 i)); get ent. name
- (setq et1 (entget e1)); get ent. content
-
- (setq str1 (cdr (assoc 0 et1)) ); get ent. type, LINE or CIRCLE
- (if (eq str1 "LINE")
- (progn
- (setq p1 (cdr (assoc 10 et1)))
- (setq p2 (cdr (assoc 11 et1)))
- (setq sum1 (+ sum1 (cal-dist p1 p2)))
-
- (setq l2 (1+ l2))
- ); end progn
- ); end if
-
- (setq i (1+ i))
- ); end of while
-
- (princ (strcat "\nNumber of LINEs be sumed: " (itoa l2) "\n"))
- (princ (strcat "Total length= " (rtos sum1 2 6 ) "\n" ))
-
- (princ)
- ); end of sum-line()
- ; end of file