[r]
(1)T
THHIIẾẾTT KKẾẾ ĐĐƯƯỜỜNNGG ĐĐII DDẠẠOO T
TRROONNGG VVƯƯỜỜNN -- MMỘỘTT VVÍÍ DDỤỤ
V
VỀỀ AAccttiivveeXX//VVBBAA
13
Trong chương này
Kiểm tra môi trường làm việc
Xác định mục đích Viết đoạn chương trình
đầu tiên Nhập số liệu Vẽđường dạo Vẽ lớp gạch lát Tổng hợp lại Duyệt mã lệnh Thực thi Macro
Thêm giao diện hộp thoại Đây phần hướng dẫn người đọc cách thêm
(2)1 Kiểm tra môi trường làm việc
Để thực thao tác cần thiết ví dụ này, trước hết cần cài đặt môi trường VBA AutoCAD Khi cài AutoCAD với tuỳ chọn Full Standard mơi trường VBA tựđộng cài đặt, chọn Custom VBA khơng cài đặt
Kiểm tra việc cài đặt VBA: 1 Khởi động AutoCAD
2 Tại dòng nhập lệnh, gõ VBAIDE
3 Nếu mơi trường lập trình VBA mở VBA cài đặt Nếu xuất thông báo “AutoCAD VBA is not currently installed” VBA chưa cài đặt
Cài đặt mơi trường VBA:
1 Thốt khỏi chương trình AutoCAD
2 Chạy chương trình cài đặt AutoCAD setup.exe
3 Chọn Add để thêm thành phần vào cài đặt
4 Chọn VBA Support
5 Chọn Next để tiếp tục cài đặt
6 Khẳng định cài đặt cách chọn Next lần
7 Khi hồn thành việc cài đặt khởi động lại chương trình AutoCAD
8 Tại dịng nhập lệnh, nhập VBAIDE Mơi trường lập trình VBA sẽđược mở môi trường làm việc để thực ví dụ chương sẵn sàng
2 Xác định mục đích
Mục tiêu ví dụ lập Marco cho AutoCAD để vẽ đường vườn lát viên bêtơng trịn Marco có dịng nhắc theo trình tự sau:
Command: gardenpath
Start point of path: Người dùng điểm đầu tuyến đường Endpoint of path: Người dùng điểm kết thúc tuyến đường Half width of path: Người dùng nhập vào giá trị nửa bề rộng Radius of tiles: Người dùng nhập vào giá trị bán kính gạch lát
(3)3 Viết đoạn chương trình đầu tiên
Macro sẽđược xây dựng dựa loạt hàm thủ tục Một số thủ tục làm việc với góc lý đơn vị góc ActiveX radians hầu hết người dùng thường quen làm việc với góc tính theo độ Do đó, trước hết cần xây dựng hàm chuyển đổi từđộ sang radians Nếu chưa mở VBA IDE khởi động từ lệnh VBAIDE
Trong VBA IDE, mở cửa sổ Code sau: menu View Code; dùng phím F7
Hàm chuyển đổi từđộ sang radians
Gõ đoạn mã sau vào cửa sổ Code sau dòng Option Explicit: Const pi = 3.14159
’ Chuyển đổi từ độ sang radians Function dtr(a As Double) As Double
dtr = (a / 180) * pi End Function
Ngay xuống dòng để kết thúc dòng lệnh Function dtr(a As Double) As Double, VBA tự động thêm dịng lệnh End Function Mơi trường lập trình VBA ln để đảm bảo tất chương trình có lệnh kết thúc tương ứng
Ở dịng đầu tiên, số pi gán giá trị 3.14159 Điều cho phép thay việc gõ lại số 3.14159 cần dùng cách nhập pi
Dịng đểđịnh nghĩa hàm có tên dtr (Degrees To Radians) Hàm số cần đối sốa góc theo đơn vịđộ Kết tính cách chia góc a cho 180 nhân với pi Dòng bắt đầu dấu nháy đơn câu thích VBA bỏ qua tất dịng bắt đầu ký tự
Hàm có thểđược sử dụng chương trình khác dự án Sau lưu dự án với tên tuỳ chọn theo trình tự chọn: menu File Save, nhiên để tiện dùng, ví dụ đặt tên cho dự án gardenpath.dvb
Tính khoảng cách hai điểm
Tiếp theo thêm hàm tính khoảng cách hai điểm Nhập đoạn mã sau hàm dtr:
’Tính khoảng cách hai điểm
Function distance(sp As Variant, ep As Variant)As Double Dim x As Double
Dim y As Double Dim z As Double x = sp(0) - ep(0) y = sp(1) - ep(1) z = sp(2) - ep(2)
distance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2)) End Function
(4)4 Nhập số liệu
Macro nhắc nhở người dùng nhập vị trí để vẽ đường đi, bề rộng đường, khoảng cách viên gạch lát Cho nên sẽđịnh nghĩa thủ tục để yêu cầu người dùng nhập vào thông tin yêu cầu sau thực tính tốn
Trong thủ tục này, sử dụng phương thức nhập số liệu đối tượng Utility 4.1 Khai báo biến
Thủ tục sử dụng số biến toàn cục Tất biến toàn cục cần khai báo trước thủ tục sử dụng chúng
Khai báo biến toàn cục
Trong VBA IDE, nhập đoạn mã lệnh sau cửa sổ Code dòng lệnh
Const pi = 3.14159:
’ Các biến để lưu thông số đường vườn Private sp(0 To 2) As Double
Private ep(0 To 2) As Double Private hwidth As Double Private trad As Double Private tspac As Double Private pangle As Double Private plength As Double Private totalwidth As Double Private angp90 As Double Private angm90 As Double
Hai hộp danh sách dạng thả xuống phía cửa sổ Code gọi tương ứng Object Box (hộp chứa danh sách đối tượng) Procedure/Event Box (hộp danh sách chứa thủ tục kiện) Hiện tại, giá trị hai hộp danh sách General Declarations Hai hộp danh sách cho biết phần dự án mà trỏ dừng lại phần nào: cụ thể đối tượng thủ tục hay kiện đối tượng Phần Declarations tương ứng với phần khai báo biến sử dụng nhiều chương trình Để chuyển sang làm việc với đối tượng khác kiện khác đối tượng, thực nhanh chóng cách lựa chọn tên tương ứng hai hộp danh sách
Chú ý đến dòng Option Explicitnằm phần Declaration Khi dòng xuất mô-đun tức biến phải khai báo rõ ràng lệnh Dim, Private, Public, ReDim, Static Các trường hợp sử dụng biến chưa khai báo phát sinh thơng báo lỗi Nếu khơng sử dụng dòng lệnh Option Explicit, tất biến mà chưa khai báo mang kiểu Variant Người lập trình nên sử dụng dịng lệnh để tránh lỗi cú pháp nhập tên biến có tránh nhầm lẫn phạm vi biến không khai báo rõ ràng
4.2 Tạo chương trình gpuser
(5)Nhắc người dùng nhập số liệu:
Viết đoạn mã sau hàm distance: ’ Thông tin cần thiết đường Private Sub gpuser()
Dim varRet As Variant
varRet = ThisDrawing.Utility.GetPoint( ,_ "Start point of path: ")
sp(0) = varRet(0) sp(1) = varRet(1) sp(2) = varRet(2)
varRet = ThisDrawing.Utility.GetPoint( ,_ "Endpoint of path: ")
ep(0) = varRet(0) ep(1) = varRet(1) ep(2) = varRet(2)
hwidth = ThisDrawing.Utility.GetDistance(sp, _ "Half width of path: ")
trad = ThisDrawing.Utility.GetDistance(sp, _ "Radius of tiles: ")
tspac = ThisDrawing.Utility.GetDistance(sp, _ "Spacing between tiles: ")
pangle = ThisDrawing.Utility.AngleFromXAxis(sp, ep) totalwidth = * hwidth
plength = distance(sp, ep) angp90 = pangle + dtr(90) angm90 = pangle - dtr(90) End Sub
Đoạn mã lệnh định nghĩa chương trình có tên gpuser Chương trình khơng có tham số yêu cầu người dùng nhập tất thông tin cần thiết
Dòng lệnh Dim varRet As Variantthực khai báo biến varRet Vì biến sử dụng phạm vi chương trình nên cần khai báo cục phạm vi thay khai báo phần Declarations
Dịng lệnh varRet = ThisDrawing.Utility.GetPoint( , "Start point of path: ") thực gọi phương thức GetPoint Dấu gạch ngang để nối dịng lệnh với dịng nó, VBA sẽđọc hai dịng dịng lệnh Dấu gạch khơng bắt buộc phải có nên nối liền hai dòng lại sử dụng để ngắt dịng lệnh dài giúp đọc dễ dàng
Để truy cập phương thức GetPoint,cần thông qua đối tượng đại diện cho vẽ hành ThisDrawing Khi nhập ThisDrawingvà dấu chấm (.) có nghĩa thực truy cập vào thứ chứa đối tượng ThisDrawing Sau dấu chấm gõ Utilityvà dấu chấm tiếp theo, tức truy cập vào bên đối tượng Utility Cuối nhập GetPointlà tên phương thức cần gọi
(6)nhập gán cho biến varRet Ba dòng lệnh gán toạ độ điểm người dùng vừa nhập cho mảng sp
Điểm cuối lấy theo cách tương tự nhưđiểm đầu
Phương thức GetDistance để nhập bề rộng nửa đường (hwidth), bán kính gạch lát (trad) khoảng cách viên gạch (tspac) Phương thức cần hai tham số, thứ điểm sở, thứ hai lời nhắc: yêu cầu chuỗi hướng dẫn người dùng nhập giá trị phù hợp Phương thức GetDistance trả giá trị khoảng cách nhập từ dòng lệnh khoảng cách điểm chọn AutoCAD điểm sở
Chương trình tính tốn biến khác mà sử dụng Macro Biến pangle gán cho góc đường thẳng tạo điểm đầu điểm cuối chiều dương trục x phương thức AngleFromXAxis Bề rộng đường tính lần giá trị nửa bề rộng nhập vào từ người dùng Biến plengthđược gán giá trị chiều dài đường xác định phương thức GetDistance Cuối biến angp90và angm90được tính lưu cách cộng trừ giá trị góc đường với 900
Lưu kết quảđã thực
Hình vẽ biểu diễn cách biến tính chương trình để xác định kích thước đường
Chi tiết bố trí gạch lát
5 Vẽ đường đi dạo
Khi có đủ thơng sốđịnh vị bề rộng bắt đầu thực vẽđường dạo
Vẽđường dạo vườn:
(7)’ Vẽ đường dạo Private Sub drawout()
Dim points(0 To 9) As Double Dim pline As AcadLWPolyline Dim varRet As Variant
varRet = ThisDrawing.Utility.PolarPoint(sp, angm90, hwidth) points(0) = varRet(0)
points(1) = varRet(1) points(8) = varRet(0) points(9) = varRet(1)
varRet = ThisDrawing.Utility.PolarPoint( _ varRet, pangle, plength)
points(2) = varRet(0) points(3) = varRet(1)
varRet = ThisDrawing.Utility.PolarPoint( _ varRet, angp90, totalwidth)
points(4) = varRet(0) points(5) = varRet(1)
varRet = ThisDrawing.Utility.PolarPoint( _ varRet, pangle + dtr(180), plength)
points(6) = varRet(0) points(7) = varRet(1)
Set pline = ThisDrawing.ModelSpace _ AddLightWeightPolyline(points) End Sub
Thủ tục vẽ đường dạo sử dụng phương thức AddLightweightPolyline Phương thức cần tham số mảng điểm tạo thành đường đa tuyến Để vẽđa tuyến cần tìm tất điểm tạo thành đường đa tuyến xếp chúng vào mảng toạđộ Với đường dạo điểm cần thiết góc Tìm góc đường dạo cách sử dụng phương thức PolarPoint Phương thức tìm điểm biết góc khoảng cách điểm so với điểm sở Từ điểm đầu (sp) tìm góc thứ đường theo chiều kim đồng hồ, đỉnh cách sp khoảng nửa bề rộng đường (hwidth) tạo góc (-900) so với tim đường Để vẽ đường khép kín bao quanh phạm vi đường điểm điểm bắt đầu điểm kết thúc mảng toạđộ điểm Vì toạđộ X Y trả từ phương thức PolarPointsẽđược gán cho cảđiểm đầu điểm cuối mảng
Các góc cịn lại tính theo cách tương tự sử dụng chiều dài, bề rộng đường dạo (plengthvà width) góc đường dạo tạo với chiều dương trục x
Mỗi phương thức PolarPoint gọi toạ độ điểm nhận (biến varRet) sẽđược chép vào mảng toạđộ điểm