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

Автор Тема: Редактирование постоянных атрибутов  (Прочитано 2729 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ZailarАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Добрый день.
Имеется блок с постоянными атрибутами, и необходимо их изменить.
Сам пробовал вот таким способом, но как уже понял, я меняю атрибут только во вхождении, а не в определении блока.
Код - 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.  

Вопрос в том, как изменить постоянный атрибут в самом определении блока?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Сам пробовал вот таким способом, но как уже понял, я меняю атрибут только во вхождении, а не в определении блока.
Константные атрибуты есть только в определении блока, так что делаешь ты правильно. Второй вариант - найти по имени блок (Block) и циклом по всем его элементам найти определения атрибутов (Attribute), проверить какие из них константные  (свойство Constant). Ну и те что надо изменить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ZailarАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Глупый вопрос, если постоянные атрибуты есть только у определения блока, то тогда почему у объектов класса AcadBlock нет метода getstaticattributes? Я так понимаю что AcadBlock это само определение блока, а AcadBlockReference это его вхождения. Если я меняю аттрибуты способом, который описан выше, то на чертеже то они изменяются, но когда я захожу в окно управления атрибутами, они остаются старыми, и при обновлении блока опять сбрасываются.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Глупый вопрос, если постоянные атрибуты есть только у определения блока, то тогда почему у объектов класса AcadBlock нет метода getstaticattributes?
Ну на этот вопрос я ответить не могу. Так решили в Autodesk...
Я так понимаю что AcadBlock это само определение блока, а AcadBlockReference это его вхождения.
Да.
Если я меняю аттрибуты способом, который описан выше, то на чертеже то они изменяются, но когда я захожу в окно управления атрибутами, они остаются старыми, и при обновлении блока опять сбрасываются.
Блок случайно не динамический?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ZailarАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Да, динамический

Отмечено как Решение Zailar 01-09-2019, 20:37:12

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, динамический

Вот с этого и надо было начинать. Если блок динамический, то после вставки его не с параметрами по-умолчанию он становится анонимным. Т.е. его имя не соответствует оригинальному имени. Например, был "ABC", а станет "*U123" (хотя в Панели свойств будет показываться как "ABC").  blockref.GetConstantAttributes вернет константные атрибуты не блока "ABC", а блока "*U123" и соответственно при их изменении константные атрибуты блока "ABC" какими были, такими и останутся.
blockref.EffectiveName  вернёт имя основного блока (т.е. "ABC"), а blockref.Name вернёт имя анонимного блока (т.е. "*U123"). Только если динамический блок вставляется с параметрами по-умолчанию и потом не редактируется динамическими ручками его имя не меняется и blockref.EffectiveName = blockref.Name
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ZailarАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
Спасибо!