У меня есть много блоков с атрибутами. Я пытаюсь выполнить поиск по атрибутам в конкретном значении WEE, и когда я его нахожу, я хотел бы изменить NDT на какое-то значение.
for Atributi in acad.ActiveDocument.ModelSpace:
name = Atributi.EntityName
if name == 'AcDbBlockReference':
isciAtribute = Atributi.HasAttributes
if isciAtribute and Atributi.Name == blokZvar:
# print(Atributi.Name)
for att in Atributi.GetAttributes():
if att.TagString == 'WEE' and att.TextString == 'A011':
storedID = att.ObjectID
for atb in Atributi.GetAttributes():
if atb.ObjectID == storedID:
atb.TagString == 'NDT'
atb.TextString = '*'
atb.Update()
# print(" {}: {}".format(atb.TagString, atb.TextString))
Я пробую новый способ получить результат через ObjectID найденного блока, но теперь я получаю ошибку name 'storedID' is not defined
Посоветуйте, как решить эту проблему.
Я попытался изменить значение в WEE и преуспел в этом, но я просто не могу изменить другое значение атрибута внутри того же блока на основе предыдущего значения.
Проблема заключается здесь:
for att in Atributi.GetAttributes():
if att.TagString == 'WEE' and att.TextString == 'A011':
if att.TagString == 'NDT':
Учтите, что att.TagString не может быть равно и WEE, и NDT одновременно, и поэтому тестовое выражение для второго оператора if никогда не может быть проверено, поскольку для его достижения att.TagString должно быть равно WEE.
Вместо этого одним из возможных решений было бы перебрать набор атрибутов и использовать два отдельных оператора if (или, скорее, if elif):
If att.TagString == 'WEE' and att.TextString == 'A011' затем установите логическую переменную «флаг» в значение true, чтобы мы знали позже, что условие было выполнено.
Иначе if att.TagString == 'NDT' затем установите назначение объекта ссылки на атрибут отдельной переменной, чтобы мы могли работать с ним вне цикла.
Поскольку мы не можем полагаться на порядок, в котором ссылки на атрибуты будут встречаться в цикле, мы не можем выйти из цикла, если выполняется только одно из этих условий, и поэтому они должны оцениваться отдельно.
Затем вне цикла вы можете проверить переменную флага и, если она верна, изменить значение атрибута, присвоенное вторым оператором if.
Например:
for Atributi in acad.ActiveDocument.ModelSpace:
name = Atributi.EntityName
if name == 'AcDbBlockReference':
if Atributi.HasAttributes and Atributi.Name == blokZvar:
flg = False
for att in Atributi.GetAttributes():
if att.TagString == 'WEE' and att.TextString == 'A011':
flg = True
elif att.TagString == 'NDT':
atb = att
if flg and atb:
atb.TextString = '*'
atb.Update()
Я попытался сейчас с ObjectID блока и сохранить его в переменной, но получаю NameError: name 'storedID' is not defined, пожалуйста, посоветуйте, как решить эту проблему.
Я добавил пример в свой ответ
У меня все еще есть NameError: name 'flg' is not defined, но теперь я понял вашу точку зрения о флаге и о том, что необходимо сделать atb = att. Это проблема в объявлении flg Я не понимаю эту часть, почему это ошибка.
Я обновил свой ответ, чтобы инициализировать переменную flg.
Я думал, что пробовал это, но, похоже, я этого не делал, теперь он работает как надо. Большое спасибо.
Если я правильно понял, мне нужно вставить триггер (логический), который вызовет другой оператор if, если будет положительный ответ... Я постараюсь сообщить вам результат, потому что я не хочу получать ответ на ладонь, попробую сам и после этого отмечу ваше сообщение как ответ. Спасибо за совет, это поможет мне разработать логику программирования