Thứ Tư, 7 tháng 4, 2010

Hướng dẩn viết lisp bài 20:

Bạn nên theo dỏi theo tên bài viết tăng từ nhỏ tới lớn thì mới đúng trình tự!

*Các lisp từ trước tới giờ nếu bạn chạy thử trên bản vẽ trống trơn thì chạy ngon nhưng bạn thử chạy trên bản vẽ có nhiều đối tượng rồi thì sẽ có khi chạy không đúng vì khi thực hiện các lệnh vẽ có chọn các điểm sẽ bị ảnh hưởng bởi chế độ bắt điểm tự động nên bắt sang các điểm không đúng với tính toán dẩn đến các hình vẽ sẽ không đúng ý.
-Cách giải quyết là tắt chế độ bắt điểm tự động đi. Cú pháp như sau:
(setvar "osmode" 0)
-Nhưng người dùng lisp của mình sẽ bực mình vì khi dùng lisp của mình thì mình tắt mất bắt điểm tự động của họ. Trong viết lisp việc thay đổi các thiết lập mặc định của người ta là không nên. Giải pháp là lưu thiết lập của họ lại bằng 1 biến tạm sau đó trả lại họ. Cách làm như sau:
+Lưu bắt điểm tự động (setq luubatdiem (getvar "osmode"))
+Trả lại bắt điểm tự động (setvar "osmode" luubatdiem)
-Như vậy trong lisp sau khi đã cung cấp dử liệu đầu vào như bắt điểm mình tiến hành lưu bắt điểm lại, tắt bắt điểm đi, thực hiện các thao tác vẽ, tính toán, trả lại bắt điểm trước khi kết thúc lệnh.
Ví dụ lisp sau khi thêm phần undo và bắt điểm:

(defun c:doanthang ()
(command "undo" "be")
(setq a (getpoint "\nChon diem: "))
(setq b (getpoint a"\nChon diem: "))
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)
(command ".line" a b "")
(setq c (list (/ (+ (car a) (car b)) 2) (/ (+ (cadr a) (cadr b)) 2)))
(command ".circle" c a)
(command ".circle" a b)
(setq traloi (strcase (getstring "\nBan co nuon array hay không? Y/:")))
(if (= traloi "N") (PROGN
)
)
(IF (= traloi "Y") (PROGN
(setq sl (getstring "\nSo luong:"))
(command ".array" "last" "" "p" c sl "" "")
)
)
(setvar "osmode" luubatdiem)
(command "undo" "end")
(princ)
)

Không có nhận xét nào:

Đăng nhận xét