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

Dùng chương trình con để rút gọn code

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

Tôi xin đóng góp 1 vài VD về dùng chương trình con

Khi viết lisp, có nhiều đoạn code gần như lặp lại, vì vậy nếu dùng chương trình con sẽ giúp rút ngắn code khá nhiều.

Việc rút ngắn code không có nghiã là chương trình chạy mau hơn, nhưng nó giúp cho 1 hàm ngắn hơn, dễ xem hơn

và tìm lỗi cũng dễ dàng hơn.

Chú ý :

-Trong chương trình con, chỉ nên dùng biến cục bộ,

-Các chương trình con thường dùng nên ghi chú kỹ và cho vào 1 file riêng để khi dùng dễ đối chiếu

http://www.cadviet.com/upfiles/Example.rar

  • 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

Ví dụ 1:

Khi viết lisp, các hàm lấy mã dxf của đối tượng thường dùng rất nhiều là

;============ Cac ham co ban ============
; n: dxf code
; Lay ma Dxf cua doi tuong
(defun GetDxf(n elist) (cdr (assoc n elist)))
; Giong nhu ham GetDxf nhung neu elist khong co thi return 0
(defun DefDxf(n elist / a) (setq a (cdr (assoc n elist))) (if a a 0))
; Thay doi ma Dxf cua doi tuong
(defun ModDxf(n newval elist)
(if (GetDxf n elist)
	(entmod (subst (cons n  newval) (assoc n elist) elist))
	(entmod (append elist (list (cons n  newval))))
)
)

Để làm VD xin phép lấy hàm của bạn Nguyen Hoanh trong bài "Học AutoLisp, Thật là đơn giản"

vì trong bài này bạn Nguyen Hoanh có giải thích chi tiết nên rất dễ hiểu

http://www.cadviet.com/forum/index.code?sh...pic=80&st=0

Ở đây tôi viết hàm TogVis để thay đổi tính ẩn hiện với tham số n là mã 60

(defun TogVis (n / ss i elist)
(if (= n 1)	(princ "\nSelect object(s) to hide: "))
(if (setq i -1 ss (if (= n 1)	(ssget) (ssget "_X" '((60 . 1)))))
	(repeat (sslength ss)
		(setq i (1+ i)	 elist (entget (ssname ss i)))
		(if (/= 4 (logand 4 (GetDxf 70 (entget (tblobjname "layer" (GetDxf 8 elist))))))
			(ModDxf 60 n elist)
		)
	)
	(if (= n 0)	(princ "\nNo objects was hidden. "))
)
(if (= n 1)	(princ))
)

Sau đó dùng 2 hàm sau gọi hàm TogVis

(defun c:InVis ()	(TogVis 1))
(defun c:Vis  ()	(TogVis 0))

Kết quả cũng như vậy, tuy hơi khó hiểu đối với người mới bắt đầu

 

Ví dụ 2:: Dùng bit cho tham số

; Ham tron toa do cua 2 point
;	n: if bit 1 set : x of pt1, else x of pt2
;	bit 2 y,	 bit 3 z
(defun MixPoint(n pt1 pt2)
(list (nth 0 (if (/= 0 (logand n 1)) pt1 pt2)); or car
			(nth 1 (if (/= 0 (logand n 2)) pt1 pt2)); or cadr
			(nth 2 (if (/= 0 (logand n 4)) pt1 pt2))); or caddr
)

Hàm này trộn toạ độ của 2 điểm pt1& pt2

Tôi viết hàm TextPos sau để thay đổi vị trí text, dùng hàm MixPoint để xác định vị trí mới cho text

 

(defun TextPos(id / pt ed l w h n)
(setq PromptPt (list ".x" ".y" ".xy" ".z" ".xz" ".yz"))
(setq pt (getpoint (strcat (nth (1- id) PromptPt) " of:") ))
(setq ed (ssget '((0 . "TEXT") )) i -1)
(repeat (sslength ed)
	(setq i (1+ i) el (entget (ssname ed i)) n (if (= (+ (DefDxf 72 el) (DefDxf 73 el)) 0) 10 11))
	(ModDxf n (MixPoint id pt (GetDxf n el))  el)
)
(princ)
)

Như vậy muốn thay đổi x ta chỉ cần gọi (TextPos 1), đổi y ta chỉ cần gọi (TextPos 2)....

;============ Thay doi vi tri text ============
(defun C:TextX() (TextPos 1))
(defun C:TextY() (TextPos 2))
(defun C:TextZ() (TextPos 4))
(defun C:TextXY() (TextPos 3))
(defun C:TextXZ() (TextPos 5))
(defun C:TextYZ() (TextPos 6))

 

Ví dụ 2: Ta còn có thể thay đổi tham số để gọi các lệnh khác nhau

Ở đây tôi viết hàm để trim hay extend nhiều đối tượng,

Trong các version mới của cad đã có hàm này nhưng ai còn dùng cad cũ thì các hàm sau vẫn còn có ích

Code của hàm này tôi cũng lấy từ diễn đàn về viết lại

(defun MulAdjust (id / n i e ss pt cm ms ce em)
(setq cm (list "Trim" "Extend" "Adjust"))
(setq ce (getvar "CMDECHO") em (getvar "EDGEMODE") ms (nth (1- id) cm))
(setvar "CMDECHO" 0) (setvar "EDGEMODE" 0)
(princ "Select edges :")
(setq e (ssget))
(princ (strcat "Select objects to " ms " :"))
(setq ss (ssget) n 0)
(setq pt (getpoint (strcat "side to " ms)))
(repeat 2
	(if (/= 0 (logand id (lsh 1 n)))
		(progn
			(setq i -1)
			(command (nth n cm) e "")
			(repeat (sslength ss) (setq i (1+ i))(command (list(ssname ss i) pt)) )
			(command "")
		)
	)
	(setq n 1)
)
(setvar "CMDECHO" ce) (setvar "EDGEMODE" em) (princ) 
)

Trong đó bit 1 của id nếu set thì sẽ dùng lệnh "TRIM" , bit 2 là "Extend"

Thay đổi id ta có được 3 hàm để "Trim", "Extend" hoặc đồng thời cả 2

(defun C:ExTrim () (MulAdjust 1))
(defun C:ExExtend () (MulAdjust 2))
(defun C:ExAdjust () (MulAdjust 3))

  • 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  

×