понедельник, 22 января 2018 г.

VBA. Узнать, есть ли в аттрибуте блока поле.

По мотивам вот этой вот темы на dwg форуме: ссылка

Как и всегда в подобных случаях, самый простой способ это воспользоваться утилитой ArxDbg и посмотреть на атрибуты с полем и без поля, сразу будет видно, что атрибут с полем содержит словарь расширенных данных с соответствующим именем ACAD_FIELD.
Вот по наличию и имени словаря и будем проверять наличие поля в атрибуте.

Тут важна именно подчеркнутая часть, проверить НАЛИЧИЕ поля средствами VBA можно, а вот прочитать код поля  - нет.

Код для VBA достаточно прост:



Sub IsAttributesHasFIELD() 
   Dim HasFIELD As Boolean
   HasFIELD = False
   Dim blockRefObj As AcadObject
   Dim basePnt As Variant
   On Error Resume Next
   ThisDrawing.Utility.GetEntity blockRefObj, basePnt, "Select an object"

   Dim varAttributes As Variant
   varAttributes = blockRefObj.GetAttributes
  
   For Each I In varAttributes
    If I.HasExtensionDictionary Then
         Dim EDictionary As AcadDictionary
         Set EDictionary = I.GetExtensionDictionary
         If EDictionary.Count > 0 Then
             For Each f In EDictionary
                 If f.Name = "ACAD_FIELD" Then
                     HasFIELD = True
                     Exit For
                 End If
             Next
         End If
     End If
    Next
   
    MsgBox CStr(HasFIELD)
End Sub


Комментариев нет: