Phát triển AutoCAD 4
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.
Tóm tắt nội dung tài liệu: Phát triển AutoCAD 4
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:
- phat_trien_autocad_4.pdf