Đến nội dung


Hình ảnh

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


  • Please log in to reply
1 reply to this topic

#1 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 29 October 2008 - 04:36 PM

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.c...les/Example.rar
  • 1

#2 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 29 October 2008 - 04:38 PM

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.c...h...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