Ошибка в 'SetParameterByName'
Главная › Форумы › Задать вопрос › Ошибка в 'SetParameterByName'
- В этой теме 8 ответов, 2 участника, последнее обновление 6 лет, 11 месяцев назад сделано txt.
-
АвторСообщения
-
Если мы на входе в питон получаем список труб то через:
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 , только что …
Вроде все правильно. Могу только предположить, что возможно, получаем “чистую” трубу без обёртки в Динамо.
SetParameterByName
– это метод именно ДизайнСкрипта на “чистой” трубе из ревитАпи не отработает.
Я бы попробовал в нод подавать трубы из Динамо, а не получать через комманды.Не знаю, в питоне понятно что добавлять ToDSType(). А вот в ДизайнСкрипте – хз
думаю вы правы, но возможно как то можно преобразовать трубу…
что т вроде : x.Owner.ToDSType .. (что тоже не работает)
либо как то создать список..
не хотелось бы вытаскивать элементы из скрипта …А чем питон смущает? Может, попробовать через него? Там просто присваивать значения параметра.
Только я бы все же там пользовался методами АПИ через транзакцию. Скорей всего будет быстрее немножко.А чем питон смущает? Может, попробовать через него? Там просто присваивать значения параметра.
я в питоне и делаю)
Блин, что-то подумал, что это дизайнСкрипт.
Тогда как по мне, генератор списка написан немножко не в питоновской парадигме – все должно быть читаемо.
Чаще используйте комманду map, а не генерируйте список циклом.
Я бы сделал отдельную функцию, в которой прописал бы что надо делать для одного элемента.
Но это уже особенности стилистики.def MakeSmth (x):
return x
OUT = map(MakeSmth, IN[0])По возможности, не пользуйтесь в Питоне методами ДизайнСкрипта. Часто это вызывает конфликты пространства имен. Например как сейчас – фиг поймешь, то ли “pipe” это объект ДС или АПИ?
Хорошо, понял.
тогда вместо GetParameter используем в скрипте LookupParameter
а вместо SetParameter что ?Параметры надо через транзакцию записывать.
В скрипт закидываем “стандартные” импорты и смотрим, чтоб была строка про документ
Ниже пример из реального скрипта, в котором я устанавливаю новый диаметр трубы.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()Спасибо за подсказку, получилось так:
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… значение которого у меня для данного параметра нет -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.