b g ngôn ng l p trình VB6 - docshare04.docshare.tips4. Quan hệ giữa VB6 và VBA trong AutoCad...

15
Xây dựng mô hình tđộng hoá thiết kế trong AutoCad bằng ngôn nglp trình VB6 Phan THướng, Trường Đại học Kiến trúc Hà Nội Tóm tắt: Trong lĩnh vc thiết kế công trình, phần mềm AutoCad được sdụng rất phbiến vì nhiu tính năng ưu việt. Với yêu cầu thiết kế xây dựng đòi hi chất lượng ngày càng cao, nhiều công vic phải giao tiếp với các phần mềm ứng dụng bên ngoài hoc thc hiện lp đi lp li gây nhàm chán, mất nhiều công sức và dsai sót. Công vic đó có thhoàn toàn thc hiện tđộng với thời gian ngắn, độ chính xác cao nhngôn nglp 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 nglp 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 vmô hình liên kết này rất hiếm (kccá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 vc tđộng hoá trong AutoCad bằng VB6. 1. Đặt vấn đề AutoCad là phần mềm chuyên vlĩnh vc vkthut và đồ hoạ, được ứng dụng rất phbiến trong thiết kế công trình. Bản thân AutoCad đã được tích hp ngôn nglp trình Visual Lisp và VBA (Visual Basic for Applications) nhưng đều có hạn chế nhất định. Ví dnhư khnăng bảo mật kém, không có khnăng đóng gói thành ứng dụng chạy độc lp, htrít điều khiển ActiveX,... Hai ngôn ngnày thường được sdụng với các ứng dụng quy mô va và nh, hoc đó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ó thto ra các ứng dụng trong AutoCad hoàn toàn chạy độc lp (không phthuc vào phiên bản), không cần các chương trình nền htr, sản phẩm có khnăng thương mại. Nhìn chung cấu trúc, mã lệnh trong thtc ca VB6 và VBA rất giống nhau nên ddàng chuyển đổi. Vì vậy, những người am hiểu vVBA thì có thnhanh chóng tiếp cận, sdụng VB6 và ngược li. Hiện nay, tuy được thay thế bằng VB.NET nhưng VB6 vẫn được sdụng rộng rãi nhnhững ưu điểm trên. 2. Điều khiển AutoCad tVB6 VB6 có thtạo ra hơn 6 kiểu ứng dụng, nhưng chcó hai kiu điều khiển (liên kết) được với AutoCad (và ccác phần mềm trong bOffice) là Standard EXE và ActiveX DLL. Standard EXE là ứng dụng được biên dịch chạy hoàn toàn độc lp, điều khiển

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.