应用插件
概况
所有的Deadline的插件是由Python编写而成,这就意味着它非常用于来编写自己的插件或者修改已经存在的插件脚本。请查看Scripting Overview文档来了解详细信息,以及Deadline插件参考的相关链接。
注意由于为应用编写的Python插件脚本将被运行在非交互式的模式下,所以很重要的一点,你的脚本里不能包含任何无限循环的阻塞计算,或者需要用户输入的界面。
当一个插件被加载进来后,日志将会显示插件是从哪里加载的。
基本插件信息
我们可以创建两种类型的插件:
- Simple
- Advance
Simple plug-ini 提供了对命令行应用程序进行封装,经常被用来构建命令行传递参数给应用程序。 Advanced plug-in 提供了更多的控制选项,一般是在简单的命令行应用无法达到使用要求的情况下使用。除了插件Python脚本本身,Simple plug-in 和 Advanced plug-in 非常类似。
创建一个新的插件
这部分包含了 Simple plug-in 和 Advanced plug-in 中一些常用的方面的内容。Simple plug-in 和 Advanced plug-in 各自特定的部分将在后面进行介绍。
为了创建一个新的插件,首先,在仓库的custom\plugins目录下创建一个文件夹,将其名称改成插件的名称。更多有关仓库里的 'custom'文件夹以及如何使用它的相关信息,请查看 String Overview文档。
为了更好的阐述这个文档的目的,我们将新的插件名命名为 MyPlugin。所有有关这个插件的脚本和配置文件被放置到这个插件的目录下(一些是必要的,另外一些事可选的)。
dlinit文件 - 必要
第一个必要文件是MyPlugin.dlinit,这个文件是插件的主要配置文件。它是一个纯文本文件,里面定义了一些 key=value 格式的插件属性,这些属性包括:
Key Name | Description |
---|---|
About | 插件的简短描述。 |
ConcurrentTasks | 值为True或者False (默认为False)。如果这个插件可以独立完成渲染任务,这个值可以设置为True。 |
DebugLogging | 值为True或者False (默认为False)。如果设置为True,debug插件的时候日志会在渲染的时候打印出来。 |
DeprecatedMode | 值为True或者False (默认为False)。如果你想要让一个Deadline 5.1 或者 5.2 版本的自定义Python .NET插件在Deadline 6 或者更新的Deadline上运行,将该值设置为True。更多有关 DeprecateMode 的信息将在文档后面可以找到。 |
里面也可以定义一些插件需要用到的自定义属性。比如一个常用的自定配置,是一个渲染任务的可执行程序的执行路径。在这个文档的例子中,我们的 MyPlugin.dlinit 文件可以写成如下内容:
About=My Example Plugin for Deadline
#This is a comment
ConcurrentTasks=True
MyPluginRenderExecutable=c:\path\to\my\executable.exe
py文件 - 必要
另外一个必要的文件是 MyPlugin.py,这个是主要的插件脚本文件。它定义了主要的DeadlinePlugin类,这个类包含了需要的代码,用于Deadline开始渲染任务。这里的内容就决定了 Simple plug-in和Advanced plug-in 插件之间的区别,这里面的每一个功能都会在后面记性讲解,这个脚本的如下所示:
from Deadline.Plugins import *
######################################################################
## This is the function that Deadline calls to get an instance of the
## main DeadlinePlugin class.
######################################################################
def GetDeadlinePlugin():
return MyPlugin()
######################################################################
## This is the function that Deadline calls when the plugin is no
## longer in use so that it can get cleaned up.
######################################################################
def CleanupDeadlinePlugin( deadlinePlugin ):
deadlinePlugin.Cleanup()
######################################################################
## This is the main DeadlinePlugin class for MyPlugin.
######################################################################
class MyPlugin (DeadlinePlugin):
# TODO: Place code here instead of "pass"
pass
要注意的第一个地方是我们要导入 Deadline.Plugins 的命名空间,这样我们就可以访问DeadlinePlugin类。
GetDeadlinePlugin()函数很重要,它可以让Slave来获取我们MyPlugin类的实例(可以扩展DeadlinePlugin抽象类)。在Deadline 6.2 以及更新的版本中,GetDeadlinePluginWithJob(job) 函数可以作为另外的选择。它有点类似GetDeadlinePlugin(),但是它在加载的时候接受一个Job对象的实例。如果这些参数没有定义,Slave在尝试渲染任务的时候报错。
MyPlugin类需要基于插件自身类型实现明确的回调,这些回调必须与MyPlugin构造器挂钩。对于所有的插件都需要实现的回调就是 InitializeProcess 函数。这里还有其他一些回调可以被实现,这些回到主要位于Deadline脚本参考里的 DeadlinePlugin 类的事件部分。
CleanupDeadlinePlugin() 函数同样重要,因为它需要在插件不再使用的时候清理插件。例如,它用于清理所有有关插件初始化后创建的回调。
InitializeProcess回调一般用于设置一些常用的插件配置:
from Deadline.Plugins import *
######################################################################
## This is the function that Deadline calls to get an instance of the
## main DeadlinePlugin class.
######################################################################
def GetDeadlinePlugin():
return MyPlugin()
######################################################################
## This is the function that Deadline calls when the plugin is no
## longer in use so that it can get cleaned up.
######################################################################
def CleanupDeadlinePlugin( deadlinePlugin ):
deadlinePlugin.Cleanup()
######################################################################
## This is the main DeadlinePlugin class for MyPlugin.
######################################################################
class MyPlugin (DeadlinePlugin):
## Hook up the callbacks in the constructor.
def __init__( self ):
self.InitializeProcessCallback += self.InitializeProcess
## Clean up the plugin.
def Cleanup():
del self.InitializeProcessCallback
## Called by Deadline to initialize the plugin.
def InitializeProcess( self ):
# Set the plugin specific settings.
self.SingleFramesOnly = False
self.PluginType = PluginType.Simple
这里有一些常用的插件属性可以再 InitializeProcess 里面回调。查看Deadline脚本参考里的 DeadlinePlugin 类的附加属性。
属性 | 描述 |
---|---|
PluginType | 插件的类型(PluginType.Simple/PluginType.Advanced)。 |
SingleFramesOnly | 设置True或者False。如果你的插件可以一次只能任务一帧的情况下设置为True,如果是序列则设置为False。 |
param文件 - 可选
MyPlugin.param文件是一个可选的文件,用于Plugin Configuration对话框,该对话框位于Monitor里。它用于声明一些属性,Monitor会根据这个文件生成用户界面,用于编辑一些在MyPlugin.dlinit文件里的自定义属性。在你创建这个文件后,打开Monitor,并进入Super User mode。然后select Tools -> Configure Plugins,你就可以再左边的插件列表里找到你的插件。
这个文件可能看起来是这个样子的:
[MyPluginRenderExecutable]
Type=filename
Label=My Plugin Render Executable
Default=c:\path\to\my\executable.exe
Description=The path to the executable file used for rendering.
注释行在 param 文件里也支持,前缀必须是 ";" 或者 "#" 。例如:
# This is the file name picker control to set the executable for this plugin.
[MyPluginRenderExecutable]
Type=filename
Label=My Plugin Render Executable
Default=c:\path\to\my\executable.exe
Description=The path to the executable file used for rendering.
你将会注意到方括号中的属性名称跟我们在 MyPlugin.dlinit 里的自定义配置 MyPluginRenderExecutable 是相匹配的。这就意味着,这个控制选项可以修改 MyPluginRenderExecutable 的值。下面是可用的 key=value格式的属性定义:
关键字名称 | 描述 |
---|---|
Category | 下面的控制选项所在的分类。 |
CategoryIndex | 这个属性决定了控制选项在分类中的顺序。这个属性跟Index做一样的事的。 |
CategoryOrder | 这个属性决定了分类之间的顺序。如果在一个分类里有多个CategoryOrder,使用最小值 。 |
Default | 如果在dlinit文件中没有定义这个属性&# |