AE内置脚本Double-Up分解

By 四月 15, 2017 After Effects, 脚本预设

这个脚本可以让合成内的图层复制出一份并且并排显示,可以用来修改图层某个属性后作对比。

全部代码在这。

接下来会逐行分解这个脚本。


首先在开头和结尾都有一个 {} ,即使删掉也不会影响脚本正常使用,但是我看到的每个内置脚本都有这个大括号,第三方脚本就没这么规矩了,可能是作为传统吧。

随后是一番注释,脚本名字、功能和注意事项。接下来就是整个代码部分。

这个脚本使用一个函数来执行动作,最开始声明一个函数,然后在函数内部做各种操作,最后调用函数来执行。

接着就是分析函数内部的代码了。


先声明了一个对象,声明方式是直接创建一个对象,并没有使用构造函数,简单粗暴。对象名为 doubleUpData ,采用了驼峰式命名规则,不过大多数情况下,对象的命名首字母也会大写。

这个对象只有三个属性,其实也就是变量。

doubleUpData.scriptName 脚本的名字。

doubleUpData.strErrNoCompSel 脚本出错的时候提示文字。

doubleUpData.favorLongerDim 控制脚本复制的方式。这个比较有意思,这个属性的值是0,后面也有注释说可以为1,为1时就会总是横向复制。就像这样。

AE内置脚本Double-Up分解

正常情况下脚本会做出一个判断,在为0时会选择是向上复制还是横向复制。这个到下面代码时候再说。

还有一个是,这里的0不仅仅是数字,实际上这个值的作用是用来做判断的,0代表 false ,1或者其他大于1的数代表 true 。


这段代码是用来判断AE是否具有代码执行的条件,也就说是否有,且只有,一个合成处于被选中状态。

首先声明一个变量 comp ,值是 app.project.activeItem 。这个是ExtendScript的一个对象属性,当有一个合成处于被选中时,返回 CompItem  。如果没有合成被选中,或者有多个合成同时被选中,就返回 null 。还有一个是,此时的comp不仅仅是含有内容的变量,同时它也代表了 app.project.activeItem 。

下面的if条件语句可以理解为:

AE内置脚本Double-Up分解

分析这段代码能得到两个信息,一个是 alert() 可以有两个参数,前面的是现实内容,后面的是显示警告框的标题。另一个是用 return; 可以停止脚本运行。

如果没有 return 还没有选中合成,脚本就会继续执行,直到出错。

AE内置脚本Double-Up分解

在AE中是无作为,但是在ExtendScript Toolkit中会报错,代码高亮指向30行,因为那里有一个参数需要选中了合成才能被获取。没有选中就没有参数,代码自然就会报错。

还有一个知识点是 comp instanceof CompItem ,这个用来判断当前选中的对象是不是合成对象,也就是 app.project.activeItem instanceof CompItem .

我用的是ExtendScript Toolkit,右下角直接显示出这个变量的值。如果不用ExtendScript Toolkit,可以在if条件语句之后添加一个 alert(comp); 这样就能实时监视comp的值是什么。

如果选择的是合成,可以看到comp是 object CompItem 。

AE内置脚本Double-Up分解

如果选择是图层或者素材,comp就会是 object FootageItem 。

AE内置脚本Double-Up分解

所以加一个这个判断还是很重要的。


如果通过了验证,符合脚本执行的条件,脚本就会正式来构建执行代码了。

先做的是命名几个变量,为修改合成宽高做准备。

var selLayers = new Array(); 创建一个数组对象,名为 selLayers 。
这个是使用了for循环语句,但是省略了 {} ,严谨的写法应该是:
意思是,将合成中的每个图层都赋予给这个数组对象。图层1就是数组[0],图层2就是数组[1],因为数组是从0开始计算的。

var firstLayer = selLayers[0];这个是把第一个图层单独赋予一个变量,用于后面的判断。
声明一个变量 widthIsLonger ,如果合成的宽度大于高度,那么值就是 true ,反之就是 false 。这里的 comp.width 就是 app.project.activeItem.width .当前选中合成的宽度。

下面两个变量是声明合成X、Y方向的偏移量。并且用到了三元运算符。举例:X ? Y : Z,如果X值是ture,那么这个变量就赋值Y,如果为false,就赋值Z。

其中 doubleUpData.favorLongerDim 就是上面最开始说的那个值为0或者1,代表false或者true的对象属性。所以在前面设置值为0或者1,在这里就起作用了。

这个值是用来定位复制后的图层的位置的。

假设 doubleUpData.favorLongerDim 值是0,也就是false。回到上面的代码,就是

X轴偏移值 =合成宽大于高,X轴不偏移,合成宽不大于高,X轴偏移值为原合成宽 x2。

Y轴偏移值 = 合成宽大于高,Y轴偏移值为原合成高x2,合成宽不大于高,Y轴不偏移。

假设 doubleUpData.favorLongerDim 值是1,也就是true。回到上面的代码,就是

X轴偏移值 =合成宽大于高,X轴偏移值还要为原合成宽 x2,合成宽小于高,X轴反而不偏移。

Y轴偏移值 = 合成宽大于高,Y轴反而不偏移,合成宽小于高, Y轴偏移值还要为原合成宽 x2。

 


最初准备的变量都准备好了,就可以用变量来计算执行了。

这段代码的开头和结尾有个类似的对象方法,这两个必须是同时存在才会起作用。作用是将包含在里面的那段执行的动作在AE中打包成一个撤销动作。

AE内置脚本Double-Up分解

如果没有这两个对象方法,AE只会一步一步撤回动作。而 app.beginUndoGroup 中的参数,就是撤销的名字。

重新设置合成的宽高,同样用到了 doubleUpData.favorLongerDim 来控制。

假设 doubleUpData.favorLongerDim 值是0,也就是false。回到上面的代码,就是

改变合成的宽度值为 =合成宽大于高,合成的宽度值不变,合成宽不大于高,改变合成的宽度值为原合成宽 x2。

改变合成的高度值为 = 合成宽大于高,改变合成的高度值为原合成高x2,合成宽不大于高,合成的高度值不变。

作用在AE中的话

AE内置脚本Double-Up分解

原合成

AE内置脚本Double-Up分解

复制一次

AE内置脚本Double-Up分解

复制两次

也就是根据合成的长宽比来判断下次复制改怎么做。

假设 doubleUpData.favorLongerDim 值是1,也就是true。回到上面的代码,就是

改变合成的宽度值为 =合成宽大于高,改变合成的宽度值为原合成宽 x2,合成宽小于高,合成的宽度值反而不变。

改变合成的高度值为 = 合成宽大于高,合成的高度值反而不变,合成宽小于高,改变合成的高度值为为原合成宽 x2。

作用在AE中的话

AE内置脚本Double-Up分解

复制一次

AE内置脚本Double-Up分解

复制两次

也就是说,总是横向复制。

很精巧也很烧脑,同时还可以考虑下如果只想竖着复制改怎么改代码?实际上还是这个代码,只要最初AE中的合成宽是小于高的。所以不能说是总是横向复制了,而应该理解为总是朝着AE合成最初长的一端来复制。如果宽大于高说成是横着的长方形,高大于宽说成是竖着的长方形。那么就是总是向长方形朝向的方向复制。

合成修改完了,接下来就要处理图层了。

这里也是用for函数来操作,声明一个变量,这个作用其实是为了下面精简代码,不然每一行代码都需要写 selLayers[i].duplicate() 了。也有实际意义,使代码逻辑更清晰。

重复三个动作,直到复制了每一个图层。这三个动作分别定义了新图层的名字,在时间线中的位置,在合成窗口中的位置。

newLayer.moveToEnd(); 是将复制出的图层放在原图层的下方。也可以删除,不过删除之后是时间线中的排列顺序不太一样。

(完)

发表回复

让技术与审美并行