Thứ Sáu, 27 tháng 8, 2010

Tạo PLINE trong lisp:

Vấn đề vướng khó chịu nhất của bà con (kể cả mình) khi viết lisp là làm việc với pline:
-Trường hợp đơn giản nhất là vẽ 1 pline với số đỉnh bất kỳ sau đó lấy giá trị diện tích của nó miễn cưỡng lắm thì viết như sau:
(DEFUN c:dtpl ( )
(setq a (getpoint "\nChon diem dau tien: "))
(setq b (getpoint a"\nChon diem tiep theo: "))
(command "pline" a b "")
(setq plhoinay (entlast))
(setq a b)
(while (setq b (getpoint a"\nChon diem tiep theo : "))
(command "pline" a b "")
(command "pedit" "m" "L" plhoinay "" "j" "0" "")
(setq plhoinay (entlast))
(setq a b)
)
(command "pedit" plhoinay "c" "")
(command "area" "object" "last")
(setq dientich (getvar "area"))
(alert (rtos dientich 2 2))
(princ)
)

Giải thích lisp trên như sau:

(setq a (getpoint "\nChon diem dau tien: "))
Hỏi chọn 1 điểm trên màn hình và gán cho biến a
(setq b (getpoint a"\nChon diem tiep theo: "))
Hỏi chọn 1 điểm trên màn hình và gán cho biến b
(command "pline" a b "")
Thực hiện lệnh pline vẽ từ a đến b, kết thúc lệnh pline
(setq plhoinay (entlast))
Gán pl vừa tạo cho biến hoinay
(setq a b)
Gán điểm b hiện tại thành điểm a
(while (setq b (getpoint a"\nChon diem tiep theo : "))
Khởi động vòng lặp tồn tại khi điều kiện biến điểm b được gán bằng pick điểm, nếu enter thì kết thúc vòng lặp
(command "pline" a b "")
Thực hiện lệnh pline vẽ từ a đến b, kết thúc lệnh pline.......lưu ý lúc này điểm a chính là điểm b của đoạn trên đã được gán qua nhé
(command "pedit" "m" "L" plhoinay "" "j" "0" "")
Thực hiện lệnh pedit lựa chọn m, chọn pline vừa tạo, chọn pline tạo trong đoạn trước đã gán cho biến plhoinay, chọn J để nối thành 1 pline liên tục
(setq plhoinay (entlast))
Gán pl vừa tạo cho biến hoinay
(setq a b)
Gán điểm b hiện tại thành điểm a
)
kết thúc vòng lặp nếu nhấn enter, lúc này sản phẩm là 1 đường pline hở
Đoạn bên dưới là thủ tục đóng kín pline và lấy giá trị diện tích và báo ra kết quả. Nhưng nếu vùng muốn tính diện tích chứa cả cung tròn thì việt viết nhại theo lệnh pline là rất khó khăn và cuối cùng mình cũng tìm ra giải pháp bắng cách lisp trả hẳn về cad thực hiện xong lệnh pline xong thì lisp tiếp tục chạy.



Bài này Duy đang viết dở nha bạn ........