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

#61 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 24 March 2011 - 12:22 PM

Chào bạn!
Hình như bạn nhầm về cách phân biệt các loại trên. Có nhiều cách can thiệp vào Database của Autocad, mình chỉ nói 3 loại mà hiện nay cũng nhiều người quan tâm.
1. ObjectArx: lập trình bằng VC++. Loại này xuất ra file *.Arx như Nova... Món này mình không rành. Thôi không nói thêm
2. Autodesk.AutoCAD.Interop: dùng các thư viện Autodesk.AutoCAD.Interop.... Loại này cũng khá hay và đa dạng. Bạn AnhCos đã hướng dẫn rất nhiều. Ưu điểm là có thể viết 1 file *.exe chạy đọc lập và can thiệp vào Autocad.
Đoạn mã của bạn đưa ra như sau:
Dim AcadApp As Autodesk.AutoCAD.Interop.AcadApplication
Dim ThisDrawing As Autodesk.AutoCAD.Interop.AcadDocument
Bạn phải dùng code này vì chương trình *.exe độc lập truy cập Autocad thông qua Interop.
3. Autocad.Net: dùng các thư viện Autodesk.AutoCAD.... không có Interop. Loại này xuất ra *.dll. Load bằng lệnh NetLoad trong cad. File *.Dll chỉ chạy trong phạm vi Autocad và từ đó truy xuất dữ liệu của Cad.
Dùng đoạn mã 2:
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Chúc bạn thành công!


Thanks bạn.
  • -1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#62 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

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

Đã gửi 25 March 2011 - 08:48 PM

Bác anhcos làm 1 cái về C# nữa đi :P
  • 1

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#63 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 25 March 2011 - 11:37 PM

Bác anhcos làm 1 cái về C# nữa đi :P


Bài về VB.NET vẫn còn, tuy nhiên mọi người vẫn không mặn mà lắm với hướng này.
C# với AutoCAD thì phức tạp hơn vì C# không hỗ trợ late-binding, vì vậy phải add thêm vào các thư viện của CAD. Nếu thích C# thì dùng NET API thôi.
  • 1
Clear sky!

MF Rock collection.

#64 Kitty Ostolazaq

Kitty Ostolazaq

    Chưa sử dụng CAD

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

Đã gửi 27 March 2011 - 01:22 PM

Hello. And Bye.
  • 0

#65 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 27 March 2011 - 09:01 PM

4room vẫn đang chờ loạt Tut VB.net của bác anhcos đây :">
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#66 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 27 March 2011 - 09:27 PM

Bài về VB.NET vẫn còn, tuy nhiên mọi người vẫn không mặn mà lắm với hướng này.
C# với AutoCAD thì phức tạp hơn vì C# không hỗ trợ late-binding, vì vậy phải add thêm vào các thư viện của CAD. Nếu thích C# thì dùng NET API thôi.

Bác Anhcos hoặc Các Bác trên diễn đàn cho em hỏi cách lấy dữ liệu của các row trong table của access. Hiện em chỉ lấy được 1 row đầu tiên.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#67 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 31 March 2011 - 07:38 AM

Bác nào cho em hỏi cách tạo Dim và dùng dim vừa tạo làm dim hiện hành.
Em bị lỗi cái method ActiveDimstyle "Mem not found".
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#68 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 31 March 2011 - 08:40 AM

Bác nào cho em hỏi cách tạo Dim và dùng dim vừa tạo làm dim hiện hành.
Em bị lỗi cái method ActiveDimstyle "Mem not found".


Bạn nói vậy là đã tạo được Dim rồi, muốn set active dimension style bạn set properties của Dimstyle trong Database.
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#69 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 31 March 2011 - 09:27 AM

Bạn nói vậy là đã tạo được Dim rồi, muốn set active dimension style bạn set properties của Dimstyle trong Database.

Không hiểu ý của bạn. Nói tóm lại mình có đoạn code sau:
Sub Create_Dim_Style(ByVal tDimScale)
Dim tText
tText = "D" & Trim(Str(tDimScale))
Dim cds As Object
AcadApp.ActiveDocument.ActiveDimStyle = AcadApp.ActiveDocument.DimStyles.Item("D1")
cds = AcadApp.ActiveDocument.DimStyles.Add(tText)
AcadApp.ActiveDocument.SetVariable("DIMLFAC", tDimScale)
cds.CopyFrom(AcadApp.ActiveDocument)
End Sub
bị lỗi đoạn màu đỏ. Trong bản vẽ mình đã có dim D1 rồi. Mình muốn tạo ra một dim khác tù dim D1.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#70 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 31 March 2011 - 10:02 AM

4room vẫn đang chờ loạt Tut VB.net của bác anhcos đây :">

Sẽ sớm có bài viết tiếp theo, mọi người vui lòng chờ.

Bác Anhcos hoặc Các Bác trên diễn đàn cho em hỏi cách lấy dữ liệu của các row trong table của access. Hiện em chỉ lấy được 1 row đầu tiên.

Mình truy xuất với file mdb hồi xưa dùng với VB6, giờ không dùng nữa nên quên mất. Bạn post sơ bộ đoạn code đọc lên xem có giúp được gì không?

Bác nào cho em hỏi cách tạo Dim và dùng dim vừa tạo làm dim hiện hành.
Em bị lỗi cái method ActiveDimstyle "Mem not found".

Nếu bạn dùng later-binding thì có lỗi này, tôi cũng không biết như thế nào nữa.
Dùng ActiveLayout cũng có lỗi tương tự. Cách giải quyết tạm thời là dùng SendCommand.
Hiện tại mình dang nghiên cứu phần kết hợp giữa chèn thư viện CAD + later binding, vừa dễ coding và chạy được trên nhiều nền cad.
  • 0
Clear sky!

MF Rock collection.

#71 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 31 March 2011 - 10:27 AM

Mình truy xuất với file mdb hồi xưa dùng với VB6, giờ không dùng nữa nên quên mất. Bạn post sơ bộ đoạn code đọc lên xem có giúp được gì không?

Cái này em đã xử lý được rồi ^^.

Nếu bạn dùng later-binding thì có lỗi này, tôi cũng không biết như thế nào nữa.
Dùng ActiveLayout cũng có lỗi tương tự. Cách giải quyết tạm thời là dùng SendCommand.
Hiện tại mình dang nghiên cứu phần kết hợp giữa chèn thư viện CAD + later binding, vừa dễ coding và chạy được trên nhiều nền cad.

Cám ơn bác đành dùng cách cổ điển vậy (may mà còn thằng sencommand).
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#72 khatamxd

khatamxd

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 31 March 2011 - 11:38 AM

Các anh cho em xin code tạo leader line với. Đọc sách thì người ta cho code bên dưới nhưng em chạy hoài ko đc (test trên cad 2007) toàn bị báo lổi: "The specified module could not be found. (Exception from HRESULT: 0x8007007E)".

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("CreateLeader")> _
Public Sub CreateLeader()
'' Get the current database
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
'' Start a transaction
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'' Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
OpenMode.ForRead)
'' Open the Block table record Model space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
'' Create the leader
Dim acLdr As Leader = New Leader()
acLdr.SetDatabaseDefaults()
acLdr.AppendVertex(New Point3d(0, 0, 0))
acLdr.AppendVertex(New Point3d(4, 4, 0))
acLdr.AppendVertex(New Point3d(4, 5, 0))
acLdr.HasArrowHead = True
'' Add the new object to Model space and the transaction
acBlkTblRec.AppendEntity(acLdr)
acTrans.AddNewlyCreatedDBObject(acLdr, True)
'' Commit the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub
Sao với VB6 nó đơn giản mà sang VB.net rối thế.hixhix
  • 0

#73 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 01 April 2011 - 01:05 AM

Hề hề! Em lại làm phiền các Bác chút.
Em gạp sự cố với hatch với code sau
Dim OuterLoop(0 To 0) As Object
OuterLoop(0) = plineObj
Add_plHatch = AcadApp.ActiveDocument.ModelSpace.AddHatch(0, hName, True)
Add_plHatch.AppendOuterLoop(OuterLoop)
bị lỗi "Invalid object array" thật bó tay với cái .net này.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#74 phuonghuynhduy

phuonghuynhduy

    biết vẽ line

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

Đã gửi 01 April 2011 - 09:15 AM

Các anh cho em xin code tạo leader line với. Đọc sách thì người ta cho code bên dưới nhưng em chạy hoài ko đc (test trên cad 2007) toàn bị báo lổi: "The specified module could not be found. (Exception from HRESULT: 0x8007007E)".


Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("CreateLeader")> _
Public Sub CreateLeader()
'' Get the current database
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
'' Start a transaction
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'' Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
OpenMode.ForRead)
'' Open the Block table record Model space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
'' Create the leader
Dim acLdr As Leader = New Leader()
acLdr.SetDatabaseDefaults()
acLdr.AppendVertex(New Point3d(0, 0, 0))
acLdr.AppendVertex(New Point3d(4, 4, 0))
acLdr.AppendVertex(New Point3d(4, 5, 0))
acLdr.HasArrowHead = True
'' Add the new object to Model space and the transaction
acBlkTblRec.AppendEntity(acLdr)
acTrans.AddNewlyCreatedDBObject(acLdr, True)
'' Commit the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub
Sao với VB6 nó đơn giản mà sang VB.net rối thế.hixhix


Chào bạn lỗi (Exception from HRESULT: 0x8007007E) thường không phải do sai code mà thường là các khai báo reference của bạn ban đầu không đúng. Mình hay dùng tools DotNetARXToolsForVS2008 để thiết lập ban đầu. Bạn tự tìm và sử dụng có lẽ khắc phục được. Chúc ban thành công.
  • 1

#75 khatamxd

khatamxd

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 01 April 2011 - 11:57 PM

Chào bạn lỗi (Exception from HRESULT: 0x8007007E) thường không phải do sai code mà thường là các khai báo reference của bạn ban đầu không đúng. Mình hay dùng tools DotNetARXToolsForVS2008 để thiết lập ban đầu. Bạn tự tìm và sử dụng có lẽ khắc phục được. Chúc ban thành công.

Cảm ơn anh! đúng là do lỗi ở khai báo reference rồi. Nhưng ko bít xử lý thế nào nhỉ! Em đang dùng win7 64bit, cad2007, VS2008.
Em đã thử xóa hết lệnh chỉ còn chừa lại dòng:
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Thì bị báo lỗi
Could not load file or assembly 'acmgd, Version=17.0.54.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Có phải là do dùng cad2007 cũ quá ko phù hợp với VS2008 nên file acmgd load vào bị lỗi ko nhỉ.
còn cái tools DotNetARXToolsForVS2008 em down về cài đặt xong rồi chẳng bít mở hay sử dụng thế nào cả.Mong a hướng dẫn dùm 1 xí. Em cũng mới bít VB được hơn nữa năm còn VB.net thì được vài tuần nên nhìu cái cơ bản vẫn ko nắm
  • 0

#76 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 02 April 2011 - 11:16 AM

Cảm ơn anh! đúng là do lỗi ở khai báo reference rồi. Nhưng ko bít xử lý thế nào nhỉ! Em đang dùng win7 64bit, cad2007, VS2008.
Em đã thử xóa hết lệnh chỉ còn chừa lại dòng:
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Thì bị báo lỗi
Could not load file or assembly 'acmgd, Version=17.0.54.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Có phải là do dùng cad2007 cũ quá ko phù hợp với VS2008 nên file acmgd load vào bị lỗi ko nhỉ.
còn cái tools DotNetARXToolsForVS2008 em down về cài đặt xong rồi chẳng bít mở hay sử dụng thế nào cả.Mong a hướng dẫn dùm 1 xí. Em cũng mới bít VB được hơn nữa năm còn VB.net thì được vài tuần nên nhìu cái cơ bản vẫn ko nắm


bạn thử chuyển properties copy Local của acmgd và acdbmgd thènh true thử coi còn lỗi ko. cái này có thể là do chạy CAD32 bit trên nền win 64 bit nên ko load dc dll 32 bit
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#77 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 02 April 2011 - 12:53 PM

Hề hề! Em lại làm phiền các Bác chút.
Em gạp sự cố với hatch với code sau
Dim OuterLoop(0 To 0) As Object
OuterLoop(0) = plineObj
Add_plHatch = AcadApp.ActiveDocument.ModelSpace.AddHatch(0, hName, True)
Add_plHatch.AppendOuterLoop(OuterLoop)
bị lỗi "Invalid object array" thật bó tay với cái .net này.


Lỗi này rất khó hiểu, mà không có cách giải quyết.

Bạn dùng cách sau xem sao:
Chèn thư viện đối tượng của CAD mà mình đã trích xuất qua dạng dll ở đây, bao gồm AutoCAD.DLL và AXDBLib.dll.
2 thư viện này copy vào cùng chỗ với chương trình đã biên dịch.

Lúc đó trong chương trình mình sẽ dùng code giống như chèn thư viện chuẩn của CAD vậy.

Như VD trên sẽ viết lại, theo kiểu thực thi giao diện:

Imports AutoCAD
Imports AXDBLib
...
...
Dim AcadApp as IAcadApplication
...
Dim plineObj as IAcadPolyline
...
Dim OuterLoop(0 To 0) As IAcadEntity
OuterLoop(0) = plineObj

Dim Add_plHatch as IAcadHatch = AcadApp.ActiveDocument.ModelSpace.AddHatch(0, hName, True)
Add_plHatch.AppendOuterLoop(OuterLoop)
  • 0
Clear sky!

MF Rock collection.

#78 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 02 April 2011 - 01:55 PM

Lỗi này rất khó hiểu, mà không có cách giải quyết.

Bạn dùng cách sau xem sao:
Chèn thư viện đối tượng của CAD mà mình đã trích xuất qua dạng dll ở đây, bao gồm AutoCAD.DLL và AXDBLib.dll.
2 thư viện này copy vào cùng chỗ với chương trình đã biên dịch.

Lúc đó trong chương trình mình sẽ dùng code giống như chèn thư viện chuẩn của CAD vậy.

Như VD trên sẽ viết lại, theo kiểu thực thi giao diện:

Imports AutoCAD
Imports AXDBLib
...
...
Dim AcadApp as IAcadApplication
...
Dim plineObj as IAcadPolyline
...
Dim OuterLoop(0 To 0) As IAcadEntity
OuterLoop(0) = plineObj

Dim Add_plHatch as IAcadHatch = AcadApp.ActiveDocument.ModelSpace.AddHatch(0, hName, True)
Add_plHatch.AppendOuterLoop(OuterLoop)

Chào Bác! Em imports 2 file của bác vào thì được nhưng khi chạy thì lại báo lỗi không nhận file. Mà cái này Bác viết trên nền net1.0 à. Lúc Add vào nó báo phải thay đổi version của net framework.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#79 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 02 April 2011 - 07:06 PM

Chào Bác! Em imports 2 file của bác vào thì được nhưng khi chạy thì lại báo lỗi không nhận file. Mà cái này Bác viết trên nền net1.0 à. Lúc Add vào nó báo phải thay đổi version của net framework.


2 thư viện này là trích xuất từ 2 thư viện chuẩn của AutoCAD:
- AutoCAD.dll trích xuất ra từ AutoCAD 17 Type Library
- AXDBLib.dll trích xuất ra từ AutoCAD/ObjectDBX 17 Common Type Library

Để trích xuất, bạn dùng command line của windows, tìm đến file tlbimp.exe để xuất thư viện TLB --> DLL.
Bạn có thể dùng .NET reflector để lấy mã nguồn dạng VB/C# từ thư viện dll kia luôn. Từ đó về sau có thể dùng các thư viện mã nguồn chèn trực tiếp vào chương trình mà không cần add bất kỳ thư viện nào nữa.
  • 0
Clear sky!

MF Rock collection.

#80 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 02 April 2011 - 08:05 PM

2 thư viện này là trích xuất từ 2 thư viện chuẩn của AutoCAD:
- AutoCAD.dll trích xuất ra từ AutoCAD 17 Type Library
- AXDBLib.dll trích xuất ra từ AutoCAD/ObjectDBX 17 Common Type Library

Để trích xuất, bạn dùng command line của windows, tìm đến file tlbimp.exe để xuất thư viện TLB --> DLL.
Bạn có thể dùng .NET reflector để lấy mã nguồn dạng VB/C# từ thư viện dll kia luôn. Từ đó về sau có thể dùng các thư viện mã nguồn chèn trực tiếp vào chương trình mà không cần add bất kỳ thư viện nào nữa.


Bạn có thể hướng dẫn cách lấy mã nguồn của file dll trên không hoặc đã có sẵn cũng dc để chèn vào chương trình?
Thanks bạn nhiều.
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341