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

#21 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 07 January 2011 - 10:47 AM

Thanks Mod.

Đầu năm sẽ cố gắng có bài mới cho xôm tụ.

  • 1
Clear sky!

MF Rock collection.

#22 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 March 2011 - 04:33 PM

Thanks Mod.

Đầu năm sẽ cố gắng có bài mới cho xôm tụ.

Bạn cho mình hỏi để remove warning CA1060 thì làm thế nào. Mình làm theo hướng dẫn của microsoft nhưng không được. Mình đã chuyển các hàm API vào nativemethods.
http://msdn.microsof...y/ms182161.aspx
  • 1
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!

#23 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 March 2011 - 07:46 PM

Bạn cho mình hỏi để remove warning CA1060 thì làm thế nào. Mình làm theo hướng dẫn của microsoft nhưng không được. Mình đã chuyển các hàm API vào native methods.
http://msdn.microsof...y/ms182161.aspx

Quả thực là mình chưa gặp lỗi này bao giờ, có thể bạn dùng dll của người khác.
Mình thấy phần hướng dẫn giải quyết vấn đề của microsoft khá chi tiết bằng nhiều ngôn ngữ và nhiều tình huống mà.
  • 1
Clear sky!

MF Rock collection.

#24 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 March 2011 - 07:58 PM

Quả thực là mình chưa gặp lỗi này bao giờ, có thể bạn dùng dll của người khác.
Mình thấy phần hướng dẫn giải quyết vấn đề của microsoft khá chi tiết bằng nhiều ngôn ngữ và nhiều tình huống mà.

Đây không phải là lỗi mà nó chỉ là cảnh báo thôi bạn ạ. Code vẫn chạy nhưng nó cứ hiện mấy cái thông báo khó chịu quá.
  • 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!

#25 Jin Yong

Jin Yong

    biết lệnh group

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

Đã gửi 08 March 2011 - 06:36 PM

Cho mình hỏi làm sao để hiển thị các Attribute trong một block sau khi Insert nó?

Mình dùng code để insert một block có chữa các text attribute, tuy nhiên nó chỉ hiện lên các đối tượng Line trong block đó, còn attribute thì không hiện lên :wacko:
  • 0

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


#26 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 08 March 2011 - 09:00 PM

Cho mình hỏi làm sao để hiển thị các Attribute trong một block sau khi Insert nó?

Mình dùng code để insert một block có chữa các text attribute, tuy nhiên nó chỉ hiện lên các đối tượng Line trong block đó, còn attribute thì không hiện lên :wacko:

Bác thử dùng SetVariable "ATTMODE", 1 kết hợp với regen xem.
  • 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!

#27 Jin Yong

Jin Yong

    biết lệnh group

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

Đã gửi 08 March 2011 - 09:24 PM

Bác thử dùng SetVariable "ATTMODE", 1 kết hợp với regen xem.

Tình hình là cũng không ăn thua
Tìm trên mạng bàn rất ít về vấn đề này
Có một số bài viết khá phức tạp nhưng làm theo cũng chưa có kết quả :( http://forums.autode...-up/m-p/2837455
  • 0

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


#28 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 08 March 2011 - 10:00 PM

Tình hình là cũng không ăn thua
Tìm trên mạng bàn rất ít về vấn đề này
Có một số bài viết khá phức tạp nhưng làm theo cũng chưa có kết quả :( http://forums.autode...-up/m-p/2837455

Bác có thể up cái block và đoạn code insertblock lên được không. Em dùng method insertblock 1 block chứa att vào vẫn hiển thị bình thường mà.
  • 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!

#29 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 08 March 2011 - 10:24 PM

Block có các text attribute, lúc đó nó là một Block reference. Dùng hàm GetAttributes ta sẽ xác định được danh sách các attr của block ref đó.
Ứng với mỗi TagString của text attribute ta sẽ đọc/ghi được giá trị của nó thông qua TextString của nó.

VD: chèn Block khungten và thay đổi một số thông tin trên bản vẽ
dim attrs() as AttributeReference / Object = khungten.GetAttributes (tùy theo later hay early binding)

for i = 0 to attrs.Length - 1
select case attrs(i).TagString
case "Owner"
attrs(i).TextString = "Vietnam"

case "Support"
attrs(i).TextString = "CADViet"

........
end select
next i
  • 0
Clear sky!

MF Rock collection.

#30 Jin Yong

Jin Yong

    biết lệnh group

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

Đã gửi 09 March 2011 - 12:51 PM

Mất khá nhiều thời gian, sau khi kết hợp cả tây lẫn ta, cuối cùng đoạn mã sau của mình đã có kết quả, Attribute đã hiện ra :|

Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
Dim acBlkTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, DatabaseServices.OpenMode.ForRead)
Dim acBlkTblRec As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), DatabaseServices.OpenMode.ForWrite)
Dim InsertID As ObjectId = acBlkTbl.Item("TK_2")
Dim BlockRef As BlockReference = New BlockReference(New Point3d(1, 1, 0), InsertID)
acBlkTblRec.AppendEntity(BlockRef)

Dim BLR As BlockTableRecord = acTrans.GetObject(BlockRef.BlockTableRecord, DatabaseServices.OpenMode.ForWrite)
Dim ent As Entity
For Each attID As ObjectId In BLR
ent = acTrans.GetObject(attID, DatabaseServices.OpenMode.ForWrite)
If ent.GetType.Name = "AttributeDefinition" Then
Dim attDef As AttributeDefinition = ent
Dim AttRef As AttributeReference = New AttributeReference
AttRef.SetAttributeFromBlock(attDef, BlockRef.BlockTransform)
If AttRef.Tag = "DK" Then attDef.TextString = "10"

BlockRef.AttributeCollection.AppendAttribute(AttRef)
acTrans.AddNewlyCreatedDBObject(AttRef, True)
End If
Next
acTrans.AddNewlyCreatedDBObject(BlockRef, True)
acTrans.Commit()
End Using

  • 0

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


#31 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 March 2011 - 10:34 AM

Có bác nào biết cách sử dụng method TrueColor trong VB.net không? Hướng dẫn em phát!!!
  • 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!

#32 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 12 March 2011 - 11:11 AM

Có bác nào biết cách sử dụng method TrueColor trong VB.net không? Hướng dẫn em phát!!!

Hỏi vắn tắt quá, không hiểu ý bạn ?
Tham khảo (Acad.Net Help): The following example creates 4 circles and assigns a different color to each circle using four different methods.

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

'' Start a transaction
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

'' Define an array of colors for the layers
Dim acColors(2) As Color
acColors(0) = Color.FromColorIndex(ColorMethod.ByAci, 1)
acColors(1) = Color.FromRgb(23, 54, 232)
acColors(2) = Color.FromNames("PANTONE Yellow 0131 C", _
"PANTONE(R) pastel coated")

'' 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 a circle object and assign it the ACI value of 4
Dim acPt As Point3d = New Point3d(0, 3, 0)
Dim acCirc As Circle = New Circle()
acCirc.SetDatabaseDefaults()
acCirc.Center = acPt
acCirc.Radius = 1
acCirc.ColorIndex = 4

acBlkTblRec.AppendEntity(acCirc)
acTrans.AddNewlyCreatedDBObject(acCirc, True)

Dim nCnt As Integer = 0

While (nCnt < 3)
'' Create a copy of the circle
Dim acCircCopy As Circle
acCircCopy = acCirc.Clone()

'' Shift the copy along the Y-axis
acPt = New Point3d(acPt.X, acPt.Y + 3, acPt.Z)
acCircCopy.Center = acPt

'' Assign the new color to the circle
acCircCopy.Color = acColors(nCnt)

acBlkTblRec.AppendEntity(acCircCopy)
acTrans.AddNewlyCreatedDBObject(acCircCopy, True)

nCnt = nCnt + 1
End While

'' Save the changes and dispose of the transaction
acTrans.Commit()
End Using
End Sub

  • 1

#33 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

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

Hỏi vắn tắt quá, không hiểu ý bạn ?

Ý em là dùng truecolor để tạo ra cái layer có màu RGB(0, 0, ,0) màu đen. Dùng code trong VB chưa biết sử dụng 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!

#34 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 12 March 2011 - 01:18 PM

Ý em là dùng truecolor để tạo ra cái layer có màu RGB(0, 0, ,0) màu đen. Dùng code trong VB chưa biết sử dụng thế nào.

Tôi cũng chưa biết cách set màu RGB (vì phụ thuộc class Color), bạn thử dùng thuộc tính Color để gán màu cho Layer

VD đổi màu Layer hiện hành thành màu trắng-đen
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim AcadApp As Object
Try
AcadApp = GetObject(, "AutoCAD.Application")
Catch
AcadApp = CreateObject("AutoCAD.Application")
End Try
AcadApp.Visible = True

Dim layer As Object
layer = AcadApp.ActiveDocument.ActiveLayer
layer.Color = 7

End Sub

  • 0

#35 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 March 2011 - 02:03 PM

Tôi cũng chưa biết cách set màu RGB (vì phụ thuộc class Color), bạn thử dùng thuộc tính Color để gán màu cho Layer

Bác chỉ em code tạo layer như bản file em gửi lên. Mục đích là dùng 1 line thuộc layer 0 để thể hiện khoảng cách dải thép trong cái modun vẽ thép sàn của em. Còn nếu dùng method color em không thể tạo được màu như thế.
http://www.cadviet.c...drawing1_53.dwg
  • 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!

#36 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 March 2011 - 02:19 PM

Nhân tiên Bác cho em hỏi đoạn code sau

Function pline_4(ByVal p1() As Double, ByVal p2() As Double, ByVal p3() As Double, ByVal p4() As Double) As Object
Dim p(0 To 11) As Double
p(0) = p1(0) : p(1) = p1(1) : p(2) = 0
p(3) = p2(0) : p(4) = p2(1) : p(5) = 0
p(6) = p3(0) : p(7) = p3(1) : p(8) = 0
p(9) = p4(0) : p(10) = p4(1) : p(11) = 0
pline_4 = AcadApp.ActiveDocument.Modelspace.Addpolyline(p)
pline_4.layer = "_Thep_san"
pline_4.setwidth(2, 7, 7)
pline_4.setwidth(1, 7, 7)
pline_4.setwidth(0, 7, 7)
Dim DataType(0) As Integer
Dim Data(0) As Object
DataType(0) = 1000
Data(0) = "thep"
pline_4.setxdata(DataType, Data)
End Function

nó bị lỗi Invalid argument type in SetXData method. Bác giúp em cái
  • 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!

#37 linhoreka

linhoreka

    biết lệnh erase

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

Đã gửi 12 March 2011 - 02:50 PM

Dim DataType(0) As Integer
Dim Data(0) As Object
DataType(0) = 1000
Data(0) = "thep"
pline_4.setxdata(DataType, Data)

Tớ thì chả biết VB.NET đâu. Nhưng cái SetXdata thì làm nhiều bên VB rồi. Bên VB làm thế này:
1. Datatype(0) phải bằng 1001, tương ứng bên Data(0) = "Tên chương trình của bạn" để AutoCAD add vào danh sách đăng ký những chương trình Addin: Bạn xem danh sách dài những RegisteredApplications trong AcadDocument thì biết.
2. Sau đó nếu bạn add thêm những dữ liệu nào nữa vào đối tượng, nên dùng tên chương trình đã khai báo để AutoCAD nhóm dữ liệu đó vào 1 nhóm. Khi lấy ra cũng phải khai báo tên chương trình: GetXdata Appname, Datatype, Data
Vì vậy code có thể bên VB NET sẽ phải là:

Dim DataType(1) As Integer
Dim Data(1) As Object '<<< Cái này bên VB là Variant. Không rõ bên NET trong ví dụ mẫu họ để là gì ?
DataType(0) = 1001
Data(0) = "Thep San" '<<< Tên chương trình
DataType(1) = 1000
Data(1) = "thep"
pline_4.setxdata(DataType, Data)
  • 0

#38 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 March 2011 - 03:15 PM

Dim DataType(0) As Integer
Dim Data(0) As Object
DataType(0) = 1000
Data(0) = "thep"
pline_4.setxdata(DataType, Data)

Tớ thì chả biết VB.NET đâu. Nhưng cái SetXdata thì làm nhiều bên VB rồi. Bên VB làm thế này:
1. Datatype(0) phải bằng 1001, tương ứng bên Data(0) = "Tên chương trình của bạn" để AutoCAD add vào danh sách đăng ký những chương trình Addin: Bạn xem danh sách dài những RegisteredApplications trong AcadDocument thì biết.
2. Sau đó nếu bạn add thêm những dữ liệu nào nữa vào đối tượng, nên dùng tên chương trình đã khai báo để AutoCAD nhóm dữ liệu đó vào 1 nhóm. Khi lấy ra cũng phải khai báo tên chương trình: GetXdata Appname, Datatype, Data
Vì vậy code có thể bên VB NET sẽ phải là:

Dim DataType(1) As Integer
Dim Data(1) As Object '<<< Cái này bên VB là Variant. Không rõ bên NET trong ví dụ mẫu họ để là gì ?
DataType(0) = 1001
Data(0) = "Thep San" '<<< Tên chương trình
DataType(1) = 1000
Data(1) = "thep"
pline_4.setxdata(DataType, Data)


Không được bạn à!

Cái này trong VB6 mình cũng làm được rồi nhưng sang VB2010 nó cứ báo lỗi mới ghét chứ. Có khi phải dùng phương pháp khác thôi.
  • 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!

#39 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 12 March 2011 - 04:33 PM

Nhân tiên Bác cho em hỏi đoạn code sau


Function pline_4(ByVal p1() As Double, ByVal p2() As Double, ByVal p3() As Double, ByVal p4() As Double) As Object
Dim p(0 To 11) As Double
p(0) = p1(0) : p(1) = p1(1) : p(2) = 0
p(3) = p2(0) : p(4) = p2(1) : p(5) = 0
p(6) = p3(0) : p(7) = p3(1) : p(8) = 0
p(9) = p4(0) : p(10) = p4(1) : p(11) = 0
pline_4 = AcadApp.ActiveDocument.Modelspace.Addpolyline(p)
pline_4.layer = "_Thep_san"
pline_4.setwidth(2, 7, 7)
pline_4.setwidth(1, 7, 7)
pline_4.setwidth(0, 7, 7)
Dim DataType(0) As Integer
Dim Data(0) As Object
DataType(0) = 1000
Data(0) = "thep"
pline_4.setxdata(DataType, Data)
End Function

nó bị lỗi Invalid argument type in SetXData method. Bác giúp em cái

Bạn thử code sau (đã test trên VB 2008) :

Function pline_4(ByVal p1() As Double, ByVal p2() As Double, ByVal p3() As Double, ByVal p4() As Double) As Object
Dim p(0 To 11) As Double
p(0) = p1(0) : p(1) = p1(1) : p(2) = 0
p(3) = p2(0) : p(4) = p2(1) : p(5) = 0
p(6) = p3(0) : p(7) = p3(1) : p(8) = 0
p(9) = p4(0) : p(10) = p4(1) : p(11) = 0
pline_4 = AcadApp.ActiveDocument.Modelspace.Addpolyline(p)
pline_4.layer = "_Thep_san"
pline_4.setwidth(2, 7, 7)
pline_4.setwidth(1, 7, 7)
pline_4.setwidth(0, 7, 7)

Dim DataType(2) As Short
Dim Data(2) As Object

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

  • 1

#40 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 March 2011 - 05:50 PM

Bạn thử code sau (đã test trên VB 2008) :

Function pline_4(ByVal p1() As Double, ByVal p2() As Double, ByVal p3() As Double, ByVal p4() As Double) As Object
Dim p(0 To 11) As Double
p(0) = p1(0) : p(1) = p1(1) : p(2) = 0
p(3) = p2(0) : p(4) = p2(1) : p(5) = 0
p(6) = p3(0) : p(7) = p3(1) : p(8) = 0
p(9) = p4(0) : p(10) = p4(1) : p(11) = 0
pline_4 = AcadApp.ActiveDocument.Modelspace.Addpolyline(p)
pline_4.layer = "_Thep_san"
pline_4.setwidth(2, 7, 7)
pline_4.setwidth(1, 7, 7)
pline_4.setwidth(0, 7, 7)

Dim DataType(2) As Short
Dim Data(2) As Object

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

Á được rồi. Vô cung cám ơn Bác. Thế là giải quyết được vấn đề rôi. Thank!
  • 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!