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

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

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

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.

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á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.autodesk.com/t5/NET/insert-a-block-with-attribute-doesn-t-show-up/m-p/2837455

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ì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.autodesk.com/t5/NET/insert-a-block-with-attribute-doesn-t-show-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à.

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

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

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

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

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

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

  • Vote tăng 1

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

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.

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

Ý 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

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ô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.com/upfiles/3/drawing1_53.dwg

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

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

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

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)

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

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.

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

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

  • Vote tăng 1

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

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

E không biết tý gì về VB mới chán.

Bác nào cho em biết tổng quát cách sử dụng các lệnh Lặp của VB ( VD: for...., if-then...) :ph34r:

Thanks

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

Nếu không biết VB thì nên bắt đầu bằng C# là hay nhất.

 

Tài liệu hướng dẫn lập trình bằng tiếng Việt ở đây:

- C#

- VB

  • Vote tăng 1

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

Cho mình hỏi tại sao trong CommandMethod lại không nhận được Form nhỉ?

Bạn tạ0 1 Form bình thuờng bằng cách Add Form, sau đó gọi lệnh ShowModalDialog(Form) để hiển thị nó.

code VB

<CommandMethod("MODALFORM")> _

Public Sub ShowModalForm()

Dim modalForm As ModalForm = New ModalForm()

Application.ShowModalDialog(modalForm)

End Sub

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

Thế nhưng muốn điều khiển trước các control của form đó thì mình làm thế nào?

Ví dụ mình mình muốn hiển thị hay ko một textbox nào đó của form trước khi cho form hiện ra?

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

Thế nhưng muốn điều khiển trước các control của form đó thì mình làm thế nào?

Ví dụ mình mình muốn hiển thị hay ko một textbox nào đó của form trước khi cho form hiện ra?

Sử dụng thuộc tính Visible = true or false để hiển thị hay ko một Control

 

Lỗi của mình:

untitled_44.jpg

Đối số của ShowModalDialog phải là Form

 

Tham khảo VD bật-tắt hiển thị Label1 và Label2 : http://www.cadviet.com/upfiles/3/formex.zip

  • Vote tăng 1

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 gia_bach thân mến, ý mình ở đây chính là chương trình soạn thảo không nhận ra được frmHieuChinhMot chính là một form, do đó dòng lệnh frmHieuChinhMot.TextBox1.Visible không có hiệu lực

Với lại, nếu mình hiển thị form theo cách của bạn: Application.ShowModalDialog(myForm)

thì có thể gõ:

 

myForm.TextBox1.Visible = True

Application.ShowModalDialog(myForm)

 

duoc khong?

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 gia_bach thân mến, ý mình ở đây chính là chương trình soạn thảo không nhận ra được frmHieuChinhMot chính là một form, do đó dòng lệnh frmHieuChinhMot.TextBox1.Visible không có hiệu lực

Với lại, nếu mình hiển thị form theo cách của bạn: Application.ShowModalDialog(myForm)

thì có thể gõ:

 

 

 

duoc khong?

Em nghĩ là cái frmHieuChinhMot.TextBox1.Visible = true hay false phải cho vao event form_load hay form_Active thì dúng hơn

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 gia_bach thân mến, ý mình ở đây chính là chương trình soạn thảo không nhận ra được frmHieuChinhMot chính là một form, do đó dòng lệnh frmHieuChinhMot.TextBox1.Visible không có hiệu lực

Với lại, nếu mình hiển thị form theo cách của bạn: Application.ShowModalDialog(myForm)

thì có thể gõ:

 

 

 

duoc khong?

Tôi không biết bạn đang dùng chương trình soạn thảo gì nhưng nếu bạn khai báo biến đúng thì không có lí do gì "chương trình soạn thảo không nhận".

 

Em nghĩ là cái frmHieuChinhMot.TextBox1.Visible = true hay false phải cho vao event form_load hay form_Active thì dúng hơn

Phụ thuộc vào mục đích (ý đồ) của lập trình viên, các thuộc tính (properties) có thể gán(gọi) tại bất kỳ đâu trong Application.

- trong cửa sổ Property của chương trình soạn thảo

- trong các event như ý của phamngoctukts

- hay như ý của Jin Yong : truớc khi hiển thị Form (gọi ShowModalDialog...)

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

×