PDA

View Full Version : Cùng nhau học AutoLisp


conghoa
08-27-2010, 04:57 PM
Mình xin mạn phép được mở topic này để mọi người cùng nhau học tập về AutoLisp đi từ lý thuyết đến thực hành. Từ cơ bản đến nâng cao.
Topic sẽ được bắt đầu từ đây. Mong mọi người tham gia và bình luận.

conghoa
08-27-2010, 05:09 PM
Cách viết chương trình của AutoLisp

Có 2 cách viết chương trình AutoLisp:
- Viết trực tiếp:
Tại dòng nhắc Command: của AutoCad ta có thể gõ các câu lệnh theo cú pháp của AutoLisp. Lệnh này sẽ được thực thi ngay và cho kết quả trên màm hình tại vùng dòng lệnh, nhưng lệnh này không lưu trữ được.
- Viết thành chương trình:
Dùng chương trình soạn thảo (dạng mã ASCII) bất kỳ hoặc Visual LISP, viết thành chương trình như một tạp tin nguồn có phần mở rộng *.lsp
Tên tệp tuân thủ theo qui ước của hệ điều hành, thường không quá 8 ký tự, giữa các ký tự không có khoảng trống.

Vì vậy chúng ta có thể sử dụng chương trình Notepad có sẳn trong Win để soạn thảo. Khi lưu chọn encode là ANSI

conghoa
08-27-2010, 05:11 PM
Tải và chạy chương trình ứng dụng AutoLisp

Từ AutoCad: Tool\ Load Application hoặc trên dòng lệnh Command: ap
Để AutoCad tự động tải ngay từ khi khởi động hoặc mở bản vẽ có 2 cách:
-Đặt tên tệp là ACAD.LSP và đặt trong thư mục Support của AutoCad
-Khi tải file lần đầu sử dụng Startup Suite\ Contents và chọn đường dẫn cho file

HieLa
08-27-2010, 07:07 PM
Cách viết chương trình của AutoLisp

Có 2 cách viết chương trình AutoLisp:
- Viết trực tiếp:
Tại dòng nhắc Command: của AutoCad ta có thể gõ các câu lệnh theo cú pháp của AutoLisp. Lệnh này sẽ được thực thi ngay và cho kết quả trên màm hình tại vùng dòng lệnh, nhưng lệnh này không lưu trữ được.
- Viết thành chương trình:
Dùng chương trình soạn thảo (dạng mã ASCII) bất kỳ hoặc Visual LISP, viết thành chương trình như một tạp tin nguồn có phần mở rộng *.lsp
Tên tệp tuân thủ theo qui ước của hệ điều hành, thường không quá 8 ký tự, giữa các ký tự không có khoảng trống.

Vì vậy chúng ta có thể sử dụng chương trình Notepad có sẳn trong Win để soạn thảo. Khi lưu chọn encode là ANSI

Tôi vẫn thường viết lisp từ trình soạn thảo của AutoLisp VisualLISP Editor nó sẽ hỗ trợ mã màu để bạn kiểm tra cú pháp . Ngoài ra nó còn định dạng câu lệnh . nếu viết sai lênh màu sác sẽ nhắc nhở bạn . Trong AutoCad bạn chọn :
Tools \\ AutoLISP \\ VisualLISP Editor để đến màn hình Visua LISP . Bạn soạn thảo CT ở đây .
Từ đây sau khi chạy thử bạn có thể kiểm tra giá tri hiện tại của các biến và thực hiện gỡ rối CT tốt hơn. Có nhiều hơn nữa sự hỗ trợ cho bạn trong quá trình viết mã

HieLa
08-27-2010, 07:34 PM
Để trở thành lập trình viên AutoLisp

Để học LT bạn cần hôi tụ các yếu tố đó là tư duy về lập trình . niềm say mê sáng tạo ,giám nghĩ giám làm , luôn luôn tìm tòi học hỏi , Ngôn ngữ chỉ là công cụ tư duy về lập trình mới là điều cốt yếu . Có lẽ bạn phải bắt đầu từ cái đơn giản nhất đó là cái máy tính .Bạn phải hiểu biết về DOS Windowns . Vì quá trình viết lệnh bạn phải tương tác với nó . Nếu bạn giám tháo tung tất cả các bộ phận của cái máy tính ra và tự gắn lại được thì bạn có cơ hội trở thành lập trình viên AutoLisp . Ở đây tôi muốn nói đến phần cứng . Bạn viết phần mềm nhưng cũng cần có kiến thức về phần cứng vì lệnh của bạn nói cho cùng thì chính phần cứng chụi trách nhiệm thực hiện .
Người LT cần có kiến thức hệ thống về máy tính .Bạn cấp phát PM cho người dùng khi nó không chạy ND sẽ tìm bạn mà hỏi .Đôi khi lỗi do hệ thống MT ,.Bạn phải sử lý lỗi này để PM chạy tiếp .

conghoa
08-28-2010, 01:09 AM
Rất vui khi anh tham gia vào topic này. Hy vọng với kinh nghiệm lập trình Lisp của anh và admin,mod topic sẽ có nhiều điều thú vị.

HieLa
08-28-2010, 06:08 AM
Sách học để trở thành lập trình viên AutoLISP


http://www.mediafire.com/?zyjjowzihjf
http://www.mediafire.com/?ieynycewnz2
http://www.mediafire.com/?dymhnrn1zmt
http://www.mediafire.com/?jodondnhnni
http://www.mediafire.com/?tkl9xdzwf5y


Bạn nên tìm cuốn : Lập trình thiết kế với AutoLISP và Visual LISP của TS Nguyễn Hữu Lộc và Nguyễn Thành Trung . Nhà Xuất bản Thành Phố Hồ Chí Minh . Sách gốm 2 tập viết rất cơ bản vả rễ hiểu .

Nếu bạn muốn tìm sách bằng tiếng Anh thì nó có ngay trong máy tính của bạn . Trong màn hình AutoCad chọn : Tools \\ AutoLISP \\ VisualLISP Editor để đến màn hình Visua LISP for AutoCAD trong maøn hình naøy choïn: Help\ Vsual LISP Help topics F1
Ở đây có đủ mọi thứ cho bạn , Các lệnh đều có ví dụ minh họa bạn không biết nhiếu têng anh nhìn vào ví dụ bạn hiểu được cú pháp lệnh , Bạn sẽ biết cách sử dụng lệnh .

Các cuốn sách viết về Lisp có rất nhiều tại các siêu thị Các tác giả thường lấy tiêu đề sách theo phiên bản của AutoCad để câu khách . Thực ra trong các cuốn sách này có 80% nội dung giống nhau ,Thậm chí giống cả văn chương . Bạn hãy đọc kỹ nôi dung trước khi mua . Các lệnh của Lisp có thể dùng chung cho càc phiên bản cùa AutoCad , Khi bạn dùng mã lệnh của Cad thì chỉ có một số lệnh nhất định mới theo phiên bản . AutoCad luôn tương thích ngược , bản mới luôn đọc được bản cũ .


Đây là Giáo trình AutoCad 2004 của trường Đại học Mỏ địa chất biên soạn :

http://www.mediafire.com/?j2olyi0odld

Sách học Autocad 2007

http://www.mediafire.com/?vtfzwjvw0gg


Sách học Autocad 2008

2 D
http://www.mediafire.com/?ttoxjjywa8d


3D
http://www.mediafire.com/?ymrywo2wklm


Bạn phải học cách dùng lệnh của Cad để viết Lisp

HieLa
08-29-2010, 08:49 AM
Tải và chạy chương trình ứng dụng AutoLisp
Từ AutoCad: Tool\ Load Application hoặc trên dòng lệnh Command: ap
Để AutoCad tự động tải ngay từ khi khởi động hoặc mở bản vẽ có 2 cách:
-Đặt tên tệp là ACAD.LSP và đặt trong thư mục Support của AutoCad
-Khi tải file lần đầu sử dụng Startup Suite\ Contents và chọn đường dẫn cho file

Cái bạn hướng dẫn là cho người dùng còn bạn đang soạn thảo CT thì chạy nó ở đây :

http://www.mediafire.com/imgbnc.php/48c916d0b14fc8bab73286cb4cdfbecb6g.jpg

Màn hình Visua LISP for AutoCad . Nơi bạn soạn thảo CT


Trong màn hình soạn thảo bạn chọn : Tools \ Load Text in Edtor hoặc (Ctrl +Alt + E ) hoặc nhấn nút load Active Edit Window (có khoanh màu đỏ trong hình )
Bạn được dẫn đến màn hình Visual Lisp Console
Trong màn hình này nếu bạn không gặp lỗi gì thì có dòng thông báo để bạn tiếp tục chạy VD :
_$ ; 415 forms loaded from #<editor "C:/Program Files/AutoCAD 2008/Support/Catkenh.LSP">
_$
Sau dấu _$
Bạn gõ lệnh gọi đoạn CT cần chạy VD :
_$ (tencotbangchiettinh)
Sau đó nhấn EnTer là được .

Bạn thấy không Visua LISP hỗ trợ cho bạn đủ mọi thứ . Chúc thành công !

conghoa
08-29-2010, 10:42 PM
Cảm ơn Mod đã nhiệt tình. Để đơn giãn và dễ hiểu chúng ta nên vừa thực hành vừa học lý thuyết. Xin một ví dụ đơn giản nhất là lisp vẽ hình chữ nhật chẳng hạn. Bây giờ chúng ta sẽ phân tích đoạn lisp đó.

conghoa
08-29-2010, 10:50 PM
Hình dáng và kí hiệu điểm của chứ nhật như hình sau:

http://cA6.upanh.com/12.509.16741166.PSD0/chunhat.jpg

Mình sử dụng Visual LISP Editor của AutoCAD viết code:
(defun C:CHUNHAT(/W H1 P1 P2 P3 P4 OldOS)
(setq
W(getreal "\nChieu rong W=")
H1(getreal "\nChieu cao H1=")
P1(getpoint "\n Diem chua:")

P2(polar P1 0.0 W)
P3(polar P2 (/pi 2) H1)
P4(polar P3 pi W)
)
(setq OldOs(getvar "osmode"))
(setvar "osmode" 0)
(command "line" P1 P2 P3 P4 "c")
(setvar "osmode" OldOs)
(princ)
)

Sau khi load vào Cad va thử chạy thì chẳng có tín hiệu gì cả. Mấy cao thủ xem dùm mình thử coi có sai gì không nhá.

HieLa
08-30-2010, 05:50 AM
Dòng 1 thêm dấu cách (khoảng trắng-space) giữa “/” và “W”
Viêt lại dòng này như sau :
(defun C:CHUNHAT(/ W H1 P1 P2 P3 P4 OldOS)
Dòng thứ 7 giữa "/ "va "pi" bạn tạo một dấu cách là được
Viêt lại dòng này như sau :
P3 (polar P2 (/ pi 2) H1)
Bạn thấy không nếu thêm khoảng trắng sau “/” thì “/” và "pi" sẽ đổi màu từ đen qua xanh dương .

conghoa
08-30-2010, 07:46 PM
Sau khi đã sửa lại như lời anh nói. Và load lại Lisp thì vẫn hiện tượng như vậy. Không biết còn chổ nào sai nữa không.

HieLa
08-30-2010, 08:56 PM
Sau khi đã sửa lại như lời anh nói. Và load lại Lisp thì vẫn hiện tượng như vậy. Không biết còn chổ nào sai nữa không.
Tôi đã thử lại nó chạy mà .Bạn kích nút Load Active edit window sau đó gõ (C:CHUNHAT) nhấn Enter
Bạn phải chú ý nhập dữ liệu dưới hàng command theo dòng nhắc lệnh . Lần đầu nhập chiều rộng , lần 2 nhập chiều cao , lần 3 kích chọn điểm bằng chuột trên màn hình sau đó nó mới vẽ hình chữ nhật cho bạn .
---------------------
Phân tích lệnh:
Dòng 1 là tên của chương trình con (Hàm defun) nó có dạng (C:XXX) các biến W H1 P1 P2 P3 P4 OldOS là biến cục bộ .
Dóng 2 là hàm Setq nó gán giá trị cho các biến ở 6 dòng tiếp theo
Dòng 3 gán giá tri cho biến v bằng hàm getreal yêu cầu người dùng nhập khoang cách trên dòng nhắc lệnh
Dòng 4 gán giá tri cho biến H1 bằng hàm getreal yêu cầu người dùng nhập chiều cao trên dòng nhắc lệnh
Dòng 5 gán giá tri cho biến P1 bằng hàm getpoint yêu cầu người dùng kích chọn điểm bằng chuột trên màn hình.
Dòng 6 tính tọa độ điểm P2 bằng hàm polar từ toạ độ điểm P1 và chiều rộng B góc soay 0.0
Dòng 7 tính tọa độ điểm P3 bằng hàm polar từ toạ độ điểm P2 và chiều cao H1 góc soay 90 độ (pi/2)
Dòng 8 tính tọa độ điểm P4 bằng hàm polar từ toạ độ điểm P3 và chiều rộng B góc soay 180 độ
Dòng 10 đóng ngoặc kết thúc hàm Setq ở dòng 2.
Dòng 11 gán giá trị cho biến OldOs là trạng thái hiện tại của osnap bằng cuộc gọi hàm getvar
Dòng 12 tắt osnap bằng hàm setvar gán biến "osmode" = 0
Dòng 13 Vẽ hình chữ nhật qua 4 điểm P1 P2 P3 P4 bằng hàm Command .(Đây là cách dùng lệnh “line” của AutoCad)
Dòng 14 gán trả lại già tri trạng thai biến osnap theo giá tri ban đầu (dòng 11)
Dòng 15 hàm (Princ) Thoát êm chương trình.
Dóng 16 đóng ngoặc kết thúc hàm Defun ở dòng 1

Ghi chú :dòng 1 có dạng (c:XXX) nên sau khi load.. bạn có thể gọi hàm bằng lệnh XXX gõ trực tiếp trên hàng Command của AutoCad trong trường hợp này XXX= CHUNHAT

HieLa
08-31-2010, 05:12 AM
Nếu viết mã trong màn hinh Visual lisp tất cả các chữ có màu xanh dương là các hàm của AutoLisp , các hàm này chạy được trên tất cả các bản Cad khác nhau . Các hàm đếu được bắt đầu bằng một dấu ngoặc mở “(” và kết thúc bằng dấu ngoặc đóng “)” . Khi bạn đóng ngoặc thì dấu ngoặc mở sẽ được nháy báo cho bạn biết vị trí mở của nó . Bạn cứ thử xoá một dấu ngoặc đóng bất kỳ sau đó gõ lại nó bạn chú ý sẽ thấy dấu ngoặc mở tương ứng. Nếu đóng mở ngoặc sai lisp sẽ không chạy . Các khoảng trắng rất quan trọng trong lisp nếu bạn không chú ý để khoảng trắng này CT sẽ không chạy . CT có dùng 1 lệnh AutoCad đó là lệnh Line .Lệnh của AutoCad được viết dưới hàm Command của lisp và đặt trong dấu nháy kép “” các biến tiếp theo của nó phụ thuộc vào yêu cầu nhập lênh của Cad .Trong trường hợp này yêu cầu nhập toạ đô 4 điểm .

conghoa
08-31-2010, 10:18 PM
Cảm ơn Mod đã giúp đỡ nhiều.
Mình cũng thực hiện và sửa lại như Mod nhưng khi gõ (C:chunhat) thì nó báo lỗi như hình bên dưới.
Load vào Autocad chạy Lisp này thì vẫn không có dấu hiệu hoạt động gì.

http://cA7.upanh.com/12.623.16854867.CPH0/error.jpg

HieLa
09-01-2010, 05:07 AM
Bạn chạy lại files tôi sửa nhé :

http://www.mediafire.com/?l3xxc98co7g2224


Bạn gửi files tôi kiểm tra lại cho .
====================================
http://www.mediafire.com/imgbnc.php/c0738ab2d17010a51b904cf84484ee366g.jpg

http://www.mediafire.com/imgbnc.php/8342bbe8e6aab876bc4f1428a39406a36g.jpg
http://www.mediafire.com/imgbnc.php/7d6dfb1ab571e1b1f1af88bbab3da0ad6g.jpg
http://www.mediafire.com/imgbnc.php/6b65ce6f769cd8037302b0d997173a3d6g.jpg

Hình các dòng nhắc lệnh và hình chữ nhật vẽ được

HieLa
09-01-2010, 11:21 AM
Gỡ rối chương trình .

Bạn có thể chạy từng lênh trên màn hình Visual Lisp Console Thay vì gõ lệnh (C:chunhat) bạn past luôn từng lệnh và nhấn Enter nhớ là các lệnh phải đầy đủ các dấu ngặc mở và đóng .(VD lệnh Setq bạn copy từ dòng sồ 2 đến dòng số 10 ) Nếu lệnh nào bị lỗi sẽ có thông báo lỗi . không lỗi sẽ có kết quả báo về là giá trị cuối cùng của các biến trong lệnh . Từ đây bạn có thể biết lỗi nằm ở đâu . Ngoài ra sau khi chạy từng lệnh hoạc cà đoạn CT con bạn có thể kiểm tra giá trị của biến hiên tại bằng cách chọn tên biến và kich nút Symbol Sevice Giá trị biến cần tìm được trả về trong hôp Symbol Sevice .(Nhớ bôi đen chọn đầy đủ tên biến) căn cứ vào gía trị biến bạn có thể biết lỗi từ đâu lưu ý các biến nhận giá trị là nil tức là chưa được gán giá trị đó là dấu vết xác dịnh lỗi . Tất nhiên còn nhiều cách khác để xác định lỗi bạn tham khảo thêm trong tài liệu . Chúc thành công !

conghoa
09-02-2010, 02:55 PM
Vâng, tôi đã thực hiện được rồi. Cảm ơn HieLa rất nhiều. Vì thiếu mất dấu cách giữa “/” và “W”. Hôm đợt đọc bài của anh mà không để ý. CHỉ đọc thấy dòng 7 là vào thay luôn nên không chạy được. Đợt tới sẽ viết thêm vài ví dụ nữa mong anh chỉnh sửa dùm nhé. Do chổ công tác không có internet nên hồi âm lại bài hơi lâu

conghoa
09-13-2010, 10:32 PM
Thêm 1 ví dụ nữa:
Ví dụ về cách tạo Layer

defun c:TaoL()

(command "layer" "m" "!tuong" "c" "2" "" "")

(command "layer" "m" "!tim" "c" "1" "" "")

(command "layer" "m" "!thay" "c" "7" "" "")

(command "layer" "m" "!noithat" "c" "8" "" "")

(command "layer" "m" "!hatch" "c" "8" "" "")

(command "layer" "m" "!chu" "c" "3" "" "")

(command "layer" "m" "!kichthuoc" "c" "8" "" "")

(princ)

)

HieLa
09-14-2010, 06:22 AM
Bạn đã dùng lệnh của Cad để tạo layer . Nó bắt đấu bằng hàm (command ….) tiếp đến là tên lệnh được đặt trong dấu “” VD “layer” . Bạn nhớ lại trong Cad khi dùng lệnh “layer” trên dòng command AutoCad yêu cầu bạn cung cấp các thông tin gì tiếp theo trong dòng nhắc lệnh , thì trong Lisp bạn cũng phải đáp ứng tất cả các yêu cầu đó theo đúng trình tự trong Cad và được đặt trong dấu “” Nếu trong dấu “” bạn không ghi gì cả thì nó được lấy theo giá trị hiện hành trong Cad . Tất nhiên có một số giá trị bắt buộc bạn phải ghi như tên lệnh trong trường hợp này là “layer” hoặc tên lớp VD “!tuong” vv nếu không ghi gì cả lệnh cuả bạn trở thành vô nghiã. Trong lệnh layer này “m” là Make : tạo lớp mới tiếp theo là tên lớp . “c” là Color “8” là mã màu các giá trị còn lại là dạng đường ... vv lấy theo mặc định . Bạn cứ kiểm tra lại xem trình tự ghi lệnh có trùng khớp với các dòng nhắc lệnh của Cad ?. Khi đã biết cách sử dụng lệnh cuả Cad để viết lisp bạn có thể tự viết các dòng lệnh khác. Lệnh của Cad luôn tùy biến do vậy mã viết lisp cũng tùy biến theo .

<Bổ sung bài viết >

Trong quá trình viết mã sau khi đã taọ các layer trên khi nào cần dùng đến nó bạn chỉ cấn gọi nó ra bằng hàm (setvar …) Vd : (setvar "clayer" "!tuong") các đối tượng được tạo sau đó sẽ nẳm trong lớp !tuong cho đến khi bạn thay bằng 1 lớp khác .

conghoa
09-14-2010, 10:42 AM
Cảm ơn Smod đã giải thích câu lệnh để mọi người cùng hiểu. Mong rằng sẽ có nhiều ví dụ nữa và Smod sẽ ủng hộ

conghoa
10-04-2010, 10:14 PM
Đợt này bận quá nên chưa khởi động topic này được.

conghoa
11-04-2010, 10:29 PM
Đánh chử theo thứ tự

(defun c:dchu (/ tdt csht sdt index tt entdt)
(defun thay (tt key moi / cu)
(setq cu (assoc key tt))
(subst (cons key moi) cu tt)
)
(setq tdt (ssget '((0 . "TEXT")))
csht (getint "\nSo bat dau: ")
sdt (sslength tdt)
index 0
)
(repeat sdt
(setq entdt (ssname tdt index)
index (1+ index)
tt (entget entdt)
tt (thay tt 1 (itoa csht))
csht (1+ csht)
)
(entmod tt)
(entupd entdt)
)
(princ)
)
(princ)

conghoa
11-04-2010, 10:44 PM
Tính diện tích một miền bằng cách pick điểm
Khi muốn tính diện tích của vùng bao quanh một điểm, tức là khi ta bấm vào một điểm thì cad sẽ tự chọn một vùng kín bao quanh điểm đó để tính diện tích.

(defun c:dtm()
(defun ctext (diem gt / lst)
(setq lst
(list
(cons 0 "TEXT")
(cons 1 gt)
(cons 10 diem)
(cons 40 (getdist p "\nChieu cao chu: "))
)
)
(entmake lst)
)
(defun dtdoituong (entdt /)
(command ".area" "o" entdt)
(command ".erase" entdt "")
(getvar "area")
)
(defun getbound(p)
(setq ent (entlast))
(command ".boundary" "A" "B" "E" "I" "Y" "" p "")
(setq ent1 (entlast))
(cond
((eq ent ent1) nil)
(t ent1)
)
)
(setq
p (getpoint "\nVao diem can tinh dien tich: ")
entpl (getbound p)
)
(if entpl
(ctext p (rtos (dtdoituong entpl)))
(alert "Diem ban chon khong kin!")
)
(princ)
)

(princ)

HieLa
11-05-2010, 07:02 PM
Tôi đã kiểm tra lại rồi . Hai lisp trên chạy tốt bạn viết lisp tiến bộ rất nhanh đấy !!! Chuẩn không cần chỉnh .

HieLa
11-09-2010, 07:19 PM
Học LT quan trọng nhất là phải rèn luyện tư duy LTvà các thuật toán liên quan . Ý nghiã của các câu lệnh bạn có thể tra cứu thêm trong tài liệu . Bạn phải bắt đầu từ việc đơn giản nhất sau đó mới phát triển thêm . VD : Bạn đã biết cách vẽ hình chữ nhật , bạn hãy phát triển thêm nó đi . Hình CN là MC ngang của dầm cột trong XD bạn thử tìm cách gắn thêm ký hiệu các thanh thép dọc và thép đai vào MC hình CN đó , bổ sung thêm các đường chỉ dẫn số lượng ĐK và chủng loại thép thế là bạn có một PM vẽ TK mặt cắt ngang dầm cột … dần dần bạn sẽ có PM hoàn chỉnh . Dùng hộp thoại để nhập liệu thay việc nhập theo dòng nhắc lệnh . Lần sau tôi muốn nhìn thấy đoạn Code do bạn viết về nó .

HieLa
11-14-2010, 07:45 PM
Tạo điều kiện thuận lợi cho bạn viết lisp tôi viết mẫu một đoạn lisp dùng hộp thoại để vẽ hình chữ nhật . Phần còn lại bạn nghiên cứu phát triển thêm . Bạn copy files damcot.dcl vaò thư viện Support cuả Acad . lệnh là DC . Kích OK để chọn kích thước . Kích P để chọn điểm chưá .

lenhan
07-07-2011, 09:42 PM
ban conghoa Lisp kha do. Minh cung dang viet may cai lisp. mong duoc hoc hoi