Deadline 5.2是唯一”流出”的有”Blue Pill”的版本,可是因为是很久以前出的,里面预设Maya等软件的版本显示不是最新,看起来不爽(话说回来,你把2013的那设置直接改成2015的路径,还不是一样可以用),想改成2015只是强迫症而已
如果你装的就是 5.2.49424 原版,那 monitor 里的 Configure Plugins 看起来会是这样:
最大只到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的相关部分
你打开那几个新文件看看,猜也猜得到,只要自己手动修改下如下3个文件,你就有新版本的Maya出现在界面里了
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
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.
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 “高逼格”
先来张图
这是个初步”概念设计”,以及尝试看看这样乱搞是不是可行,结果是可行… orz
这方法就是去读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的话)
上面的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变量(这是测试…),实现了
当ui开启时从MayaBatch.dlinit用regex读取已经有哪些版本的maya在了,然后使相应的checkbox们被勾上
当加勾或者去勾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}
当按下apply按钮时,按照global变量mayaVerDict里的各个版本的值去修改MayaBatch.dlinit文件,已经有的就跳过,没有的就加进去(到文件最底部,显然这样属性就乱了,但由于这里是个简单的可行性测试,所以请忽略)
当按下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"
如果不用这个,lz不知道windows下如何”即时”的显示一个log文件的最后几行.log文件们默认位于 C:\ProgramData\Thinkbox\Deadline\logs , 如果你没改的话。如果不知道在哪的话可以选monitor的Help菜单里的Explore Log Folder
以上…… 如果有谁觉得这个脑残想法有用的话,可以接着写,或是想写deadline的monitor script的话,这个也可以作为一个额外的例子来参考下.
方法3 高逼格+1
高逼格就是简单问题复杂化,请看下面的脑抽成果 …
可以从deadline里启动
其原理就是写了个package专门用于搜索替换相应字符串(使用regex)
赞过:
赞 正在加载……
相关