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

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

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

Nhìn cái lisp trên bạn sẽ thấy có hai đoạn nội dung giống y hệt nhau dẫn đến lisp quá dài. Cách giải quyết: Cứ cái đoạn nào có nội dung giống nhau mà lại xuất hiện nhiều lần thì làm như sau:
(defun doanlap ()
Nội dung đoạn
)
Lưu ý sau defun không có c:
Sau đó cứ chổ nào cần nguyên cái đoạn đó chỉ cần thay bằng dòng
(doanlap) là được. Ví dụ lisp đánh cos sửa lại như sau:


(defun vonglapcos ()
(setvar "osmode" 0)
(setq daiab (distance a b))
(setq giatri (/ daiab motmet))
(setq c (list (- (car a) 250) (+ (cadr a) 410)))
(setq trenduoi (- (cadr a) (cadr b)))
(if (= trenduoi 0) (PROGN
(setq dau "%%p ")
)
)
(if (> trenduoi 0) (PROGN
(setq dau "+ ")
)
)
(if (< trenduoi 0) (PROGN
(setq dau "- ")
)
)
(setq noidung (strcat dau (rtos giatri 2 3)))
(command "-style" "tlkt" "VNI-HELVE" "0" "1" "0" "n" "n")
(command ".TEXT" c 250 0 noidung)
(setq timfile (findfile "c:\\tailieukythuat\\dwg\\caodo.dwg"))
(if (= timfile nil) (PROGN
(princ "\nKhong tim thay file caodo.dwg")
)
)
(if (/= timfile nil) (PROGN
(command "INSERT" "c:\\tailieukythuat\\dwg\\caodo.dwg" a 1 1 0)
)
)
(setvar "osmode" luubatdiem)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:cos ()
(command "undo" "be")
(setq motmet (getreal "\nMot met ban ve bang bao nhieu: "))
(setq luubatdiem (getvar "osmode"))
(setq a (getpoint "\nChon diem muon danh cos: "))
(setvar "osmode" 128)
(setq b (getpoint a"\nChon cao do 0.000: "))
(Vonglapcos)
(while
(setq a (getpoint b"\nChon diem muon danh cos : "))
(setq luubatdiem (getvar "osmode"))
(Vonglapcos)
)
(command "undo" "end")
(princ)
)

3 nhận xét:

  1. Nhờ Anh Duy xem dùm:
    (command "UNDO" "be")
    (setq luubatdiem (getvar "osmode"))
    (defun vonglap ()
    (setq dai12 (distance p1 p2)
    lamtron (rtos dai12 2 0)
    vitri1 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (+ (cadr p1) 30) (+ (cadr p2) 30)) 2))
    vitri2 (list (- (car p1) 25) (/ (+ (cadr p1) (cadr p2)) 2))
    dau "L = "
    noidung (strcat dau lamtron)
    gocp1p2 (angle p1 p2)
    )
    (Setvar "osmode" 0)
    (command "_layer" "m" "KichThuoc" "c" "77" "KichThuoc" "")
    (command "_style" "cuong" "Arial" "0" "1" "0" "n" "n")
    (if (= gocp1p2 0) (progn
    (command ".text" "m" vitri1 25 0 noidung "")
    )
    )
    (if (= gocp1p2 (/ pi 2)) (progn
    (command ".text" "r" vitri2 25 0 noidung "")
    )
    )
    (if (and (/= gocp1p2 (/ pi 2)) (/= gocp1p2 0)) (progn
    (command ".text" "m" vitri1 25 gocp1p2 noidung "")
    )
    )
    )
    ;---------------------------------------------------------------------------------------------------------
    (defun c:kt ()
    (command "osnap" "End" "")
    (setq p1 (getpoint "\n Chon Diem Dau"))
    (setq p2 (getpoint "\n Chon Diem Cuoi"))
    (vonglap)
    (setq i 0)
    (while (< i 100)
    (command "osnap" "End" "")
    (setq p1 (getpoint "\n Chon Diem Dau"))
    (setq p2 (getpoint "\n Chon Diem Cuoi"))
    (vonglap)
    )
    (setvar "osmode" luubatdiem)
    (command "UNDO" "end")
    (princ)
    )

    Em khai viết vầy đúng không anh :

    (command ".text" "m" vitri1 25 gocp1p2 noidung "")

    Tại sao khi em đo kích thước của 1 đường chéo thì kích thước không nằm song song với đường chéo đó

    Trả lờiXóa
  2. Trong dòng viết text thì giá trị góc phải tính bằng độ. Trong khi đó giá trị nhận được bởi setq angle là giá trị radian.
    PI bằng 180 độ nên phải chuyễn đổi để có giá trị độ.
    lấy gocp1p2 nhân 180 chia pi thì ra độ.

    Trả lờiXóa
  3. Từ bi giờ em sẽ đổi cách xưng hô , em sẽ gọi anh Duy là SƯ PHỤ để ép anh nhận em làm ĐỆ TỬ. HA HA
    Em đã thông rồi.
    Cám ơn anh nhé

    Trả lờiXóa