Тема: Как прочитать значения Tag и Prompt атрибута?
Добрый день. Подскажите пожалуйста. Имеется блок с атрибутом, как прочитать значения Tag и Prompt этого атрибута.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как прочитать значения Tag и Prompt атрибута?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добрый день. Подскажите пожалуйста. Имеется блок с атрибутом, как прочитать значения Tag и Prompt этого атрибута.
attributeReference.TagString
attributeObj.PromptString
Уважаемые господа, мне удалось программно присвоить значения 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 ???????????????
> Андрей
Похоже, что никак не прочитаешь.
Нет такого свойства PromptString у атрибута в VBA.
> Андрей
Нужно найти соответствующий для этого AttributeReference Attribute и у него получить PromptString.
А как?????? Извини за глупый вопрос, я только начал изучать VB для autocad.
> Андрей
Попробуй копать в этом направлении:
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'~
> Fatty
В test не учтены постоянные атрибуты, которые могут быть в AcadBlock, и которые отсутствуют в AcadBlockReference. Поэтому, выражение:
attData(i, 1) = pmtArr(i) '' => {PromptString}
справедливо только если в блоке нет постоянных атрибутов.
Большое спасибо за помощь.
> Александр Ривилис
Для этого я и добавил функцию GetAllAttributes
:)
Думаю что существенный момент остался за скобками обсуждения. Для какого именно атрибута ищет 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
Уважаемый Андрей, я призываю Вас отложить на минутку присущую Вам вежливость и, возможно, щепетильность и высказаться по существу - как дела с Вашей программой?
Спасибо за помощь. Все понятно.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как прочитать значения Tag и Prompt атрибута?
Форум работает на PunBB, при поддержке Informer Technologies, Inc