一半君的总结纸

听话只听一半君

Deadline 5.2如何“添加”高版本软件支持(高逼格乱搞)

Deadline 5.2是唯一”流出”的有”Blue Pill”的版本,可是因为是很久以前出的,里面预设Maya等软件的版本显示不是最新,看起来不爽(话说回来,你把2013的那设置直接改成2015的路径,还不是一样可以用),想改成2015只是强迫症而已

如果你装的就是 5.2.49424 原版,那 monitor 里的 Configure Plugins 看起来会是这样:
mayabatch_plugin_original

最大只到2013(lz觉得你把2015的路径填到2013的里面也一样可以用)

方法1 “低逼格”

如果你去官网的 Deadline Miscellaneous Downloads 那儿下载了增加2014支持的”升级”文件,并和你已有的repo里的文件比较,你会发现其实就是改了几个配置文件而已.
跑题:把cygwin里的~/.bash_profile里加了一行改prompt,不想显示用户名

# 之前是 PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$' 改成
PS1='\[\e]0;\w\a\]\n\[\e[32m\]fucker@ilmvfx \[\e[33m\]\w\[\e[0m\]\n\$'

下面是此”升级包”里Maya的相关部分
deadline5_misc_download
你打开那几个新文件看看,猜也猜得到,只要自己手动修改下如下3个文件,你就有新版本的Maya出现在界面里了

  1. MayaCmd.dlinit里多了一行
    RenderExecutable2014_0=C:\Program Files\Autodesk\Maya2014\bin\MayaBatch.exe;C:\Program Files (x86)\Autodesk\Maya2014\bin\MayaBatch.exe;/usr/autodesk/maya2014/bin/maya;/Applications/Autodesk/maya2014/Maya.app/Contents/bin/maya
    
  2. MayaBatch.param里多了一段
    [RenderExecutable2014_0]
    Type=multilinemultifilename
    Category=Render Executables
    CategoryOrder=0
    Index=9
    Label=Maya 2014 Render Executable
    Default=C:\Program Files\Autodesk\Maya2014\bin\MayaBatch.exe;C:\Program Files (x86)\Autodesk\Maya2014\bin\MayaBatch.exe;/usr/autodesk/maya2014/bin/maya;/Applications/Autodesk/maya2014/Maya.app/Contents/bin/maya
    Description=The path to the Maya 2014 executable file used for rendering. Enter alternative paths on separate lines.
    
  3. MayaSubmission.py只有这一行不一样
    scriptDialog.AddComboControl( "VersionBox", "ComboControl", "2012", ("7.0","8.0","8.5","2008","2009","2010","2011","2012","2013","2014"), 120, -1 )
    

至于为何是这样,显然repo里plugin目录下的文件夹里的配置文件们对应monitor的configure plugins里的各个软件有哪些版本, scripts\submission\下的文件夹里的.py文件,就是当你选择monitor的Submit菜单下的各种软件后弹出来的ui. (5.2里使用的还是IronPython,虽然不知道他使用的是什么gui toolkit)

根据官网的说明,dlinit文件才是最终被用来找你的renderer可执行文件在哪里的配置(必须有),param文件可有可无,只是用来在你选菜单configure plugins的弹出的窗口里配置路径用的,也就是说你如果不需要配置的界面,你直接改dlinit就行了. 此外dlinit会根据你param文件的配置自动更新,不信你这样试试,只改param 文件,加个maya 2033,然后打开configure plugins 的ui,然后点ok,此时你去看看你的dlinit文件,是不是自动加了个2033?

综上所述,你只要改这3处地方,只要软件渲染的命令行没大变(一般来说不会),你愿意改多大就改多大,你加到Maya 2020都可以…… 因为Deadline的所谓”网络渲染”,无非就是把命令行渲染的那行命令发到每台电脑让他们运行而已,又不是什么把n个cpu拼成个大cpu渲染的高科技(况且这种高科技还不存在,也许存在,请恕lz孤陋寡闻)

但是此种”手动”方法逼格甚低, 所以请继续往下看

方法2 “高逼格”

先来张图
ver++_preview
这是个初步”概念设计”,以及尝试看看这样乱搞是不是可行,结果是可行… orz

ver++_files

这方法就是去读plugins目录下的配置文件们,然后把他们显示在ui上,然后你可以加勾你想要的版本,然后点apply,想加多大版本就加多大版本.(script后台去帮你改那几个文件 orz).

此实验完成的部分是用regex读取到已有的版本号,显示在了界面上(同理去修改也不难)

目测需要的科技”要点”有

  • 把ui和执行的code分离,我没看到ironPython.exe,只有个dll, 现在每次debug执行要去菜单下选ver++菜单,好麻烦
  • 把读写配置文件的部分写成package,这样好unittest,而且如果想被外部的工具用也方便(假设你有另外一个不在monitor里运行的普通的Python script想用他修改配置的话)
  • 如果”generalize” code,不要手动的去hardcode每种软件的版本号

以上,lz觉得这纯粹吃饱了撑的,不过这可以当成练习写脚本

跑题 regex(Regular Expression又称”正则表达式”是无敌的),比如你想选到MayaBatch.dlinit里所有的已有版本号,那你可以用

re.findall('(?<=\nRenderExecutable)(\d+_\d)',MayaBatchDlinitFileContent)

在线版实例见regex101(这是个在线测试regex的网站,这种网站多如牛毛,如果你搜下regex python online的话)
regex101_test
上面的regex也可以拆成多行写(此时可以加注释)

re.findall('''(?<=\nRenderExecutable)   # 找到前面是换行RenderExecutable的,但是不包括在结果里
              (\d+_\d)                  # 找到紧挨着前面,并且是数字_数字的部分
           ''',MayaBatchDlinitFileContent,re.X)

下面是完整例子

# coding=utf-8

from System.Collections.Specialized import *
from System.Drawing import *
from System.IO import *

from Deadline.Scripting import *

import re
import json

########################################################################
## Globals
########################################################################
scriptDialog = None
settings = None
mayaVerDict = None

########################################################################
## Main Function Called By Deadline
########################################################################
def __main__():
	global scriptDialog
	global settings

	dialogWidth = 500
	dialogHeight = 654
	# dialogHeight = 600 + 16
	labelWidth = 100
	tabHeight = 600

	scriptDialog = DeadlineScriptEngine.GetScriptDialog()
	scriptDialog.ShowGroupBoxMenu()

	scriptDialog.SetSize( dialogWidth+24, dialogHeight )
	scriptDialog.SetTitle( "ver++ 0.1 by biubiubiu大" )
	scriptDialog.SetIcon( Path.Combine( GetRootDirectory(), "scripts/General/ver++/ver++.ico" ) )

	scriptDialog.AddTabControl("Example Tab Control", dialogWidth+16, tabHeight)

	scriptDialog.AddTabPage("Fucker")
	scriptDialog.AddControl( "Separator1", "SeparatorControl", "Version up your software !", dialogWidth - 16, -1 )

	allMayaBatchVersions= getPluginsVersions()
	scriptDialog.AddGroupBox( "GroupBox2", "Maya ver++", True )

	scriptDialog.AddRow()

	verDict={}
	global mayaVerDict

	for i,v  in enumerate([7.0,8.0] + range(2008,2018)):
		# scriptDialog.AddSelectionControl( "CheckBox_maya"+str(i), "CheckBoxControl", False, str(i), 50 , -1)
		verStr = str(v).replace('.','_')
		if '_' not in verStr:
			verStr = '%s_0' % verStr

		check = 'True' if verStr in allMayaBatchVersions else 'False'
		verDict[verStr]=eval(check)
		checkBoxName = 'CheckBox_MayaBatch_'+verStr
		cmd='scriptDialog.AddSelectionControl("'+checkBoxName+'" , "CheckBoxControl", '+ check+', str(v), 50 , -1)'
		ClientUtils.LogText(cmd)
		checkBoxObj=eval(cmd)

		def updateMayaSettings(checkBoxName,checkBoxObj):
			ClientUtils.LogText(checkBoxName + ' -> '+ str(checkBoxObj))
			key = checkBoxName.replace("CheckBox_MayaBatch_","")
			ClientUtils.LogText(key + ' -> '+ str(scriptDialog.GetValue(checkBoxName)))
			mayaVerDict[key]=scriptDialog.GetValue(checkBoxName)

		checkBoxObj.ValueModified += lambda _,checkBoxName=checkBoxName,checkBoxObj=checkBoxObj:updateMayaSettings(checkBoxName,checkBoxObj)

		if (i+1) % 8 ==0:
			scriptDialog.EndRow()
			scriptDialog.AddRow()

	scriptDialog.EndRow()

	scriptDialog.AddRow()
	scriptDialog.AddControl( "mayaVerRangeLabel", "LabelControl", "Add a new Verson", labelWidth, -1 )
	scriptDialog.AddRangeControl( "mayaVerSliderBox", "SliderControl", 2018, 2018, 2023, 0, 1, dialogWidth - labelWidth - 24 -100, -1 )
	mayaVerAddBtn = scriptDialog.AddControl( "mayaVerAddBtn", "ButtonControl", "Add",40,-1)
	mayaVerRemoveBtn = scriptDialog.AddControl( "mayaVerRemoveBtn", "ButtonControl", "Del",40,-1)

	def updateMayaVer(mode,verRangeControl):
		newVer=scriptDialog.GetValue(verRangeControl)
		newVer = '%s_0'% str(newVer)
		mode = True if mode else False
		mayaVerDict[newVer]=mode

		ClientUtils.LogText(json.dumps(mayaVerDict))

	mayaVerAddBtn.ValueModified += lambda _,verRangeControl='mayaVerSliderBox':updateMayaVer(1,verRangeControl)
	mayaVerRemoveBtn.ValueModified += lambda _,verRangeControl='mayaVerSliderBox':updateMayaVer(0,verRangeControl)

	scriptDialog.EndRow()
	mayaVerApplyBtn = scriptDialog.AddControl( "mayaVerApplyBtn", "ButtonControl", "Apply",80,-1 )
	mayaVerApplyBtn.ValueModified += setMayaPluginsVersions

	# setattr(mayaVerApplyBtn,'x',"9527")

	# mayaVerApplyBtn.ValueModified += test

	mayaVerDict = verDict

	scriptDialog.EndGroupBox( False )

	scriptDialog.AddGroupBox( "GroupBox3", "Max ver++", True )
	scriptDialog.EndGroupBox( False )

	scriptDialog.EndTabPage()

	scriptDialog.AddTabPage("About This Shit")
	scriptDialog.AddControl( "Separator3", "SeparatorControl", "Seriously ?!!", dialogWidth - 16, -1 )
	scriptDialog.AddRow()
	scriptDialog.AddControl( "MultiLineTextLabel", "LabelControl", "Multi Line", labelWidth, -1 )
	scriptDialog.AddControl( "MultiLineTextBox", "MultilineTextControl", "环球数码整个就一大傻B\r\n不同意的举手", dialogWidth - labelWidth - 24, 100 )
	scriptDialog.EndRow()
	scriptDialog.EndTabPage()
	scriptDialog.EndTabControl()

	scriptDialog.AddRow()
	scriptDialog.AddControl( "DummyLabel1", "LabelControl", "", dialogWidth - 232, -1 )
	popupButton = scriptDialog.AddControl( "PopupButton", "ButtonControl", "Restart", 100, -1 )
	popupButton.ValueModified += PopupButtonPressed
	closeButton = scriptDialog.AddControl( "CloseButton", "ButtonControl", "Close", 100, -1 )
	closeButton.ValueModified += CloseButtonPressed
	scriptDialog.EndRow()

	scriptDialog.ShowDialog( False )

########################################################################
## Helper Functions
########################################################################
def ProgressButtonPressed( *args ):
	global scriptDialog

	currentProgress = scriptDialog.GetValue( "ProgressBox" )
	currentProgress = currentProgress + 5
	if currentProgress > 100:
		currentProgress = 1
	scriptDialog.SetValue( "ProgressBox", currentProgress )

def CloseButtonPressed( *args ):
	global scriptDialog
	scriptDialog.CloseDialog()

def PopupButtonPressed( *args ):
	global scriptDialog
	# scriptDialog.ShowMessageBox( "This is a popup!", "Popup" )
	# scriptDialog.CloseDialog()
	# ExecuteScript(__file__,'')
	ExecuteScript(Path.Combine( GetRootDirectory(), "scripts/General/ver++/ver++.py" ),'')
	scriptDialog.CloseDialog()

def mayaPlusButtonPressed (*args):
	global scriptDialog

	currentProgress = scriptDialog.GetValue( "ProgressBox" )

def getPluginsVersions(*args):
	global scriptDialog

	pluginsDir = GetPluginsDirectory()
	mayaBatchPluginsDir = Path.Combine(pluginsDir,'MayaBatch')
	ClientUtils.LogText('CRAP!!! ' +mayaBatchPluginsDir)

	initFile = Path.Combine(mayaBatchPluginsDir,'MayaBatch.dlinit')
	import os
	if os.path.isfile(initFile):
		ClientUtils.LogText(initFile+' exists')
	else:
		ClientUtils.LogText(initFile+' not exists')

	allVersions=[]
	with open(initFile) as f:
		# for line in f:
			# ClientUtils.LogText(line)
		initFileContent = f.read()
		ClientUtils.LogText(initFileContent)
		allVersions = re.findall('(?<=\nRenderExecutable)(\d+_\d)',initFileContent)
		ClientUtils.LogText(','.join(allVersions))

	return allVersions

def setMayaPluginsVersions(*args):
	global scriptDialog
	pluginsDir = GetPluginsDirectory()
	mayaBatchPluginsDir = Path.Combine(pluginsDir,'MayaBatch')
	initFile = Path.Combine(mayaBatchPluginsDir,'MayaBatch.dlinit')

	ClientUtils.LogText(str(len(args)))

	global mayaVerDict
	import json
	ClientUtils.LogText(json.dumps(mayaVerDict))

	initFileContent= ''
	with open(initFile) as f:
		initFileContent = f.read()
		for v,enabled in mayaVerDict.items():
			exists = re.search('\nRenderExecutable'+v,initFileContent)
			if enabled:
				if exists:
					pass
				else:
					# Add
					verInt=v.replace('_','.')
					newConfig = r'RenderExecutable%s=C:\Program Files\Alias\Maya%s\bin\Render.exe;C:\Program Files (x86)\Alias\Maya%s\bin\Render.exe' % (v,verInt,verInt) +'\n'
					initFileContent+=newConfig

					pass

			else:
				if exists:
					ClientUtils.LogText('RenderExecutable'+v+'.*\n')
					initFileContent = re.sub('RenderExecutable'+v+'.*','',initFileContent)
					# delete
				else:
					pass

	# with open(r'E:\DeadlineRepository\plugins\MayaBatch\MayaBatch_test.dlinit','w') as f:
	with open(initFile,'w') as f:
		f.write(initFileContent)

# def test(*args):
# 	ClientUtils.LogText(str(len(args)))
# 	ClientUtils.LogText(str(args[0]))
# 	ClientUtils.LogText(','.join(dir(args[0])))

上面的例子中,因为不知道如何才能将当前有哪些checkbox勾选了的信息传给按下Apply按钮后的function,所以使用了一个global变量(这是测试…),实现了

  1. 当ui开启时从MayaBatch.dlinit用regex读取已经有哪些版本的maya在了,然后使相应的checkbox们被勾上
  2. 当加勾或者去勾checbox时,global变量mayaVerDict会被更新,他看起来是像这个样子的
    {"2010_0": true, "2015_0": false, "2013_0": true, "2016_0": false, "2008_0": true, "2011_0": true, "7_0": false, "2014_0": true, "2012_0": true, "2009_0": true, "8_0": false, "2017_0": false}
    
  3. 当按下apply按钮时,按照global变量mayaVerDict里的各个版本的值去修改MayaBatch.dlinit文件,已经有的就跳过,没有的就加进去(到文件最底部,显然这样属性就乱了,但由于这里是个简单的可行性测试,所以请忽略)
  4. 当按下add/del按钮时,把左边滑条所显示的版本号从global变量mayaVerDict中加入/或删除(所以你还得再按apply)

注:

  • ls的脑残script只是个简单测试,所以没有去改MayaBatch.param也没有改MayaSubmission.py,而且也没有去关心添加/删除后的顺序,只是纯粹想乱搞试下这样看可不可以
  • 以上是脑残的technical artist的写法,显然你不可能把所有的plugins都这么写一遍,这样相当于把要改哪些地方hardcode进了代码文件里,而且把ui的代码和逻辑部分(修改文件)的代码混在了一起,如果是以写代码为生的td也来这么写,那估计绝b马上就要失业了(所以lz快失业了), 所以lz之后准备尝试用”程序员的写法再来写试一下”
  • 因为不知道怎么print, 不方便调试,只看到doc里有个ClientUtils.LogText(‘oh yeah , fuck idmt !’)可以把信息输出到log里,为了方便的查看log,lz在cygwin里用了如下命令
    tail -f "deadlinemonitor(Oglop-pc)-2014-06-22-0000.log"
    

    deadline_monitor_log如果不用这个,lz不知道windows下如何”即时”的显示一个log文件的最后几行.log文件们默认位于 C:\ProgramData\Thinkbox\Deadline\logs , 如果你没改的话。如果不知道在哪的话可以选monitor的Help菜单里的Explore Log Folder

以上…… 如果有谁觉得这个脑残想法有用的话,可以接着写,或是想写deadline的monitor script的话,这个也可以作为一个额外的例子来参考下.

方法3 高逼格+1

高逼格就是简单问题复杂化,请看下面的脑抽成果 …

dlp

可以从deadline里启动

dlp2

其原理就是写了个package专门用于搜索替换相应字符串(使用regex)

代码位于Github

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: