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 ........

3 nhận xét:

  1. BAC OI EM DANG HOC VIET LISP MA KHO' WE.CO GI BAC GIUP EM NHA! MA SAO EM TIM BAI SO 1KO THAY NHI~

    Trả lờiXóa
  2. Bạn sang bên tay phải ở phần mục lục bài viết bogduy782006 chọn xem mục lục. nó mở rộng ra bạn chọn vào phần hướng dẩn viết lisp thì nó liệt kê tất cả các bài hướng dẩn. Bạn xem bài nào thì bấm chọn bài đó.

    Trả lờiXóa
  3. Chào anh Duy,
    Ở cái lisp này anh mở rộng thêm nội dung dùm em với:
    - Em có một mặt bằng bố trí các ô phòng chức năng
    - Khi em click chuột vào một ô phòng chức năng thì lisp tự động tạo một đa giác khép kín bao quanh và ghi diện tích ra text.
    (Vùng cần tạo là các ô phòng có chừa lỗ kích thước lỗ cửa được tập hợp bởi các line hoặc pline ...không hẳn là khép kín)
    PS: Em đang theo dõi các bài hưỡng dẫn viết lisp của anh chắc nay mai cũng viết được một vài lisp theo ý mình, hiện tại thì chưa đủ khả năng nên nhờ anh tạo giúp em lisp theo nội dung bên trên với nhé.

    Trả lờiXóa

Khi viết nhận xét mong bạn không đứng vai trò nặc danh! Bạn có thể chọn Name/Url trong đó Url là http://duy782006.blogspot.com/ như vậy hay hơn nặc danh bạn nhé.