【AE脚本】下拉菜单快速选择图层 | DropTune

当图层数量较多时,从效果下拉菜单中选择目标图层太费劲了。请使用此脚本。

(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设置中。因此,在以后的使用中,除非需要使用其他效果,否则不需要再次进行准备。

效果名称将输入匹配名称(类似于脚本内的正式名称)。

给TA充电
共{{data.count}}人
人已充电
AEAE开发脚本开发

[AE脚本] 删除有错误的表达式 DelErrorExps

2023-6-19 14:54:36

AEAE开发脚本开发

[AE脚本示例] 遍历效果并创建文件夹

2023-6-28 12:49:06

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索