b g ngôn ng l p trình VB6 - docshare04.docshare.tips4. Quan hệ giữa VB6 và VBA trong AutoCad...
Transcript of b g ngôn ng l p trình VB6 - docshare04.docshare.tips4. Quan hệ giữa VB6 và VBA trong AutoCad...
-
Xây dựng mô hình tự động hoá thiết kế trong AutoCad
bằng ngôn ngữ lập trình VB6
Phan Tự Hướng, Trường Đại học Kiến trúc Hà Nội
Tóm tắt: Trong lĩnh vực thiết kế công trình, phần mềm AutoCad được sử dụng rất phổ
biến vì nhiều tính năng ưu việt. Với yêu cầu thiết kế xây dựng đòi hỏi chất lượng ngày càng
cao, nhiều công việc phải giao tiếp với các phần mềm ứng dụng bên ngoài hoặc thực hiện
lặp đi lặp lại gây nhàm chán, mất nhiều công sức và dễ sai sót. Công việc đó có thể hoàn
toàn thực hiện tự động với thời gian ngắn, độ chính xác cao nhờ ngôn ngữ lập trình VB6
(Visual Basic 6) trong môi trường AutoCad. Bài báo này trình bày mô hình tự động hoá thiết
kế trong AutoCad bằng ngôn ngữ lập trình VB6. Mô hình tự động hoá này đã được ứng
dụng trong nhiều phần mềm thiết kế xây dựng hiện nay, nhưng tài liệu viết về mô hình liên
kết này rất hiếm (kể cả các tài liệu nước ngoài). Hy vọng bài báo này sẽ đáp ứng nhu cầu
những ai muốn khám phá lĩnh vực tự động hoá trong AutoCad bằng VB6.
1. Đặt vấn đề
AutoCad là phần mềm chuyên về lĩnh vực vẽ kỹ thuật và đồ hoạ, được ứng dụng rất
phổ biến trong thiết kế công trình. Bản thân AutoCad đã được tích hợp ngôn ngữ lập trình
Visual Lisp và VBA (Visual Basic for Applications) nhưng đều có hạn chế nhất định. Ví dụ
như khả năng bảo mật kém, không có khả năng đóng gói thành ứng dụng chạy độc lập,
hỗ trợ ít điều khiển ActiveX,... Hai ngôn ngữ này thường được sử dụng với các ứng dụng
quy mô vừa và nhỏ, hoặc đóng vai trò kết nối hay khởi động ứng dụng khác.
VB6 khắc phục được những mặt hạn chế trên, có thể tạo ra các ứng dụng trong
AutoCad hoàn toàn chạy độc lập (không phụ thuộc vào phiên bản), không cần các
chương trình nền hỗ trợ, sản phẩm có khả năng thương mại. Nhìn chung cấu trúc, mã
lệnh trong thủ tục của VB6 và VBA rất giống nhau nên dễ dàng chuyển đổi. Vì vậy, những
người am hiểu về VBA thì có thể nhanh chóng tiếp cận, sử dụng VB6 và ngược lại. Hiện
nay, tuy được thay thế bằng VB.NET nhưng VB6 vẫn được sử dụng rộng rãi nhờ những
ưu điểm trên.
2. Điều khiển AutoCad từ VB6
VB6 có thể tạo ra hơn 6 kiểu ứng dụng, nhưng chỉ có hai kiểu điều khiển (liên kết)
được với AutoCad (và cả các phần mềm trong bộ Office) là Standard EXE và ActiveX
DLL. Standard EXE là ứng dụng được biên dịch chạy hoàn toàn độc lập, điều khiển
-
AutoCad thông qua đối tượng Automation. Automation là một dạng công nghệ ActiveX
trong gia đình Microsoft, cho phép điều khiển các ứng dụng (AutoCad) từ môi trường bên
ngoài (như VB6). ActiveX DLL được hiểu là thư viện liên kết động (Dynamic Link Library -
DLL) để các ứng dụng có thể tham chiếu, sử dụng được. Khác với VB6, VBA là môi
trường lập trình có sẵn trong AutoCad nên điều khiển không thông qua đối tượng
Automation (được gọi là AutoCAD.Application). Điều đó có nghĩa Automation là đối tượng
trung gian để VB6 từ bên ngoài có thể điều khiển các ứng dụng khác như AutoCad, Excel,
Word,...
Hình 1: Mô hình trao đổi dữ liệu với các ứng dụng khác từ VB6
Bài báo này giới thiệu 2 ứng dụng điều khiển AutoCad từ VB6 qua Standard EXE và
ActiveX DLL một cách đơn giản nhất.
2.1. Điều khiển AutoCad bằng Standard EXE
VB6
AutoCad
AUTOMATION
PowerPoint Excel Word
-
Hình 2: Tạo ứng dụng Standard EXE
Khởi động VB6, chọn Standard EXE trong cửa sổ New Project (hình 2). Dự án (project)
mới mặc định sẵn có Form1, đổi tên của dự án thành VB6exeAcad, đổi tên Form thành
ControlAcad và lưu lại dự án đó.
Hình 3: Xây dựng các điều khiển trong dự án VB6exeAcad
Sau đó, xây dựng các điều khiển chính như hình 3. Điều khiển Text Box gồm có
txtFirstX, txtFirstY (toạ độ điểm đầu), txtSecondX, txtSecondY (tọa độ điểm cuối). Điều
-
khiển CommandButton gồm có cmdFirstP, cmdSecondP (chọn điểm đầu, điểm cuối),
cmdOK (thực hiện lệnh vẽ), cmdClose (đóng cửa sổ),...
Thủ tục dưới đây sẽ khởi động AutoCad khi Form ControlAcad được tải:
Private Sub Form_Load()
On Error Resume Next 'Bỏ qua lỗi khi AutoCad chưa mở sẵn
'"Bắt" đối tượng AutoCad nếu đang mở
Set AcadApp = GetObject(, "AutoCAD.Application")
'Xoá lỗi nếu AutoCad chưa mở
If Err 0
Err.Clear 'Xoá lỗi phát sinh
Set AcadApp = CreateObject("AutoCAD.Application")
End If
AppActivate AcadApp.Caption 'Kích hoạt AutoCad
AcadApp.Visible = True 'Hiện cửa sổ AutoCad
End Sub
Thủ tục thi hành một số nút lệnh cmdClose, cmdFirstP, cmdSecondP như hình 4.
Hình 4: Nội dung thủ tục của nút lệnh cmdClose, cmdFirstP, cmdSecondP
-
Nội dung thủ tục của nút cmdOK (vẽ đoạn thẳng từ điểm LineP1 và LineP2):
Private Sub cmdOK_Click()
Dim LineL As Object, LineP1(0 To 2) As Double, LineP2(0 To 2) As Double
With Me
LineP1(0) = Val(.txtFirstX) 'Gán toạ độ điểm đầu
LineP1(1) = Val(.txtFirstY)
LineP2(0) = Val(.txtSecondX) 'Gán toạ độ điểm cuối
LineP2(1) = Val(.txtSecondY)
End With
'Vẽ đoạn thẳng và chuyển sang màu đỏ
Set LineL = AcadApp.ActiveDocument.ModelSpace.AddLine(LineP1, LineP2)
LineL.Color = 1
Unload Me
Set AcadApp = Nothing 'Xoá biến đối tượng
End Sub
Đối tượng AcadApp được khai báo ở trên chính là AutoCAD.Application. Nếu AutoCad
đang được mở, sử dụng hàm GetObject để chương trình tham chiếu đến đối tượng
AutoCAD.Application. Trong trường hợp AutoCad đang đóng, sử dụng hàm CreateObject
để tạo ra và trả về tham chiếu đến đối tượng AutoCAD.Application.
Sau khi xây dựng hoàn chỉnh, bạn vào menu File và chọn Make VB6exeAcad.exe... để
tạo file chạy độc lập như các chương trình khác. Ứng dụng này có thể thực hiện trên các
phiên bản AutoCad bắt đầu từ 2000 (phiên bản đầu tiên hỗ trợ Automation).
Chi tiết của dự án này trong www.cadviet.com...
2.2. Điều khiển AutoCad bằng ActiveX DLL
Khởi động VB6, chọn ActiveX DLL trong cửa sổ New Project (hình 2). Dự án mới mặc
định có một Class Module, đổi tên của dự án thành Dll_VB6_Project và lưu lại dự án đó.
Sau đó thêm Form, Module, Class Module bằng cách vào menu Project và chọn Add
Form, Add Module, Add Class Module (hình 5).
http://www.cadviet.com/
-
Hình 5: Tải Form, Module vào dự án Dll_VB6_Project
Hình 6: Cấu trúc Dự án Dll_VB6_Project
Dự án Dll_VB6 có ba thành phần là Form FDllVb6, Module Dll_in_AutoCad, Class
Module HelloDllVB6 như sau:
- Module Dll_in_AutoCad: Khai báo biến đối tượng CadApp, chính là đối tượng
Acad.Application để các thủ tục có thể truy cập.
Public CadApp As Object (gọi chung)
-
- Form FDllVb6: Là Form sẽ hiển thị trong AutoCad, Form này chứa các điều khiển
theo ý muốn. Phương pháp xây dựng các điều khiển tương tự như ở mục 2.1 nên
tôi không trình bày lại nữa.
Private Sub cmdLine_Click()
Dim LineObj As Object
Dim StartPoint As Variant
Dim EndPoint As Variant
On Error GoTo Thoat 'Tự thoát khi gặp lỗi hay bấm phím Esc
Unload Me
'Chọn điểm đầu của đường thẳng
StartPoint = CadApp.ActiveDocument.Utility.GetPoint(, "Chon diem dau:")
Do
'Chọn điểm cuối của đường thẳng, được lặp giống lệnh Line trong AutoCad
EndPoint = CadApp.ActiveDocument.Utility. _
GetPoint(StartPoint, "Chon diem tiep theo:")
'Vẽ đoạn thẳng
Set LineObj = CadApp.ActiveDocument.ModelSpace. _
AddLine(StartPoint, EndPoint)
'Gán biến đối tượng
StartPoint = EndPoint
Loop
Set LineObj = Nothing
Thoat:
End Sub
- Class Module HelloDllVB6: Tạo đối tượng mới có tên HelloDllVb6, trong
HelloDllVb6 xây dựng thủ tục ShowVB6Form (hình 7). Thủ tục ShowVB6Form có
chức năng hiển thị form FDllVb6 trong AutoCad.
-
Hình 7: Cấu trúc Class Module HelloDllVB6
Đáng chú ý trong dự án này có sử dụng hai hàm API là FindWindowA và
SetWindowLongA. Hàm FindWindowA lấy handle của cửa sổ có tên (title) được chỉ định.
Hàm SetWindowLongA sẽ thay đổi thuộc tính của cửa sổ chỉ định (xem thêm trong trang
www.microsoft.com).
-
Hình 8: Biên dịch dự án Dll_VB6_Project sang DLL
Khi dự án hoàn thành, chúng ta tiến hành biên dịch bằng cách chọn menu File\ Make
Dll in AutoCad.dll... (hình 8). Bây giờ, công việc tiếp theo của chúng ta là sử dụng file Dll
in AutoCad.dll như thế nào?
Khác với dự án VB6exeAcad.exe có thể điều khiển trực tiếp AutoCad, để sử dụng
ActiveX DLL cần phải có thủ tục trong AutoCad gọi ứng dụng đó. Thủ tục đó được xây
dựng trong VBA của AutoCad.
Đầu tiên khởi động AutoCad, sau đó vào menu Tools\ Macro\ Visual Basic Editer (hoặc
bấm Alt+F11). Cửa sổ Microsoft Visual Basic hiện ra (hình 9), chọn menu Insert\ Module
để thêm module mới. Sau đó vào menu Tools\ References..., cửa sổ References -
ACADProject hiện ra như hình 10. Bấm vào nút Browse... để tìm tới file Dll in AutoCad.dll
vừa được biên dịch. Sau khi chọn xong, AutoCad xác nhận dự án Dll_VB6_Project đã
được tải vào chương trình (hình 10). Sau đó bạn tiến hành xây dựng thủ tục
DisplayDLLForm trong VBA, dự án vừa rồi đã được nạp vào Auto List Members như các
thành phần sẵn có trong AutoCad (hình 11).
-
Hình 9: Cửa sổ Microsoft Visual Basic trong AutoCad
Hình 10: Cửa sổ Microsoft Visual Basic trong AutoCad
Hình 11: Dự án Dll_VB6_Project được xác nhận trong Auto List Members
Thủ tục DisplayDLLForm hoàn chỉnh như ở dưới:
Public Sub DisplayDLLForm()
'Khai báo biến HelloDllVb6 trong Dll_VB6_Project
Dim HelloDllVb6 As Dll_VB6_Project.HelloDllVb6
Set HelloDllVb6 = New Dll_VB6_Project.HelloDllVb6
Set HelloDllVb6.AcadApp = Application
'Hiện thi hành thủ tục ShowVB6Form để tải form FDllVb6
HelloDllVb6.ShowVB6Form
Set HelloDllVb6 = Nothing
End Sub
-
Trong thủ tục trên, HelloDllVb6 đóng vai trò là một đối tượng nằm trong
Dll_VB6_Project. Đối tượng HelloDllVb6 có phương thức ShowVB6Form.
Sau đó thi hành thủ tục trên bằng cách chuyển sang cửa sổ AutoCad, vào menu Tools\
Macro\ Macros... (hoặc phím tắt Alt+F8). Cửa sổ Macros hiện ra như hình 12, chọn thủ tục
DisplayDLLForm và bấm nút Run. Kết quả thể hiện như hình 13 để thi hành các lệnh.
Hình 12: Thi hành thủ tục DisplayDLLForm trong AutoCad
Hình 13: Form xây dựng trong VB6 trong AutoCad
-
Chi tiết của dự án này trong www.cadviet.com...
4. Quan hệ giữa VB6 và VBA trong AutoCad
Như đã đề cập ở trên, VB6 và VBA rất gần gũi nhau và có thể chuyển đổi code giữa 2
môi trường một cách dễ dàng. Chúng đều là ngôn ngữ lập trình Visual Basic và khi điều
khiển đối tượng giống nhau, cách thức thực hiện tương tự. Để tiện so sánh, tôi xây dựng
Form trong VBA giống như trong VB6 (hình 14). Các đối tượng bên trong Form cũng như
thuộc tính của chúng thiết lập gần tương tự nhau. Giao diện giữa 2 chương trình giống
nhau đến mức dễ gây nên sự xáo trộn khi làm việc với chúng (hình 6 và 14).
Hình 14: Form xây dựng trong VBA của AutoCad
Về mặt thuật toán cũng như mã lệnh (code) giữa chúng gần tương tự nhau. Để tiện so
sánh tôi copy toàn bộ code vẽ đoạn thẳng trong VB6 (hình 6) sang VBA (hình 14). Do VBA
nằm sẵn trong AutoCad (không phải can thiệp từ bên ngoài như VB6) nên chỉ cần bỏ đi
đoạn code “CadApp.”, còn toàn bộ giữ nguyên. Thủ tục vẽ đoạn thẳng trong VBA sửa lại
như sau:
Private Sub cmdLine_Click()
Dim LineObj As Object
http://www.cadviet.com/
-
Dim StartPoint As Variant
Dim EndPoint As Variant
On Error GoTo Thoat ' Tự thoát khi gặp lỗi hay bấm phím Esc
Unload Me
'Chọn điểm đầu của đường thẳng
StartPoint = ActiveDocument.Utility.GetPoint(, "Chon diem dau:")
Do
'Chọn điểm cuối của đường thẳng, được lặp giống lệnh Line trong AutoCad
EndPoint = ActiveDocument.Utility. _
GetPoint(StartPoint, "Chon diem tiep theo:")
'Vẽ đoạn thẳng
Set LineObj = ActiveDocument.ModelSpace. _
AddLine(StartPoint, EndPoint)
'Gán biến đối tượng
StartPoint = EndPoint
Loop
Set LineObj = Nothing
Thoat:
End Sub
-
Hình 15: Trợ giúp về ActiveX và VBA
Hãy kiểm tra thủ tục trên, bạn sẽ thấy kết quả tương tự như với VB6. Đó là cách
chuyển code từ VB6 sang VBA, còn nếu muốn chuyển từ VBA sang VB6 thì thực hiện
ngược lại bằng cách bổ sung đường dẫn ở trên. Điều đó thật đơn giản phải không?
Tại sao tôi lại quan tâm đến mối liên quan giữa VB6 và VBA? Sách hướng dẫn lập trình
VB6 điều khiển các đối tượng bên ngoài, đặc biệt là AutoCad là rất hiếm hoặc chỉ dẫn một
cách sơ sài. Trong khi đó, nguồn tài liệu hướng dẫn sử dụng VBA trong AutoCad lại rất
phong phú trên Internet cũng như có sẵn trong phần Help của AutoCad. Trong AutoCad
(2007), để có hướng dẫn sử dụng VBA, vào menu Help\ Additional Resources\ Developer
Help, cửa sổ AutoCad 2007 Help: Developer Documentation hiện ra như hình 15. Khai
thác những thông tin trong đó ta sẽ thu được nhiều kiến thức VBA với những chỉ dẫn cụ
thể với ví dụ kèm theo (hình 16).
Và như vậy, để trở thành “chuyên gia” lập trình VB6 cho đối tượng AutoCad (hay
Office), cần có bước đệm nghiên cứu và sử dụng thành thạo VBA. Khi thủ tục viết trong
VBA đã chạy chuẩn, chỉ cần vài thao tác sao chép, bổ sung đơn giản là code VBA trở
thành code VB6.
Hình 16: Hướng dẫn sử dụng phương thức vẽ cung tròn Arc trong Help
4. Kết luận
Visual Basic là ngôn ngữ lập trình rất phổ biến vì dễ học, phạm vi ứng dụng rộng rãi.