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

Phương pháp chỉnh sửa và bắt lỗi trong Auto Lisp

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

Đọc một số bài viết trên diễn đàn thấy anh em tham gia rất đông vui và tập tành viết Auto Lisp rất nhiều

Có rất nhiều bạn thường hay đem một số đoạn Lisp mới viết lên nhờ các cao thủ chỉnh sửa giúp

Và để chia sẻ kinh nghiệm viết LIsp của mình mình xin có một số kinh nghiệm quý báu sau :

1. Khi bạn muốn viết 1 đoạn lisp theo một ý tưởng nào đó trong quá trình làm việc thì bạn nên copy một đoạn mã chuẩn làm mẫu. Sau đó, bạn xóa đi một số dòng câu lệnh không phù hợp đi để có được 1 cú pháp tốt nhất

VD :

(defun c:abc (/)
 (setvar "cmdecho" 0)
 (command "_.undo" "be")
 (setvar "regenmode" 1)
 (setq osmode (getvar "osmode"))
 (setq colo (getvar "clayer"))
 (setvar "osmode" 0)
 (command "ucs" "")
;;;bat dau viet tu day


;;;ket thuc
 (setvar "clayer" colo)
 (setvar "osmode" osmode)
 (command "_.undo" "e")
)

 

2. Sau đó bạn sẽ triển khai viết tiếp các dòng lệnh tiếp theo .... Và tôi thường hay dùng một số lệnh tắt dùng để bắt lỗi chương trình như sau (vào AutoCad bấm lệnh Vlide) : Tại vị trí con trỏ viết lệnh

- Ctrl+Shift+] : kiểm tra đoạn mã có thiếu dấu ( hoặc ) hay không

- F9 : dùng để đánh dấu câu lệnh tại vị trí con trỏ (sau khi load file, vào Cad đánh lệnh ... thì chương trình lisp chỉ chạy tới vị trí đánh dấu này và dừng

- F8 : dùng phím này để tiếp tục chạy chương trình sau khi dừng tại vị trí F9. Tiếp tục bấm F8 chạy cho đến hết chương trình. Nếu bị dừng tại vị trí nào thic câu lệnh đó bị lỗi

- Ctrl+Shift+I : trả ra kết quả của câu lệnh. Nếu không hiện ra kết quả thì câu lệnh đó bị sai (hoặc thiếu biến số)

....

Nếu có thời gian thì tôi sẽ đăng Picture lên cho các bạn dễ hiểu hơn nhé

  • Vote tăng 3

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

He, thanks bác, em chưa thử nhưng có vẻ hay ho đây, bình thường viết lisp tốn thời gian check mấy cái lỗi vớ vỉn cú pháp ghét ghê :)

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
1. Khi bạn muốn viết 1 đoạn lisp theo một ý tưởng nào đó trong quá trình làm việc thì bạn nên copy một đoạn mã chuẩn làm mẫu. Sau đó, bạn xóa đi một số dòng câu lệnh không phù hợp đi để có được 1 cú pháp tốt nhất

VD :

(defun c:abc (/)
 (setvar "cmdecho" 0)
 (command "_.undo" "be")
 (setvar "regenmode" 1)
 (setq osmode (getvar "osmode"))
 (setq colo (getvar "clayer"))
 (setvar "osmode" 0)
 (command "ucs" "")
;;;bat dau viet tu day


;;;ket thuc
 (setvar "clayer" colo)
 (setvar "osmode" osmode)
 (command "_.undo" "e")
)

2. Sau đó bạn sẽ triển khai viết tiếp các dòng lệnh tiếp theo ....

Làm 3 cái hàm con Start-progn, Done-progn, Error-progn cho lành. Mình chỉ cần 3 hàm này để kiểm soát toàn bộ biến hệ thống của mỗi chương trình.

 

Và tôi thường hay dùng một số lệnh tắt dùng để bắt lỗi chương trình như sau (vào AutoCad bấm lệnh Vlide) : Tại vị trí con trỏ viết lệnh

- Ctrl+Shift+] : kiểm tra đoạn mã có thiếu dấu ( hoặc ) hay không

- F9 : dùng để đánh dấu câu lệnh tại vị trí con trỏ (sau khi load file, vào Cad đánh lệnh ... thì chương trình lisp chỉ chạy tới vị trí đánh dấu này và dừng

- F8 : dùng phím này để tiếp tục chạy chương trình sau khi dừng tại vị trí F9. Tiếp tục bấm F8 chạy cho đến hết chương trình. Nếu bị dừng tại vị trí nào thic câu lệnh đó bị lỗi

- Ctrl+Shift+I : trả ra kết quả của câu lệnh. Nếu không hiện ra kết quả thì câu lệnh đó bị sai (hoặc thiếu biến số)

....

- Có thể kiểm tra xem đoạn code đã đủ các dấu đóng mở ngoặc, các dấu nháy kép bằng cách kích đúp chuột vào vị trí đầu hoặc cuối các đoạn code cần kiểm tra

- Bật thêm cái cửa sổ Watch (Ctrl+shift+W) trong cửa sổ này add tất cả các biến cần theo dõi và 1 biến không thể thiếu là LastValue. với công cụ này thì việc kiểm tra lỗi trở lên đơn giản rất nhiêu.

- Ngoài ra còn 1 công cụ hữu ích nữa là "Check edit window" (trên thanh công cụ của Vlide bấm nút có biểu tuợng tờ giấy trắng và chữ V màu xanh). công cụ này sẽ kiểm tra toàn bộ các lỗi có thể gặp phải trong code (thiếu dấu đóng mở ngoặc, thiếu dấu nháy kép, khai báo thừa hoặc thiếu biến...) nếu sảy ra lỗi sẽ đuợc thông báo bằng cửa sổ Buil output các lỗi sẽ đuợc thông báo bằng dòng chữ tô màu xanh, kích đúp vào dòng chữ này con trỏ sẽ nhảy về vị trí đoạn code bị lỗi.

  • Vote tăng 2

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

Đơn giản mà hiệu quả, em vừa check xong, ko biết các bác tự mò hay đọc được mấy cái thủ thuật này ở đâu vậy ?

Chưa hiểu ý tưởng 3 cái hàm của bác Thaistreetz như thế nào cả ?????

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
Đơn giản mà hiệu quả, em vừa check xong, ko biết các bác tự mò hay đọc được mấy cái thủ thuật này ở đâu vậy ?

Chưa hiểu ý tưởng 3 cái hàm của bác Thaistreetz như thế nào cả ?????

đây bạn

(defun start-progn ()
(setq CMDLAST (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "Undo" "BEGIN")
(command "UCS" "W")
(setq	OSMLAST	(getvar "osmode")
			DMZLAST	(getvar "dimzin")
			OTHLAST	(getvar "orthomode")
			TSTLAST	(getvar "textstyle")
			COLLAST	(getvar "cecolor")
			LAYLAST	(getvar "clayer")
			DPMLAST	(getvar "DYNPROMPT")
			DYNLAST	(getvar "DYNMODE")
			ERR			*error*
			*error*	error-progn
)
)
																;defun
;======================= THIET LAP LAI GIA TRI BIEN HE THONG BAN DAU CUA BAN VE ========================
(defun done-progn ()
 (setvar "osmode" OSMLAST)
 (setvar "dimzin" DMZLAST)
 (setvar "orthomode" OTHLAST)
 (setvar "textstyle" TSTLAST)
 (setvar "cecolor" COLLAST)
 (setvar "clayer" LAYLAST)
 (setvar "DYNPROMPT" DPMLAST)
 (setvar "DYNMODE" DYNLAST)
 (command "UCS" "P")
 (if SSe (command "erase" SSe ""))
 (command "undo" "end")
 (if cmdname (progn
 (princ (strcat "\nEnd of [" cmdname "]"))
 (setq cmdname nil)))
 (setq *error* ERR)
 (setvar "cmdecho" CMDLAST)
);defun

;=====================THONG BAO LOI VA THIET LAP LAI GIA TRI BIEN HE THONG BAN DAU======================
(defun error-progn (msg)
 (if OSMLAST (setvar "osmode" OSMLAST))
 (if DMZLAST (setvar "dimzin" DMZLAST))
 (if OTHLAST (setvar "orthomode" OTHLAST))
 (if TSTLAST (setvar "textstyle" TSTLAST))
 (if COLLAST (setvar "cecolor" COLLAST))
 (if COLLAST (setvar "clayer" LAYLAST))
 (if DPMLAST (setvar "DYNPROMPT" DPMLAST))
 (if DYNLAST (setvar "DYNMODE" DYNLAST))
 (if SShd (command "erase" SShd ""))
 (if SSe (command "erase" SSe ""))
 (command "UCS" "P")
 (command "undo" "end")
 (if cmdname
(progn
  (princ (strcat "\n" msg "\nEnd of ["	   cmdname			 "], Reset System Variables\n"		) )
  (setq cmdname nil)
)
(princ (strcat "\n" msg ", Reset System Variables\n"))
 )
 (setq *error* ERR)
 (setvar "cmdecho" CMDLAST)
);defun

Đây là 3 hàm luôn đuợc gọi trong mỗi chuơng trình của mình. hàm start-progn đuợc gọi ngay đầu lisp, hàm error-progn được gọi trong hàm start-progn, hàm này được tự động gọi khi hàm báo lỗi của cad được gọi. hàm done-progn đuợc gọi truớc khi đóng chuơng trình:

(defun c:... ()

(start-progn)

viết code

(done-progn)

(princ)

);end defun

3 hàm này sẽ đuợc bổ sung chỉnh sửa để thích hợp cho toàn bộ dự án (xem thêm Menu project của vlide) lisp của bạn trong quá trình viết lisp

  • Vote tăng 2

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  

×