/

10 tháng 4, 2013

Bài 3: Hàm "Command" đơn giản và hiệu quả

Hàm command là gì?

Như các bạn đã biết, chúng ta tương tác với AutoCAD chủ yếu bằng cách gõ các lệnh từ bàn phím như lệnh m (move), u (undo), l (line)... Tất cả các thao tác với bàn phím đều được AutoCAD ghi lại, và thể hiện trên dòng lệnh.

Hỏi vui: Có bao giờ không nhìn màn hình của AutoCAD mà bạn vẫn gõ lệnh theo đúng trình tự hay không?

Hãy xem một ví dụ sau:
  1. (defun c:C2L ()
  2.         (command "Layout" "" "")      
  3. )
Dòng số 1: Dùng để khai báo một lệnh mới có tên C2L (Bạn có thể tự đặt tên riêng cho mình).
Dòng số 2: Thực hiện lệnh command đã nói ở trên. Bạn chú ý, cấu trúc của câu lệnh này vẫn theo quy tắc 1 danh sách ở giữa hai dấu đóng mở ngoặc (luôn luôn phải theo quy tắc này).
Vậy AutoCAD sẽ thực hiện hàm command trong ví dụ này như thế nào?
Đầu tiên AutoCAD sẽ gõ "hộ" bạn lệnh layout. Tiếp đến là thêm hai lần (đại diện bằng 4 dấu ngoặc kép) nhấn phím Enter và kết thúc lệnh/hàm. Bạn có thể tự thực hiện bằng cách gõ lệnh theo đúng trình tự trên:
Command: layout [ENTER]
Enter layout option [Copy/Delete/New/Template/Rename/SAveas/Set/?] <set>:  
[ENTER]
Enter layout to make current <Layout1>: [ENTER]
Regenerating layout.
Regenerating model - caching viewports.
Kết quả là bạn sẽ được chuyển từ Model sang Layout1.

Như vậy với việc nhớ trình tự các thao tác nhập liệu trên bàn phím, bạn hoàn toàn có thể thực hiện một số lệnh đơn giản mà không mất nhiều công sức rồi.

Sau đây là một vài ứng dụng (sưu tầm) của lệnh command mà bạn có thể tự kiểm tra và tự hiểu được kết quả:
(defun c:ss( )
 (command "layer" "new" "1" "c" "1" "1" "")
 (command "layer" "new" "2" "c" "2" "2" "")
 (command "layer" "new" "3" "c" "3" "3" "")
 (command "layer" "new" "4" "c" "4" "4" "")
 (command "layer" "new" "2" "c" "2" "2" "")
 (command "layer" "new" "5" "c" "1" "5" "")
 (command "layer" "new" "6" "c" "6" "6" "")
 (command "layer" "new" "8" "c" "8" "8" "")
 (command "layer" "new" "9" "c" "8" "9" "")
 (command "layer" "c" "7" "0" "")
 (command "style" "IN" ".VnArialH" "" "" "" "" "")
 (command "style" "IN1" ".VnArial NarrowH" "" "" "" "" "")
 (command "style" "Thuong" ".VnArial Narrow" "" "" "" "" "")
)
Hoặc
(command ".undo" "mark")
(command ".undo" "back")
Bạn có thể tự kiểm tra các lệnh sau dùng để làm gì?
(defun c:a () (command ".line" ))
(defun c:ac() (command ".arc"))
(defun c:cc () (command ".circle"))
(defun c:ci () (command ".circle"))
(defun c:du () (command "dim1" "update"))
(defun c:dx () (command ".dimaligned"))
(defun c:dc () (command "dim1" "continue"))
(defun c:dh () (command "dimedit" "home"))
(defun c:dr () (command ".dimradius"))
(defun c:df () (command ".dimlinear"))
(defun c:dd () (command ".dimlinear"))
(defun c:dn () (command ".dim1" "n"))
(defun c:n () (command ".dim1" "n"))
(defun c:de () (command "dim1" "l"))
(defun c:da () (command ".dimangular"))
(defun c:a () (command ".line"))
(defun c:g () (command ".matchprop"))
(defun c:q () (command ".offset"))
(defun c:s () (command ".stretch"))
(defun c:t () (command ".text"))
(defun c:v () (command ".move"))
(defun c:m () (command ".move"))
(defun c:x () (command ".explode"))
(defun c:z () (command ".zoom"))
(defun c:zz () (command ".zoom" "p"))
(defun c:ze () (command ".zoom" "e")) 
(defun c:zd () (command ".zoom" "d")) 
(defun c:za () (command ".zoom" "all"))
(defun c:ed () (command ".ddedit"))
(defun c:d () (command ".dist" ))
(defun c:sq () (command ".Qselect"))
(defun c:lo () (command ".Layon"))
(defun c:loo () (command ".layoff"))
(defun c:ee () (command ".Extend"))
(defun c:sq () (command ".Qselect"))

Một câu hỏi đặt ra là:  
Tôi muốn vẽ 1 đường thẳng (Line) hay một đường tròn bằng command có được không?
Câu trả lời là: Hoàn toàn được!
Lúc này tôi sẽ giới thiệu với các bạn một tập hợp hàm quan trọng, chịu trách nhiệm nhận thông tin từ người dùng, gọi là các hàm đầu vào:
(getreal [Dòng nhắc]) Cho phép người dùng nhập vào một số thực.
(getstring [cr] [Dòng nhắc]) Cho phép người dùng nhập vào một chuỗi ký tự. Trong đó [cr] nếu không có hoặc mang giá trị nil thì không được nhập dấu cách (spacebar).
(getpoint [pt] [Dòng nhắc]) Cho phép người dùng nhập vào tọa độ một điểm hoặc click trên màn hình. Trong đó pt là điểm đã được chọn từ trước, dùng để so sánh trên màn hình.
(getcorner pt [Dòng nhắc]) Cho phép người dùng nhập vào một góc của hình chữ nhật
(getdist [pt] [Dòng nhắc]) Cho phép người dùng nhập vào khoảng cách hoặc click 02 điểm trên màn hình. Trong đó pt là điểm đầu của khoảng cách (nếu có).
(getangle [pt] [Dòng nhắc]) Cho phép người dùng nhập vào số đo góc.
(getorient [pt] [Dòng nhắc])
(getkword [Dòng nhắc]) Cho phép người dùng nhập vào từ khóa (kword).
(getint [Dòng nhắc]) Cho phép người dùng nhập vào một số nguyên.
Xin phép được đưa thêm 2 hàm sau:
(ssget) Cho người dùng chọn một tập hợp đối tượng (Selection Set).
(entget) Cho phép chọn một đối tượng.
 Có một quy tắc trình bày trong lập trình, đó là các thành phần nằm giữa hai dấu ngoặc vuông [ ] là các thành phần có thể vắng mặt. Dòng nhắc là một chuỗi ký tự, thông báo cho người sử dụng biết cần phải làm gì.
(defun c:cc ()
(command ".circle" (getpoint "\nXac dinh tam duong tron: ") (getreal "\nNhap ban kinh: "))
)
Ngoài ra, khi sử dụng hàm command, bạn có thể tạm dừng bất cứ lúc nào để nhận tương tác từ người dùng bằng phần tử PAUSE như ví dụ sau:
(defun c:90 (/ ss1) (command "rotate" (ssget) "" pause 90))
(defun c:09 (/ ss1) (command "rotate"
(ssget) "" pause -90))
(defun c:15 (/ ss1) (command "rotate"
(ssget) "" pause 15))
(defun c:51 (/ ss1) (command "rotate"
(ssget) "" pause -15))
(defun c:25 (/ ss1) (command "rotate"
(ssget) "" pause 225))
(defun c:52 (/ ss1) (command "rotate"
(ssget) "" pause -225))
(defun c:27 (/ ss1) (command "rotate"
(ssget) "" pause 270))
(defun c:72 (/ ss1) (command "rotate"
(ssget) "" pause -270))
(defun c:35 (/ ss1) (command "rotate"
(ssget) "" pause 135))
(defun c:53 (/ ss1) (command "rotate"
(ssget) "" pause -135))
(defun c:45 (/ ss1) (command "rotate"
(ssget) "" pause 45))
(defun c:54 (/ ss1) (command "rotate"
(ssget) "" pause -45))
(defun c:18 (/ ss1) (command "rotate"
(ssget) "" pause 180)
(defun c:81 (/ ss1) (command "rotate"
(ssget) "" pause -180))
(defun c:30 (/ ss1) (command "rotate"
(ssget) "" pause 30))
(defun c:03 (/ ss1) (command "rotate"
(ssget) "" pause -30))
(defun c:60 (/ ss1) (command "rotate"
(ssget) "" pause 60))
(defun c:06 (/ ss1) (command "rotate"
(ssget) "" pause -60))
Các hàm command trên đều thực hiện lệnh rotate. Trong đó, pause tương ứng với yêu cầu nhập tọa độ tâm quay basepoint (trong trình tự lệnh rotate). Vì vậy pause tạm dừng lệnh rotate để người dùng thực hiện "nghĩa vụ" nhập tọa độ basepoint. Có thể thay pause bằng hàm (getpoint "\nNhap toa do tam quay: ")
(defun c:90 (/ ss1) (command "rotate" (ssget) "" (getpoint "\nNhap toa do tam quay: ") 90))
Như vậy, với việc nhớ trình tự gõ lệnh, bạn đã tự tạo cho mình được những lệnh hữu dụng, giúp thao tác nhanh hơn rất nhiều lần cách nhập phím thông thường.

Nào, hãy tự tạo ra lệnh cho riêng mình đi! Và đừng quên chia sẻ với mọi người nhé :)