Đến nội dung


Hình ảnh
- - - - -

Hướng dẫn lập trình với AutoCAD bằng VB.NET


  • Please log in to reply
114 replies to this topic

#1 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 26 August 2010 - 03:31 PM

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&#224;m li&#234;n k&#7871;t v&#7899;i AutoCAD, &#273;&#7891;ng th&#7901;i hi&#7875;n th&#7883; th&#244;ng b&#225;o l&#7895;i (n&#7871;u c&#243;)
''' </summary>
''' <param name="acad_app">Tr&#7843; v&#7873; bi&#7871;n li&#234;n k&#7871;t &#273;&#7841;i di&#7879;n cho ch&#432;&#417;ng tr&#236;nh AutoCAD</param>
''' <param name="op">T&#249;y ch&#7885;n li&#234;n k&#7871;t</param>
''' <param name="Visible">C&#243; hi&#7875;n th&#7883; ch&#432;&#417;ng tr&#236;nh AutoCAD hay kh&#244;ng</param>
''' <returns>True n&#7871;u th&#224;nh c&#244;ng, ng&#432;&#7907;c l&#7841;i l&#224; false</returns>
''' <remarks>H&#224;m n&#224;y c&#243; th&#234;m h&#224;m ghi &#273;&#232;</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&#432;a ch&#7841;y, kh&#7903;i &#273;&#7897;ng n&#243; ?", MsgBoxStyle.YesNo, "Ch&#250; &#253;") = MsgBoxResult.Yes Then
Try
acad_app = CreateObject("AutoCAD.Application")
Catch
MsgBox("C&#243; l&#7895;i khi kh&#7903;i &#273;&#7897;ng AutoCAD!", MsgBoxStyle.Information, "Ch&#250; &#253;")
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&#243; l&#7895;i khi kh&#7903;i &#273;&#7897;ng AutoCAD!", MsgBoxStyle.Information, "Ch&#250; &#253;")
Return False
End Try
End Try

Case acAcadLink.NewSession
Try
acad_app = CreateObject("AutoCAD.Application")
Catch
MsgBox("C&#243; l&#7895;i khi kh&#7903;i &#273;&#7897;ng AutoCAD!", MsgBoxStyle.Information, "Ch&#250; &#253;")
Return False
End Try
End Select

Try
Dim acAcadState = acad_app.GetAcadState
If Not acAcadState.IsQuiescent Then
MsgBox("AutoCAD ch&#432;a s&#7861;n s&#224;ng. H&#227;y &#273;&#243;ng h&#7897;p tho&#7841;i &#273;ang m&#7903; ho&#7863;c tho&#225;t kh&#7887;i l&#7879;nh &#273;ang th&#7921;c hi&#7879;n", MsgBoxStyle.Critical, "Ch&#250; &#253;")
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&#224;m li&#234;n k&#7871;t v&#7899;i AutoCAD v&#224; g&#225;n v&#224;o bi&#7871;n Acad, &#273;&#7891;ng th&#7901;i hi&#7875;n th&#7883; th&#244;ng b&#225;o l&#7895;i (n&#7871;u c&#243;)
''' </summary>
''' <param name="op">T&#249;y ch&#7885;n li&#234;n k&#7871;t</param>
''' <param name="Visible">C&#243; hi&#7875;n th&#7883; ch&#432;&#417;ng tr&#236;nh AutoCAD hay kh&#244;ng</param>
''' <returns>True n&#7871;u th&#224;nh c&#244;ng, ng&#432;&#7907;c l&#7841;i l&#224; false</returns>
''' <remarks>H&#224;m n&#224;y c&#243; th&#234;m h&#224;m ghi &#273;&#232;</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
Hình đã gửi

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
  • 5
Clear sky!

MF Rock collection.

#2 phuonghuynhduy

phuonghuynhduy

    biết vẽ line

  • Members
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 26 August 2010 - 03:53 PM

Hi!
Mình cũng đang nghiên cứu món này, bạn share cho mình đoạn code trên với. À mà bản demo của bạn sao chưa vẽ được qua Autocad nhỉ.!
Theo mình trình tự như sau:
- Chạy ứng dụng độc lập. (Việc này OK)
- Mở Autocad (OK - làm theo đoạn code ở trên của bạn)
- Xác định của sổ Autocad cần vẽ (có nhiều cửa số Autocad thì sao) - cách lấy handle như thế nào? Chưa biết.
- Lấy được handle của sổ rồi vẽ (việc này OK)
- Lấy các dữ liệu từ Autocad --> ứng dụng (việc này chưa hiểu)
Mong giúp đỡ.
Thx.
  • 0

#3 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 26 August 2010 - 04:16 PM

- Xác định của sổ Autocad cần vẽ (có nhiều cửa số Autocad thì sao) - cách lấy handle như thế nào? Chưa biết.
- Lấy được handle của sổ rồi vẽ (việc này OK)
- Lấy các dữ liệu từ Autocad --> ứng dụng (việc này chưa hiểu)
Mong giúp đỡ.
Thx.


Bạn cứ từ từ, mà mình đã up lại bản Demo rồi, có thể xuất qua AutoCAD được rồi.
  • 0
Clear sky!

MF Rock collection.

#4 NDBNGO

NDBNGO

    biết lệnh rotate

  • Members
  • PipPipPip
  • 132 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 26 August 2010 - 05:07 PM

Rất cảm ơn về chủ đề này.Mong được đọc.
  • 0

#5 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 30 August 2010 - 11:47 AM

II. Thao tác với các đối tượng AutoCAD

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.

Để sử dụng một thuộc tính / hàm nào đó ta sẽ sử dụng cú pháp sau:
[Đối tượng].[Tên hàm or thuộc tính] hoặc
[biến lưu giá trị trả về] = [Đối tượng].[Tên hàm or thuộc tính]

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.

Một số kiểu đối tượng chính trong AutoCAD:

1. Đối tượng là chương trình AutoCAD:
Có các thuộc tính và hàm sau mà ta có thể sử dụng:
Thuộc tính: ActiveDocument, Documents, MenuGroups, Preferences ... và một số thuộc tính cơ bản của window như HWND, Width, Height
Hàm: Eval, GetAcadState, ListARX, LoadARX, LoadDVB và các hàm Zoom...

VD:
+ Để truy xuất đến các bản vẽ đang mở ta sử dụng câu lệnh sau:
dim dwgs as object = Acad.Documents, 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 ...

Các collection sẽ có một số hàm chung như sau
- Hàm Item(vị trí trong mảng / chuỗi chứa tên) trả về đối tượng có kiểu tương ứng trong collection đó

VD:
+ Để lấy thông tin về textstyle đầu tiên trong bản vẽ hiện hành
Dim first_text_style as object = Acad.ActiveDocument.TextStyles.Item(0) or
Dim first_text_style as object = Acad.ActiveDocument.TextStyles.Item("Standard") đề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 Try
VD:
+ Thêm một tập chọn đối tượng vào, nếu đã có thì chọn nó
dim selset as object
Try
selset = Acad.ActiveDocument.SelectionSets.Add("anhcos selection set")
Catch
selset = Acad.ActiveDocument.SelectionSets.Item("anhcos selection set")
End Try

+ Để thêm một Layer mới vào bản vẽ hiện hành
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
Dim new_layer as object = Acad.ActiveDocument.Layers.Add("anhcos") 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.AddLine(new double(){1,2,0}, new double(){2,-1,0})

+ thêm một LightWeightPolyline có 4 đỉnh (mảng có 4 x 2 tọa độ)
dwg.ModelSpace.AddLightWeightPolyline(new double(){2,1,1,5,3,4,7,8})

+ thêm một 2DPolyline có 3 đỉnh (mảng 3 x 3 tọa độ)
dwg.ModelSpace.AddPolyline(new double(){2,1,0,1,5,0,3,4,0})

+ thêm một Text vào PaperSpace
dwg.PaperSpace.AddText("vi du", new double(){2,3,0}, 2)

3. Các thực thể AutoCAD:
trông thấy được như Line, Circle, Text, BlockRef ...

Các thực thể này có thuộc tính riêng như
- StartPoint, EndPoint là điểm đầu và cuối của Line
- Radius là bán kính của Circle ...
- Coordinates là mảng tọa độ của Polyline, LightweightPolyline, 3DPolyline ...

và có chung các thuộc tính / hàm như
- Layer: lớp mà nó đang tham chiếu đến
- Các hàm Copy, Mirror, Mirror3D, Rotate, IntersectWith, Offset ...

VD:
+ tạo một đường thẳng mới song song với đường thẳng kia một đoạn
Dim new_line as object = this_line.Offset(10)

+ tìm tất cả các giao giữa một đường thẳng và một đường đa tuyến
Dim cac_giao as object = this_polyline.IntersectWith(this_line, 0)
sẽ trả về một mảng chứa tọa độ của các điểm giao.

4. Các đối tượng khác:
như Utility, Preferences, Plot ...
hoặc Block, TextStyle, DimStyle ...

Để 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

Hình đã gửi
  • 4
Clear sky!

MF Rock collection.

#6 nkgedadknr

nkgedadknr

    biết vẽ line

  • Validating
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 06 September 2010 - 09:58 AM

tiếp đi Anh ơi :undecided:
  • 0

#7 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 06 September 2010 - 08:02 PM

Mình đang bận công tác nên hơi khó, sẽ cố gắng có bài mới thật sớm

tiếp đi Anh ơi :undecided:


  • 0
Clear sky!

MF Rock collection.

#8 phuonghuynhduy

phuonghuynhduy

    biết vẽ line

  • Members
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 24 September 2010 - 10:44 AM

Hi Anhcos!
Mình đã theo dõi chủ đề này lâu rồi, mình dùng những đoạn code ở trên của bạn và cũng đã đạt được kết quả khá ổn. Chỉ còn việc nắm handle window autocad hiện tại để vẽ các đối tượng lâu quá chưa thấy bạn giới thiệu. Bạn có thể gửi cho mình đoạn code trong demo của bạn được không, mình đang viết phần mềm theo hưóng đó. Mong giúp đỡ. Cảm ơn.
  • 0

#9 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 28 September 2010 - 11:15 PM

III. Lập trình với bản vẽ:

1. Đối tượng bản vẽ được truy xuất thông qua các phương thức sau:

a. Chọn từ danh sách các bản vẽ đang mở:
VD: Dim bản_vẽ as Object
bản_vẽ = Acad.Documents(vị_trí) hoặc
bản_vẽ = Acad.Documents(tên_bản_vẽ)

b. Mở từ một file bản vẽ đã có sẵn trên đĩa:
dùng lệnh sau:
AcadApp.Documents.Open(Name[, ReadOnly][, Password]) hoặc
hoặc:
bản_vẽ_đang_mở.Open(Name[, ReadOnly][, Password])

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)

c. Tạo bản vẽ mới:
dùng lệnh sau:
bản_vẽ_mới = AcadApp.Documents.Add([Name]) hoặc

hoặc từ một bản vẽ đang mở:
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.

d. Từ bản vẽ hiện hành:
bản_vẽ = Acad.ActiveDocument

2. Các hàm và thuộc tính quan trọng trong đối tượng bản vẽ:

a. Các hàm hay dùng là:
- Close, Save, SaveAs: Đóng và lưu bản vẽ
- GetVariable và SetVariable: đọc và gán các biến
- Regen: làm tươi bản vẽ
- SendCommand: gởi lệnh đến AutoCAD.
Các hàm khác tham khảo phần giúp đỡ của acad.

b. Các thuộc tính:
- Blocks: tập chứa danh sách các block trong bản vẽ, trong đó có hai block đặc biệt là ModelSpace 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 ...

Ngoài ra còn có một số các thuộc tính khác:
DimStyles, TextStyles, Units, Linetypes , Limits, Viewports, Views ...
và ActiveLayer, ActiveLayout, ActiveSelectionSet, ActiveViewport ...

Một số VD:
Chọn bản vẽ đang mở
Dim Dwg as Object = Acad.ActiveDocument

+ Lấy danh sách các Layers trong bản vẽ:
Dim layer_names(Dwg.Layers.Count - 1) as string
Dim i as integer
for i = 0 to Dwg.Layers.Count - 1
layer_names(i) = Dwg.Layers.Item(i)
next i

+ Thiết lập biến cho phép lệnh in chạy nền:
Dwg.SetVariable("BACKGROUNDPLOT", CInt(0))

+ Chọn ModelSpace hay PaperSpace
Dim space_colletion as Object
if Dwg.ActiveSpace = 0
space_colletion = Dwg.PaperSpace
else
space_colletion = Dwg.ModelSpace
end if

Xem qua chương trình và code mẫu bằng VB.NET 2008.
http://www.fshare.vn/file/TWZSCHPKZT
  • 3
Clear sky!

MF Rock collection.

#10 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 28 October 2010 - 09:36 PM

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.

1. Đọc và chỉnh sửa thông tin:

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.

a. Trích xuất thuộc tính:

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_độ

- Có một số thuộc tính cần dùng linh hoạt hơn:
VD: InsertionPoint là tọa độ của Text trong trường hợp Alignment của Text là Left, Aligned hoặc Fit. Nếu Alignment khác ở trên thì tọa độ Text sẽ là TextAlignmentPoint và InsertionPoint là trở thành thuộc tính chỉ đọc.

b. Thay đổi thuộc tính:

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

LineObject.StartPoint = New Double() {9, 2, 0}
hoặc
Dim sp(2) as Double
sp(0) = 9
sp(1) = 2
sp(2) = 0
LineObject.StartPoint = sp
Đều gán lại điểm đầu cho đường thẳng

PolylineObj.SetBulge(3 - 1, Tan(30 * PI / 180) / 4) Thay đổi độ lồi phân đoạn thứ 3 của đối tượng Polyline thành cung tròn có góc mở là 30 độ.

ArcObj.Move(New Double() {1, 2, 0} , New Double() {7, -1, 0} ) 'di chuyển cung tròn theo độ dời giữa 2 điểm (1, 2, 0) và (7, -1, 0)

c. Các hàm chức năng:

Phần lớn các hàm chức năng này tạo thêm các đối tượng mới trên nền đối tượng đang có với các phép biến đổi riêng, ngoại trừ lệnh Delete:
ArrayPolar, ArrayRectangular dùng như lệnh array
Copy, Delete: Sao chép và xóa đối tượng
GetBoundingBox: Cho biết vị trí và độ lớn của hình chữ nhật bao gói lấy đối tượng này
IntersectWith: Tìm điểm giao với các đối tượng khác.
Mirror, Mirror3D: tương tự lệnh đối xứng
Offset

- Các hàm Array, Mirror, Copy, Offset sẽ trả về một hoặc nhiều các đối tượng mới được tạo thêm ra.
VD:
Dim đối_tượng_mới as Object = Obj.Copy 'tạo thêm 1 đối tượng mới
đối_tượng_mới.Layer = "0"

Dim đối_tượng_mới as Object = Obj.Mirror(New Double() {1, 2, 0} , New Double() {7, -1, 0} ) Tạo đối tượng mới bằng cách đối xứng nó qua 2 điểm (1,2,0) và (7,-1,0)

Dim đối_tượng_mới() as Object = Obj.ArrayPolar(1+23, 2*PI, New Double() {1, 1, 0}) Tạo thêm 23 đối tượng mới như lệnh aray quanh tâm và gán vào biến đối_tượng_mới.

- 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.

Dim MinPoint, MaxPoint as Object
Obj.GetBoundingBox(MinPoint, MaxPoint) Trả về điểm bên dưới trái và bên trên trái bao gói lấy đối tượng.

Code VB mẫu ở đây.
Hình đã gửi
  • 2
Clear sky!

MF Rock collection.

#11 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 04 November 2010 - 12:17 PM

IV. Lập trình với các đối tượng trong bản vẽ: (tiếp tục...)

2. Tạo các thực thể mới:

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).

Trong đó có một số block với tên đặc biệt như:
- ModelSpace là block với tên *MODEL_SPACE, đại diện cho các đối tượng trong chế độ model
- PaperSpace đang chọn là block có tên *PAPER_SPACE, đại diện cho các đối tượng trong chế độ paper
Như vậy trong bản vẽ Dwg:
Dwg.ModelSpace và Dwg.Blocks.Item(“*MODEL_SPACE”) là một
Dwg.PaperSpace và Dwg.Blocks.Item(“*PAPER_SPACE”) là một

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 hàm thêm thực thể bao gồm:
AddLine, AddCircle, AddText, AddLightWeightPolyline, AddDimRotated ..., Add3DFace, AddBox, AddCylinder... và InsertBlock.

Cú pháp chung là:
[Đối_tượng_mới =] Đối_tượng_Block.Add...(Tham_số_đầu_vào)
Trong đó:
+ Đối_tượng_Block: có thể là ModelSpace, PaperSpace hoặc một block nào đó.
+ Đối_tượng_mới: dùng trong trường hợp muốn thay đổi nó sau khi tạo ra.
+ Tham_số_đầu_vào: thay đổi phụ thuộc vào đối tượng cần tạo

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 i

- 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 độ.
Const Length As Double = 10.5
Const Radius = 1.6

'tạo ống đặc bên ngoài
Dim out_pipe = dwg.ModelSpace.AddCylinder(New Double() {0, 0, 0}, Radius, Length)

'Tạo ống đặc bên trong
Dim in_pipe = dwg.ModelSpace.AddCylinder(New Double() {0, 0, 0}, Radius - 0.25, Length)

'Lấy lớn trừ bé --> ra ống
out_pipe.Boolean(2, in_pipe)’2 là subtraction

'Quay 3D cho nó nằm ngang trong mặt phẳng xOy
out_pipe.Rotate3D(New Double() {0, 0, 0}, New Double() {0, 1, 0}, PI / 2)

'Đổi góc qua radians
Dim angle As Double = 15 * PI / 180

'Cắt vát 1 đầu bên trái
Dim pt1 = New Double() {-Length / 2, -Radius, 0}
Dim pt2 = New Double() {-Length / 2, -Radius, 1}
Dim pt3 = New Double() {-Length / 2 + Sin(angle), -Radius + Cos(angle), 0}
out_pipe.SliceSolid(pt1,pt2 ,pt3 , False)

- 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")

‘Thêm các đối tượng vào
block.AddLine(New Double() {-1, 0, 0}, New Double() {1, 0, 0})’đường ngang
block.AddLine(New Double() {0, -1, 0}, New Double() {0, 1, 0})’đường đứng
block.AddCircle(New Double() {0, 0, 0}, 0.5)’vòng tròn
End Try

‘Chèn vào điểm (2,3), góc ngiêng là 45 độ
dwg.ModelSpace.InsertBlock(New Double() {2, 3, 0}, "abc", 1, 1, 1, 45 * PI / 180)

‘Chèn vào điểm (4,7), tỉ lệ theo phương Y là 0,55; góc ngiêng là 75 độ
dwg.ModelSpace.InsertBlock(New Double() {4, 7, 0}, "abc", 1, 0.55, 1, 75 * PI / 180)

  • 2
Clear sky!

MF Rock collection.

#12 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 05 November 2010 - 03:36 PM

Code VB mẫu]:

- Dữ liệu từ Excel --> Acad: Tạo đối tượng bảng trong acad hoặc kẻ thành dạng bảng với độ rộng vừa khít.

- Break các PL thành các PL con tại các giao điểm giữa chúng với nhau.
  • 2
Clear sky!

MF Rock collection.

#13 huuthanh1

huuthanh1

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 05 November 2010 - 04:11 PM

tôi là thành viên m[í muốn học hỏi kinh nghiệm của mọi người . xin cảm ơn
  • 0

#14 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 12 November 2010 - 02:48 PM

Không biết mọi người có hứng thú với chuyên mục này nữa không?

Vì vẫn còn vài bài nữa mới xong.

Mọi người có có thắc mắc gì cứ trao đổi ngay tại đây nhé.
  • 1
Clear sky!

MF Rock collection.

#15 nkgedadknr

nkgedadknr

    biết vẽ line

  • Validating
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 November 2010 - 04:58 PM

Em đang theo dõi, vì lúc này bận quá. Hôm trước có hẹn A mà bận quá không gặp được. Chắc sang tháng 12 sẽ làm phiễn Anh nhé.
Nhân ngày 20-11 thằng Em chúc Anh vui khỏe, gia đình hạnh phúc, sự nghiệp tiến triển ào ạt nhé
  • 0

#16 nkgedadknr

nkgedadknr

    biết vẽ line

  • Validating
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 November 2010 - 05:03 PM

Không biết mọi người có hứng thú với chuyên mục này nữa không?

Vì vẫn còn vài bài nữa mới xong.

Mọi người có có thắc mắc gì cứ trao đổi ngay tại đây nhé.


Mong được theo dõi tiếp các bài của Anh. Dạo này bị cái Văn bằng 2 nó hành nên chả học thêm được gì hết
  • 0

#17 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 22 November 2010 - 08:20 PM

IV. Lập trình với các đối tượng trong bản vẽ: (tiếp tục...)

2. Tạo các thực thể mới:

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).

Trong đó có một số block với tên đặc biệt như:
- ModelSpace là block với tên *MODEL_SPACE, đại diện cho các đối tượng trong chế độ model
- PaperSpace đang chọn là block có tên *PAPER_SPACE, đại diện cho các đối tượng trong chế độ paper
Như vậy trong bản vẽ Dwg:
Dwg.ModelSpace và Dwg.Blocks.Item(“*MODEL_SPACE”) là một
Dwg.PaperSpace và Dwg.Blocks.Item(“*PAPER_SPACE”) là một

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 hàm thêm thực thể bao gồm:
AddLine, AddCircle, AddText, AddLightWeightPolyline, AddDimRotated ..., Add3DFace, AddBox, AddCylinder... và InsertBlock.

Cú pháp chung là:
[Đối_tượng_mới =] Đối_tượng_Block.Add...(Tham_số_đầu_vào)
Trong đó:
+ Đối_tượng_Block: có thể là ModelSpace, PaperSpace hoặc một block nào đó.
+ Đối_tượng_mới: dùng trong trường hợp muốn thay đổi nó sau khi tạo ra.
+ Tham_số_đầu_vào: thay đổi phụ thuộc vào đối tượng cần tạo

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 i

- 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 độ.
Const Length As Double = 10.5
Const Radius = 1.6

'tạo ống đặc bên ngoài
Dim out_pipe = dwg.ModelSpace.AddCylinder(New Double() {0, 0, 0}, Radius, Length)

'Tạo ống đặc bên trong
Dim in_pipe = dwg.ModelSpace.AddCylinder(New Double() {0, 0, 0}, Radius - 0.25, Length)

'Lấy lớn trừ bé --> ra ống
out_pipe.Boolean(2, in_pipe)’2 là subtraction

'Quay 3D cho nó nằm ngang trong mặt phẳng xOy
out_pipe.Rotate3D(New Double() {0, 0, 0}, New Double() {0, 1, 0}, PI / 2)

'Đổi góc qua radians
Dim angle As Double = 15 * PI / 180

'Cắt vát 1 đầu bên trái
Dim pt1 = New Double() {-Length / 2, -Radius, 0}
Dim pt2 = New Double() {-Length / 2, -Radius, 1}
Dim pt3 = New Double() {-Length / 2 + Sin(angle), -Radius + Cos(angle), 0}
out_pipe.SliceSolid(pt1,pt2 ,pt3 , False)

- 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")

‘Thêm các đối tượng vào
block.AddLine(New Double() {-1, 0, 0}, New Double() {1, 0, 0})’đường ngang
block.AddLine(New Double() {0, -1, 0}, New Double() {0, 1, 0})’đường đứng
block.AddCircle(New Double() {0, 0, 0}, 0.5)’vòng tròn
End Try

‘Chèn vào điểm (2,3), góc ngiêng là 45 độ
dwg.ModelSpace.InsertBlock(New Double() {2, 3, 0}, "abc", 1, 1, 1, 45 * PI / 180)

‘Chèn vào điểm (4,7), tỉ lệ theo phương Y là 0,55; góc ngiêng là 75 độ
dwg.ModelSpace.InsertBlock(New Double() {4, 7, 0}, "abc", 1, 0.55, 1, 75 * PI / 180)

Em sẽ theo con đường của bác. Nếu có thời gian em sẽ nghiên cứu cái này, Hic. Nó hay quá
  • 1



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#18 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 29 December 2010 - 08:47 AM

Đọc các bài của bác Anhcos thấy hay quá nhưng chưa làm được gì hết vì Tue_NV mới bắt đầu.
Chắc phải tìm tòi, học hỏi nhiều nữa.
Cho Tue_NV hỏi bác anhcos và các bác :
VB.NET cũng được lập trình trên Microsoft Visual Basic hở các bác?
Tue_NV mới bắt đầu thôi à. Các bác đừng cười nhé.
Ý mình hỏi công cụ để lập trình nó. Mới bắt đầu nên còn chưa biết chi nhiều. Mong các bác giúp đỡ.
Thanks
  • 0

#19 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 29 December 2010 - 10:53 AM

VB.NET cũng được lập trình trên Microsoft Visual Basic hở các bác?


Microsoft Visual Basic là một chương trình biên dịch đời cũ trước đây, còn Visual Studio .NET (VS) là phiên bản sau này.
VS chủ yếu bao gồm Visual Basic, Visual C++, Visual C#, cả ba ngôn ngữ này đều na ná nhau.

Vì thế VB.NET thực chất vẫn là VB được mở rộng với rất nhiều cải tiến.

VD:

- Có thể khai báo biến bằng unicode (VD tiếng việt, hoặc trung nga j đó)
- VB.NET không hỗ trợ câu lệnh set nữa
set aaa = 1 --> aaa = 1
- kiểu biến variant trong VB sẽ là object trong VB.NET
- các kiểu dữ liệu đều là kiểu đối tượng
Dim num as integer, st as String --> st = num.ToString
- Khả năng sử dụng các lớp đối tượng, các namespace ...

... và còn nhiều thứ để khám phá.
  • 2
Clear sky!

MF Rock collection.

#20 nkgedadknr

nkgedadknr

    biết vẽ line

  • Validating
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 30 December 2010 - 02:49 PM

Anh ơi, thằng em làm phiền anh rồi? Anh có thể trình bày một ví dụ liên kết giữa Excel và VB NEt không?
  • 0