Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
mr.nguyen08ql

Giải thích đạn code của Lisp

Các bài được khuyến nghị

Chào cả nhà! em đang học làm quen với lisp mà thấy hơi khó hỉu xí.em đang sử dụng lisp ví dụ của bác Ssg để tự học : có đoạn chú thích sau em không hiểu ( đoạn tô màu):

;;;----------------------------------------------------------

(defun C:NHA(/ W H1 H2 p1 p2 p3 p4 p5 OldOs)

;;;Nhap so lieu

(setq

W (getreal "\nChieu rong W = ")

H1 (getreal "\nChieu cao H1 = ")

H2 (getreal "\nChieu cao chop H2 = ")

p1 (getpoint "\nDiem chuan: ")

;;;----------------------------------------------------------

;;;Tinh toa do

p2 (polar p1 0.0 W)

p3 (polar p2 (/ pi 2) H1)

p4 (polar p3 pi W)

p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))

)

 

 

;;;----------------------------------------------------------

;;;Luu bien osmode

(setq OldOs (getvar "osmode"))

;;;----------------------------------------------------------

;;;Set object snap OFF

(setvar "osmode" 0)

;;;----------------------------------------------------------

;;;Goi lenh AutoCAD

(command "line" p1 p2 p3 p4 "c")

(command "line" p3 p5 p4 "")

;;;----------------------------------------------------------

;;;Tai lap osmode

(setvar "osmode" OldOs)

;;;----------------------------------------------------------

;;;Lang le rut lui

(princ)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn có thể qua topic Hướng dẫn lập trình lisp, hoặc CÙng nhau học Lisp... để hỏi vấn đề này.

Về đoạn màu đỏ :

;;;Luu bien osmode -> lấy chế độ bắt điểm hiện hành (getvar "osmode") và gán nó vào biến OldOs

Sở dĩ phải làm vậy vì như bạn biết, các command của CAD bị chi phối bởi chế độ bắt điểm, nếu để, rất dễ bị tình trạng điểm mình chọn nó lại k chọn mà lấy thằng gần nhất theo chế độ bắt điểm, vì vậy, khi thực hiện thao tác command, ta phải tắt nó đi.

 

(setq OldOs (getvar "osmode"))

;;;----------------------------------------------------------

;;;Set object snap OFF

(setvar "osmode" 0)

;;;----------------------------------------------------------

--> Sau khi tắt đu thì thực hiện lệnh Line, đi qua 4 điểm p1,p2,p3,p4,close và Line p3,p5,p4

;;;Goi lenh AutoCAD

(command "line" p1 p2 p3 p4 "c")

(command "line" p3 p5 p4 "")

;;;----------------------------------------------------------

 

-> Thực hiện xong 2 command trên rồi thì ta trả lại chế độ bắt điểm như cũ cho người dùng bằng cách lấy lại giá trị từ biến oldOs..

 

;;;Tai lap osmode

(setvar "osmode" OldOs)

;;;----------------------------------------------------------

;;;Lang le rut lui

(princ)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào cả nhà! em đang học làm quen với lisp mà thấy hơi khó hỉu xí.em đang sử dụng lisp ví dụ của bác Ssg để tự học : có đoạn chú thích sau em không hiểu ( đoạn tô màu):

;;;----------------------------------------------------------

(defun C:NHA(/ W H1 H2 p1 p2 p3 p4 p5 OldOs)

;;;Nhap so lieu

(setq

W (getreal "\nChieu rong W = ")

H1 (getreal "\nChieu cao H1 = ")

H2 (getreal "\nChieu cao chop H2 = ")

p1 (getpoint "\nDiem chuan: ")

;;;----------------------------------------------------------

;;;Tinh toa do

p2 (polar p1 0.0 W)

p3 (polar p2 (/ pi 2) H1)

p4 (polar p3 pi W)

p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))

)

 

 

;;;----------------------------------------------------------

;;;Luu bien osmode

(setq OldOs (getvar "osmode"))

;;;----------------------------------------------------------

;;;Set object snap OFF

(setvar "osmode" 0)

;;;----------------------------------------------------------

;;;Goi lenh AutoCAD

(command "line" p1 p2 p3 p4 "c")

(command "line" p3 p5 p4 "")

;;;----------------------------------------------------------

;;;Tai lap osmode

(setvar "osmode" OldOs)

;;;----------------------------------------------------------

;;;Lang le rut lui

(princ)

)

Mạn phép bác Ssg, xin giải thích giùm bạn về đoạn code đó như thế này: đoạn code này nhằm 1 mục đích

là để tránh bắt nhầm điểm khi dùng các hàm (command) nếu chế độ osnap lúc đó đang mở. Đây là 1 kinh nghiệm

"xương máu" của người lập trình. Giải thích chi tiết thì như sau:

;;;----------------------------------------------------------

;;;Luu bien osmode

(setq OldOs (getvar "osmode")) ;đoạn này để lưu lại biến osnap mà bạn đang đặt trước khi dùng hàm (command).

;;;----------------------------------------------------------

;;;Set object snap OFF

(setvar "osmode" 0) ;đoạn này để tắt chế độ bắt điểm osnap mà ta đã đặt trước khi dùng (command).

;nếu không tắt thì 2 đoạn vẽ bằng (command) dưới đây có thể bắt điểm sai.

;;;----------------------------------------------------------

;;;Goi lenh AutoCAD

(command "line" p1 p2 p3 p4 "c") ;dùng để vẽ line qua p1, p2, p3, p4 và đóng lại ở p1.

(command "line" p3 p5 p4 "") ;dùng để vẽ line qua p3, p4, p4 và dừng.

;;;----------------------------------------------------------

;;;Tai lap osmode ;đoạn này để đặt lại chế độ osnap như đã đặt trước khi dùng (command).

(setvar "osmode" OldOs)

;;;----------------------------------------------------------

;;;Lang le rut lui

(princ) ;in một dòng trống

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào bạn,

Mình thì ko biết lisp nhiều nhưng cũng xin giúp 1 chút

Đoạn màu đỏ mỗi dòng đều có chú thích rất rõ ràng (dòng có 3 dấu ; là chú thích.

 

biến OSMODE và OSNAP là 2 biến hệ thống (bạn vào Express > Tôls > System Variable Editor tìm hiểu thêm)

 

;;;Goi lenh AutoCAD

(command "line" p1 p2 p3 p4 "c") >> vẽ line qua 4 diem p1, p2, p3, p4 rồi quay lại điểm đầu => có 4 line

(command "line" p3 p5 p4 "") >> vẽ line qua 3 diem p3, p4, p5

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×