Trang

Thứ Ba, 9 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é :)

Thứ Tư, 3 tháng 4, 2013

Bài 2: AutoLISP là gì và HelloWorld

AutoLisp là gì?


Trước hết LISP là chữ viết tắt của LISt Processor (xử lý danh sách). Nếu nhắc đến danh sách, bạn nên nghĩ ngay đến các dấu phân cách giữa các phần tử (ví dụ như dấu phẩy (,) hay dấu chấm phẩy (;)...). Và trong trường hợp này là dấu Cách ( ).
Cùng xem một ví dụ:

(princ "HelloWorld")
;Ghi chú: in trên dòng lệnh command của AutoCAD dòng chữ "HelloWorld"

Câu lệnh trên là một ví dụ điển hình về ngôn ngữ LISP:
- Một câu lệnh được đặt giữa hai dấu mở đóng ngoặc ( ).
- Trong một câu lệnh sẽ có một danh sách được phân cách với nhau bởi dấu cách (SpaceBar).

Các sản phẩm của AutoDesk (điển hình là AutoCAD) đều có tiền tố "Auto" đứng đầu. và AutoLISP không phải là một ngoại lệ (đoán thế :v ).

Như vậy hiểu nôm na, AutoLISP là một sản phẩm của AutoDesk, sử dụng ngôn ngữ lập trình LISP. Nhằm tạo ra các công cụ tự động hoá (chủ yếu là các lệnh mới) cho thao tác trên các sản phẩm của AutoDesk mà điển hình là AutoCAD.

Và HelloWorld!

Đơn giản là xin chào thế giới!

  1. (defun c:HelloWorld ()
  2.      (princ "Hello World")
  3.      (princ)
  4. )
Dòng số 1: (defun c:HelloWorld () có tác dụng khai báo với AutoCAD một lệnh mới có tên là HelloWorld (không phân biệt viết hoa và viết thường). Bạn hoàn toàn có thể thay đổi HelloWorld bằng một cái tên khác do bạn tự định nghĩa (VD: hello, world, chaothegioi, ...).

Dòng số 2: (princ "Hello World") có tác dụng in ra trên dòng lệnh AutoCAD dòng chữ Hello World.

Dòng số 3: Khi câu lệnh tại dòng 2 kết thúc, nó sẽ trả về một giá trị (*) chính là chuỗi ký tự "Hello World". Trong trường hợp không có dòng thứ 3, thì giá trị đấy cũng chính là giá trị trả về của toàn bộ lệnh HelloWorld, do đó AutoCAD sẽ in dòng chữ "Hello World" một lần nữa. Để tránh trường kết quả không mong muốn đó, ta dùng hàm (princ) để trả về một giá trị trắng (không in).

Dòng số 4: là kết thúc câu lệnh HelloWorld.

Để chạy được câu lệnh trên, sử dụng 2 cách sau:
  1. Copy toàn bộ đoạn code vào dòng lệnh của AutoCAD và nhấn Enter. Bạn chú ý trước dấu mở ngoặc đầu tiên (trước chữ defun) không được phép có khoảng trắng. Nếu không sẽ gây nhầm lẫn cho AutoCAD.
  2.  Dùng Notepad (**), mở 1 file mới copy 4 dòng code vào, ghi với tên tệp yourfilename.lsp. Mặc định của Notepad là định dạng *.txt, do vậy để ghi dưới dạng *.lsp, bạn phải để File typeAll Files và trong File Name, phải ghi đầy đủ cả phần mở rộng yourfilename.lsp. Mở AutoCAD, gõ lệnh APPLOAD (hoặc AP), tìm đường dẫn đến file lsp vừa tạo và chọn LOAD.


Sau khi đã LOAD, từ dòng lệnh của AutoCAD, gõ lệnh HelloWorld và xem kết quả!
  1. Command: helloworld
  2. Hello World
  3. Command:
Như vậy bạn đã tạo được một lệnh cho riêng mình, nhưng lại mở ra một thế giới khác! Bạn thấy đấy, không khó chút nào đúng không?

Hãy tiếp tục chờ đón bài 3 nhé!

(*)   Các hàm của AutoLISP thường trả về một giá trị nào đó. Và AutoCAD sẽ in giá trị trả về trên dòng lệnh.
(**) Thông thường mình hay dùng Notepad++ để soạn thảo AutoLISP. Bạn có thể download Notepad++ theo đường dẫn sau:
Notepad++ Download
Download Notepad ++

Bài 1: Lời mở đầu

Chào mừng các bạn đến với khóa học AutoLISP cơ bản!

Đây là khóa học dành cho các bạn đã và đang phải làm việc với AutoCAD, biết hay không am hiểu về lập trình nói chung và AutoLISP nói riêng. Mục đích nhằm nâng cao khả năng tự động hóa trong thiết kế, được tiếp cận với một công cụ đơn giản nhưng mang lại hiệu quả cao trong công việc.
Tại sao lại là "AutoLISP - Thật là đơn giản"?


Đây chỉ là một câu nói vui về ngôn ngữ lập trình AutoLISP, một ngôn ngữ tương đối đơn giản (theo quan điểm riêng của người viết). Hy vọng những thông tin trong blog sẽ giúp bạn có một cái nhìn cởi mở hơn về công việc tự động hoá thiết kế, về ngôn ngữ lập trình. Quan trọng hơn là giúp cho công việc của bạn trở nên đơn giản, bớt nhàm chán.

Ngoài ra, bất cứ lúc nào bạn có thắc mắc, bạn đều có thể yêu cầu hỗ trợ từ admin theo địa chỉ sau:
Yahoo ID: lemanhhung0302
Email: lemanhhung0302@yahoo.com

Chúc các bạn sau khi hoàn thành khóa học đều có thể thốt lên "AutoLISP - Thật là đơn giản"!

Thư viện AutoLISP mở rộng Doslib (Phần 2)

Các hàm thiết lập -------------------------------------------------------------------------------- dos_getini Trả về giá trị từ tệp tin INI ...