Сообщество программистов Autodesk в СНГ

ADN Club => VBA => Тема начата: Zailar от 01-09-2019, 10:38:21

Название: Редактирование постоянных атрибутов
Отправлено: Zailar от 01-09-2019, 10:38:21
Добрый день.
Имеется блок с постоянными атрибутами, и необходимо их изменить.
Сам пробовал вот таким способом, но как уже понял, я меняю атрибут только во вхождении, а не в определении блока.
Код - Visual Basic [Выбрать]
  1. Sub ChngAttBlock()
  2.  
  3.     Dim blockref As AcadBlockReference
  4.    
  5. On Error GoTo 1
  6.  
  7.     Set sset = ThisDrawing.SelectionSets.Add("ssOne")
  8.     sset.SelectOnScreen
  9.  
  10. For Each blockref In sset
  11.      
  12.  
  13.     If blockref.HasAttributes = True Then
  14.         att = blockref.GetConstantAttributes
  15.        
  16.             For i = LBound(att) To UBound(att)
  17.                 If att(i).TagString = "ÌÀÐÊÀ" Then
  18.                     att(i).TextString = "Á8"
  19.                    
  20.                 End If
  21.                 If att(i).TagString = "ÏÐÎÔÈËÜ" Then
  22.                     att(i).TextString = "Ñ24Ï"
  23.                    
  24.                 End If
  25.                
  26.             Next
  27.     End If
  28.    
  29.     blockref.Update
  30.    
  31.     End If
  32. Next
  33.  
  34. 1
  35. sset.Delete
  36.    
  37. End Sub
  38.  

Вопрос в том, как изменить постоянный атрибут в самом определении блока?
Название: Re: Редактирование постоянных атрибутов
Отправлено: Александр Ривилис от 01-09-2019, 12:35:11
Сам пробовал вот таким способом, но как уже понял, я меняю атрибут только во вхождении, а не в определении блока.
Константные атрибуты есть только в определении блока, так что делаешь ты правильно. Второй вариант - найти по имени блок (Block) и циклом по всем его элементам найти определения атрибутов (Attribute), проверить какие из них константные  (свойство Constant). Ну и те что надо изменить.
Название: Re: Редактирование постоянных атрибутов
Отправлено: Zailar от 01-09-2019, 17:28:37
Глупый вопрос, если постоянные атрибуты есть только у определения блока, то тогда почему у объектов класса AcadBlock нет метода getstaticattributes? Я так понимаю что AcadBlock это само определение блока, а AcadBlockReference это его вхождения. Если я меняю аттрибуты способом, который описан выше, то на чертеже то они изменяются, но когда я захожу в окно управления атрибутами, они остаются старыми, и при обновлении блока опять сбрасываются.
Название: Re: Редактирование постоянных атрибутов
Отправлено: Александр Ривилис от 01-09-2019, 19:16:32
Глупый вопрос, если постоянные атрибуты есть только у определения блока, то тогда почему у объектов класса AcadBlock нет метода getstaticattributes?
Ну на этот вопрос я ответить не могу. Так решили в Autodesk...
Я так понимаю что AcadBlock это само определение блока, а AcadBlockReference это его вхождения.
Да.
Если я меняю аттрибуты способом, который описан выше, то на чертеже то они изменяются, но когда я захожу в окно управления атрибутами, они остаются старыми, и при обновлении блока опять сбрасываются.
Блок случайно не динамический?
Название: Re: Редактирование постоянных атрибутов
Отправлено: Zailar от 01-09-2019, 19:29:11
Да, динамический
Название: Re: Редактирование постоянных атрибутов
Отправлено: Александр Ривилис от 01-09-2019, 19:48:19
Да, динамический

Вот с этого и надо было начинать. Если блок динамический, то после вставки его не с параметрами по-умолчанию он становится анонимным. Т.е. его имя не соответствует оригинальному имени. Например, был "ABC", а станет "*U123" (хотя в Панели свойств будет показываться как "ABC").  blockref.GetConstantAttributes вернет константные атрибуты не блока "ABC", а блока "*U123" и соответственно при их изменении константные атрибуты блока "ABC" какими были, такими и останутся.
blockref.EffectiveName  вернёт имя основного блока (т.е. "ABC"), а blockref.Name вернёт имя анонимного блока (т.е. "*U123"). Только если динамический блок вставляется с параметрами по-умолчанию и потом не редактируется динамическими ручками его имя не меняется и blockref.EffectiveName = blockref.Name
Название: Re: Редактирование постоянных атрибутов
Отправлено: Zailar от 01-09-2019, 20:37:54
Спасибо!