Chuyển đến nội dung
Diễn đàn CADViet
anhcos

Lập trình VB.NET với AutoCAD

Các bài được khuyến nghị

Tôi thấy trong forum này chưa có bàn nhiều về lập trình VB.NET cho AutoCAD.

 

So với AutoLISP thì VB.NET dễ lập trình hơn và có thể kiểm soát các lỗi dễ dàng hơn. Nhưng tốc độ thì không bằng AutoLISP được vì nó chạy trực tiếp trên nền ACAD.

 

Các bước khi lập trình với VB.NET(VB 6.0 hoặc Excel.Macro sẽ khác một ít)

 

Bước 1: Tạo liên kết với AutoCAD (có thể liên kết với bất kỳ version nào của AutoCAD đang cài đặt trên máy)

 

Dim AcadApp as object

Try

'Xem acad đã chạy chưa

AcadApp = GetObject(, "AutoCAD.Application")

Catch

'Nếu chưa có bản ACAD nào đang chạy thì khởi động ACAD lên

Acad = CreateObject("AutoCAD.Application")

Acad.Visible = True 'Hiện acad lên, nếu không nó sẽ chạy ở background

End Try

 

Sau khi liên kết chtrình ACAD vào biến AcadApp, từ biến này ta có thể can thiệp vào rất nhiều dữ liệu chứa trong ACAD

VD:

dim acDocs as object = AcadApp.Documents

dim acLayers as object = AcadApp.Layers

dim acTextStyles as object = AcadApp.TextStyles

...

 

Để tham khảo các thuộc tính, các hàm và các sự kiện của mỗi đối tượng ACAD, xem phần giúp đỡ của ACAD.

Ấn F1, chọn ActiveX Automation & VBA, click tiếp mục ActiveX and VBA Reference.

 

------------------------------

 

Bước 2: Can thiệp vào các dữ liệu của AutoCAD

 

Ứng với mỗi đối tượng, sẽ có nhiều thuộc tính và hàm tương ưng với nó.

VD: đối tượng Layers bao gồm tất cả các layer nằm trong 1 bản vẽ, nó bao gồm

Các hàm

Add 'dùng để thêm một layer mới

GenerateUsageData

GetExtensionDictionary

Item 'lấy dữ liệu của một layer

SetXData

và các thuộc tính

Application 'bản AutoCAD đang chạy

Count 'số lượng layer trong bản vẽ

Document 'bản vẽ đang xét

Handle

HasExtensionDictionary

ObjectID

ObjectName

OwnerID

 

Như vậy để tắt hết các layer ta sẽ viết code như sau

dim i as integer

dim acLayers as object = acadApp.ActiveDocuments.Layers

dim acEachLayer as object

for i= 0 to acLayers.Count - 1

acLayer = acLayers.Item(i)

acEachLayer.LayerOn = FALSE

next i

 

Và sẽ còn rất nhiều thứ nữa cần các bạn thử nghiệm và khám phá

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn có biết tại sao Microsoft đưa ra dotNET không?

Nếu bạn biết thì có lẽ bạn chẳng đưa bài viết này lên đây đâu

 

sao bạn không giải thích dùm luôn đi, mà lại hỏi đố người khác vậy, dĩ nhiên là ko biết lý do thì bạn đó mới gửi lên chứ

bạn giải thích để mọi người hiểu thêm nha.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dear anhcos & All!

 

- Trước đây trên forum CADVIET tôi đã được anhcos và mọi người giúp đỡ rất nhiều về lisp/VBA.Hiện tại tôi muốn tìm hiểu về VB.net vì tôi thấy hiện nay mọi người chuyển dần sang VB.net rất nhiều. Tôi mới tìm hiểu nên rất ít tài liệu vì thế tôi rất cần anhcos và mọi người chia sẻ tài liệu. VB.net rất hay. Nếu có thể anhcos hãy cho tôi 1 vài ví dụ cụ thể nhé! ví dụ như: Vẽ 1 poline và viết 1 text tại trung điểm của poline đó. Tôi cảm ơn anhcos và mọi người đã giúp đỡ tôi!

- Ứng dụng của VB.net có chạy được trên AutocadLT 2006 không Anhcos?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dear all!

AutoCAD LT không hỗ trợ lập trình bên ngoài.Ok. Tuy nhiên một số chương trình vẫn can thiệp được vào Cad để load Lisp. Ví dụ như Object ARX.Tôi chưa hiểu thuật giải cho bài toán này như thế nào nên nhờ mọi người trên cadviet giúp cho tôi nhé! Ví dụ như để load Lisp cần phải gọi thư viện nào? <Ứng dụng cho AutocadLT>

 

AutoCAD LT không hỗ trợ lập trình bên ngoài.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ví dụ như: Vẽ 1 poline và viết 1 text tại trung điểm của poline đó.

- Ứng dụng của VB.net có chạy được trên AutocadLT 2006 không?

 

- Khai báo biến

Giả sử LineObj là thực thể Line và PolyObj là thực thể Polyline

Dim diem_dau(2) As Double

Dim diem_cuoi(2) As Double

Dim trung_diem(2) As Double

 

'Xác định điểm giữa trong các trường hợp sau:

 

- Đối với đoạn thẳng

diem_dau = LineObj.StartPoint

diem_cuoi = LineObj.EndPoint

 

trung_diem(0) = (diem_dau(0) + diem_cuoi(0)) / 2 'X

trung_diem(1) = (diem_dau(1) + diem_cuoi(1)) / 2 'Y

 

- Đối với PolyLine

'1/2 tổng chiều dài
  Dim HalfLen As Double = PolyObj.Length / 2

  Dim Count As Integer = PolyObj.Coordinates.Length / 2 ' số điểm của Polyline

  Dim LineLen As Double 'chiều dài của đoạn thẳng
  Dim AccLen As Double = 0 'chiều dài cộng dồn

  'Điểm đầu đoạn thẳng trong poly
  diem_dau(0) = PolyObj.Coordinates(0)
  diem_dau(1) = PolyObj.Coordinates(1)

  'Xác định điểm giữa đang nằm ở đoạn nào trong poly
  For i = 0 To Count - 2 'duyệt qua từng đoạn trong poly
  'Điểm cuối đoạn thẳng trong poly
  diem_cuoi(0) = PolyObj.Coordinates((i + 1) * 2)
  diem_cuoi(1) = PolyObj.Coordinates((i + 1) * 2 + 1)

  'Chiều dài đoạn
  LineLen = Math.Sqrt((diem_dau(0) - diem_cuoi(0)) ^ 2 + (diem_dau(1) - diem_cuoi(1)) ^ 2)

  If AccLen + LineLen > HalfLen Then 'Điểm chính giữa nằm trong đoạn này
  trung_diem(0) = diem_dau(0) + (diem_cuoi(0) - diem_dau(0)) * (HalfLen - AccLen) / LineLen 'X
  trung_diem(1) = diem_dau(1) + (diem_cuoi(1) - diem_dau(1)) * (HalfLen - AccLen) / LineLen 'Y

  Exit For
  End If

  'Còn không thì xét đoạn thẳng kế tiếp
  AccLen += LineLen
  diem_dau = diem_cuoi.Clone 'điểm cuối của em này là đầu của em kia
  Next i

- Cuối cùng vẽ Text tại điểm tìm thấy

Acad.ActiveDocument.ModelSpace.AddText("VD ve Text", trung_diem, 1)

 

Tôi chưa xài AutoCAD LT bao giờ cả nên không rõ ntn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
AutoCAD LT không hỗ trợ lập trình bên ngoài.

 

AutoCad LT là bản AutoCad Limited nên mất nhiều tính năng, giá chỉ bằng 36% AutoCad Full. Chẳng ai dùng bản LT làm gì cả trong khi Full phổ biến. Xem thêm ở đây:

 

 

http://www.cadtutor.net/faq/questions/21/W...d+AutoCAD+LT%3F

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dear Phantuhuong!

- Đồng ý là CAD LT mất nhiều tính năng tuy nhiên giá một phần mềm full rất đắt. Vì thế dùng full không hiệu quả lắm

 

AutoCad LT là bản AutoCad Limited nên mất nhiều tính năng, giá chỉ bằng 36% AutoCad Full. Chẳng ai dùng bản LT làm gì cả trong khi Full phổ biến. Xem thêm ở đây:

http://www.cadtutor.net/faq/questions/21/W...d+AutoCAD+LT%3F

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Dear Phantuhuong!

- Đồng ý là CAD LT mất nhiều tính năng tuy nhiên giá một phần mềm full rất đắt. Vì thế dùng full không hiệu quả lắm

 

Acad Full có tràn lan khắp nơi.

Tuy nhiên cty tôi đang có kế hoạch trang bị LT bản quyền cho nhân viên.

LT mới có giá < 1K$, chứ bản full cũng > 5K$ rồi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Dear anhcos!

Đồng ý với ý kiến của anhcos. Tôi đề xuất ý kiến mong nuốn các cao thủ ObjectARX hãy viết một chương trình Load lisp cho cadLT để mọi người cùng sử dụng.

Theo tìm hiểu của tôi thì chỉ có ObjectARX mới có thể can thiệp vào sâu trong autocad LT

 

 

Acad Full có tràn lan khắp nơi.

Tuy nhiên cty tôi đang có kế hoạch trang bị LT bản quyền cho nhân viên.

LT mới có giá < 1K$, chứ bản full cũng > 5K$ rồi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Dear anhcos!

Đồng ý với ý kiến của anhcos. Tôi đề xuất ý kiến mong nuốn các cao thủ ObjectARX hãy viết một chương trình Load lisp cho cadLT để mọi người cùng sử dụng.

Theo tìm hiểu của tôi thì chỉ có ObjectARX mới có thể can thiệp vào sâu trong autocad LT

 

AutoCAD có cung cấp sẵn bộ ObjectARX rồi.

 

Đăng ký và tải phiên bản phù hợp về ở đây:

http://usa.autodesk.com/adsk/servlet/item?...2&id=785550

 

Cái này nó có sẵn Help và Example luôn, tuy nhiên nó viết bằng C thì phải.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×