Thứ Ba, 18 tháng 5, 2010

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

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

Một chức năng hay của lisp là có thể thao tác lặp lại một vài thao tác trên từng đối tượng của tập hợp chọn.
Ứng dụng vòng lặp While.
Ví dụ bạn có tập hợp tapdoituong gồm các text hình thành từ
(setq tapdoituong (ssget '((0 . "text"))))
Bây giờ bạn muốn vẽ 1 hình tròn tâm tại điểm chèn text bán kính 100.
Việc vẽ 1 hình tròn bằng lisp khi biết tâm và bán kính bằng lisp thì đơn giản rồi.
(command "circle" diemve 100)
Vấn đề là làm lần lượt cho từng text trong cả tập hợp chọn.
Dùng hàm sslength để lấy ra số lượng đối tượng trong tập hợp chọn
(setq sodoituong (sslength tapdoituong))
Hàm ssname lấy ra đối tượng thứ thutu trong tập hợp tapdoituong
(setq doituong (ssname tapdoituong thutu))
Đầu tiên cho thutu = 0 sau đó áp dụng vòng lặp While với điều kiện thutu< sodoituong, cuối vòng lặp cho thutu = thutu+1 đến khi thutu= sodoituong thì vòng lặp sẽ dừng lại.

Đoạn lisp như sau:
(defun c:vht ()
(command "undo" "be")
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)

(Princ "\nChon cac text :")
(setq tapdoituong (ssget '((0 . "text"))))
(setq thutu 0)
(setq sodoituong (sslength tapdoituong))

(while (< thutu sodoituong)
(setq doituong (ssname tapdoituong thutu))
(setq laynoidung (entget doituong))
(setq diemve (cdr (assoc 10 laynoidung)))
(command "circle" diemve 100)
(setq thutu (+ thutu 1))
)
(command "undo" "end")
(setvar "osmode" luubatdiem)
(Princ)
)

Bạn chạy thử lisp này chọn các text nó sẽ vẽ các hình tròn vào điểm chèn của từng text.
Đoạn sau giúp lấy ra điểm chèn của text:
(setq laynoidung (entget doituong))
(setq diemve (cdr (assoc 10 laynoidung)))
Bài sau mình sẽ nói về cách lấy các thông tin về đối tượng cad bằng lisp, có bao hàm cả hai dòng trên. Bài này bạn chấp nhận nó đã nhé.
*Để thực hành mình ra 1 đề bài bạn viết thử nhé.
Viết lisp hỏi chọn các text, hỏi chọn điểm canh lề, move các text được chọn sao cho điểm canh lề của text thẳng hàng theo phương thẳng đứng.
*Gợi ý:
-Cơ bản đoạn lisp như trên.
-Sau khi chọn đối tượng thêm phần hỏi chọn điểm canh lề. (diemchuan)
-Sau khi lấy được điểm canh lề text (trường hợp này là diemve). Bỏ dòng vẽ hình tròn mà thay bằng dòng move.
-Move từng text từ điểm canh lề (diemve) đến điểm mới. Điểm mới xác định bằng cách lấy giá trị x của diemchuan và y của diemve.
*Sẽ có đáp án trong bài tới.

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

Đăng nhận xét