Pyautocad перебирает атрибуты

У меня есть много блоков с атрибутами. Я пытаюсь выполнить поиск по атрибутам в конкретном значении WEE, и когда я его нахожу, я хотел бы изменить NDT на какое-то значение.

Имя Атт Значение Атт МИЛЫЙ А011 неразрушающий контроль (Нулевой)
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 и преуспел в этом, но я просто не могу изменить другое значение атрибута внутри того же блока на основе предыдущего значения.

Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
Learning Data Analytics Two: Filtering data in a DataFrame.
Learning Data Analytics Two: Filtering data in a DataFrame.
В Learning Data Analytics One: Using Python and Pandas , я рассказываю о:
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается здесь:

            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):

  1. If att.TagString == 'WEE' and att.TextString == 'A011' затем установите логическую переменную «флаг» в значение true, чтобы мы знали позже, что условие было выполнено.

  2. Иначе 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()

Если я правильно понял, мне нужно вставить триггер (логический), который вызовет другой оператор if, если будет положительный ответ... Я постараюсь сообщить вам результат, потому что я не хочу получать ответ на ладонь, попробую сам и после этого отмечу ваше сообщение как ответ. Спасибо за совет, это поможет мне разработать логику программирования

Hom Tom 11.01.2023 22:44

Я попытался сейчас с ObjectID блока и сохранить его в переменной, но получаю NameError: name 'storedID' is not defined, пожалуйста, посоветуйте, как решить эту проблему.

Hom Tom 12.01.2023 09:40

Я добавил пример в свой ответ

Lee Mac 12.01.2023 18:48

У меня все еще есть NameError: name 'flg' is not defined, но теперь я понял вашу точку зрения о флаге и о том, что необходимо сделать atb = att. Это проблема в объявлении flg Я не понимаю эту часть, почему это ошибка.

Hom Tom 13.01.2023 08:04

Я обновил свой ответ, чтобы инициализировать переменную flg.

Lee Mac 13.01.2023 14:22

Я думал, что пробовал это, но, похоже, я этого не делал, теперь он работает как надо. Большое спасибо.

Hom Tom 16.01.2023 07:35

Другие вопросы по теме