Professional Documents
Culture Documents
HD Lap Trinh Voi AUTOCAD Bang VBNet
HD Lap Trinh Voi AUTOCAD Bang VBNet
Trong các phầnhướ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.
'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
'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
Khi đã sử dụng liên kết muộn để ép kiểu của đối tượng vào biến của mình, thì mỗi đối tượng AutoCAD
như application, Document, Layer, Polyline ... đều có các thuộc tính, các hàm (các sự kiện) tương ứng
mà ta có thể truy xuất đến chúng.
Vì không sử dụng tham chiếu đến thư viện đối tượng của AutoCAD, cho nên bạn phải tự nhớ lấy tên
hàm / thuộc tính.
Nếu [Tên hàm or thuôc tính] không có, lỗi sẽ xảy ra như sau:
Public member 'tên hàm or thuộc tính' on type 'AcadApplicationClass' not found.
VD:
+ Để truy xuất đến các bản vẽ đang mở ta sử dụng câu lệnh sau:
, lúc đó một mảng các đối tượng có kiểu Document sẽ được ép vào biến dwgs
+ Để hiển thị version của chương trình AutoCAD đang chạy là dùng lệnh
MsgBox(Acad.Version)
2. Các collection:
Documents: tập hợp các bản vẽ đang mở
SelectionSets: tập hợp các bộ chọn đối tượng của một bản vẽ
Layers: các lớp của một bản vẽ ...
TextStyles, Limits, Layouts, Blocks, ModelSpace, PaperSpace ...
VD:
+ Để lấy thông tin về textstyle đầu tiên trong bản vẽ hiện hành
hoặc
đều được
- Hàm Add để thêm vào một đối tượng cùng kiểu trong collection đó. Trong trường hợp một đối tượng
mới thêm vào đã có tên rồi thì sẽ xảy ra lỗi.
Câu lệnh thêm vào an toàn nhất là:
Dim new_item as object
Try
new_item = [Collection].Add([Tên])
Catch 'nếu đã có rồi thì chọn nó thôi
new_item = [Collection].Item([Tên])
End
VD:
+ Thêm một tập chọn đối tượng vào, nếu đã có thì chọn nó
Acad.ActiveDocument.Layers.Add("anhcos")
sẽ tạo ra một lớp mới có tên "anhcos", với các thuộc tính mặc định
có kết quả tương đương, nhưng lớp mới này được gán vào biến new_layer để có thể thay đổi các thuộc
tính của nó như màu sắc ...
Trong đó collection hay dùng nhất là ModelSpace hoặc PaperSpace dùng để thêm các thực thể mới vào
bản vẽ.
Và ModelSpace thực chất là một tập con ánh xạ của Blocks với tên riêng là "*MODEL_SPACE"
Các lệnh AddLine để thêm vào một Line, AddPolyline, AddLightWeightPolyline, AddCircle, AddBox...
VD;
+ thêm một Line vào
dwg.ModelSpace.AddLightWeightPolyline(new double(){2,1,1,5,3,4,7,8})
dwg.ModelSpace.AddPolyline(new double(){2,1,0,1,5,0,3,4,0})
+ tìm tất cả các giao giữa một đường thẳng và một đường đa tuyến
Để có thêm thông tin về từng đối tượng, tham khảo các phần sau:
Phần giúp đỡ của AutoCAD --> ActiveX Automation and VBA --> ActiveX and VBA Reference.
hoặc mở file acad_dev.chm trong thư mục Help của AutoCAD
hoặc tham khảo online qua trang: AutoCAD .NET Developer's Guide
1. Đối tượng bản vẽ được truy xuất thông qua các phương thức sau:
hoặc:
Trong đó Name là tên của bản vẽ bao gồm cả đường dẫn, nếu bản vẽ nằm trong các đường dẫn hỗ trợ
của Acad
thì chỉ cần tên file thôi. Sau khi mở xong dùng cách (a) ở trên để truy xuất đến bản vẽ vừa mở
VD:
Dim bản_vẽ_vừa_mở = Acad.Documents(Acad.Documents.Count - 1)
bản_vẽ_mới = AcadApp.Documents.Add([Name])
hoặc
bản_vẽ_mới = bản_vẽ_đang_mở.New(tên_file_khởi_thủy)
Chỉ chấp nhận bản vẽ khởi thủy dạng dwt và nằm ở thư mục chứa các bản vẽ mẫu.
Dùng Acad.Preferences.Files.TemplateDWGPath để lấy đường dẫn.
2. Các hàm và thuộc tính quan trọng trong đối tượng bản vẽ:
PaperSpace
- FullName: đường dẫn đầy đủ của bản vẽ
- Layers: tập các layer
- Layouts: tập các layout trong bản vẽ, bao gồm cả ModelSpace và PaperSpace. Tập này cũng dùng để
thiết lập
trang in.
- ModelSpace, PaperSpace: chứa các đối tượng trong bản vẽ, được ánh xạ đến tập Blocks và Layouts.
- SelectionSets: tập chứa các bộ chọn đối tượng.
- Utility: Một số hàm tiện ích như: nhập một số thực; nhập một góc; chọn một đối tượng ...
Một số VD:
Dwg.SetVariable("BACKGROUNDPLOT", CInt(0))
IV. Lập trình với các đối tượng trong bản vẽ:
Các thao tác bao gồm: đọc (trích xuất), chỉnh sửa dữ liệu của các đối tượng và tạo ra các đối tượng
mới.
Các đối tượng hay sử dụng nhất là: loại "sờ được" như Line, Polyline, Arc, Circle, BlockReference ... và
loại không trông thấy như Block, các Styles như DimStyle, TextStyle ...
Trong phần này sẽ đề cập đến phần đọc và chỉnh sửa dữ liệu của đối tượng "sờ được" trước, sau đó
mới đến phần tạo mới, vì sửa cái đã có sẵn sẽ dễ dàng hơn.
Các đối tượng như đã nói ở trên, mỗi cái sẽ có những thuộc tính và hàm riêng của nó. Các thuộc tính
bao gồm loại chỉ đọc và loại có thể đọc + sửa được. Đối với các thực thể có một số hàm dùng chung
như Copy, Move, Rotate, Rotate3D, Mirror, Mirror3D, IntersectWith, Offset, Delete, ArrayPolar,
ArrayRectangular ...
Ví dụ: đối tượng Line có các thuộc tính chỉ đọc như: Angle - góc nghiêng của nó, Length - chiều dài,
Normal - vector pháp tuyến; và thuộc tính kiểu đọc-ghi như StartPoint - điểm đầu, EndPoint - điểm cuối,
Thickness - độ dày.
Như vậy chỉ cần thay đổi đến thuộc tính StartPoint và EndPoint thì những thuộc tính còn lại (như Angle,
Length...) sẽ được Acad tính toán và thay đổi theo.
Chi tiết hàm và các thuộc tính của từng đối tượng xem phần giúp đỡ của acad.
Theo cú pháp:
Biến_lưu_giá_trị = Đốitượng.Thuộctính
Biến dùng lưu giá trị nên có kiểu cùng với kiểu của thuộc tính, trong trường hợp không rõ thì khai báo
kiểu là Object. Nếu Tên thuộc tính không đúng, sẽ xảy ra lỗi "Member not found".
VD:
Dim Nộidung as string = TextObj.TextString lấy đoạn văn bản của đối tượng Text/MText
Dim Tọa_độ as Object = polyObj.Coordinates sẽ ép mảng tọa độ (2 hoặc 3 tọa độ) của
đường đa tuyến vào biến Tọa_độ
Theo cú pháp:
- Trực tiếp qua thuộc tính: Đốitượng.Thuộctính = Giá_trị_mới
Kiểu của Giá_trị_mới phải phù hợp với kiểu dữ liệu của thuộc tính
Thuộc tính dùng chung là Layer, Linetype, Lineweight, TrueColor, Visible ...
- Thông qua hàm: thay đổi gián tiếp dữ liệu thông qua các hàm liên quan của từng đối tượng như hàm
Rotate, Rotate3D, Move, TransformBy, SetBulge, ScaleEntity ...
VD:
Try 'Thiết lập layer cho đối tượng BlockRefObj
BlockRefObj.Layer = "THANH"
Catch
'Chưa có layer THANH --> chuyển về layer 0
BlockRefObj.Layer = "0"
End Try
TextObj.Height = 100 ‘thay đổi chiều cao của đối tượng Text
- Các hàm IntersectWith, GetBoundingBox: dùng để lấy các thông tin thêm
VD:
Dim các_điểm_giao() as Double = Obj.IntersectWith(OtherObj, 1) ‘Tìm giao của
Obj với đối tượng OtherObj có kéo dài đối tượng Obj.
Việc tạo các thực thể mới thông qua các hàm có tên bắt đầu là Add... của lớp đối tượng Block.
Đối với mỗi bản vẽ, tập Blocks sẽ chứa toàn bộ các Block đã định nghĩa trong bản vẽ (trong khi các
block reference là những hiển thị bản sao của block trên acad).
Tùy thuộc vào nơi cần tạo ra đối tượng mới mà ta chọn ModelSpace hay PaperSpace cho phù hợp.
Ngoài ra các hàm thêm đối tượng còn được dùng để thêm các đối tượng vào một định nghĩa Block mới.
Drawing
|
Blocks
|-------- *MODEL_SPACE <-------- chèn block tham chiếu vào ----|
|
|-------- *PAPER_SPACE <-------- chèn block tham chiếu vào -----|
|
|-------- Block 1 -----các block có thể tự tham chiếu lẫn nhau-------|
|-------- Block 2-----các block có thể tự tham chiếu lẫn nhau--------|
...
|-------- Block n -----các block có thể tự tham chiếu lẫn nhau -------|
Các VD:
- Tạo ra 32 hình tròn có bán kính R=0.35 và sắp xếp theo hình sin xuất phát tại điểm (2.3,1.7) với biên
độ = 10.25:
Dim i As Integer, CircleObj As Object, center(2) As Double
Dim góc_chia As Double = 2 * PI / (32 - 1)
For i = 0 To 32 - 1
center(0) = 2.3 + i
center(1) = 1.7 + 10.25 * Sin(góc_chia * i)
CircleObj = dwg.ModelSpace.AddCircle(center, 0.35)
Next
- Tạo ra một đoạn ống có bán kính 1.6, dài 10.5, dày 0.25, một đầu bên trái vát 15 độ:
- Tạo ra một Block mới (chữ thập với hình tròn ở giữa) và chèn vào bản vẽ:
Dim block
Try
‘Xem đã có block này chưa
block = dwg.Blocks.Item("abc")
Catch
‘tạo mới
block = dwg.Blocks.Add(New Double() {0, 0, 0}, "abc")
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Colors
<CommandMethod("SetObjectColor")> _
Public Sub SetObjectColor()
'' Get the current document and database
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
'' Open the Block table record Model space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
acBlkTblRec.AppendEntity(acCirc)
acTrans.AddNewlyCreatedDBObject(acCirc, True)
acBlkTblRec.AppendEntity(acCircCopy)
acTrans.AddNewlyCreatedDBObject(acCircCopy, True)
nCnt = nCnt + 1
End While
End Sub
DataType(0) = 1001
Data(0) = "thep1001"
DataType(1) = 1000
Data(1) = "thep1000"
DataType(2) = 1000
Data(2) = "thep1000"
pline_4.SetXData(DataType, Data)
End Function
TẠO HATCH
Vẽ SPLINE
'Get a selection
Dim result As PromptSelectionResult = ed.GetSelection(pso, filter)
If result.Status <> PromptStatus.OK Then
Return
End If
'' Create a spline with a start and end tangency of (0.5, 0.5,
0.0)
Dim spline As Spline = New Spline(ptColl, vecTan, vecTan, 4, 0.0)
spline.ColorIndex = 1
'' Add the new object to the block table record and the
transaction
currentSpace.AppendEntity(spline)
tr.AddNewlyCreatedDBObject(spline, True)
tr.Commit()
End Using
End Sub
RIBBON
đoạn code tạo ribbon mà khi tạo xong nhấn ribbon 2 để thực hiện lệnh thì dòng chữ nó dúm lại và không
thấy ảnh đâu,bác nào giúp e với,e cám ơn ạ
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
' Create Ribbon
Imports Autodesk.Windows
Imports System.Drawing
Imports System.IO
Namespace XDARibbon
Public Class Ribbon
Implements IExtensionApplication
Public Sub Initialize() Implements IExtensionApplication.Initialize
' Khi load và trong CAD sẽ thực thi sub
CreateRibbon()
End Sub
Public Sub Terminate() Implements IExtensionApplication.Terminate
End Sub
End Namespace