当图层数量较多时,从效果下拉菜单中选择目标图层太费劲了。请使用此脚本。
(function (aGbl) {
function mCreateUI(aObj) {
var mPorW = (aObj instanceof Panel) ? aObj : new Window("palette", "DropTune", undefined);
mPorW.preferredSize = [200, 200];
mPorW.margins = [10, 10, 10, 10];
mPorW.spacing = 4;
mPorW.mCbDrpDwn = mPorW.add("checkbox { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : '锁定'}");
mPorW.mGpDrpDwn = mPorW.add("group { orientation : 'column', alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}");
mPorW.mBtDrpDwn = mPorW.mGpDrpDwn.add("button { preferredSize : [180,20] , alignment : [ 'left','top' ] ,text : '获取下拉菜单'}");
mPorW.mEtPropN = mPorW.mGpDrpDwn.add("edittext { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : ''}");
mPorW.mEtPrmN = mPorW.mGpDrpDwn.add("edittext { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : ''}");
mPorW.mGpBrnk = mPorW.add("group { orientation : 'stack', preferredSize : [20,20] , alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 0}");
mPorW.mGpBrnk.add("statictext { preferredSize : [20,20] ,alignment : ['left','center' ] ,text : ''}");
mPorW.mGpBrnk.add("panel { preferredSize : [180,1],alignment : [ 'fill','center' ] , margins : [0, 0, 0, 0], spacing : 0}");
mPorW.mGpEftLyr = mPorW.add("group { orientation : 'column',alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}");
mPorW.mGpEftLyrBtCb = mPorW.mGpEftLyr.add("group {alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}");
mPorW.mBtEftLyr = mPorW.mGpEftLyrBtCb.add("button { preferredSize : [60,20] , alignment : [ 'left','top' ] ,text : '获取效果'}");
mPorW.mCbEftLyr = mPorW.mGpEftLyrBtCb.add("checkbox { preferredSize : [20,20] ,alignment : [ 'left','top' ] ,text : ''}");
mPorW.mStEftLyr = mPorW.mGpEftLyr.add("statictext { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : ''}");
mPorW.mGpTgt = mPorW.add("group { orientation : 'column',alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}");
mPorW.mGpTgtEtSt = mPorW.mGpTgt.add("group { alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}");
mPorW.mBtTgt = mPorW.mGpTgtEtSt.add("button { preferredSize : [60,20] , alignment : [ 'left','top' ] ,text : '获取图层索引'}");
mPorW.mEtTgt = mPorW.mGpTgtEtSt.add("edittext { preferredSize : [120,20] ,alignment : [ 'left','top' ] ,text : ''}");
mPorW.mStTgt = mPorW.mGpTgt.add("statictext { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : ''}");
mPorW.mBtAply = mPorW.add("button { preferredSize : [-1,40] , alignment : [ 'fill','top' ] ,text : '应用'}");
mPorW.mEtPropN.text = "ADBE Set Matte3";
mPorW.mEtPrmN.text = "提取图层中的遮罩";
mPorW.mCbDrpDwn.value = true;
mPorW.mGpDrpDwn.enabled = false;
mPorW.mCbEftLyr.value = true;
// 用于存储图层信息的变量。
mPorW.mLyrName = "";
mPorW.mLyrIdx = null;
mPorW.mPrpName = "";
mPorW.mPrpIdx = null;
return mPorW;
}
//创建主窗口。
var mPnl = mCreateUI(aGbl);
if (mPnl instanceof Window) {
mPnl.center();
mPnl.show();
} else if (mPnl instanceof Panel) {
// 对于UI面板,需要执行以下操作才能进行自动布局。
mPnl.layout.layout(true);
}
//----------------------------------------------------------------------------------------------------------------------
// 设置部分。
var mSecName = "DropTune";
// 如果存在设置,则加载设置。
if (app.settings.haveSetting(mSecName, "mEtPropN")) {
mPnl.mEtPropN.text = mConvertCodesTxtToTxt(app.settings.getSetting(mSecName, "mEtPropN"));
}
if (app.settings.haveSetting(mSecName, "mEtPrmN")) {
mPnl.mEtPrmN.text = mConvertCodesTxtToTxt(app.settings.getSetting(mSecName, "mEtPrmN"));
}
if (app.settings.haveSetting(mSecName, "mCbDrpDwn")) {
mPnl.mCbDrpDwn.value = (app.settings.getSetting(mSecName, "mCbDrpDwn") === "true");
mPnl.mGpDrpDwn.enabled = !(mPnl.mCbDrpDwn.value);
}
if (app.settings.haveSetting(mSecName, "mCbEftLyr")) {
mPnl.mCbEftLyr.value = (app.settings.getSetting(mSecName, "mCbEftLyr") === "true");
mPnl.mBtEftLyr.enabled = mPnl.mCbEftLyr.value;
mPnl.mStEftLyr.enabled = mPnl.mCbEftLyr.value;
}
//----------------------------------------------
// 复选框与启用状态的联动。
mPnl.mCbDrpDwn.onClick = function () {
mPnl.mGpDrpDwn.enabled = !(mPnl.mCbDrpDwn.value);
app.settings.saveSetting(mSecName, "mCbDrpDwn", mPnl.mCbDrpDwn.value);
}
mPnl.mCbEftLyr.onClick = function () {
mPnl.mBtEftLyr.enabled = mPnl.mCbEftLyr.value;
mPnl.mStEftLyr.enabled = mPnl.mCbEftLyr.value;
app.settings.saveSetting(mSecName, "mCbEftLyr", mPnl.mCbEftLyr.value);
}
// 当在Prop和Param的编辑文本框中输入时,将保存输入的文本。
mPnl.mEtPropN.onChanging = mPnl.mEtPropN.onChange = function () {
app.settings.saveSetting(mSecName, "mEtPropN", mConvertTxtToCodesTxt(mPnl.mEtPropN.text));
}
mPnl.mEtPrmN.onChanging = mPnl.mEtPrmN.onChange = function () {
app.settings.saveSetting(mSecName, "mEtPrmN", mConvertTxtToCodesTxt(mPnl.mEtPrmN.text));
}
//----------------------------------------------------------------------------------------------------------------------
// 主要部分。
// 输入文本后搜索图层名称。
mPnl.mEtTgt.onChanging = mPnl.mEtTgt.onChange = function () {
app.beginUndoGroup("Get Layer Name");
var mStr = mPnl.mEtTgt.text;
var mIdx = parseInt(mStr);
if (isNaN(mIdx)) {
mPnl.mStTgt.text = "";
return;
}
var mAi = app.project.activeItem;
if (0 >= mIdx || mIdx > mAi.numLayers) {
mPnl.mStTgt.text = "";
return;
}
var mLyr = mAi.layer(mIdx);
mPnl.mStTgt.text = mLyr.name;
app.endUndoGroup();
}
//--------------------------------------------------------------
// 获取目标图层。
mPnl.mBtTgt.onClick = function () {
app.beginUndoGroup("Get Target Layer Index");
var mAi = app.project.activeItem;
var mSl = mAi.selectedLayers[0];
mPnl.mEtTgt.text = mSl.index;
mPnl.mStTgt.text = mSl.name;
app.endUndoGroup();
}
//--------------------------------------------------------------
// 获取效果图层。
mPnl.mBtEftLyr.onClick = function () {
app.beginUndoGroup("Get Effect Prop");
var mAi = app.project.activeItem;
var mSl = mAi.selectedLayers[0];
var mSp = mSl.selectedProperties[0];
mPnl.mStEftLyr.text = "No." + mSl.index + ":" + mSl.name + " / " + "No." + mSp.propertyIndex + ":" + mSp.name;
//将窗口元素变量填入值。
mPnl.mLyrName = mSl.name;
mPnl.mLyrIdx = mSl.index;
mPnl.mPrpName = mSp.name;
mPnl.mPrpIdx = mSp.propertyIndex;
app.endUndoGroup();
}
//--------------------------------------------------------------
//获取下拉菜单的信息。
mPnl.mBtDrpDwn.onClick = function () {
app.beginUndoGroup("Get DropDownMenu Info");
var mAi = app.project.activeItem;
var mSl = mAi.selectedLayers[0];
var mSps = mSl.selectedProperties;
if (mSps.length !== 2) {
alert("Select effect\'s parameter from timeline.")
return;
}
var mSp1 = mSps[0];
var mSp2 = mSps[1];
var mSpPre = mSp2.propertyGroup(1);
if (mSpPre.name !== mSp1.name) { return; }
mPnl.mEtPropN.text = mSp1.matchName;
mPnl.mEtPrmN.text = mSp2.name;
app.settings.saveSetting(mSecName, "mEtPropN", mConvertTxtToCodesTxt(mPnl.mEtPropN.text));
app.settings.saveSetting(mSecName, "mEtPrmN", mConvertTxtToCodesTxt(mPnl.mEtPrmN.text));
app.endUndoGroup();
}
//--------------------------------------------------------------
//应用获取到的值。
mPnl.mBtAply.onClick = function () {
app.beginUndoGroup("Apply");
var mAi = app.project.activeItem;
//如果要使用通过按钮获取的效果,请执行以下操作。
if (mPnl.mCbEftLyr.value) {
var mSlIN = mPnl.mLyrName;
var mSlIdx = mPnl.mLyrIdx;
var mSpN = mPnl.mPrpName;
var mSpIdx = mPnl.mPrpIdx;
/*
var mStr = mPnl.mStEftLyr.text;
var mStrAry = mStr.split(" / ");
var mSlData = mStrAry[0].split(":");
var mSpData = mStrAry[1].split(":");
var mSlIdx = parseInt( mSlData[0].replace ("No.", ""));
var mSlIN= mSlData[1];
var mSpIdx = parseInt(mSpData[0].replace ("No.", ""));
var mSpN= mSpData[1];
*/
mAi.layer(mSlIdx).effect.property(mSpIdx).property(mPnl.mEtPrmN.text).setValue(parseInt(mPnl.mEtTgt.text));
//如果选择了图层,则应用于所选图层。支持多个图层。
} else {
var mSls = mAi.selectedLayers;
if (mSls.length === 0) {
return;
} else if (mSls.length === 1) {
var mSl = mSls[0];
var mSps = mSl.selectedProperties;
//如果选择了特定的效果,则应用于所选效果。否则,应用于匹配名称中的最上层效果。
if (mSps.length !== 0) { var mSp = mSps[0]; }
else { var mSp = mSl.effect.property(mPnl.mEtPropN.text); }
mSp.property(mPnl.mEtPrmN.text).setValue(parseInt(mPnl.mEtTgt.text));
//对于多个图层的情况,将应用于最上层的效果。
} else {
for (var i = 0; i < mSls.length; i++) {
var mSl = mSls[i];
alert();
if (!(mSl.effect.hasOwnProperty(mPnl.mEtPropN.text))) { continue; }
var mSp = mSl.effect.property(mPnl.mEtPropN.text);
mSp.property(mPnl.mEtPrmN.text).setValue(parseInt(mPnl.mEtTgt.text));
}
}
}
app.activeViewer.setActive();
app.endUndoGroup();
}
//----------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
//转换函数,将文本转换为字符的代码(数字)字符串。
function mConvertTxtToCodesTxt(aTxt) {
var mNameCodes = [];
//文字を一つずつUnicode(数字)で取得して、配列に入れる。
for (var i = 0; i < aTxt.length; i++) {
var mCode = aTxt.charCodeAt(i);
mNameCodes.push(mCode);
}
//将代码数组转换为逗号分隔的字符串。
//如果aTxt输入了"",那么长度为零,直接进入此处处理空数组mNameCodes。
//join()将[]转换为"",所以返回值将是代码字符串或"",将在读取函数中进行处理。
var mNameCodesStr = mNameCodes.join(",");
return mNameCodesStr;
}
//----------------------------------------------
//将代码(数字)字符串转换回原始字符的函数。
function mConvertCodesTxtToTxt(aCodesTxt) {
//对于空字符串"",不存在代码编号。而对于(本应该输入代码编号的)fromCharCode()函数,
// 如果输入空字符串""(作为字符串),会获得代码编号为0的空字符。
// 严格来说,这并不是完全的转换,因此以下是对此进行的处理。
if (aCodesTxt === "") { return "" }
//首先,将字符串转换为数组。
var mNameCodesAry = aCodesTxt.split(",");
var mNameLetterAry = [];
//将Unicode(数字)转换为字符,并逐个添加到数组中。
for (var i = 0; i < mNameCodesAry.length; i++) {
var mLetter = String.fromCharCode(mNameCodesAry[i]);
mNameLetterAry.push(mLetter);
}
//将包含单个字符的数组合并为一个字符串。
var mNameRst = mNameLetterAry.join("");
return mNameRst;
}
//----------------------------------------------------------------------------------------------------------------------
}(this));
使用
准备工作
首次运行时,首先解锁/锁定
。选择要设置的下拉菜单属性,然后点击获取下拉菜单
按钮。如果下方出现信息,则表示成功了。
没法从效果面板选择这个属性,请在时间轴上选择。(效果面板内双击属性,时间轴上就可以选择了)
对于获取下拉菜单
按钮的重新锁定(不会影响处理),您可以选择锁定或不锁定。
输入的准备信息将保存在AE设置中。因此,在以后的使用中,除非需要使用其他效果,否则不需要再次进行准备。
效果名称将输入匹配名称(类似于脚本内的正式名称)。