ndtnv 481 Báo cáo bài đăng Đã đăng Tháng 10 29, 2008 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 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
ndtnv 481 Báo cáo bài đăng Đã đăng Tháng 10 29, 2008 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)) 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