Phát triển AutoCAD bằng ActiveX & VBA - Chương 2: Các khái niệm cơ bản về ActiveX Automation

Để sử dụng AutoCAD ActiveX Automation có hiệu

quả, ta cần phải quen thuộc với các thực thể (entity),

đối tượng (object), và các đặc tính của AutoCAD

liên quan đến loại chương trình được dự định phát

triển. Nếu càng biết nhiều về các thuộc tính đồ hoạ

hoặc phi đồ hoạ của đối tượng thì càng dễ dàng sử

dụng AutoCAD ActiveX Automation.

Luôn nhớ rằng phần trợ giúp của AutoCAD ActiveX

Automation luôn sẵn sàng – chỉ cần nhấn F1. Nếu

gặp vấn đề gì với bất kỳ đối tượng, phương thức, hay

thuộc tính, chỉ cần lựa chọn đối tượng, phương thức

hay thuộc tính đó trong VBA IDE và nhấn F1.

pdf 16 trang dienloan 2680
Bạn đang xem tài liệu "Phát triển AutoCAD bằng ActiveX & VBA - Chương 2: Các khái niệm cơ bản về ActiveX Automation", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Phát triển AutoCAD bằng ActiveX & VBA - Chương 2: Các khái niệm cơ bản về ActiveX Automation

Phát triển AutoCAD bằng ActiveX & VBA - Chương 2: Các khái niệm cơ bản về ActiveX Automation
 Phát triển AutoCAD bằng ActiveX và VBA | 45 
CÁC KHÁI NIỆM CƠ BẢN VỀ 
ActiveX Automation 
2 
Trong chương này
ƒ Tìm hiểu mô hình đối 
tượng trong AutoCAD 
ƒ Truy xuất cây phân cấp 
đối tượng 
ƒ Làm việc với tập đối 
tượng 
ƒ Tìm hiểu Phương thức và 
Thuộc tính 
ƒ Tìm hiểu Đối tượng gốc 
ƒ Thư viện kiểu 
ƒ Gọi lại thực thể đầu tiên 
trong CSDL 
ƒ Sử dụng Variant trong 
Phương thức và Thuộc 
tính 
ƒ Sử dụng các ngôn ngữ 
lập trình khác 
Để sử dụng AutoCAD ActiveX Automation có hiệu 
quả, ta cần phải quen thuộc với các thực thể (entity), 
đối tượng (object), và các đặc tính của AutoCAD 
liên quan đến loại chương trình được dự định phát 
triển. Nếu càng biết nhiều về các thuộc tính đồ hoạ 
hoặc phi đồ hoạ của đối tượng thì càng dễ dàng sử 
dụng AutoCAD ActiveX Automation. 
Luôn nhớ rằng phần trợ giúp của AutoCAD ActiveX 
Automation luôn sẵn sàng – chỉ cần nhấn F1. Nếu 
gặp vấn đề gì với bất kỳ đối tượng, phương thức, hay 
thuộc tính, chỉ cần lựa chọn đối tượng, phương thức 
hay thuộc tính đó trong VBA IDE và nhấn F1. 
 46 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
1. Tìm hiểu mô hình đối tượng trong AutoCAD 
Một đối tượng là một khối cấu thành chính của giao diện AutoCAD ActiveX. Mỗi 
một đối tượng thể hiện đúng một phần của AutoCAD. Có rất nhiều loại đối tượng 
khác nhau trong giao diện AutoCAD ActiveX. Ví dụ 
ƒ Đối tượng đồ hoạ: line, arc, text và dimension 
ƒ Cấu hình về kiểu dáng (style settings): linetype và dimension style 
ƒ Cấu trúc tổ chức: layer, group, block 
ƒ Thể hiện bản vẽ: view, viewport 
ƒ Và ngay cả bản thân bản vẽ trong chương trình AutoCAD cũng được xem là 
một đối tượng. 
Các đối tượng được xây dựng theo quan hệ phân cấp, trong đó đối tượng 
Application là gốc. Cấu trúc phân nhánh này còn được gọi là Mô Hình Đối Tượng. 
Mô hình đối tượng giúp người dùng có thể biết đối tượng nào có thể truy cập vào 
đối tượng nào ở cấp tiếp theo. 
 Phát triển AutoCAD bằng ActiveX và VBA | 47 
 48 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
1.1. Sơ lược về đối tượng Application 
Đối tượng Application là đối tượng gốc của mô hình đối tượng trong AutoCAD 
ActiveX Automation. Từ đối tượng Application, ta có thể truy xuất đến bất kỳ đối 
tượng nào khác, hoặc thuộc tính hoặc phương thức gán cho bất kỳ đối tượng nào. 
Ví dụ, đối tượng Application có thuộc tính Preferences trả về đối tượng Preferences. 
Đối tượng này cho phép truy cập đến các cấu hình bên trong của hộp thoại Option. 
(Các cấu hình lưu trong bản vẽ nằm trong đối tượng DatabasePreferences, sẽ được 
đề cập sau). Các thuộc tính khác của đối tượng Application cho phép truy cập đến 
các dữ liệu riêng của chương trình chẳng hạn như tên và phiên bản chương trình, và 
kích thước, vị trí, tính nhìn thấy của AutoCAD. Các phương thức của đối tượng 
Application thực hiện các thao tác trong chương trình như liệt kê, nạp, gỡ bỏ 
chương trình ADS và ARX, thoát khỏi AutoCAD. 
Đối tượng Application cũng có các liên kết đến bản vẽ AutoCAD thông qua tập đối 
tượng Documents, các trình đơn và thanh công cụ AutoCAD thông qua tập đối 
tượng MenuBar và MenuGroups, và VBA IDE thông qua một thuộc tính gọi là 
VBE. 
Đối tượng Application là đối tượng toàn cục trong giao diện ActiveX. Điều này có 
nghĩa là tất cả các phương thức và thuộc tính của đối tượng Application luôn có 
hiệu lực trong không gian tên toàn cục. 
1.2. Sơ lược về đối tượng Document 
Đối tượng Document, thực chất là một bản vẽ AutoCAD, thuộc tập đối tượng 
Documents cho phép truy cập vào tất cả các đối tượng đồ hoạ và hầu hết các đối 
tượng phi đồ họa của AutoCAD. Các đối tượng đồ họa (đường thẳng, hình tròn, 
cung, ) được truy cập thông qua tập ModelSpace và PaperSpace, còn các đối 
tượng phi đồ họa (layer, linetype, text style, ) được truy cập thông qua tập đối 
tượng có tên tương tự, chẳng hạn như Layers, Linetypes, TextStyles. Đối tượng 
Document còn cho phép truy cập đến đối tượng Plot và Utility. 
 Phát triển AutoCAD bằng ActiveX và VBA | 49 
 50 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
1.3. Sơ lược về tập đối tượng 
AutoCAD nhóm hầu hết các đối tượng vào trong tập đối tượng. Mặc dù một tập đối 
tượng chứa nhiều loại đối tượng khác nhau nhưng khi xử lý được sử dụng những kỹ 
thuật tương tự nhau. Mỗi một tập đối tượng có một phương thức dùng để thêm đối 
tượng vào bản thân tập đối tượng đó và hầu hết các tập đối tượng đều sử dụng 
phương thức Add để thực hiện nhiệm vụ này. Tuy nhiên mỗi thực thể1 thường được 
thêm vào phương thức có tên là Add, chẳng hạn như để thêm 
vào một đường thẳng (Line) ta sử dụng phương thức AddLine. 
Các tập đối tượng cũng có những phương thức và thuộc tính giống nhau. Thuộc tính 
Count dùng để truy cập bộ đếm số đối tượng trong tập đối tượng. Phương thức Item 
sử dụng để truy cập bất kỳ đối tượng nào trong tập đối tượng. 
1.4. Sơ lược về các đối tượng Đồ họa và Phi đồ hoạ 
Các đối tượng đồ hoạ, còn gọi là thực thể, là những đối tượng hữu hình cấu thành 
bản vẽ (đường thẳng, hình tròn, ảnh raster2 ). Để tạo những đối tượng này, ta sử 
dụng phương thức Add tương ứng. Để hiệu chỉnh hoặc truy vấn 
các đối tượng, ta sử dụng các phương thức và thuộc tính của bản thân từng đối 
tượng. Mỗi đối tượng đồ hoạ đều có các thuộc tính cho phép ứng dụng có thể thực 
hiện hầu hết các lệnh hiệu chỉnh đối tượng trong AutoCAD như Copy, Erase, Move, 
Mirror Những đối tượng này còn có phương thức để xác lập và gọi lại các dữ liệu 
mở rộng (xdata), lựa chọn và cập nhật, và lấy lại hình bao của đối tượng. Các đối 
tượng đồ hoạ đều có các thuộc tính điển hình như Layer, Linetype, Color, và 
Handle cũng như những thuộc tính riêng biệt, phụ thuộc vào loại đối tượng, chẳng 
hạn như Center, Radius, và Area. 
Các đối tượng phi đồ hoạ là những đối tượng không thể nhìn thấy được (đối tượng 
thông tin) chẳng hạn như Layer, Linetype, DimStyle, SelectionSets Để tạo những 
đối tượng này, sử dụng phương thức Add của đối tượng tập đối tượng cha. Còn để 
hiệu chỉnh và truy vấn các đối tượng thì sử dụng các phương thức và thuộc tính 
riêng của từng đối tượng. Mỗi đối tượng phi đồ hoạ đều có các phương thức và 
thuộc tính đặc biệt tương ứng với từng mục đích; tất cả đều có các phương thức để 
thiết lập và gọi lại dữ liệu mở rộng (xdata), và xoá bản thân đối tượng. 
1.5. Sơ lược về đối tượng Preferences, Plot và Utility 
Dưới đối tượng Preferences là một tập hợp các đối tượng khác tương ứng với từng 
thẻ trong hộp thoại Options. Đồng thời, những đối tượng này đều cho phép truy cập 
vào các thiết lập được lưu trong dữ liệu của hộp thoại Options. Những thiết lập 
được lưu cùng bản vẽ đều nằm trong đối tượng DatabasePreferences. Ta còn có thể 
thiết lập và hiệu chỉnh các lựa chọn (và biến hệ thống không nằm trong hộp thoại 
Options) sử dụng phương thức SetVariable và GetVariable. Thông tin chi tiết ở mục 
“Thiết lập các lựa chọn trong AutoCAD”. 
1 Thực thể (Entity): trong một tập hợp có chứa nhiều đối tượng khác nhau, mỗi đối tượng như vậy 
được gọi là một thực thể. 
2 Ảnh Raster: là ảnh kiểu ánh xạ bit hay ảnh dạng mành, các hình ảnh được thể hiện bởi các chấm 
nhỏ riêng biệt.
 Phát triển AutoCAD bằng ActiveX và VBA | 51 
Đối tượng Plot cho phép truy cập đến những thiết lập trong hộp thoại Plot và cho 
phép ứng dụng có thể in bản vẽ theo nhiều phương thức khác nhau. Thông tin chi 
tiết về việc in ấn, xin xem thêm mục “In bản vẽ” trang 244. 
Đối tượng Utility bao gồm các hàm về nhập liệu của người dùng và hàm chuyển 
đổi. Hàm nhập liệu của người dùng là những phương thức nhắc người dùng 
AutoCAD nhập vào rất nhiều dạng dữ liệu khác nhau trong của sổ dòng lệnh, chẳng 
hạn như chuỗi, số nguyên, số thực, điểm Các hàm chuyển đổi là những phương 
thức thực thi trên các dữ liệu đặc biệt của AutoCAD như điểm và góc phục vụ cho 
việc xử lý chuỗi và số. Để có thêm thông tin chi tiết về hàm nhập liệu của người 
dùng “Nhắc người dùng nhập liệu”, xem thêm mục trang 84. 
AutoCAD Application 
Preferences
2. Truy xuất cây phân cấp đối tượng 
Việc truy xuất cây phân cấp đối tượng được thực hiện dễ dàng ngay bên trong 
VBA. Đó là do VBA thực thi cùng tiến trình với phiên làm việc hiện tại của 
AutoCAD và vì vậy việc kết nối với ứng dụng không cần thêm bước nào nữa. 
VBA có thể liên kết đến bản vẽ hiện hành trong phiên làm việc hiện tại của 
AutoCAD nhờ đối tượng ThisDrawing. Nhờ có đối tượng ThisDrawing mà người 
lập trình có thể truy cập tức thời đến đối tượng Document hiện hành và tất cả các 
thuộc tính, phương thức cũng như các đối tượng khác trong cấu trúc cây phân cấp. 
PreferencesDisplay
PreferencesDrafting
PreferencesFiles
PreferencesOpenSave
PreferencesOutput
PreferencesProfile
PreferencesSelection
PreferencesSystem
PreferencesUser
Documents
Document
DatabasePreferences
Plot
Utility
 52 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
Khi được sử dụng trong dự án độc lập, đối tượng ThisDrawing luôn luôn tương ứng 
với bản vẽ hiện hành trong AutoCAD. Còn nếu là dự án nhúng, đối tượng 
ThisDrawing ứng với bản vẽ có chứa dự án nhúng đó. Lấy ví dụ dòng lệnh dưới 
đây trong dự án độc lập sẽ lưu bất cứ bản vẽ hiện hành nào trong AutoCAD: 
ThisDrawing.Save 
2.1. Tham chiếu đối tượng trong Cấu trúc cây phân cấp đối 
tượng 
Người lập trình có thể tham chiếu đối tượng một cách trực tiếp hoặc thông qua biến 
người dùng định nghĩa. Để tham chiếu đối tượng trực tiếp, phải bao hàm đối tượng 
trong cấu trúc phân cấp. Chẳng hạn như đoạn mã sau đây sẽ thêm một đường thẳng 
vào trong không gian mô hình. Chú ý rằng cấu trúc phân cấp bắt đầu bằng 
ThisDrawing, sau đó đến đối tượng ModelSpace và sau đó gọi phương thức 
AddLine: 
Dim startPoint(0 To 2) As Double, endPoint(0 To 2) As Double 
Dim LineObj as AcadLine 
startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0 
endPoint(0) = 30: endPoint(1) = 20: endPoint(2) = 0 
Set LineObj = ThisDrawing.ModelSpace.AddLine(startPoint,endPoint) 
Để tham chiếu đối tượng thông qua biến người dùng định nghĩa, người lập trình 
phải định nghĩa biến theo đúng kiểu mong muốn, sau đó gán biến cho một đối 
tượng thích hợp. Ví dụ, đoạn mã sau định nghĩa một biến (moSpace) kiểu 
AcadModelSpace và gán biến tương ứng với không gian mô hình hiện hành: 
Dim moSpace As AcadModelSpace 
Set moSpace = ThisDrawing.ModelSpace 
Đoạn mã sau sẽ thêm một đường thẳng vào không gian mô hình sử dụng biến người 
dùng định nghĩa: 
Dim startPoint(0 To 2) As Double, endPoint(0 To 2) As Double 
Dim LineObj as AcadLine 
startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0 
endPoint(0) = 30: endPoint(1) = 20: endPoint(2) = 0 
Set LineObj = moSpace.AddLine(startPoint,endPoint) 
2.2. Truy xuất đối tượng Application 
Do đối tượng ThisDrawing cho phép liên kết đến đối tượng Document, người lập 
trình có thể tự hỏi, làm thế nào để truy xuất đến đối tượng gốc rễ nhất (đối tượng 
Application), nó nằm trên cả đối tượng Document trong cấu trúc cây phân cấp đối 
tượng. Đối tượng Document có một thuộc tính gọi là Application, cho phép liên kết 
đến đối tượng Application. 
Lấy ví dụ, đoạn mã sau sẽ cập nhật lại bản vẽ: 
ThisDrawing.Applications.Update 
3. Làm việc với Tập đối tượng 
Tập đối tượng là một đối tượng được định nghĩa trước chứa tất cả các thực thể 
tương tự nhau. Những đối tượng sau có thể hình thành nên tập đối tượng: 
 Phát triển AutoCAD bằng ActiveX và VBA | 53 
Documents Collection bao gồm tất cả các bản vẽ đang mở trong phiên làm việc hiện 
hành của AutoCAD. 
ModelSpace Collection bao gồm tất cả các đối tượng đồ hoạ (thực thể) trong không 
gian mô hình. 
PaperSpace Collection bao gồm tất cả các đối tượng đồ hoạ trong không gian in hiện 
hành. 
Block Object bao gồm tất cả các thực thể nằm trong một khối nào đó. 
Blocks Collection bao gồm tất cả các khối trong bản vẽ. 
Dictionaries Collection bao gồm tất cả các từ điển trong bản vẽ. 
DimStyles Collection bao gồm tất cả các kiểu kích thước trong bản vẽ. 
Groups Collection bao gồm tất cả các nhóm trong bản vẽ. 
Hyperlinks Collection bao gồm tất cả các siêu liên kết của một thực thể nào đó. 
Layers Collection bao gồm tất cả các lớp (layer) trong bản vẽ. 
Layouts Collection bao gồm tất cả các layout trong bản vẽ. 
Linetypes Collection bao gồm tất cả các kiểu đường (linetype) trong bản vẽ. 
MenuBar Collection bao gồm tất cả các trình đơn hiện có trong AutoCAD. 
MenuGroups Collection bao gồm tất cả các trình đơn và thanh công cụ đã được tải vào 
AutoCAD. 
RegisteredApplications Collection: 
bao gồm tất cả các ứng dụng đã đăng ký trong bản vẽ. 
SelectionSets Collection bao gồm tất cả các đối tượng được chọn trong bản vẽ. 
TextStyles Collection bao gồm tất cả các kiểu văn bản trong bản vẽ. 
UCSs Collection bao gồm tất cả các hệ toạ độ người dùng trong bản vẽ. 
Views Collection bao gồm tất cả các cảnh nhìn trong bản vẽ. 
Viewports Collection bao gồm tất cả các khung nhìn trong bản vẽ. 
3.1. Truy xuất Tập đối tượng 
Hầu hết các tập đối tượng đều được truy xuất thông qua đối tượng Document. Đối 
tượng Document có một thuộc tính tương ứng với mỗi tập đối tượng. Lấy ví dụ, 
đoạn mã sau định nghĩa một biến và gán cho tập đối tượng Layers trong bản vẽ hiện 
tại: 
Dim layerCollection as AcadLayers 
Set layerCollection = ThisDrawing.Layers 
Tập đối tượng Documents, MenuBar và MenuGroups được truy xuất thông qua đối 
tượng Application. Đối tượng Application cũng có một thuộc tính tương ứng với 
từng tập đối tượng. Ví dụ như đoạn mã sau sẽ định nghĩa một biến và gán cho tập 
đối tượng MenuGroups của ứng dụng: 
Dim MenuGroupsCollection as AcadMenuGroups 
Set MenuGroupsCollection = ThisDrawing.Application.MenuGroups 
 54 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
3.2. Thêm đối tượng mới vào Tập đối tượng 
Để thêm một đối tượng mới vào tập đối tượng, ta sử dụng phương thức Add. Đoạn 
mã sau sẽ tạo một lớp mới và thêm vào trong tập đối tượng Layers: 
Dim newLayer as AcadLayer 
Set newLayer = ThisDrawing.Layers.Add("MyNewLayer") 
3.3. Duyệt Tập đối tượng 
Để chọn một đối tượng nào đó trong tập đối tượng, ta sử dụng phương thức Item. 
Phương thức Item cần có một từ định danh đóng vai trò như là chỉ số để xác định vị 
trí của đối tượng trong tập đối tượng cũng như là chuỗi thể hiện tên của đối tượng. 
Ví dụ sau sẽ duyệt qua một tập đối tượng và hiển thị tên của tất cả các lớp trong tập 
đối tượng: 
Duyệt qua tập đối tượng Layers 
Sub Ch2_IterateLayer() 
’ Duyệt qua tập đối tượng 
On Error Resume Next 
Dim I As Integer 
Dim msg As String 
msg = "" 
For I = 0 To ThisDrawing.Layers.count - 1 
msg = msg + ThisDrawing.Layers.Item(I).Name + vbCrLf 
Next 
MsgBox msg 
End Sub 
Đoạn ví dụ dưới đây sử dụng phương thức Item để tìm một lớp có tên là “ABC”: 
Tìm lớp có tên “ABC” 
Sub Ch2_FindLayerABC() 
’ Sử dụng phương thức Item để tìm lớp tên “ABC” 
On Error Resume Next 
Dim ABCLayer As AcadLayer 
Set ABCLayer = ThisDrawing.Layers.Item("ABC") 
If Err 0 Then 
MsgBox "The layer ’ABC’ does not exist." 
End If 
End Sub 
CHÚ Ý: Không sử dụng các phương thức hiệu chỉnh thực thể (Copy, Array, Mirror) cho 
bất cứ một đối tượng nào khi đang đồng thời duyệt qua tập đối tượng sử dụng cấu trúc 
For...Each. Thay vào đó, có thể hoàn thành quá trình duyệt tập đối đượng trước khi hiệu 
chỉnh hoặc tạo một mảng tạm và gán bằng tập đối tượng sau đó có thể duyệt trên mảng 
vừa sao chép và thực hiện việc hiệu chỉnh bình thường. 
3.4. Xoá một đối tượng khỏi Tập đối tượng 
Để xoá một đối tượng nào đó, sử dụng phương thức Delete trong đối tượng tìm 
được. Ví dụ đoạn mã sau sẽ xoá lớp ABC: 
Dim ABCLayer as AcadLayer 
 Phát triển AutoCAD bằng ActiveX và VBA | 55 
Set ABCLayer = ThisDrawing.Layers.Item("ABC") 
ABCLayer.Delete 
Một khi đối tượng đã bị xoá đi thì nên nhớ là về sau không bao giờ được truy cập 
lại đối tượng đó trong chương trình. 
4. Tìm hiểu Phương thức và Thuộc tính 
Mỗi đối tượng đều có thuộc tính và phương thức tương ứng. Thuộc tính mô tả các 
khía cạnh của từng đối tượng, còn phương thức là hành động có thể được thực hiện 
trên từng đối tượng. Sau khi tạo mới đối tượng, ta có thể truy vấn và hiệu chỉnh đối 
tượng thông qua các thuộc tính và phương thức của đối tượng đó. 
Ví dụ, một đối tượng Circle (hình tròn) có thuộc tính Center. Thuộc tính này thể 
hiện tâm của hình tròn trong hệ toạ độ toàn cục 3 chiều. Để thay đổi tâm của hình 
tròn, chỉ cần gán thuộc tính này với toạ độ khác. Đối tượng Circle còn có một 
phương thức có tên là Offset. Phương thức này tạo một đối tượng mới nằm cách 
hình tròn cũ một khoảng trống cho trước. Để thấy tất cả các thuộc tính và phương 
thức của đối tượng Circle, tham khảo thêm phần đối tượng Circle trong ActiveX and 
VBA Reference trong AutoCAD. 
5. Tìm hiểu Đối tượng gốc 
Mỗi đối tượng đều được liên kết thường xuyên với một đối tượng gốc. Tất cả các 
đối tượng đều được phát sinh từ một đối tượng gọi là đối tượng gốc. Người lập trình 
có thể truy xuất đến tất cả các đối tượng trong cùng giao diện bằng cách lần theo 
liên kết từ đối tượng gốc đến các đối tượng con. Thêm vào đó, tất cả các đối tượng 
đều có một thuộc tính gọi là Application có liên kết trực tiếp ngược trở lại với đối 
tượng gốc. 
Đối tượng gốc của giao tiếp AutoCAD là chương trình AutoCAD. 
6. Thư viện kiểu 
Các đối tượng, thuộc tính, và phương thức truy xuất qua Automation Object đều 
nằm trong thư viện kiểu. Một thư viện kiểu là một tệp hay một phần của tệp mô tả 
kiểu của một hoặc nhiều đối tượng. Các thư viện kiểu không lưu đối tượng mà chỉ 
lưu thông tin. Nhờ truy xuất vào thư viện kiểu, các ứng dụng và trình duyệt mới có 
thể xác định được những đặc tính của đối tượng, chẳng hạn như các giao tiếp mà 
đối tượng hỗ trợ và tên, địa chỉ của các bộ phận bên trong giao tiếp đó. Trước khi sử 
dụng Automation Object trong chương trình, người lập trình cần phải tham chiếu 
đến thư viện kiểu của nó. Quá trình tham chiếu tự động thực hiện trong AutoCAD 
VBA. Với các môi trường phát triển ứng dụng tương tác khác, người lập trình cần 
phải tự thực hiện việc tham chiếu. 
Người lập trình có thể sử dụng các đối tượng của chương trình mà không cần thực 
hiện việc tham chiếu thư viện kiểu của chương trình đó. Tuy nhiên, nên thêm tham 
chiếu đến thư viện kiểu vì những lý do sau: 
• Các hàm có khả năng truy cập toàn cục có thể được truy xuất trực tiếp mà 
không cần chứng nhận. 
 56 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
• Việc sử dụng hàm, thuộc tính, và phương thức có thể được kiểm tra lúc dịch để 
đảm bảo sự chính xác, và do đó thời gian thực thi sẽ nhanh hơn lúc chạy 
chương trình. 
• Có thể khai báo biến có kiểu đã được định nghĩa trong thư viện, như vậy sẽ 
tăng độ tin cậy và khả năng dễ đọc trong lúc chạy chương trình. 
7. Gọi lại Thực Thể Đầu Tiên trong CSDL 
Ví dụ sau trả lại thực thể đầu tiên trong không gian mô hình. Với các thực thể trong 
không gian in, vẫn có thể áp dụng đoạn mã này. 
Gọi lại đối tượng đầu tiên trong không gian mô hình 
Sub Ch2_FindFirstEntity() 
’Ví dụ này gọi lại đối tượng đầu tiên trong không gian mô hình 
On Error Resume Next 
Dim entity As AcadEntity 
If ThisDrawing.ModelSpace.count 0 Then 
Set entity = ThisDrawing.ModelSpace.Item(0) 
MsgBox entity.ObjectName + _ 
" là đối tượng đầu tiên trong không gian mô hình." 
Else 
MsgBox "Không có đối tượng nào trong không gian mô hình." 
End If 
End Sub 
8. Sử dụng Variant trong phương thức và thuộc 
tính 
AutoCAD ActiveX Automation sử dụng kiểu variant để truyền mảng dữ liệu. Mặc 
dù điều này có vẻ khá rắc rối với những người chưa có kinh nghiệm, nhưng một khi 
đã hiểu được cơ bản vấn đề này cũng không quá khó. Thêm vào đó, AutoCAD 
ActiveX Automation cũng có những tiện ích trợ giúp để chuyển đổi kiểu dữ liệu. 
8.1. Variant là gì? 
Variant là một kiểu dữ liệu đặc biệt có thể lưu bất kỳ loại dữ liệu nào, trừ dữ liệu 
kiểu chuỗi có độ dài cố định và các kiểu dữ liệu do người dùng định nghĩa. Biến 
Variant còn có thể chứa các giá trị đặc biệt Empty, Error, Nothing và 
NULL. Có thể xác định cách thức xử lý biến kiểu variant sử dụng các hàm của 
Visual Basic: VarType hoặc TypeName. 
Người lập trình có thể sử dụng biến kiểu variant trong những trường hợp hầu hết 
các dữ liệu cần được xử lý theo cách linh động hơn. 
8.2. Sử dụng biến Variant trong dữ liệu mảng. 
Biến Variant được sử dụng để truyền dữ liệu vào và ra AutoCAD ActiveX 
Automation. Điều này có nghĩa là mảng dữ liệu phải là kiểu variant để tương thích 
với các phương thức và thuộc tính trong AutoCAD ActiveX Automation. Ngoài ra, 
 Phát triển AutoCAD bằng ActiveX và VBA | 57 
dữ liệu mảng xuất ra từ AutoCAD ActiveX Automation phải được xử lý như là dữ 
liệu kiểu Variant. 
CHÚ Ý: Trong AutoCAD, mảng dữ liệu đầu vào của VBA được tự động chuyển đổi thành 
kiểu variant. Nghĩa là người lập trình không phải sử dụng mảng variant để truyền dữ liệu 
vào trong các phương thức và thuộc tính của ActiveX Automation khi sử dụng chúng trong 
VBA. Tuy nhiên, tất cả các mảng dữ liệu xuất ra luôn ở dạng variant, do đó cần phải chú ý 
để xử lý theo cách thích hợp nhất. 
8.3. Chuyển Mảng thành Variant 
AutoCAD ActiveX Automation cung cấp các phương thức tiện ích để chuyển đổi 
một mảng dữ liệu thành Variant. Phương thức này là phương thức 
CreateTypedArray, nó sẽ tạo biến variant chứa mảng số nguyên, số thực Sau đó 
có thể truyền biến variant kết quả vào bất kỳ phương thức hoặc thuộc tính nào của 
AutoCAD mà chấp nhận mảng số như là biến variant. 
Phương thức CreateTypedArray nhận tham số đầu vào là kiểu biến của mảng và dữ 
liệu của mảng cần được chuyển đổi. Giá trị trả về là biến variant. Đoạn mã sau sẽ 
chuyển 3 mảng sử dụng CreateTypedArray: toạ độ các điểm khống chế của đường 
Spline và tiếp tuyến đầu, tiếp tuyến cuối của đường Spline. Sau đó các biến Variant 
sẽ được truyền vào phương thức AddSpline để tạo một đường spline. 
Tạo đường Spline sử dụng phương thức CreateTypedAray 
Sub Ch2_CreateSplineUsingTypedArray() 
’ Ví dụ tạo đường Spline trong không gian mô hình sử dụng 
’ sử dụng Phương thức CreateTypedArray. 
Dim splineObj As AcadSpline 
Dim startTan As Variant 
Dim endTan As Variant 
Dim fitPoints As Variant 
Dim noOfPoints As Integer 
Dim utilObj As Object 
’ ràng buộc về sau với đối tượng Utility 
Set utilObj = ThisDrawing.Utility 
’ Định nghĩa đối tượng Spline 
utilObj.CreateTypedArray _ 
startTan, vbDouble, 0.5, 0.5, 0 
utilObj.CreateTypedArray _ 
endTan, vbDouble, 0.5, 0.5, 0 
utilObj.CreateTypedArray _ 
fitPoints, vbDouble, 0, 0, 0, 5, 5, 0, 10, 0, 0 
noOfPoints = 3 
Set splineObj = ThisDrawing.ModelSpace.AddSpline _ 
(fitPoints, startTan, endTan) 
’ Xem đường spline vừa tạo 
ZoomAll 
End Sub 
8.4. Mảng Variant 
Thông tin về mảng được truyền ngược lại từ AutoCAD ActiveX Automation là 
truyền ở dạng biến variant. Nếu người lập trình biết rõ kiểu dữ liệu mảng, chỉ cần 
truy xuất vào biến variant như một mảng bình thường. Nếu không nắm rõ kiểu dữ 
 58 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
liệu chứa trong biến variant, cần phải sử dụng các hàm VBA VarType hoặc 
Typename. Các hàm này trả lại kiểu dữ liệu chứa trong biến variant. Nếu cần 
duyệt qua mảng người lập trình có thể sử dụng cấu trúc For...Each của VBA. 
Đoạn mã sau sẽ minh hoạ cách tính khoảng cách giữa hai điểm do người dùng nhập 
vào. Trong ví dụ này, kiểu dữ liệu là biết trước vì tất cả các toạ độ đều có kiểu là 
double. Toạ độ 3D chứa trong mảng có 3 biến double còn toạ độ 2D chứa trong 
mảng có 2 biến double. 
Tính khoảng cách giữa hai điểm 
Sub Ch2_TinhKhoangCach() 
Dim point1 As Variant 
Dim point2 As Variant 
’ Người dùng nhập toạ độ điểm 
point1 = ThisDrawing.Utility.GetPoint _ 
(, vbCrLf & "Diem thu nhat: ") 
point2 = ThisDrawing.Utility.GetPoint _ 
(point1, vbCrLf & "Diem thu hai: ") 
’ Tính khoảng cách giữa point1 và point2 
Dim x As Double, y As Double, z As Double 
Dim dist As Double 
x = point1(0) - point2(0) 
y = point1(1) - point2(1) 
z = point1(2) - point2(2) 
dist = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2)) 
’Trình bày kết quả tính 
MsgBox "Khoang cach giua hai diem la: " _ 
& dist, , "Tinh Khoang cach" 
End Sub 
9. Sử dụng các ngôn ngữ lập trình khác 
Tài liệu này được viết cho ngôn ngữ lập trình VBA, do đó các đoạn mã ví dụ và các 
ứng dụng mẫu đều được viết theo ngôn ngữ VBA. Để sử dụng những đoạn mã này 
trong các môi trường lập trình khác, người lập trình cần phải chuyển đổi thích hợp 
sang môi trường mà mình đã lựa chọn. 
9.1. Chuyển đổi từ mã VBA sang VB 
Để cập nhật các đoạn mã ví dụ sử dụng trong VB, cần phải tham chiếu đến thư viện 
kiểu của AutoCAD. Để thực hiện điều này trong VB, chọn mục References từ trình 
đơn Project để mở hộp thoại References. Trong hộp thoại References, chọn 
AutoCAD 2000 Type Library (hoặc tương đương) và nhấn OK. 
Sau đó, trong các đoạn mã ví dụ, thay thế tất cả các phần tham chiếu đến 
ThisDrawing bằng các biến tự định nghĩa tham chiếu đến bản vẽ hiện hành. Để làm 
được điều này, định nghĩa một biến cho ứng dụng AutoCAD (myApp) và cho bản 
vẽ hiện hành (myDoc). Cuối cùng, gán các biến trong chương trình cho các ứng 
dụng AutoCAD hiện hành. Nếu đang chạy AutoCAD, phương thức GetObject sẽ 
lấy lại đối tượng AutoCAD Application. Nếu AutoCAD hiện tại chưa được chạy, 
 Phát triển AutoCAD bằng ActiveX và VBA | 59 
lỗi xuất hiện sẽ được chặn lại và sau đó được xóa đi. Và sau đó, phương thức 
CreateObject sẽ cố gắng tạo đối tượng AutoCAD Application. Nếu thành công, sẽ 
khởi động được AutoCAD; nếu không, một hôp thoại thông báo xuất hiện mô tả về 
lỗi đó. Đoạn mã sau có sử dụng thuộc tính Clear và Description của Err. Nếu môi 
trường phát triển không hỗ trợ các thuộc tính này, ta cần phải điều chỉnh ví dụ cho 
thích hợp. 
Kết nối với AutoCAD từ Visual Basic 
Sub Ch2_ConnectToAcad() 
Dim acadApp As AcadApplication 
On Error Resume Next 
Set acadApp = GetObject(, "AutoCAD.Application") 
If Err Then 
Err.Clear 
Set acadApp = CreateObject("AutoCAD.Application") 
If Err Then 
MsgBox Err.Description 
Exit Sub 
End If 
End If 
MsgBox "Now running " + acadApp.Name + _ 
" version " + acadApp.Version 
End Sub 
Tiếp theo đó, gán đối tượng Document trong AutoCAD cho biến document. Đối 
tượng Document được trả về bằng thuộc tính ActiveDocument. 
Dim acadDoc as AcadDocument 
Set acadDoc = acadApp.ActiveDocument 
Từ đây trở đi, sử dụng biến acadDoc để tham chiếu đến bản vẽ hiện hành của bản 
vẽ AutoCAD. 
CHÚ Ý Khi có đa phiên làm việc trong AutoCAD, hàm GetObject sẽ trả về thực thể đầu tiên 
của AutoCAD trong Running Object Table của Windows. Xem thêm tài liệu của Microsoft 
Visual Basic về Running Object Table (ROT) và hàm GetObject để hiểu thêm về cách xác 
thực phiên làm việc được trả về khi dùng hàm GetObject. 
9.2. Đoạn mã ví dụ so sánh VBA và VB 
Đoạn mã ví dụ sau minh hoạ việc tạo một đoạn thẳng bằng VBA và VB: 
Tạo một đoạn thẳng sử dụng VBA 
Sub Ch2_AddLineVBA() 
’ Ví dụ này sẽ thêm một đoạn thẳng vào Model Space 
Dim lineObj As AcadLine 
Dim startPoint(0 To 2) As Double 
Dim endPoint(0 To 2) As Double 
’ Xác định điểm đầu và điểm cuối của đoạn thẳng 
startPoint(0) = 1 
startPoint(1) = 1 
startPoint(2) = 0 
endPoint(0) = 5 
endPoint(1) = 5 
endPoint(2) = 0 
’ Tạo đoạn thẳng trong Model Space 
 60 | Chương 2: Các khái niệm cơ bản về ActiveX Automation 
Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, _ 
 endPoint) 
’ Xem đoạn thẳng vừa mới tạo 
ZoomAll 
End Sub 
Tạo một đoạn thẳng sử dụng VB 
Sub Ch2_AddLineVB() 
On Error Resume Next 
’ Kết nối với chương trình AutoCAD 
Dim acadApp As AcadApplication 
Set acadApp = GetObject(, "AutoCAD.Application") 
If Err Then 
Err.Clear 
Set acadApp = CreateObject("AutoCAD.Application") 
If Err Then 
MsgBox Err.Description 
Exit Sub 
End If 
End If 
’ Kết nối với bản vẽ AutoCAD 
Dim acadDoc As AcadDocument 
Set acadDoc = acadApp.ActiveDocument 
’ Xác định hai đầu đoạn thẳng 
Dim lineObj As AcadLine 
Dim startPoint(0 To 2) As Double 
Dim endPoint(0 To 2) As Double 
startPoint(0) = 1 
startPoint(1) = 1 
startPoint(2) = 0 
endPoint(0) = 5 
endPoint(1) = 5 
endPoint(2) = 0 
’ Tạo đoạn thẳng trong Model Space 
Set lineObj = acadDoc.ModelSpace.AddLine _ 
 (startPoint, endPoint) 
ZoomAll 
End Sub 

File đính kèm:

  • pdfphat_trien_autocad_bang_activex_vba_chuong_2_cac_khai_niem_c.pdf