Ошибка в 'SetParameterByName'

Главная Форумы Задать вопрос Ошибка в 'SetParameterByName'

  • В этой теме 8 ответов, 2 участника, последнее обновление 7 лет назад сделано txt.
Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Автор
    Сообщения
  • #7195 Score: 0
    txt
    Модератор
    86 pts

    Если мы на входе в питон получаем  список труб то через:

    OUT=[i.SetParameterByName(Параметр, Значение) for i in IN[0]]  задаем значения (если не получается , то UnwrapElement(i) добавляем – обычно помогает)

    У меня код:

    con_ps=[[x.Owner.SetParameterByName("kmc_equip_ASDK", kmc_eqp(y.Owner)/2)    for y in con_eq_pt  for x in i   if x.IsConnectedTo(y)==True ] for i in con_set_ps  ]

    код корректно выдает трубы (если убрать SetParameter) , то есть работает норм, но не могу задать значения ….
    здесь x.Owner – это труба (выдает Pipe на выходе, т.е. я получаю родительскую трубу коннектора), и при выполнении скрипта, вылетает ошибка:

    AttributeError: ‘Pipe’ object has no attribute ‘SetParameterByName’

    Чувствую что то надо добавить к x.Owner  , только что …

    #7197 Score: 0
    ИваСерж
    Хранитель
    134 pts

    Вроде все правильно. Могу только предположить, что возможно, получаем “чистую” трубу без обёртки в Динамо.
    SetParameterByName – это метод именно ДизайнСкрипта на “чистой” трубе из ревитАпи не отработает.
    Я бы попробовал в нод подавать трубы из Динамо, а не получать через комманды.

    Не знаю, в питоне понятно что добавлять ToDSType(). А вот в ДизайнСкрипте – хз

    #7198 Score: 0
    txt
    Модератор
    86 pts

    думаю вы правы, но возможно как то можно преобразовать трубу…
    что т вроде : x.Owner.ToDSType .. (что тоже не работает)
    либо как то создать список..
    не хотелось бы вытаскивать элементы из скрипта …

    #7199 Score: 0
    ИваСерж
    Хранитель
    134 pts

    А чем питон смущает? Может, попробовать через него? Там просто присваивать значения параметра.
    Только я бы все же там пользовался методами АПИ через транзакцию. Скорей всего будет быстрее немножко.

    #7200 Score: 0
    txt
    Модератор
    86 pts

    А чем питон смущает? Может, попробовать через него? Там просто присваивать значения параметра.
     

    я в питоне и делаю)

    #7202 Score: 0
    ИваСерж
    Хранитель
    134 pts

    Блин, что-то подумал, что это дизайнСкрипт.
    Тогда как по мне, генератор списка написан немножко не в питоновской парадигме – все должно быть читаемо.
    Чаще используйте комманду map, а не генерируйте список циклом.
    Я бы сделал отдельную функцию, в которой прописал бы что надо делать для одного элемента.
    Но это уже особенности стилистики.

    def MakeSmth (x):
    return x
    OUT = map(MakeSmth, IN[0])

    По возможности, не пользуйтесь в Питоне методами ДизайнСкрипта. Часто это вызывает конфликты пространства имен. Например как сейчас – фиг поймешь, то ли “pipe” это объект ДС или АПИ?

    #7203 Score: 0
    txt
    Модератор
    86 pts

    Хорошо, понял.
    тогда вместо GetParameter используем в скрипте LookupParameter
    а вместо SetParameter что ?

    #7204 Score: 1
    ИваСерж
    Хранитель
    134 pts

    Параметры надо через транзакцию записывать.
    В скрипт закидываем “стандартные” импорты и смотрим, чтоб была строка про документ
    Ниже пример из реального скрипта, в котором я устанавливаю новый диаметр трубы.

    doc = DocumentManager.Instance.CurrentDBDocument
    TransactionManager.Instance.EnsureInTransaction(doc)
    #Можно было бы заменить на Лукап. Но Лукап языкозависимый. Я предпочитаю не делать привязку к языку, если возможно
    #diam = pp.LookupParameter(“Диаметр”)
    diam = pp.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)
    diam.Set(IN[1][1])
    TransactionManager.Instance.TransactionTaskDone()

     

    #7205 Score: 0
    txt
    Модератор
    86 pts

    Спасибо за подсказку, получилось так:
    con_ps=[[ x.Owner.LookupParameter("kmc_equip_ASDK").Set(y.Owner.LookupParameter("kmc_equip_ASDK").AsDouble()) for y in con_eq_pt for x in i if x.IsConnectedTo(y)==True ] for i in con_set_ps ]

    через

    diam = pp.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)
    diam.Set(IN[1][1])

    не получилось так как get_Parameter требует BuiltInParameter.RBS… значение которого у меня для данного параметра нет

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Для ответа в этой теме необходимо авторизоваться.