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

#81 phuonghuynhduy

phuonghuynhduy

    biết vẽ line

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

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

Hi Anhcos!
Mình thấy bạn cũng rất khá về Auocad.net. Mình muốn làm quen để học hỏi thêm nếu tiện cho mình email với. Email của mình phuonghuynhduy80@gmail.com. Thân chào.
Mình cũng đang nghiên cứu Autocad.net và đang muốn reference *Arx vào *.Dll không biết có được không?
Mình đang định Add các Class do các phần mềm khác chứa trong *.Arx vào project của mình, nhưng chưa có cách nào. Bạn biết hướng dẫn mình với.
  • 0

#82 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 - 08:21 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.

Trời ơi! Bác nói em mới search trên google ra cả đống. không ngờ cái .net vày dịch ngược dễ vậy. Có khi phải quay về VB6 thôi. Híc
  • 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!

#83 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 - 08:47 PM

Cách sử dụng tlbimp.ex:
Đây là tiện tích của VS, nằm đâu đó trong thư mục cài đặt của microsoft visual studio, search là ra ngay thôi.
Cách sử dụng từ ms: http://msdn.microsof...3sx(VS.80).aspx
Sử dụng trực tiếp từ Command Line của windows.

.NET reflector là công cụ dịch ngược file .NET, hỗ trợ dịch ngược .exe, .dll. Bản này tìm và tra cứu trên google có rất nhiều.
Khi cài đặt cần thêm addon FileDisassembler mới dịch ngược được.
  • 0
Clear sky!

MF Rock collection.

#84 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 - 08:52 PM

Trời ơi! Bác nói em mới search trên google ra cả đống. không ngờ cái .net vày dịch ngược dễ vậy. Có khi phải quay về VB6 thôi. Híc


Vì thế trong visual studio đã có sẵn công cụ mã hóa code rồi là Dotfuscate, Vô google mà tìm.
  • 2
Clear sky!

MF Rock collection.

#85 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 03 April 2011 - 04:12 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ác có thể hướng dẫn em cách lấy code của thư viện cho vào code cua mình được không. Cái này em chưa biết làm thế nào?
  • 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!

#86 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 06 April 2011 - 05:52 PM

Bác có thể hướng dẫn em cách lấy code của thư viện cho vào code cua mình được không. Cái này em chưa biết làm thế nào?

Đã fix được rồi các Bác ạ.
  • 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!

#87 zoro107

zoro107

    biết vẽ ellipse

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

Đã gửi 28 September 2011 - 04:35 PM

cảm ơn bác anhcos nhie72u nhé! bác còn bài nào nữa thì post lên cho mọi người tham khảo với. Mình tin là mọi người đang theo bac hằng ngày đấy :D.
  • 0

#88 Gà mờ

Gà mờ

    biết zoom

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

Đã gửi 25 October 2011 - 02:08 PM

Các bác ơi cho em hỏi sao hàm RemoveItems & AddItems của SelectionSet chạy toàn báo lỗi vậy
=================================================
Invalid argument Items in RemoveItems
=================================================
  • 0

#89 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 October 2011 - 04:27 PM

Các bác ơi cho em hỏi sao hàm RemoveItems & AddItems của SelectionSet chạy toàn báo lỗi vậy
=================================================
Invalid argument Items in RemoveItems
=================================================


Một số Property và Method không dùng theo kiểu later binding được, mình chẳng biết tại sao, mặc dù cú pháp không sai tí nào.

Trường hợp này giải quyết bằng cách lọc ngay từ đầu cho phần chọn đối tượng.
  • 0
Clear sky!

MF Rock collection.

#90 xanhnhnn280683

xanhnhnn280683

    Chưa sử dụng CAD

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

Đã gửi 17 November 2011 - 10:18 AM

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.mediafire...WorkWithDwg.rar

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
2. Tạo bảng trong CAD từ dữ liệu trong Excel
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.

:mellow: Chào AnhCos!
Chúc anh có nhiều sức khỏe, sao anh lập trình hay thế, anh hướng dẫn hay cho em xin source bài trên đi nhé tiện nghiên cứu cho việc học.
Cám ơn anh nhiều
Xanhnhnn280683@gmail.com Kính chào. :blink:
  • 0

#91 garupro

garupro

    biết vẽ circle

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

Đã gửi 05 June 2012 - 07:32 PM

Bạn nào tạo được Hatch trong Net không mình làm hoài đến phần thêm đối tượng vào toàn báo Invalid object array , Nếu dùng Sencommand thì được nhưng khi cho vào vòng lặp thì Cad đơ luông (Chắc Net gửi nhiều dữ liệu quá)

Dim diem(14) As Double
Dim pline As Object
diem(0) = x
diem(1) = y + dao / tile
diem(2) = 0
diem(3) = x + khoangcachcoc
diem(4) = y + dao / tile
diem(5) = 0
diem(6) = x + khoangcachcoc
diem(7) = y - dap / tile
diem(8) = 0
diem(9) = x
diem(10) = y - dap / tile
diem(11) = 0
diem(12) = x
diem(13) = y + dao / tile
diem(14) = 0
pline = Dwg.ModelSpace.AddPolyline(diem)
Dim hatchobj As Object
Dim ptname As String
Dim pttype As Long
Dim bass As Boolean
Dim lopp(0)
ptname = "ANSI31"
pttype = 0
bass = True
lopp(0) = pline
hatchobj = Dwg.ModelSpace.AddHatch(pttype, ptname, bass)
hatchobj.AppendOuterLoop(lopp) ' B&#225;o l&#7895;i &#7903; &#273;&#226;y n&#232;

Bài viết đã được chỉnh sửa nội dung bởi garupro: 05 June 2012 - 07:33 PM

  • 0

#92 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 07 June 2012 - 06:31 AM

Bạn nào tạo được Hatch trong Net không mình làm hoài đến phần thêm đối tượng vào toàn báo Invalid object array , Nếu dùng Sencommand thì được nhưng khi cho vào vòng lặp thì Cad đơ luông (Chắc Net gửi nhiều dữ liệu quá)


Dim diem(14) As Double
Dim pline As Object
diem(0) = x
diem(1) = y + dao / tile
diem(2) = 0
diem(3) = x + khoangcachcoc
diem(4) = y + dao / tile
diem(5) = 0
diem(6) = x + khoangcachcoc
diem(7) = y - dap / tile
diem(8) = 0
diem(9) = x
diem(10) = y - dap / tile
diem(11) = 0
diem(12) = x
diem(13) = y + dao / tile
diem(14) = 0
pline = Dwg.ModelSpace.AddPolyline(diem)
Dim hatchobj As Object
Dim ptname As String
Dim pttype As Long
Dim bass As Boolean
Dim lopp(0)
ptname = "ANSI31"
pttype = 0
bass = True
lopp(0) = pline
hatchobj = Dwg.ModelSpace.AddHatch(pttype, ptname, bass)
hatchobj.AppendOuterLoop(lopp) ' B&#225;o l&#7895;i &#7903; &#273;&#226;y n&#232;


Mình tạo hatch như thế này:


Sub Add_CONKE(ByVal X1, ByVal Y1, ByVal X2, ByVal Y2)
Dim acDoc As Document = AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, DatabaseServices.OpenMode.ForRead)
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), DatabaseServices.OpenMode.ForWrite)
Dim acLine1 As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X2, Y1, 0))
acLine1.SetDatabaseDefaults()
acLine1.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine1)
acTrans.AddNewlyCreatedDBObject(acLine1, True)
Dim acLine2 As Line = New Line(New Point3d(X2, Y1, 0), New Point3d(X2, Y2, 0))
acLine2.SetDatabaseDefaults()
acLine2.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine2)
acTrans.AddNewlyCreatedDBObject(acLine2, True)
Dim acLine3 As Line = New Line(New Point3d(X1, Y2, 0), New Point3d(X2, Y2, 0))
acLine3.SetDatabaseDefaults()
acLine3.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine3)
acTrans.AddNewlyCreatedDBObject(acLine3, True)
Dim acLine4 As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X1, Y2, 0))
acLine4.SetDatabaseDefaults()
acLine4.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine4)
acTrans.AddNewlyCreatedDBObject(acLine4, True)
Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
acObjIdColl.Add(acLine1.ObjectId)
acObjIdColl.Add(acLine2.ObjectId)
acObjIdColl.Add(acLine3.ObjectId)
acObjIdColl.Add(acLine4.ObjectId)
Dim acHatch As Hatch = New Hatch()
acBlkTblRec.AppendEntity(acHatch)
acTrans.AddNewlyCreatedDBObject(acHatch, True)
acHatch.SetDatabaseDefaults()
acHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31")
acHatch.PatternScale = 100
acHatch.SetHatchPattern(acHatch.PatternType, acHatch.PatternName)
acHatch.Associative = True
acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl)
acHatch.EvaluateHatch(True)
acHatch.ColorIndex = 251
acTrans.Commit()
End Using
End Sub

  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#93 garupro

garupro

    biết vẽ circle

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

Đã gửi 07 June 2012 - 09:31 AM

Cách của bạn có chạy được với Cad 2007 không ? Mình đang làm trên 2007 dùng dạng trên toàn báo lỗi ở mấy file dll thui
  • 0

#94 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 07 June 2012 - 12:44 PM

Dùng bình thường mà!
  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#95 sanit

sanit

    biết vẽ line

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

Đã gửi 24 August 2012 - 09:28 AM

Thanks mọi người mình mày mò làm được rồi ^^
  • 0

#96 cuongvule

cuongvule

    Chưa sử dụng CAD

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

Đã gửi 30 August 2012 - 09:34 PM

Vì thế trong visual studio đã có sẵn công cụ mã hóa code rồi là Dotfuscate, Vô google mà tìm.

Hôm nay đọc đc bài viết của bác Anhcos hay quá. Đúng cái mình đang cần, nhưng lại không down đc code của các vd. Bác anhcos nếu còn lưu mấy cái code đấy thì có thể bớt chút thời gian up lại hoặc gửi cho em xin với. Cảm ơn bác nhiều.
Email: cuongvule@gmail.com
  • 0

#97 sanit

sanit

    biết vẽ line

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

Đã gửi 31 August 2012 - 07:28 AM

thế bác ơi bọn e chả biết gì về lập trinh hay ăn sẵn thì sao đây bác post thành quả lên đi để e xào nấu luôn


Bắt đầu không có ai là biết hết, bạn vào đây để tham khảo, có nhiều cái cho bạn xào nấu đấy ^^ http://docs.autodesk....NET Developer....
  • 0

#98 daominh80

daominh80

    biết pan

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

Đã gửi 15 September 2012 - 12:01 AM


Mình tạo hatch như thế này:


Sub Add_CONKE(ByVal X1, ByVal Y1, ByVal X2, ByVal Y2)
Dim acDoc As Document = AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, DatabaseServices.OpenMode.ForRead)
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), DatabaseServices.OpenMode.ForWrite)
Dim acLine1 As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X2, Y1, 0))
acLine1.SetDatabaseDefaults()
acLine1.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine1)
acTrans.AddNewlyCreatedDBObject(acLine1, True)
Dim acLine2 As Line = New Line(New Point3d(X2, Y1, 0), New Point3d(X2, Y2, 0))
acLine2.SetDatabaseDefaults()
acLine2.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine2)
acTrans.AddNewlyCreatedDBObject(acLine2, True)
Dim acLine3 As Line = New Line(New Point3d(X1, Y2, 0), New Point3d(X2, Y2, 0))
acLine3.SetDatabaseDefaults()
acLine3.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine3)
acTrans.AddNewlyCreatedDBObject(acLine3, True)
Dim acLine4 As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X1, Y2, 0))
acLine4.SetDatabaseDefaults()
acLine4.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine4)
acTrans.AddNewlyCreatedDBObject(acLine4, True)
Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
acObjIdColl.Add(acLine1.ObjectId)
acObjIdColl.Add(acLine2.ObjectId)
acObjIdColl.Add(acLine3.ObjectId)
acObjIdColl.Add(acLine4.ObjectId)
Dim acHatch As Hatch = New Hatch()
acBlkTblRec.AppendEntity(acHatch)
acTrans.AddNewlyCreatedDBObject(acHatch, True)
acHatch.SetDatabaseDefaults()
acHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31")
acHatch.PatternScale = 100
acHatch.SetHatchPattern(acHatch.PatternType, acHatch.PatternName)
acHatch.Associative = True
acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl)
acHatch.EvaluateHatch(True)
acHatch.ColorIndex = 251
acTrans.Commit()
End Using
End Sub


Mình tạo hatch như thế này:


Sub Add_CONKE(ByVal X1, ByVal Y1, ByVal X2, ByVal Y2)
Dim acDoc As Document = AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, DatabaseServices.OpenMode.ForRead)
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), DatabaseServices.OpenMode.ForWrite)
Dim acLine1 As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X2, Y1, 0))
acLine1.SetDatabaseDefaults()
acLine1.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine1)
acTrans.AddNewlyCreatedDBObject(acLine1, True)
Dim acLine2 As Line = New Line(New Point3d(X2, Y1, 0), New Point3d(X2, Y2, 0))
acLine2.SetDatabaseDefaults()
acLine2.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine2)
acTrans.AddNewlyCreatedDBObject(acLine2, True)
Dim acLine3 As Line = New Line(New Point3d(X1, Y2, 0), New Point3d(X2, Y2, 0))
acLine3.SetDatabaseDefaults()
acLine3.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine3)
acTrans.AddNewlyCreatedDBObject(acLine3, True)
Dim acLine4 As Line = New Line(New Point3d(X1, Y1, 0), New Point3d(X1, Y2, 0))
acLine4.SetDatabaseDefaults()
acLine4.ColorIndex = 5
acBlkTblRec.AppendEntity(acLine4)
acTrans.AddNewlyCreatedDBObject(acLine4, True)
Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
acObjIdColl.Add(acLine1.ObjectId)
acObjIdColl.Add(acLine2.ObjectId)
acObjIdColl.Add(acLine3.ObjectId)
acObjIdColl.Add(acLine4.ObjectId)
Dim acHatch As Hatch = New Hatch()
acBlkTblRec.AppendEntity(acHatch)
acTrans.AddNewlyCreatedDBObject(acHatch, True)
acHatch.SetDatabaseDefaults()
acHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31")
acHatch.PatternScale = 100
acHatch.SetHatchPattern(acHatch.PatternType, acHatch.PatternName)
acHatch.Associative = True
acHatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl)
acHatch.EvaluateHatch(True)
acHatch.ColorIndex = 251
acTrans.Commit()
End Using
End Sub


Chào bạn, Mình đã theo dõi rất nhiều bài viết của bạn và thấy nó rất bổ ích. Về vấn đề tạo Hatch với vb.net mình cũng đã tìm hiểu khá nhiều và vẫn chưa ổn.
Bạn có cách nào tạo Hatch mà không cần dùng đến netload (file dll) để tạo hatch không. Trước mình tạo hatch với vb6 thì được, nhưng chuyển lên vb2010 thì bị lỗi.
Bạn có thể hướng dẫn mình chi tiết hơn được không. Mình dùng thử theo cách của bạn (acd210) nó báo lỗi "Could not load file or assembly 'acdbmgd, Version=18.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."
Sử dụng cad 2007 thì nó lại báo lỗi "Could not load file or assembly 'acdbmgd.dll' or one of its dependencies. The specified module could not be found". Cám ơn bạn nhiều
  • 0

#99 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 16 September 2012 - 03:11 PM


Chào bạn, Mình đã theo dõi rất nhiều bài viết của bạn và thấy nó rất bổ ích. Về vấn đề tạo Hatch với vb.net mình cũng đã tìm hiểu khá nhiều và vẫn chưa ổn.
Bạn có cách nào tạo Hatch mà không cần dùng đến netload (file dll) để tạo hatch không. Trước mình tạo hatch với vb6 thì được, nhưng chuyển lên vb2010 thì bị lỗi.
Bạn có thể hướng dẫn mình chi tiết hơn được không. Mình dùng thử theo cách của bạn (acd210) nó báo lỗi "Could not load file or assembly 'acdbmgd, Version=18.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."
Sử dụng cad 2007 thì nó lại báo lỗi "Could not load file or assembly 'acdbmgd.dll' or one of its dependencies. The specified module could not be found". Cám ơn bạn nhiều


Mình chỉ có thể giúp bạn về vấn đề tạo Hatch thông qua file dll bằng lệnh Netload, phương thức khác chắc phải nhờ bạn chủ topic Anhcos
Về lỗi của bạn, mình đoán nguyên nhân là do khi Reference các file DLL (acdbmgd.dll hay acmgd.dll) bạn đã chưa chuyển chế độ Copy Local sang False. Nếu vẫn để là True thi có thể phần mềm sẽ báo lỗi

Hình đã gửi
  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#100 daominh80

daominh80

    biết pan

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

Đã gửi 01 October 2012 - 01:07 AM

OK, cám bơn bạn nhé. Dạo này bận quá chưa có thời gian ngó lại mấy cái đó. Dể mình thử lại. Thank!
  • 0