SHINE OCEAN - THẮP SÁNG BIỂN KHƠI
Hãy đăng nhập để không nhìn thấy hình ảnh quảng cáo này

SHINE OCEAN - THẮP SÁNG BIỂN KHƠI

WEBSITE ĐÃ CHUYỂN SANG TÊN MIỀN: http://offshore.vn - WELCOME TO OFSHORE ENGINEERING ^.HỘI NGỘ HỢP TÁC CÙNG PHÁT TRIỂN.^
 
IndexIndex  CalendarCalendar  GalleryGallery  Trợ giúpTrợ giúp  Tìm kiếmTìm kiếm  Thành viênThành viên  NhómNhóm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  

Share | 
 

 những bước đi đầu tiên khi viết lisp cho cad

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
TOTINH
Admin
avatar

Nam
Tổng số bài gửi : 775
Age : 32
Location : Sài Gòn
Job/hobbies : KỸ SƯ CTB
Registration date : 29/03/2008

Bài gửiTiêu đề: những bước đi đầu tiên khi viết lisp cho cad   Thu Nov 18, 2010 11:39 pm

Học AutoLisp
Phần 1: bắt đầu

Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

Hãy tạo một file mới và save nó với tên hoclisp.lsp.
(princ "\nChao ban")
(princ)
Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao ban' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao ban" là tham số của hàm princ.

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao ban"\nChao ban"' trên màn hình, trong đó "\nChao ban" là kết quả của hàm (princ "\nChao ban").


Phần 2:

Trong phần 1, chúng ta đã xây dựng được 1 chương trình lisp có thể nói là thô sơ nhất thế giới. Và nó có 1 nhược điểm: mỗi lần load thì viết ra lệnh. Muốn viết lại phải appload thêm 1 lần nữa.

Để điều khiển được thời điểm viết, và viết được nhiều lần, chúng ta phải định nghĩa một hàm AutoCAD, để mỗi khi gọi hàm này, chương trình sẽ viết ra màn hình text mà không cần phải appload lại file lisp.

Trên file hoclisp.lsp, chúng ta thêm mã lệnh để trở thành như sau:

(defun c:chao()
(princ "\nChao ban")
(princ)
)

Như vậy chúng ta đã định nghĩa được một lệnh của AutoCAD mang tên chao, mỗi lần gọi lệnh chao tại dòng nhắc Command, chương trình sẽ viết ra trên màn hình text dòng chữ: Chao cadviet.

Trong 2 dòng vừa thêm, hàm defun là hàm định nghĩa lệnh AutoCAD. Có cấu trúc:
(defun tenham() noidungham) trong đó:
- tenham là tên hàm cần định nghĩa, nếu muốn định nghĩa một lệnh trong AutoCAD thì thêm 'C:' vào trước tên hàm.
- noidungham là tập các lệnh mà hàm vừa định nghĩa sẽ thực thi.

Phần 3:

Trong phần 2, chúng ta đã tạo được một chương trình lisp có giao tiếp với AutoCAD thông qua tên lệnh.
Tại phần 3 này, chúng ta sẽ viết một chương trình thực sự, có ích hẳn hoi.

Đó là chương trình tính diện tích của một đối tượng. Trên file hoclisp.lsp, hãy sửa tên hàm chao thành tdt và thêm các mã lệnh như sau:
(defun c:tdt( / sel ent dientich)
(princ "\nChao ban")

(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(princ "\nDien tich doi tuong vua roi la: ")
(princ dientich)
(princ "\nm2")

(princ)
)

Bạn thử appload file hoclisp.lsp mới và gọi lệnh tdt thử xem, chương trình sẽ yêu cầu bạn nhập vào 1 đối tượng. Và nó sẽ kết xuất diện tích đối tượng vừa rồi ra màn hình:
Command: tdt
Chao ban
Hay chon doi tuong: .area
Specify first corner point or [Object/Add/Subtract]: o
Select objects:
Area = 46546736.0000, Perimeter = 28320.0000

Command:
Dien tich doi tuong vua roi la: 4.65467e+007m2
Điều gì làm nên sự khác biệt này vậy: chúng ta hãy lần theo từng lệnh nhé.
- Lệnh (entsel "\nHay chon doi tuong: ") là lệnh trả về đối tượng được pick, kết quả trả về là một tập hợp gồm 2 thành phần: thứ nhất là đối tượng được pick, thứ 2 là tọa độ pick.
- Lệnh (setq sel (entsel "\nHay chon doi tuong: ")) là lệnh gán kết quả vừa pick vào biến sel. Bạn nhớ là lệnh (setq a cool.gif là gán giá trị a bằng giá trị b. Trong trường hợp này a là sel, b là kết quả của hàm entsel.
- Lệnh (car sel) là lệnh lấy giá trị đầu tiên của biến sel (biến sel có dạng tập hợp) tức là đối tượng được chọn.
- lệnh (setq ent (car sel)) là lệnh gán giá trị biến ent bằng ename của đối tượng được chọn. ename của một đối tượng là giá trị chỉ ra đối tượng trong một bản vẽ cad.
Như vậy, 2 dòng lệnh
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
có ý nghĩa là gán giá trị biến ent cho đối tượng vừa được chọn bằng phương pháp pick.

Tiếp đến, lệnh (command ".area" "o" ent) tương đương với gõ tại dòng lệnh command: .area rồi gõ tiếp o và pick đối tượng. Bạn nhớ là lệnh (command a b c d e f...) tương đương với việc gõ các giá trị a, b, c, d, e, f ... vào dòng lệnh của cad. Như vậy, lệnh trên tương đương với việc tính diện tích của đối tượng vừa được chọn.

- Lệnh (setq dientich (getvar "area")): gán giá trị biến dientich bằng giá trị của biến hệ thống AREA (biến hệ thống AREA chứa diện tích vừa được tính bằng lệnh AREA trước đó của cad).

-cụm lệnh:
(princ "\nDien tich doi tuong vua roi la: ")
(princ dientich)
(princ "m2")
chắc chắn bạn biết đó là lệnh viết dòng chữ 'Dien tich doi tuong vua roi la: ' diện tích đối tượng vừa rồi 'm2'.
Trên màn hình bạn còn nhìn thấy các dòng chữ khác ngoài dòng chữ trên đó là do các lệnh area của CAD sinh ra. Trong bài học sau chúng ta sẽ biết cách loại bỏ chữ này.

Phần 4:
* Các phần trước, chúng ta đã thực hành được với lệnh lisp tính diện tích của một đối tượng. Phần này, chúng ta sẽ đi vào cải tiến để lệnh tính diện tích sẽ áp dụng cho một tập đối tượng được chọn của chúng ta.

* Trong AutoLisp tập đối tượng được lưu trong biến kiểu tập chọn. Với lệnh (ssget), có thể tạo ra một tập chọn chứa các đối tượng chúng ta chọn. Với lệnh (ssname ss index) chúng ta sẽ lấy được entname đối tượng thứ index trong tập đối tượng ss. lệnh (sslength ss) trả về số đối tượng trong tập chọn.

* Tính diện tích của một tập đối tượng, ta sẽ tính diện tích của từng đối tượng trong tập này và cộng lại với nhau. Để làm được như vậy, chúng ta sẽ làm một hàm lặp như sau:
(repeat sodoituong
(setq
ent_ht (ssname ssdt index)
index (+ index 1)
dientich (tinhdientich_one ent_ht)
tongdientich (+ tongdientich dientich)
)
Vòng lặp này sẽ quét qua tất cả các đối tượng và cộng dồn diện tích của đối tượng hiện tại vào diện tích tổng. Trong đoạn mã trên, biến sodoituong chứa số đối tượng có trong tập chọn. index là biến chứa chỉ số của đối tượng hiện tại (index có giá trị từ 0 đến sodoituong-1). ent_ht là tên của đối tượng hiện tại. tinhdientich_one là hàm tính diện tích của một đối tượng được chỉ định, hàm này có được bằng cách gom 2 dòng lệnh của phần trước lại với nhau là: (command ".area" "o" ent)(setq dientich (getvar "area")). Tongdientich chính là diện tích của tất cả các đối tượng, giá trị này có được nhờ cộng dồn tất cả các giá trị của biến dientich lại với nhau.

* Chương trình tính diện tích sẽ tiếp tục được cải tiến như sau:
--------------------Gốc (xin nhắc lại phần trước):
(defun c:tdt( / sel ent dientich)
(princ "\nChao ban")
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(princ "\nDien tich tap doi tuong vua roi la: ")
(princ dientich)
(princ "\nm2")
(princ)
)

--------------------Cải tiến (màu xám là đoạn code bỏ đi, màu xanh là đoạn code thêm mới):
(defun c:tdt( / sel ent dientich)
(princ "\nChao cadviet")
;(setq sel (entsel "\nHay chon doi tuong: "))
(setq ssdt (ssget))
;(setq ent (car sel))
(defun tinhdientich_one(ent)
(command ".area" "o" ent)
(setq dientich (getvar "area"))
)

; khởi tạo các biến
(setq
sodoituong (sslength ssdt)
index 0
tongdientich 0.0
)

; vòng lặp quét qua các đối tượng
(repeat sodoituong
(setq
ent_ht (ssname ssdt index)
index (1+ index)
dientich (tinhdientich_one ent_ht)
tongdientich (+ tongdientich dientich)
)
)

(princ "\nDien tich tap doi tuong vua roi la: ")
;(princ dientich)

;in tổng diện tích
(princ tongdientich)
(princ "\nm2")
(princ)
)

* Như vậy, chúng ta đã tạo được một đoạn code tính diện tích của một tập đối tượng. Tuy nhiên, đoạn code này hơi rườm rà, do có một lệnh định nghĩa hàm defun tinhdientich_one nằm ngay giữa đoạn code. Bây giờ, chúng ta sẽ làm sạch lại đoạn code trên bằng cách sắp xếp lại mà không thay đổi bất cứ ý nghĩa của một mã nào:
(defun c:tdt( / sel ent dientich)

;định nghĩa hàm tính diện tích 1 đối tượng
(defun tinhdientich_one(ent)
(command ".area" "o" ent)
(setq dientich (getvar "area"))
)

; viết lời chào và chọn đối tượng
(princ "\nChao ban")
(setq ssdt (ssget))

; khởi tạo các biến
(setq
sodoituong (sslength ssdt)
index 0
tongdientich 0.0
)

; quét qua tất cả các đối tượng trong tập chọn, tính diện tích và cộng dồn diện tích
(repeat sodoituong
(setq
ent_ht (ssname ssdt index)
index (1+ index)
dientich (tinhdientich_one ent_ht)
tongdientich (+ tongdientich dientich)
)
)

; xuất kết quả ra màn hình
(princ "\nDien tich tap doi tuong vua roi la: ")
(princ tongdientich)
(princ "\nm2")
(princ)
)

_________________
"Đừng hỏi sao nghèo mà học giỏi
Hãy hỏi tại sao, học giỏi mà vẫn nghèo"
Về Đầu Trang Go down
Xem lý lịch thành viên http://48cb.heavenforum.com
TOTINH
Admin
avatar

Nam
Tổng số bài gửi : 775
Age : 32
Location : Sài Gòn
Job/hobbies : KỸ SƯ CTB
Registration date : 29/03/2008

Bài gửiTiêu đề: Re: những bước đi đầu tiên khi viết lisp cho cad   Fri Nov 19, 2010 7:37 am

(Phần 1)
AutoLISP là ngôn ngữ lập trình có thể sử dụng các tính năng,các lệnh trong AutoCAD.AutoLISP dự trên cơ sở ngôn ngữ lập trình LISP - ngôn ngữ lập trình trí tuệ nhân tạo(AI)
Visual LISP (VLISP) là một phần mềm giúp phát triển chương trình AutoLIST.Nó giúp ta thực hiện hầu hết các thao tác cần thiết như soạn thảo,gỡ rối chương trình,giao tiếp với AutoCAD mà không cần thoát ra khỏi AUtoCAD.
AutoLisp là một ngôn ngữ lập trình thông dịch, nghĩa là dịch đến dòng nào thực hiện dòng đó và cho kết quả, không có trình biên dịch riêng. Một tập hợp các câu lệnh của AutoLisp được gọi là hàm Lisp và tệp (file) chứa các hàm gọi là tệp (file) Lisp có phần mở rộng là *.Lsp.
Với AutoLisp, người dùng có thể dễ dàng truy cập đến dữ liệu của AutoCad, có thể thay đổi, tạo mới, xoá bỏ các đối tượng, thêm các thông tin vào bản vẽ thực hiện các công việc Tự động hoá trong thiết kế...
Hiện nay AutoLisp đã đuợc hãng Autodesk phát triển theo các số hiệu phát hành của AutoCad. Về căn bản những phiên bản sau vẫn sử dụng được những chương trình lập bằng phiên bản trước, ngược lại thì không được do có một số biến hệ thống và lệnh của AutoCad giữa các phiên bản không giống nhau nên việc dùng chung có gặp một số trở ngại. Do vậy yêu cầu người lập trình AutoLisp phải nắm thật vững AutoCad để sử dụng AutoLisp một cách hiệu quả.
Phần 1: bắt đầu
Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.
Hãy tạo một file mới và save nó với tên hoclisp.lsp.
Guests are not allowed to view code.Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao VietAutoCAD' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao VietAutoCAD.
Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, " Chao VietAutoCAD" là tham số của hàm princ.

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao VietAutoCAD" Chao VietAutoCAD"' trên màn hình, trong đó " Chao VietAutoCAD" là kết quả của hàm (princ " Chao VietAutoCAD").

Phần 2:
Trong phần 1, chúng ta đã xây dựng được 1 chương trình lisp có thể nói là thô sơ nhất thế giới. Và nó có 1 nhược điểm: mỗi lần load thì viết ra lệnh. Muốn viết lại phải appload thêm 1 lần nữa.

Để điều khiển được thời điểm viết, và viết được nhiều lần, chúng ta phải định nghĩa một hàm AutoCAD, để mỗi khi gọi hàm này, chương trình sẽ viết ra màn hình text mà không cần phải appload lại file lisp.

Trên file hoclisp.lsp, chúng ta thêm mã lệnh để trở thành như sau:
Guests are not allowed to view code.Như vậy chúng ta đã định nghĩa được một lệnh của AutoCAD mang tên chao, mỗi lần gọi lệnh chao tại dòng nhắc Command, chương trình sẽ viết ra trên màn hình text dòng chữ: Chao VietAutoCAD.

Trong 2 dòng vừa thêm, hàm defun là hàm định nghĩa lệnh AutoCAD. Có cấu trúc:
(defun tenham() noidungham) trong đó:
- tenham là tên hàm cần định nghĩa, nếu muốn định nghĩa một lệnh trong AutoCAD thì thêm 'C:' vào trước tên hàm.
- noidungham là tập các lệnh mà hàm vừa định nghĩa sẽ thực thi.

Phần 3:
Trong phần 2, chúng ta đã tạo được một chương trình lisp có giao tiếp với AutoCAD thông qua tên lệnh.
Tại phần 3 này, chúng ta sẽ viết một chương trình thực sự, có ích hẳn hoi.

Đó là chương trình tính diện tích của một đối tượng. Trên file hoclisp.lsp, hãy sửa tên hàm chao thành tdt và thêm các mã lệnh như sau:
Guests are not allowed to view code.Bạn thử appload file hoclisp.lsp mới và gọi lệnh tdt thử xem, chương trình sẽ yêu cầu bạn nhập vào 1 đối tượng. Và nó sẽ kết xuất diện tích đối tượng vừa rồi ra màn hình:
Guests are not allowed to view quotes.Command:
Dien tich doi tuong vua roi la: 4.65467e+007m2
Điều gì làm nên sự khác biệt này vậy: chúng ta hãy lần theo từng lệnh nhé.
- Lệnh (entsel " Hay chon doi tuong: ") là lệnh trả về đối tượng được pick, kết quả trả về là một tập hợp gồm 2 thành phần: thứ nhất là đối tượng được pick, thứ 2 là tọa độ pick.
- Lệnh (setq sel (entsel " Hay chon doi tuong: ")) là lệnh gán kết quả vừa pick vào biến sel. Bạn nhớ là lệnh (setq a là gán giá trị a bằng giá trị b. Trong trường hợp này a là sel, b là kết quả của hàm entsel.
- Lệnh (car sel) là lệnh lấy giá trị đầu tiên của biến sel (biến sel có dạng tập hợp) tức là đối tượng được chọn.
- lệnh (setq ent (car sel)) là lệnh gán giá trị biến ent bằng ename của đối tượng được chọn. ename của một đối tượng là giá trị chỉ ra đối tượng trong một bản vẽ cad.
Như vậy, 2 dòng lệnh
Guests are not allowed to view code.có ý nghĩa là gán giá trị biến ent cho đối tượng vừa được chọn bằng phương pháp pick.

Tiếp đến, lệnh (command ".area" "o" ent) tương đương với gõ tại dòng lệnh command: .area rồi gõ tiếp o và pick đối tượng. Bạn nhớ là lệnh (command a b c d e f...) tương đương với việc gõ các giá trị a, b, c, d, e, f ... vào dòng lệnh của cad. Như vậy, lệnh trên tương đương với việc tính diện tích của đối tượng vừa được chọn.

- Lệnh (setq dientich (getvar "area")): gán giá trị biến dientich bằng giá trị của biến hệ thống AREA (biến hệ thống AREA chứa diện tích vừa được tính bằng lệnh AREA trước đó của cad).

-cụm lệnh:
Guests are not allowed to view code.chắc chắn bạn biết đó là lệnh viết dòng chữ 'Dien tich doi tuong vua roi la: ' diện tích đối tượng vừa rồi 'm2'.
Trên màn hình bạn còn nhìn thấy các dòng chữ khác ngoài dòng chữ trên đó là do các lệnh area của CAD sinh ra. Trong bài học sau chúng ta sẽ biết cách loại bỏ chữ này.

_________________
"Đừng hỏi sao nghèo mà học giỏi
Hãy hỏi tại sao, học giỏi mà vẫn nghèo"
Về Đầu Trang Go down
Xem lý lịch thành viên http://48cb.heavenforum.com
 
những bước đi đầu tiên khi viết lisp cho cad
Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
SHINE OCEAN - THẮP SÁNG BIỂN KHƠI :: :::(^_^):::GIAO LƯU:::('._.')::: :: GIAO LUU KINH NGHIEM-
Chuyển đến