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

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

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ự!

Bây giờ bạn lại muốn số lần move text là do bạn nhập vào kia. Áp dụng hàm getreal xem nào:

(defun c:tlkt ()
(setq a (getpoint "\nChon diem viet: "))
(setq b (getpoint a"\nChon diem den: "))
(setq so (getreal "\nSo lan di chuyen: "))
(setq dolon (getvar "viewsize"))
(setq dolonchu (/ dolon 30))
(setq daiab (distance a b))
(setq dodai (/ daiab so))
(setq gocab (angle a b))
(setq c (polar a gocab dodai))
(command "-style" "tlkt" "VNI-HELVE" "0" "1" "0" "n" "n")
(command ".TEXT" "m" a dolonchu 0 "tailieukythuat.com")
(setq sol (fix so))
(repeat sol
(command "DELAY" "5000" "")
(command ".MOVE" "last" "" a c)
)
(command "DELAY" "5000" "")
(command ".ERASE" "last" "")
(princ)
)

Nếu bạn thay dòng:
(setq so (getreal "\nSo lan di chuyen: "))
Bằng dòng:
(setq so (getstring "\nSo lan di chuyen: "))
Thì lisp sẽ lổi ngay mặc dù bạn vẩn nhập vào là số nhưng chuổi thu được bằng hàm getstring không dùng để tính toán với các hàm + - * / được nên dòng
(setq dodai (/ daiab so))
Sẽ không lượng giá được, xuất hiện lổi và xẹtttttttttttttt lisp hỏng. Đây là điểm rất cần lưu ý trong viết lisp.
-Bạn thấy có 1 dòng lạ nửa:
(setq sol (fix so))
Vì vòng lặp repeat đòi hỏi đối số là số nguyên nghĩa là không có phẩy phiếc gì hết. Trong khi bạn nhập số lần di chuyển bằng hàm getreal kết quả lại là số thực ví dụ nhập 10 thì thực chất nó biểu diển trong lisp là dạng 10,000000000000000000000000000000... Bạn dùng hàm fix sẽ làm mất toàn bộ các ký tự sau dấu phẩy lúc này mới dùng kết quả thu được này cung cấp cho vòng lặp repeat được.

1 nhận xét:

  1. Hi hi Cám ơn anh nhiều .Bài này đúng là khó thật nếu không có sự hướng dẫn của anh thì khó mà biết được .
    Người đọc
    jula_julo@yahoo.com.vn

    Trả lờiXóa