Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2017 21:56:51

Ivan_Pomidoroff
Зарегистрирован: 2017-10-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

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

Часть кода я уже написал и выложу его для критики завтра когда буду на рабочем месте, но начно с общей картины.

В программе композитинга (Nuke, Natron) tсть множество узлов (Нод) чтения и записи в которых прописанны пути к файлам которые надо читать и сответственно писать. Нужно написать скрипт который будет изменять эти пути плюс имя и путь рабочего файла. Я как раз написал ту часть кода которая изменяет пути.

Осталось дело за малым:
1. как переписать каждую нужную ноду.
2. как записать рабочий файл с нужным именем в нужное место
3. Нужно создать менюшку в которой будут скрипты в виде списка.

Все вопросы косаются работы самой программы в которую интегрирован Пайтон. Я нашёл руководство программы https://www.thefoundry.co.uk/products/nuke/developers/63/pythondevguide/index.html
но пока это помогло не сильно. Решил обратится за помощью. (мой английский не так хорошь)

Вобщем, буду потихоньку разбераться сам и писать тут результаты моих изысканий. Если у кого будет желание и возможность помочь то я буду только рад )

Зарание спасибо.

Офлайн

#2 Окт. 18, 2017 11:52:04

Ivan_Pomidoroff
Зарегистрирован: 2017-10-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

 flink="T:/3.13 Projektdaten 2018/Messen 2018-1/Synflex/02_Design/02_3D/Output/Synflex/10/Sinflex_10_Cam_0010000.exr"
print "Old Link: "+ flink
#изменение версии папки
kar=flink.rpartition("/") 
kar0=kar[0]
vers=kar0[-2::1]
vers=int(vers)
nvers=vers+1
if nvers<10:
	nvers="0"+str(nvers)
nvers=str(nvers)
nlink=kar0[0:-2]+nvers+kar[1]+kar[2]
#изменение версии файла
kar=nlink.rpartition("_Cam") 
kar0=kar[0]
nlink=kar0[0:-2]+nvers+kar[1]+kar[2]
print "New Link: " + nlink

Вот та часть кода которая изменяет адрес ноды Read. Если у кого есть замечания то буду рад услышать.
Код работает коректно до 200 версии чего более чем достаточно.

зы. для Пайтона 2.7

Отредактировано Ivan_Pomidoroff (Окт. 18, 2017 11:54:09)

Офлайн

#3 Окт. 19, 2017 15:06:29

Ivan_Pomidoroff
Зарегистрирован: 2017-10-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

Продолжаем.
Вот нашёл скрипт для Нюка который изменяет линки:

 toolbar=nuke.menu('Nodes')
menu=toolbar.addMenu('Costum Tools')
menu.addCommand('Re-Read All', lambda:reRead())
def reRead():
	if len(nuke.allNodes('Read')):
		p=nuke.Panel('Re-Read All')
		p.addSingleLineInput('Old Source:', 'Ex.: c:/user/filedir1/')
		p.addSingleLineInput('New Source:', 'Ex.: c:/user/filedir2/')
		p.show()
		oldSource=p.value('Old Source:')
		newSource=p.value('New Source:')
		for node in nuke.allNodes('Read'):
			s1=node['file'].value()
			node['file'].setValue(s1.replace(oldSource,newSource))
	else:
		nuke.message("No Read nodes found")

Несовсем понял как он работает.Первое что непонятно это то что он создаёт функцию reRead и вобще не определяет аргументов. Может это для того чтобы переменные работали только локально?

Второе, функция Len возвращает длину строки… тут мне совсем непонятно что делает эта строка кода. nuke.allNodes('Read') - это линк на файл в нодах Read.

Отредактировано Ivan_Pomidoroff (Окт. 19, 2017 15:22:23)

Офлайн

#4 Окт. 19, 2017 15:36:43

Ivan_Pomidoroff
Зарегистрирован: 2017-10-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

Не совсем разобрался но получилось заменить часть на мой код. вот что получилось:

 toolbar=nuke.menu('Nodes')
menu=toolbar.addMenu('Costum Tools')
menu.addCommand('Re-Read All', lambda:reRead())
def reRead():
    if len(nuke.allNodes('Read')):
        for node in nuke.allNodes('Read'):
            flink=node['file'].value()
            print "Alt Link: "+ flink
            #изменение версии папки
            kar=flink.rpartition("/") 
            kar0=kar[0]
            vers=int(kar0[-2:])
            nvers=vers+1
            if nvers<10:
                nvers="0"+str(nvers)
            nvers=str(nvers)
            nlink=kar0[0:-2]+nvers+kar[1]+kar[2]
            #изменение версии файла
            kar=nlink.rpartition("_Cam") 
            kar0=kar[0]
            nlink=kar0[0:-2]+nvers+kar[1]+kar[2]
            print "New Link: " + nlink
            node['file'].setValue(nlink)
    else:
        nuke.message("No Read nodes found")

Теперь все Read ноды переписываются правельно. осталось допелить ноды Write…

Офлайн

#5 Окт. 20, 2017 23:04:10

Ivan_Pomidoroff
Зарегистрирован: 2017-10-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

Кароче додел. Есть ли тут недочёты?
Стандартный линк на файл выглядит так:
“—/Synflex/02_Design/02_3D/Output/Synflex/10/Sinflex_10_Cam_0010000.exr”

 # Re-Link
nuke.menu( 'Nuke' ).addCommand( 'MyMenu/Re-Link', lambda:relink())
def relink():
    if len(nuke.allNodes('Read')):
        for node in nuke.allNodes('Read'):
            readlink=node['file'].value()
            #изменение версии папки
            kar=readlink.rpartition("/") 
            pkar0=kar[0]
            vers=int(pkar0[-2:])
            nvers=vers+1
            if nvers<10:
                nvers="0"+str(nvers)
            nvers=str(nvers)
            newreadlink=pkar0[0:-2]+nvers+kar[1]+kar[2]
            #изменение версии файла
            kar=newreadlink.rpartition("_Cam") 
            fkar0=kar[0]
            newreadlink=fkar0[0:-2]+nvers+kar[1]+kar[2]
            node['file'].setValue(newreadlink)
    else:
        nuke.message("No Read nodes found")
    if len(nuke.allNodes('Write')):
        for node in nuke.allNodes('Write'):
            writelink=node['file'].value()
            #изменение версии папки
            kar=writelink.rpartition("/Comp") 
            pkar0=kar[0]
            vers=int(pkar0[-2:])
            nvers=vers+1
            if nvers<10:
                nvers="0"+str(nvers)
            nvers=str(nvers)
            newwritelink=pkar0[0:-2]+nvers+kar[1]+kar[2]
            #изменение версии файла
            kar=newwritelink.rpartition("_Cam") 
            fkar0=kar[0]
            newwritelink=fkar0[0:-2]+nvers+kar[1]+kar[2]
            node['file'].setValue(newwritelink)
    else:
        nuke.message("No Write nodes found")
    savelink=newreadlink.rpartition("_Cam")
    savelink=savelink[0]
    nuke.scriptSaveAs(savelink + ".nknc")

Офлайн

#6 Окт. 21, 2017 08:21:12

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

У вас монолог получается :)

По поводу замечаний.

  • Нюку тут никто не использует поэтому понять какие у вас там данные нельзя и сказать правильно вы сними работаете или нет трудно
  • Использование одинакового имени переменных (kar,kar0) для разных по смыслу переменных запутывает программу.
  • Len это len Регистр важен, постарайтесь писать корректно. Функция возвращает длину чего угодно а не только строки. У вас это наверное не строка.
  • Для работы с путями используют методы из os.path или pathlib. Неплохо бы вам указать какую версию питона вы используете.



Офлайн

#7 Окт. 24, 2017 19:04:42

Ivan_Pomidoroff
Зарегистрирован: 2017-10-17
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенаправление линков в Nuke

Спасибо за замечания.

1. Скрипт работает коректно поэтому меня сейчас интересует общие замечаня.
2. С переменными у меня не красиво вышло ) Может их называть более длинно и однозначно, а то я сам иногда забываю что там в них лежит.
3. Понятно. Кажется, в моём случае len проверяет наличие нод “реад” Если их нет то пропускаем. (nuke.allNodes('Read') - типо, выбрать все ноды “реад”. Что удевительно он выберает их по очереди пока все не переберёт… это как-то не явно.
4. Версия питона 2.7 (я указал во втором сообщении)

Если найдутся ещё замечания то я буду только рад.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version