Тема: Как прочитать значения Tag и Prompt атрибута?

Добрый день. Подскажите пожалуйста. Имеется блок с атрибутом, как прочитать значения  Tag  и Prompt этого атрибута.

Re: Как прочитать значения Tag и Prompt атрибута?

attributeReference.TagString
attributeObj.PromptString

Re: Как прочитать значения Tag и Prompt атрибута?

Большое спасибо!

Re: Как прочитать значения Tag и Prompt атрибута?

Уважаемые господа, мне  удалось программно присвоить значения tag  и Prompt атрибутам блоков. При считывании значение Tag выдается. Но получить значение Promt не удается, исправьте пожалуйста.
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
If objSelSet.Name = "Only" Then
objSelSet.Delete
Exit For
End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("Only")
intType(0) = 0
varData(0) = "INSERT"
objSelSet.SelectOnScreen intType, varData
varAttributes = objSelSet.Item(0).GetAttributes
AA(N, 0) = varAttributes(0).TextString
AA(N, 1) = varAttributes(0).TagString
AA(N, 2) = varAttributes(0).PromptString ???????????????

Re: Как прочитать значения Tag и Prompt атрибута?

> Андрей
Похоже, что никак не прочитаешь.
Нет такого свойства PromptString у атрибута в VBA.

Re: Как прочитать значения Tag и Prompt атрибута?

> Андрей
Нужно найти соответствующий для этого AttributeReference Attribute и у него получить PromptString.

Re: Как прочитать значения Tag и Prompt атрибута?

А как??????  Извини за глупый вопрос, я только начал изучать VB для autocad.

Re: Как прочитать значения Tag и Prompt атрибута?

> Андрей
Попробуй копать в этом направлении:

Sub test()
Dim oSsets As AcadSelectionSets
Dim oSset As AcadSelectionSet
Dim oBlocks As AcadBlocks
Dim blkDef As AcadBlock
Dim blkRef As AcadBlockReference
Dim attRef As AcadAttributeReference
Dim itmObj As AcadObject
Dim i, j, k, n As Integer
Dim fType(1) As Integer
Dim fData(1) As Variant
Dim blkName, strTag, strPmt, strVal As String
Dim attColl As Collection
Dim pmtArr() As String
Dim attArr() As AcadAttributeReference
Dim attData() As Variant
Set attColl = New Collection
Set oBlocks = ThisDrawing.Blocks
Set oSsets = ThisDrawing.SelectionSets
For Each oSset In oSsets
If oSset.Name = "Only" Then
oSset.Delete
Exit For
End If
Next
Set oSset = ThisDrawing.SelectionSets.Add("Only")
fType(0) = 0: fType(1) = 66
fData(0) = "INSERT": fData(1) = 1 ''{DXF код 66 бит 1 для блоков с атрибутами}
oSset.SelectOnScreen fType, fData
j = 0
For n = 0 To oSset.Count - 1
Set blkRef = oSset.Item(n)
attArr = blkRef.GetAttributes
For i = 0 To UBound(attArr)
Set attRef = attArr(i)
attColl.Add attRef
Next i
blkName = blkRef.Name
Set blkDef = oBlocks.Item(blkName)
For k = 0 To blkDef.Count - 1
Set itmObj = blkDef.Item(k)
If TypeOf itmObj Is AcadAttribute Then
strPmt = itmObj.PromptString
ReDim Preserve pmtArr(j)
pmtArr(j) = strPmt
j = j + 1
End If
Next k
Next n
i = 0
ReDim attData(0 To attColl.Count - 1, 0 To 2)
For Each attRef In attColl
attData(i, 0) = attRef.TagString
attData(i, 1) = pmtArr(i) '' => {PromptString}
attData(i, 2) = attRef.TextString
i = i + 1
Next
End Sub

Можно вытаскивать данные из AcadAttributeReference также
при помощи следующей функции(учитывает и постоянные
атрибуты):

'|   Function GetAllAttributes
'|   Description:
'|   Get all attributes data include constant.
'|   Copyright: all rights removed
'|   ©2006
'|   Author: Fatty The Old Stupid Horse
'|   Arguments:
'|     - blkRef = AcadBlockReference
'|   Return:
'|     - Two dimensional array with tags and values
'|   Notes:
'|     - None
Public Function GetAllAttributes(ByVal blkRef As AcadBlockReference) As Variant
Dim atRef As Object
Dim verArr, cstArr, tmpArr As Variant
Dim attArr As New Collection
Dim attData() As Variant
Dim i, j As Integer
On Error GoTo ErrCheck
    If blkRef.HasAttributes Then
      '|  Get "usual" attributes
      verArr = blkRef.GetAttributes
      If UBound(verArr) >= LBound(verArr) Then
      For i = LBound(verArr) To UBound(verArr)
      attArr.Add verArr(i)
      Next i
      End If
      '|  Get constant attributes
      cstArr = blkRef.GetConstantAttributes
      If UBound(cstArr) >= LBound(cstArr) Then
        For i = LBound(cstArr) To UBound(cstArr)
        attArr.Add cstArr(i)
        Next i
      End If
    End If
    i = 0
    ReDim attData(attArr.Count - 1, 1)
    For Each atRef In attArr
    attData(i, 0) = atRef.TagString
    attData(i, 1) = atRef.TextString
    i = i + 1
    Next
ErrCheck:
MsgBox Err.Description
GetAllAttributes = attData
End Function

~'J'~

Re: Как прочитать значения Tag и Prompt атрибута?

> Fatty
В test не учтены постоянные атрибуты, которые могут быть в AcadBlock, и которые отсутствуют в AcadBlockReference. Поэтому, выражение:

attData(i, 1) = pmtArr(i) '' => {PromptString}

справедливо только если в блоке нет постоянных атрибутов.

Re: Как прочитать значения Tag и Prompt атрибута?

Большое спасибо за помощь.

Re: Как прочитать значения Tag и Prompt атрибута?

> Александр Ривилис
Для этого я и добавил функцию GetAllAttributes
:)

Re: Как прочитать значения Tag и Prompt атрибута?

Думаю что существенный момент остался за скобками обсуждения. Для какого именно атрибута ищет Prompt Андрей? Он этого не уточнял. Но судя по тому, что не прошел его код, это был AcadAttributeReference, то есть атрибут входящий в состав AcadBlockReference. У него действительно нет свойства PromptString.
Это свойство присутсвует у отдельного краснознаменного атрибута AcadAttribute (ATTRIBDEF) не входящего в состав AcadBlockReference, но входящего в состав AcadBlock, например AcadModelSpace.
В коде приведенном Fatty (2006-06-25 12:49:41)
ключевое слово - AcadAttribute:

If TypeOf itmObj Is [b]AcadAttribute[/b] Then
strPmt = itmObj.PromptString

Уважаемый Андрей, я призываю Вас отложить на минутку присущую Вам вежливость и, возможно, щепетильность и высказаться по существу - как дела с Вашей программой?

Re: Как прочитать значения Tag и Prompt атрибута?

Спасибо за помощь. Все понятно.