Hiện tại có nhiều người muốn tìm hiểu về lập trình trên nền tảng .NET với AutoCAD.
Với một số kinh nghiệm tích lũy được về lập trình với AutoCAD, tôi mạn phép viết phần hướng dẫn này.
Hy vọng là sẽ có nhiều điều bổ ích cho mọi người.
Một số ghi chú: Trong các phần hướng dẫn, chỉ chú trọng đến cách thức giao tiếp với CAD mà không bàn về việc sử dụng và thao tác các chương trình lập trình.
Có thể sử dụng VB.NET hoặc C#, nhưng các hướng dẫn sau này sẽ viết bằng code VB.NET.
Chương trình tạo ra sẽ chạy độc lập với AutoCAD, không sử dụng tham chiếu đến thư viện đối tượng của AutoCAD mà sử dụng kỹ thuật liên kết - muộn.
So với phương pháp chèn thư viện tham chiếu thì nó có ưu điểm riêng và thuận lợi riêng.
- Ưu điểm: giao tiếp với phần lớn các phiên bản của CAD
- Nhược điểm:
Không có sẵn các lớp, hàm và các hằng số AutoCAD, người dùng phải tự định nghĩa, tự ghi nhớ lấy tên.
Một số chức năng không sử dụng tường minh được.
I. Tạo liên kết với AutoCAD
Vì AutoCAD là đối tượng chính nhắm tới và thường xuyên thao tác đến nó, cho nên cần khai báo một biến đại diện cho chương trình AutoCAD (tương tự như AcadApplication trong VBA) để dễ dàng thao tác như sau:
'Biến toàn cục chỉ đến chương trình AutoCAD chạy sau cùng nhất,
Public Acad As Object
Để làm việc với biến này, cần tạo ra sự liên kết chương trình AutoCAD đến nó.
Tại thời điểm chạy, các dữ liệu của chương trình AutoCAd sẽ được ép sang biến Acad, với biến này ta có thể truy xuất đến các thuộc tính và hàm của nó, phương pháp này gọi là pp liên kết muộn.
Trước hết định nghĩa cách thức liên kết như sau:
Enum acAcadLink As Integer
'Chỉ liên kết đến chương trình AutoCAD đang chạy
Link = 1
'Tạo một phiên chạy mới của chương trình AutoCAD
NewSession = 2
'Liên kết đến chương trình AutoCAD, nếu không được thì chạy một bản mới
LinkNewSession = 3
End Enum
và đây là hàm dùng để liên kết với một biến bất kỳ chứa đựng thông tin của chương trình AutoCAD
''' <summary>
''' Hàm liên kết với AutoCAD, đồng thời hiển thị thông báo lỗi (nếu có)
''' </summary>
''' <param name="acad_app">Trả về biến liên kết đại diện cho chương trình AutoCAD</param>
''' <param name="op">Tùy chọn liên kết</param>
''' <param name="Visible">Có hiển thị chương trình AutoCAD hay không</param>
''' <returns>True nếu thành công, ngược lại là false</returns>
''' <remarks>Hàm này có thêm hàm ghi đè</remarks>
Public Function ACADLink(ByRef acad_app As Object, Optional ByVal op As acAcadLink = acAcadLink.Link, Optional ByVal Visible As Boolean = True) As Boolean
Select Case op
Case acAcadLink.Link
Try
acad_app = GetObject(, "AutoCAD.Application")
Catch
If MsgBox("AutoCAD chưa chạy, khởi động nó ?", MsgBoxStyle.YesNo, "Chú ý") = MsgBoxResult.Yes Then
Try
acad_app = CreateObject("AutoCAD.Application")
Catch
MsgBox("Có lỗi khi khởi động AutoCAD!", MsgBoxStyle.Information, "Chú ý")
Return False
End Try
Else
Return False
End If
End Try
Case acAcadLink.LinkNewSession
Try
acad_app = GetObject(, "AutoCAD.Application")
Catch
Try
acad_app = CreateObject("AutoCAD.Application")
Catch
MsgBox("Có lỗi khi khởi động AutoCAD!", MsgBoxStyle.Information, "Chú ý")
Return False
End Try
End Try
Case acAcadLink.NewSession
Try
acad_app = CreateObject("AutoCAD.Application")
Catch
MsgBox("Có lỗi khi khởi động AutoCAD!", MsgBoxStyle.Information, "Chú ý")
Return False
End Try
End Select
Try
Dim acAcadState = acad_app.GetAcadState
If Not acAcadState.IsQuiescent Then
MsgBox("AutoCAD chưa sẵn sàng. Hãy đóng hộp thoại đang mở hoặc thoát khỏi lệnh đang thực hiện", MsgBoxStyle.Critical, "Chú ý")
Else
acad_app.Visible = Visible
Return True
End If
Catch
Return False
End Try
End Function
Trong trường hợp muốn liên kết với biến Acad đã khai báo ở trên, ta dùng hàm sau
''' <summary>
''' Hàm liên kết với AutoCAD và gán vào biến Acad, đồng thời hiển thị thông báo lỗi (nếu có)
''' </summary>
''' <param name="op">Tùy chọn liên kết</param>
''' <param name="Visible">Có hiển thị chương trình AutoCAD hay không</param>
''' <returns>True nếu thành công, ngược lại là false</returns>
''' <remarks>Hàm này có thêm hàm ghi đè</remarks>
Public Function ACADLink(Optional ByVal op As acAcadLink = acAcadLink.Link, Optional ByVal Visible As Boolean = True) As Boolean
Return ACADLink(Acad, op, Visible)
End Function
VD:
Để liên kết biến Acad với chương trình AutoCAD đang chạy, ta dùng như sau:
if ACADLink() then
'Nếu AutoCAD chưa chạy thì câu lệnh if sẽ kết thúc
'Làm cái gì đó ở đây
end if
Để liên kết biến Acad với chương trình AutoCAD đang chạy, or chưa chạy thì chạy nó, ta dùng như sau:
if ACADLink(acAcadLink.LinkNewSession) then
'Làm cái gì đó ở đây
end if
Để liên kết biến MyAcad với một phiên mới AutoCAD đồng thời ẩn nó để xử lý chạy nền
Dim MyAcad as Object
if ACADLink(MyAcad, acAcadLink.NewSession, False) then
'Làm cái gì đó ở đây
end if
Tải về ch trình mẫu VD về thao tác với AutoCAD
Phần 2: Thao tác với các đối tượng AutoCAD
Phần 3: Lập trình với bản vẽ
Source chương trình mẫu: http://www.fshare.vn/file/TWZSCHPKZT
Phần 4: Lập trình với các đối tượng trong bản vẽ
Source chương trình mẫu:
1. Thao tác với các đối tượng: http://www.fshare.vn/file/THA20XJFHT
2. Tạo bảng trong CAD từ dữ liệu trong Excel: http://www.fshare.vn/file/TXHY1W363T
3. Break các Polyline thành các Polyline con tại các giao điểm giữa chúng với nhau: http://www.fshare.vn/file/TGBGC2NFVT