Đến nội dung


Hình ảnh
- - - - -

Thuộc tính TagString của AcadAttributeReference trong VBA Excel khác VBA AutoCAD?


  • Please log in to reply
12 replies to this topic

#1 nvson

nvson

    biết vẽ ellipse

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

Đã gửi 31 March 2010 - 11:00 AM

Chào các bác!
Tôi sử dụng AutoCAD 2008 và Excel 2010.
Trong VBA for AutoCAD, tôi Insert 1 file chứa các Block Attribute, dùng thuộc tính Tagstring để nhận biết và chỉnh sửa.
NHưng khi chuyển sang VBA for Excel, cũng sử dụng như vậy nhưng không nhận được giá trị của Tagstring nên không biết đường nào mà sửa.
Mong các bác giúp đỡ!
Xin cảm ơn nhiều!
  • 0

#2 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 2010 - 11:32 AM

Các thuộc tính của Tảgting dễ dàng truy xuất thôi mà.

TagString Property

Specifies the tag string of the object.

See Also | Example

Signature

object.TagString

object

Attribute, AttributeReference, PopupMenu, PopupMenuItem, Toolbar, ToolbarItem
The object or objects this property applies to.

TagString

String; [color="#FF0000"][b]read-write[/b][/color] (read-only for PopupMenu and Toolbar objects)
The tag string of the object.

Remarks

Attribute, AttributeReference: This string identifies each occurrence of the attribute. Enter any characters except spaces or exclamation points. AutoCAD changes lowercase letters to uppercase.

  • 0
Clear sky!

MF Rock collection.

#3 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 31 March 2010 - 12:23 PM

Bạn nên nói rõ thêm bạn đã tạo cơ chế "bắt tay" giữa Excel và Cad chưa?
Khi đã "bắt tay" được nhau rồi thì rủ đi đâu chả được.
  • 0

#4 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 2010 - 09:34 PM

Bạn nên nói rõ thêm bạn đã tạo cơ chế "bắt tay" giữa Excel và Cad chưa?
Khi đã "bắt tay" được nhau rồi thì rủ đi đâu chả được.


Bắt tay đây:

dim AcadApp as object
'Coi như ACAD đang chạy và rảnh rỗi
set AcadApp = GetObject(,"Acad.Application")

AcadApp lúc này là biến chứa đựng thông tin về chương trình AutoCAD đang chạy.
Sử dụng biến đó để truy xuất đến các thuộc tính và hàm.

Muốn biết chi tiết về nó, xem hướng dẫn VBA trong AutoCAD. (or mở file acad_dev.chm trong thư mục help của ACAD)
  • 0
Clear sky!

MF Rock collection.

#5 nvson

nvson

    biết vẽ ellipse

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

Đã gửi 01 April 2010 - 08:20 AM

Cảm ơn các bác đã quan tâm.

To hoa35ktxd: Dĩ nhiên là trong Excel mình đã "bắt tay" với AutoCAD rồi.
Các bạn xem code nhé:

Đây là code chạy trong AutoCAD
Public Sub Block_Attribute()
Dim x As Integer
Dim i As Integer
Dim varAtts() As AcadAttributeReference
Dim blockRefObj As AcadBlockReference
Dim insertionPnt(0 To 2) As Double

For x = 1 To 5
insertionPnt(0) = insertionPnt(0) + 200#
insertionPnt(1) = 0#
insertionPnt(2) = 0

'Lenh trong AutoCAD
'Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

varAtts = blockRefObj.GetAttributes
For i = LBound(varAtts) To UBound(varAtts)
MsgBox varAtts(i).TagString
Select Case varAtts(i).TagString
Case "DU_AN"
varAtts(i).TextString = "1" & x
Case "GIAI_DOAN"
varAtts(i).TextString = "2" & x
End Select
Next i
blockRefObj.Update
Next x
End Sub

Đây là code chạy trong Excel
Public Sub Block_Attribute()
Dim x As Integer
Dim i As Integer
Dim varAtts() As AcadAttributeReference
Dim blockRefObj As AcadBlockReference
Dim insertionPnt(0 To 2) As Double

For x = 1 To 5
insertionPnt(0) = insertionPnt(0) + 200#
insertionPnt(1) = 0#
insertionPnt(2) = 0
'Lenh trong Excel
Set blockRefObj = AcadApplication.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

varAtts = blockRefObj.GetAttributes
For i = LBound(varAtts) To UBound(varAtts)
MsgBox varAtts(i).TagString
Select Case varAtts(i).TagString
Case "DU_AN"
varAtts(i).TextString = "1" & x
Case "GIAI_DOAN"
varAtts(i).TextString = "2" & x
End Select
Next i
blockRefObj.Update
Next x
End Sub

Còn đây là file có chứa các Block Attrtibute
http://www.cadviet.c...k_attribute.rar
  • 0

#6 phantuhuong

phantuhuong

    biết dimstyle

  • Moderator
  • PipPipPipPipPip
  • 383 Bài viết
Điểm đánh giá: 200 (khá)

Đã gửi 01 April 2010 - 10:29 AM

Mình lại không thạo về block thuộc tính nên không giúp được Sơn, nhưng theo mình đã thực hiện được = VBA AutoCad thì sao lại ko được trong Excel??? Nhiều người lập chương trình điều khiển AutoCad từ bên ngoài như Excel, VB6, C, Delphi,... Em thử hỏi anh Long LOGMAN 0437523740 xem sao.
  • 0
Bồi dưỡng Excel & VBA cho các đơn vị ở Hà Nội và khu vực lân cận

Từng bước loại đồ Tàu ra khỏi cuộc sống!


#7 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 01 April 2010 - 03:04 PM

'Lenh trong Excel
Set blockRefObj = AcadApplication.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

Có lẽ bạn sai ở chỗ này, vì AcadApplication là một class, không dùng với cấu trúc như trên được.

Bạn phải khai báo như sau
Dim AcadApp as AcadApplication
Liên kết với bản AutoCAD dang chạy ở đây

sau đó lệnh trên fải sửa lại:
Set blockRefObj = AcadApp.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)
  • 0
Clear sky!

MF Rock collection.

#8 nvson

nvson

    biết vẽ ellipse

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

Đã gửi 01 April 2010 - 04:28 PM

Vấn đề không phải ở chỗ đó anh anhcos à.
Nó nhận không đúng cái TagString cơ.
Trong AutoCAD thì nó nhận đúng, còn trong Excel thì không.
  • 0

#9 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 01 April 2010 - 10:14 PM

Nó liên đới đến nhau đó. biến blockRefObj chưa được đặt giá trị (blockRefObj=nothing) thì làm sao có thể truy xuất đến các thuộc tính của nó được. Bạn thử debug phía sau lệnh set blockRefObj = ... xem nó có được set gía trị hay chưa là biết ngay thôi.
  • 1
Clear sky!

MF Rock collection.

#10 nvson

nvson

    biết vẽ ellipse

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

Đã gửi 02 April 2010 - 08:07 AM

Cảm ơn anh anhcos. Đúng là tôi chưa tạo block có tên là "ABC".
Tôi sử dụng ACad 2008.
Đây là code trong ACad

Public Sub UpdateAttribute()
Dim x As Integer
Dim i As Integer
Dim varAtts() As AcadAttributeReference
Dim blockRefObj As AcadBlockReference
Dim insertionPnt(0 To 2) As Double

For x = 1 To 1
insertionPnt(0) = insertionPnt(0) + 200#
insertionPnt(1) = 0#
insertionPnt(2) = 0

Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "ABC", 1#, 1#, 1#, 0)

varAtts = blockRefObj.GetAttributes
For i = LBound(varAtts) To UBound(varAtts)
MsgBox varAtts(i).TagString
Select Case varAtts(i).TagString
Case "DU_AN"
varAtts(i).TextString = "1" & x
Case "GIAI_DOAN"
varAtts(i).TextString = "2" & x
Case "HANG_MUC"
varAtts(i).TextString = "3" & x
End Select
Next i
blockRefObj.Update
Next x
End Sub
Các bạn mở file Block_Attribute.dwg trong file đính kèm, thêm đoạn code trên, ĐẢM BẢO ĐOẠN CODE CHẠY ĐÚNG.
AutoCad nhận đúng TagString.

+ Bi giờ tôi mở file TagString_AutoCad2008.xls, rồi chạy Macro (đoạn Code trong VBA Excel giống đoạn code trong VBA AutoCad)
Excel nhận không đúng TagString.
(Khi chạy Excel chú ý file Block_Attribute.dwg đang được mở).

Mong các bạn giúp đỡ.

http://www.cadviet.c...tocad2008_1.rar
  • 0

#11 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 2010 - 09:39 AM

Đã kiểm tra, bạn thay chỗ này là xong:

Dim varAtts() As AcadAttributeReference
thành
Dim varAtts As Variant
  • 1
Clear sky!

MF Rock collection.

#12 nvson

nvson

    biết vẽ ellipse

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

Đã gửi 02 April 2010 - 12:17 PM

Cảm ơn anh anhcos nhiều.
Nhờ anh mà biết được chỗ sai của chương trình.
Khai báo như anh: Dim varAtts As Variant cũng không hay lắm
mà phải là: Dim varAtts() As AcadBlockReference

:D
  • 0

#13 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 2010 - 03:51 PM

varAtts() As AcadBlockReference


Khai báo thế này thì không đúng với cú pháp của hàm GetAttributes rồi.
Nhưng chtrình vẫn chạy được thì đúng là automation của CAD vẫn có vấn đề.
  • 0
Clear sky!

MF Rock collection.