-
[AE脚本]独显小助手
介绍 有时候需要独显图层查看不同效果. 独显小助手, 用来保存当前独显的图层, 基于图层的索引 使用方法 添加设置: 选择图层, 在文字输入框内设置名字, 按回车/随便其他地方单击 删除设置: ctrl 单击设置, 即可恢复设置的独显图层 使用: 直接单击设置 脚本源码 'use strict'; // https://cg.yuelili.com/ae/ae-dev/ae-dev-script/ae-script-unique-display-assistant/ var activeComp = function activeComp() { return app.project.activeItem; }; function arrIndexOf(target, arr) { for (var i_2 = 0; i_2 < arr.length; i_2++) { var item = arr[i_2]; if (item == target) { return i_2; } } return -1; } var panelGlobal = this; (function () { var presetStore = panelGlobal instanceof Panel ? panelGlobal : new Window('palette', undefined, undefined, { resizeable: true, }); if (!(panelGlobal instanceof Panel)) presetStore.text = '独显小助手'; presetStore.preferredSize.width = 200; presetStore.preferredSize.height = 150; presetStore.orientation = 'column'; presetStore.alignChildren = ['left', 'center']; presetStore.spacing = 0; presetStore.margins = 0; var group1 = presetStore.add('group', [0, 0, 200, 50], { name: 'group1', }); group1.orientation = 'row'; group1.alignChildren = ['left', 'center']; group1.spacing = 10; group1.margins = 0; var listbox = presetStore.add('listbox', [0, 0, 200, 150], undefined, { name: 'listbox1', multiselect: true, }); listbox.onChange = soloLayers; var nameControl = group1.add('edittext', [0, 0, 95, 30]); var disableSoloBtn = group1.add('button', [0, 0, 95, 30], undefined, { name: 'button1', }); disableSoloBtn.text = '禁用'; disableSoloBtn.onClick = disableSolo; var LayerStore = (function () { function LayerStore() { this.layers = {}; } LayerStore.prototype.add = function (key, layers) { if…- 0
- 0
- 141
-
【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 : […- 0
- 0
- 456
-
用鼠伸缩放形状层,但不挤压描边宽度
概括一下思路: 1.锁死缩放属性,缩放属性不能改变,否则描边一定会被挤压 2.不改变缩放,那就改变形状的比例,也就是说,用鼠标伸缩形状图层,但不改变图层的缩放属性,而是改变形状的比例属性 3.然后将 描边属性 应用到改变后的形状,即:把形状属性组里的描边,移到外层的内容属性组,与它原先的父级属性组平级 但是没有这种功能,只能在内容属性组下新添加一个描边属性,把原先的描边属性里的参数一个个复制过来 app.beginUndoGroup("neverchange") var curcomp = app.project.activeItem; var curlayer = curcomp.selectedLayers[0]; var curPro = curcomp.selectedProperties[0]; //锁死缩放 curlayer.scale.expression = "if(time<thisLayer.outPoint)\n" + " {[" + curlayer.scale.value[0] + "," + curlayer.scale.value[1] + "]}\n" + "else\n" + " {value}" //比例值由缩放的原始值改变 curlayer("ADBE Root Vectors Group")(1)("ADBE Vector Transform Group")("ADBE Vector Scale").expression = "a=transform.scale.valueAtTime(outPoint);\n" + "b=transform.scale.value;\n" + "[a[0]/b[0]*100,a[1]/b[1]*100]" //在内容组里添加描边,把形状组里的描边属性拷贝到内容组里的描边 curlayer("ADBE Root Vectors Group").addProperty("ADBE Vector Graphic - Stroke") var newstroke = curlayer("ADBE Root Vectors Group")("ADBE Vector Graphic - Stroke") var oldstroke = curlayer("ADBE Root Vectors Group")("ADBE Vector Group")("ADBE Vectors Group")("ADBE Vector Graphic - Stroke") //复制描边里的基础属性 for (i = 1; i <= 7; i++) { newstroke(i).setValue(oldstroke(i).value) } //复制虚线组下的属性 for (i = 1; i <= 7; i++) { if (oldstroke("ADBE Vector Stroke Dashes")(i).isModified) { newstroke("ADBE Vector Stroke Dashes").addProperty(oldstroke("ADBE Vector Stroke Dashes")(i).matchName); newstroke("ADBE Vector Stroke Dashes")(i).setValue(oldstroke("ADBE Vector Stroke Dashes")(i).value); } } //锥度 for (i = 1; i <= 9; i++) { if (oldstroke("ADBE Vector Stroke Taper")(i).isModified) { newstroke("ADBE Vector Stroke Taper")(i).setValue(oldstroke("ADBE Vector Stroke Taper")(i).value); } } //波形 for (i = 1; i <= 5; i++) { if (oldstroke("ADBE Vector Stroke Wave")(i).isModified) { newstroke("ADBE Vector Stroke Wave")(i).setValue(oldstroke("ADBE Vector Stroke Wave")(i).value); } } //移除形状组里的描边 oldstroke.remove() app.endUndoGroup()- 0
- 0
- 786
-
【AE脚本示例】合成度遍历示例
//AE合成度遍历示例 v1.0 2022-05-04 //Raymond Yan 2022 (RaymondClr@outlook.com / QQ: 1107677019) function _arrayEach(array, iteratee) { var index = -1; var length = array.length; while (++index < length) iteratee(array[index], index, array); } function _contains(array, value) { var index = -1; var length = array.length; while (++index < length) if (array[index] === value) return true; return false; } function _stubTrue() { return true; } function isCompLayer(layer) { return layer.source instanceof CompItem; } function baseEachLayers(compItem, iteratee) { var index = 0; var numLayers = compItem.numLayers + 1; while (++index < numLayers) iteratee(compItem.layer(index), index); } function baseFindLayer(compItem, predicate, iteratee) { var compLayers = []; baseEachLayers(compItem, function (layer) { iteratee(layer); if (isCompLayer(layer) && predicate(layer)) compLayers.push(layer); }); _arrayEach(compLayers, function (layer) { baseFindLayer(layer.source, predicate, iteratee); }); } function eachLayersDeep(compItem, iteratee) { baseFindLayer(compItem, _stubTrue, iteratee); } function eachLayersDeepOnce(compItem, iteratee) { var seen = []; baseFindLayer( compItem, function (layer) { var id = layer.source.id; return _contains(seen, id) ? false : (seen.push(id), true); }, iteratee ); } //用法一:无论子合成是否存在重复,都进行遍历。 var result = []; eachLayersDeep(app.project.activeItem.selectedLayers[0].source, function (layer) { result.push(layer.name); }); $.writeln(result.join("\n")); //用法二:当子合成存在重复时,只遍第一次发现的子合成。 var result = []; eachLayersDeepOnce(app.project.activeItem.selectedLayers[0].source, function (layer) { result.push(layer.name); }); $.writeln(result.join("\n"));- 0
- 0
- 535
-
【AE 脚本】只在时间轴打开选择的合成的一种实现方法
function filterComp(seletion) { var compArr = []; for(var i=0;i<seletion.length;i++){ if(seletion[i] instanceof CompItem) {compArr.push(seletion[i])} } return compArr; } function onlyOpenSelComp() { var myComp= filterComp(app.project.selection); var selCompID = []; for(var n=0;n<myComp.length;n++){ selCompID.push(myComp[n].id); } var thisFile = app.project.file; if(!thisFile) {alert("Save project first!","Warning");return;} app.project.close(CloseOptions.SAVE_CHANGES); app["openFast"](thisFile); for(var n=0;n<selCompID.length;n++){ app.project.itemByID(selCompID[n]).openInViewer(); } } app.beginUndoGroup("Undo 只打开选中合成"); onlyOpenSelComp(); app.endUndoGroup();- 0
- 0
- 348
-
【AE脚本】案例:多图层中心空对象
演示 源码 // @author:哒哒 QQ:285078716 // @LINK:https://www.yuelili.com/?p=19379 (function run() { var composition = app.project.activeItem; if (!(composition && composition instanceof CompItem)) { alert("亲,请先选择一个合成!"); return; } app.beginUndoGroup("Null"); //在没有选中图层的情况下,在合成中直接创建一个空对象 var nullSize = 100; if (composition.selectedLayers.length === 0) { var target = composition.layers.addNull(); target.name ="空001"; target.label = 9; target.source.width = nullSize; target.source.height = nullSize; target.anchorPoint.setValue([target.source.width / 2, target.source.height / 2]); } else { //选中图层的情况下,为所选图层创建中心父级空对象 var xmin = void(0); var xmax = void(0); var ymin = void(0); var ymax = void(0); var zmin = Infinity; var zmax = -Infinity; var newNull = void(0); if (composition !== null) { var selectedLayers = composition.selectedLayers; //判断有没有3D图层 var allLayersAre3d = selectedLayers.filter(function(layer) { if (layer instanceof ShapeLayer || layer instanceof TextLayer || layer instanceof AVLayer) { return layer.threeDLayer === true; } return false; }).length === selectedLayers.length; if (selectedLayers.length > 0) { minIndex = selectedLayers[0].index; xmin = xmax = selectedLayers[0].property("Position").value[0]; ymin = ymax = selectedLayers[0].property("Position").value[1]; if (composition != null && composition instanceof CompItem) { var myLayers = composition.selectedLayers; //判断所选图层的入点和出点 if (myLayers.length != 0) { var saveIn = composition.duration; var saveOut = 0; var saveIndex = composition.numLayers; var newInpoint = composition.duration; var newOutpoint = 0; var myIndex = composition.numLayers; for (var i = 0; i <= myLayers.length - 1; i += 1)…- 0
- 0
- 424
-
【AE脚本】一键开关项目面板选中合成中的所有文字层
var window = new Window("palette"); function forEachItem(items, callback) { var index = items.length; while (index--) callback(items[index]); } function forEachLayer(compItem, callback) { var index = compItem.numLayers + 1; while (1 < index--) callback(compItem.layer(index)); } function isCompItem(item) { return item instanceof CompItem; } function isTextLayer(layer) { return layer.constructor.name === "TextLayer"; } window.add("checkbox").onClick = function () { var state = this.value; forEachItem(app.project.selection, function (item) { if (isCompItem(item)) { forEachLayer(item, function (layer) { if (isTextLayer(layer)) layer.enabled = state; }); } }); }; window.show();- 0
- 0
- 211
-
-
批量变更图层叠加模式
(function (global) { eval( "@JSXBIN@ES@2.0@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" ); //批量变更图层叠加模式 Beta 1.0.2 2021-11-01 //© Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019) var settings = new Settings(); var userInterface = new UserInterface(); var afterEffect = new AfterEffect(); runScript(); function runScript() { var buttons = userInterface.getButtons(); buttons.forEach(function (button) { button.onClick = function () { afterEffect.changeBlendingMode(BlendingMode[this.mode]); }; }); } function Settings() { //配置按钮排列方向 //可选参数: //row 排成一行 //column 排成一列 var buttonsDirection = "column"; //配置按钮白名单 //1、按钮排序:列表呈现顺序对应按钮在UI中的显示顺序,调整此顺序可对按钮排序。 //2、按钮文字:中文内容为按钮显示文本,可按个人喜好更改。 //注意事项 //1、请务必遵从列表的现有书写格式进行增删改,否则,可能会引发程序错误。 //2、左侧大写英文不可随意更改,此英文决定了叠加模式的最终结果;如需增删,仅可输入以下文档中列举的单词: //https://ae-scripting.docsforadobe.dev/layers/avlayer.html?highlight=blending#avlayer-frameblendingtype var whiteList = { ADD: "相加", ALPHA_ADD: "Alpha 添加", CLASSIC_COLOR_BURN: "经典颜色加深", CLASSIC_COLOR_DODGE: "经典颜色减淡", CLASSIC_DIFFERENCE: "经典差值", COLOR: "颜色", COLOR_BURN: "颜色加深", COLOR_DODGE: "颜色减淡", DANCING_DISSOLVE: "动态抖动溶解", DARKEN: "变暗", DARKER_COLOR: "较深的颜色", DIFFERENCE: "差值", DISSOLVE: "溶解", DIVIDE: "相除", EXCLUSION: "排除", HARD_LIGHT: "强光", HARD_MIX: "纯色混合", HUE: "色相", LIGHTEN: "变亮", LIGHTER_COLOR: "较浅的颜色", LINEAR_BURN: "线性加深", LINEAR_DODGE: "线性减淡", LINEAR_LIGHT: "线性光", LUMINESCENT_PREMUL: "冷光预乘", LUMINOSITY: "发光度", MULTIPLY: "相乘", NORMAL: "正常", OVERLAY: "叠加", PIN_LIGHT: "点光", SATURATION: "饱和度", SCREEN: "屏幕", SILHOUETE_ALPHA: "轮廓 Alpha", SILHOUETTE_LUMA: "轮廓亮度", SOFT_LIGHT: "柔光", STENCIL_ALPHA: "模板 Alpha", STENCIL_LUMA: "模板亮度", SUBTRACT: "相减", VIVID_LIGHT: "亮光", }; return { getWhiteList: function () { return whiteList; }, getDirection: function () { return buttonsDirection; }, }; } function AfterEffect() { function getActiveItem() { var activeItem = app.project.activeItem; var hasActiveItem = (function () { return activeItem instanceof CompItem && activeItem !== null; })();…- 0
- 0
- 232
-
【脚本案例】选中图层的源(在项目中显示图层源可多个)
与AE自带的选中在项目中显示图层源一个意思,这个是为了同时选中多个图层源。 可以直接拷贝到toolbar 里作为一个小按钮用。 function sleSource(){ app.beginUndoGroup("选中图层再项目窗口的源") var avItem = app.project.activeItem; if(!avItem){alert("先激活一个合成!")}; var l = avItem.selectedLayers; if(l.length==0){alert("选中一些图层!")} for(var i=l.length-1; i>=0; i--){ try{l[i].source.selected = 1;}catch(err){continue};//有的图层没有源偷懒直接给他try一下 l[i].source.selected = 1; } app.endUndoGroup() } sleSource();- 0
- 0
- 299
-
【脚本案例】选择摄像机,创建空对象并绑定
介绍 选择一个摄像机,单击创建,可以创建2个空对象,分别绑定兴趣点和位置 空对象名称请在“自定义空对象名称”处自行更改 源码 V1.1 /** * 名称:摄像机一键绑定空对象 * 功能:选择一个摄像机,单击创建,可以创建2个空对象,分别绑定兴趣点和位置 * 源码:https://www.yuelili.com/?p=18041 * 1.1 新增摄像机景深开关,放在 兴趣点图层空对象上 * 1.0 */ var panelGlobal = this; var palette = (function () { // 自定义空对象名称 var CAM_POS = "CAM_POS" // 摄像机位置 var CAM_POI = "CAM_POI" // 摄像机兴趣点 var DOF_NAME = "DOF" // 摄像机景深 // UI 界面 var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "一键绑定摄像机空对象"; palette.orientation = "row"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var cam_btn = palette.add("button", undefined, undefined, { name: "" }); cam_btn.helpTip = ""; // 小提示 cam_btn.text = "创建"; cam_btn.preferredSize.width = 80; cam_btn.onClick = cam_it // 主函数 function cam_it() { app.beginUndoGroup("cam it"); var cam_layer = app.project.activeItem.selectedLayers[0] if (cam_layer && cam_layer("ADBE Camera Options Group")) { var layer1 = app.project.activeItem.layers.addNull() layer1.threeDLayer = true layer1.name = CAM_POI var layer2 = app.project.activeItem.layers.addNull() layer2.threeDLayer = true layer2.name = CAM_POS var DOF = cam_layer.property("ADBE Camera Options Group").property("ADBE Camera Depth of Field") var DOF_Control= layer1.property("ADBE Effect Parade").addProperty("ADBE Checkbox Control") DOF_Control.name = DOF_NAME + " CONTROL" cam_layer.property("ADBE Transform Group").property(1).expression = 'thisComp.layer("' + layer1.name + '").transform.position' cam_layer.property("ADBE Transform Group").property("ADBE Position").expression = 'thisComp.layer("' + layer2.name + '").transform.position' DOF.expression = 'thisComp.layer("' + CAM_POI + '").effect("' + DOF_NAME + '…- 0
- 2
- 213
-
【脚本案例】合成批量加时间码
介绍 选择所有合成,单击创建按钮,即可在所有合成左下角加个时间码。 具体位置啥的、字体、字体大小自己改 源码 * https://www.yuelili.com/?p=18016 */ var panelGlobal = this; var main = (function () { /* Code for Import https://scriptui.joonas.me — (Triple click to select): {"activeId":0,"items":{"item-0":{"id":0,"type":"Dialog","parentId":false,"style":{"enabled":true,"varName":"main","windowType":"Palette","creationProps":{"su1PanelCoordinates":false,"maximizeButton":false,"minimizeButton":false,"independent":false,"closeButton":true,"borderless":true,"resizeable":true},"text":"合成批量加时间码","preferredSize":[0,0],"margins":16,"orientation":"column","spacing":10,"alignChildren":["center","top"],"item-1":{"id":1,"type":"Button","parentId":0,"style":{"enabled":true,"varName":"time_code_btn","text":"加时间码","justify":"center","preferredSize":[0,0],"alignment":null,"helpTip":null},"order":[0,1],"settings":{"importJSON":true,"indentSize":false,"cepExport":false,"includeCSSJS":true,"showDialog":true,"functionWrapper":true,"afterEffectsDockable":true,"itemReferenceList":"None" */ // MAIN // ==== var main = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette", undefined, undefined, {}); if (!(panelGlobal instanceof Panel)) main.text = "合成批量加时间码"; main.orientation = "column"; main.alignChildren = ["center", "top"]; main.spacing = 10; main.margins = 16; var time_code_btn = main.add("button", undefined, undefined, { name: "time_code_btn" }); time_code_btn.text = "加时间码"; time_code_btn.onClick = time_code_it // 获取时间信息 function get_time(comp) { s1 = comp.duration;//获取时间 s2 = comp.frameRate;//获取帧数率 s = (Number(s1 * s2)) + 1; var a, b, c, d; a = parseInt((s - 1) / 24); b = "s+"; c = (s - 1) % 24; d = "帧"; return a + b + c + d } // 主函数 function time_code_it() { var selItems = app.project.selection if (selItems.length == 0) { alert("请在项目面板至少选择一个合成") } else { app.beginUndoGroup("Add 持续时间");//记录撤销 // 循环选中的项目 for (i = 0; i < selItems.length; i++) { // 判断项目是否为合成 if (selItems[i] instanceof CompItem) { // 获取合成时间 var time_txt = get_time(selItems[i]) var textLayer = selItems[i].layers.addText(time_txt);//文本显示格式为## s + ## 帧 textLayer.position.setValue([125, 1000]);//位置修改 textLayer.property("transform").property("Scale").setValue([200, 200]);//字符放大 var ramp = textLayer.effect.addProperty("ADBE Fill")//填充效果 ramp(3).setValue([1, 0, 0]);//字符颜色 }…- 0
- 0
- 174
-
【脚本案例】批量修改合成以及子合成信息
介绍 选择一个合成,设置参数,自动修改当前合成以及子合成信息 更新 V1.3 : 默认参数都为0,如果不修改,那么该参数也不参与修改 V1.2 :帧速率可以填小数 V1.1 :增加了一些提示 源码 V1.3 * 名称:批量修改合成信息 * 用途:选择一个合成,里面子合成信息也一起修改* * V1.3 : 如果不修改参数 则不会修改,默认参数都为0 * V1.2 :帧速率可以填小数 * V1.1 :增加了一些提示 * 作者:yueli * 链接:https://www.yuelili.com/?p=18007 * AE脚本 合成篇:https://www.yuelili.com/docs/ae-script/ae-script-compitem/ * 使用条件:必须选择一个合成 * 缺点:如果修改分辨率,不可能自适应!这种跨世纪难题请自己解决 */ var panelGlobal = this; var main = (function () { // MAIN var main = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette", undefined, undefined, { closeButton: true }); if (!(panelGlobal instanceof Panel)) main.text = "批量修改合成信息"; main.orientation = "column"; main.alignChildren = ["center", "top"]; main.spacing = 10; main.margins = 16; // GP_SIZE // ======= var gp_size = main.add("group", undefined, { name: "gp_size" }); gp_size.orientation = "row"; gp_size.alignChildren = ["left", "center"]; gp_size.spacing = 10; gp_size.margins = 0; var t_width = gp_size.add('edittext {properties: {name: "t_width"'); t_width.text = "00"; t_width.helpTip = "宽度" var t_height = gp_size.add('edittext {properties: {name: "t_height"'); t_height.text = "00"; t_height.helpTip = "高度" var t_frameRate = gp_size.add('edittext {properties: {name: "t_frameRate"'); t_frameRate.preferredSize.width = 50 t_frameRate.text = "00"; t_frameRate.helpTip = "帧速率,可以填小数" // GP_TIME // ======= var gp_time = main.add("group", undefined, { name: "gp_time" }); gp_time.orientation = "row"; gp_time.alignChildren = ["left", "center"]; gp_time.spacing = 10; gp_time.margins = 0; var hh = gp_time.add('edittext {properties: {name: "hh"'); hh.text = "00"; hh.helpTip = "小时" var mm = gp_time.add('edittext {properties:…- 0
- 0
- 443
-
【脚本案例】调整图层置顶
介绍 选择一个合成,置顶当前合成的所有调整图层 排序前 排序后 源码 ```javascript * 功能:选择一个合成,指定当前合成的所有调整图层 * 源码:https://www.yuelili.com/?p=17996 * 版本:1.0 */ var panelGlobal = this; var palette = (function () { // PALETTE var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "置顶调整图层"; palette.orientation = "row"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var create = palette.add("button", undefined, undefined, { name: "create" }); create.helpTip = "选择一个合成,然后单击"; create.text = "置顶"; create.preferredSize.width = 80; create.onClick = move_top // 判断 function move_top() { app.beginUndoGroup("adjust_to_top"); var comp = app.project.activeItem if (comp instanceof CompItem) { myLayers = comp.layers var jug = 0 for (var i = myLayers.length; i > 1; i--) { theLayer = comp.layer(i) if (theLayer.adjustmentLayer == true) { theLayer.moveToBeginning() i = i + 1 jug += 1 } if (jug + 1 == i) { break } } } else { alert("请选择一个合成") } app.endUndoGroup(); } palette.layout.layout(true); palette.layout.resize(); palette.onResizing = palette.onResize = function () { this.layout.resize(); } if (palette instanceof Window) palette.show(); return palette; }()); ```- 0
- 0
- 178
-
【脚本案例】基于选择图层时间 创建新图层
来源:朝倉老师的基于当前选择图层创建调整图层如下 本脚本介绍 基于选择的图层创建新图层。 单击:只创建一个,时间为所有图层的起始与结束 shift 单击:所有图层上方都创建一个对应图层 可优化 目前文字图层创建的是空文本、形状也是空形状组。具体我也不知道咋处理好,看个人需求吧 源码 /** * 功能:基于选择的图层、创建新图层。按住shift可以基于每个图层都创建 * 源码:https://www.yuelili.com/?p=17993 * 版本:1.0 * 参考代码:https://www.yuelili.com/?p=17740 */ var panelGlobal = this; var palette = (function () { // PALETTE // ======= var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "创建图层"; palette.orientation = "row"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var layer_list_array = ["调整图层", "纯色图层", "文字图层", "空对象", "形状图层"]; var layer_list = palette.add("dropdownlist", undefined, undefined, { name: "layer_list", items: layer_list_array }); layer_list.selection = 0; var create = palette.add("button", undefined, undefined, { name: "create" }); create.helpTip = "选择一个素材,然后单击"; create.text = "创建"; create.preferredSize.width = 50; create.onClick = create_it // 判断要创建什么图层 function creat_layer() { switch (layer_list.selection.index) { case 0: app.executeCommand(2279); // 调整图层 break; case 1: var cur_comp = app.project.activeItem cur_comp.layers.addSolid([0.5, 0.5, 0.5], '纯色图层', cur_comp.width, cur_comp.height, 1); // 纯色图层 break; case 2: app.project.activeItem.layers.addText(''); // 文字图层 break; case 3: app.executeCommand(2767); // 空对象 break; case 4: app.project.activeItem.layers.addShape(); // 形状图层 break; } } // 数组排序 function sortArr(arr) { arr.sort(function (a, b) { if (a < b) return -1; if (a > b) return 1; return 0; }); } function atal() { app.beginUndoGroup("atal"); var comp = app.project.activeItem; var slLayers = comp.selectedLayers; var inPArr = [];…- 0
- 0
- 196
-
【脚本案例】GIF等素材循环
介绍 许多可以循环的素材,比如gif,本身导入是不能循环的,很蛋疼。 如果要更改的话,一般需要右键素材 - 解释素材 - 主要 然后在其他选项里更改循环次数 更改前与更改后(所有合成内的该项目会同时更改,所以不用担心重新替换之类) 使用方法 在项目面板选择素材文件(可多选),单击按钮即可 这里有默认文件类型 ,以及默认循环次数,可以自行更改 tips:可以在项目面板搜索筛选(比如输入gif,mp4) 源码 /** * 功能:在项目面板选择一个或多个素材文件,可以批量更改循环次数,比如gif文件等 * 源码:https://www.yuelili.com/?p=17991 * 版本:1.0 */ var panelGlobal = this; var palette = (function () { // 用户自定义区 loop_list = [".mov", ".gif"] loop_times = 100 // UI 界面 可以不管 var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "素材重映射"; palette.orientation = "row"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var remap_btn = palette.add("button", undefined, undefined, { name: "remap_btn" }); remap_btn.helpTip = "选择素材(可以多个),然后单击"; remap_btn.text = "重映射"; remap_btn.preferredSize.width = 80; remap_btn.onClick = loop_it // 判断是否在数组内 ES不自带 所以要加一个 function isInArray(arr, value) { for (var i = 0; i < arr.length; i++) { if (value === arr[i]) { return true; } } return false; } function loop_it() { // 当前项目选择的文件 var selItems = app.project.selection if (selItems.length > 0) { // 遍历选择的文件 for (var i = 0; i < selItems.length; i++) { selItem = selItems[i] // 判断文件是否有本地文件 if (selItem.mainSource instanceof FileSource) { // 获取文件后缀 inx = selItem.name.lastIndexOf(".") endfix = selItem.name.substr(inx, 9) // 判断文件后缀是否在指定列表内 if (isInArray(loop_list, endfix)) { // 将该素材的源循环改为指定次数 selItem.mainSource.loop = loop_times } } } } else { alert("请至少选择一个项目") } } palette.layout.layout(true); palette.layout.resize(); palette.onResizing = palette.onResize =…- 0
- 0
- 360
-
【脚本案例】True Comp Duplicator – 真实合成复制器 源码
{ ///////////////////////////////////////////////////////////////////////// // // True Comp Duplicator v3 // // ©2010 Brennan Chapman // Author: Brennan Chapman // 2.0 enhancements: Brennan Chapman & Lloyd Alvarez // // Creates a complete duplicate of a comp hierarchy including subcomps. // Also, makes sure if a comp is used multiple times that it only gets duplicated // once and all remaining references point to the first duplicate. // // Version History // 1.0 initial release - 04/2010 // 2.0 Added UI, search and replace new comp name, maintian hierarchy and arrange into new folder option, non-english AE support, blessed for CS5 - 05/2010 // 2.1 Fixed folder hierarchy when using add into new folder option and CS3 comp name limit bug - 08/2010 // 2.2 Fixed bug when running script from Scripts menu - 02/2011 (LA) // 3.0 Massive update // - Updates expressions // - Multiple copies // - Depth limit // - Duplicates Footage Items // - Exclude Filter // - Select multiple comps at once // - Improved naming // - Help // - Progress Dialog // 3.1 - Fixes // New Features // - Expression Erros window // - New Update Expression Algorithm and Help info // Bug Fixes…- 0
- 0
- 231
-
【AE脚本案例】一键减少项目
使用方法 1.在项目面板选择一个合成,单击运行按钮 2.没了 运行逻辑 1.获取当前工程路径,获取选择合成名称(比如 Comp 1) 2.判断同级目录是否有合成名.aep( Comp 1.aex) 3.如果没有,则减少工程,然后保存文件,然后撤销减少工程。(方便打包其他合成) 源码 /** * 选择一个合成,运行此脚本。基于选择合成减少项目,并且另存到同级目录。 * 源码:https://www.yuelili.com/?p=17977 */ // 函数功能区 function reduceProject() { var myProjectFile = app.project.file var selComp = app.project.selection[0] if (selComp instanceof CompItem) { var trg_project_name = selComp.name trg_path = myProjectFile.path + '/' + trg_project_name + ".aep" var trg_file = File(trg_path) if (!trg_file.exists) { app.project.reduceProject(selComp) app.project.save(new File(trg_file)) app.executeCommand(16); } else { alert("目标文件已存在!") } } else { alert("请在项目面板选择一个合成") } } // UI界面 var panelGlobal = this; var palette = (function () { var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "一键减少工程"; palette.orientation = "column"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var reduce_it = palette.add("button", undefined, undefined, { name: "reduce_it" }); reduce_it.text = "Do it"; reduce_it.onClick = reduceProject palette.layout.layout(true); palette.layout.resize(); palette.onResizing = palette.onResize = function () { this.layout.resize(); } if (palette instanceof Window) palette.show(); return palette; }());- 0
- 0
- 261
-
【AE脚本案例】真实复制文件夹
源码 V1.1 /** * 名称:真实复制文件夹 * 用途:完整复制一个文件夹,里面的合成也会被真实复制,跟原文件夹以及所属合成,互不干扰。静态资源、图片、纯色层等不会被复制,因为他们不会影响引用 * Vision:1.1 * 作者:yueli * 链接:https://www.yuelili.com/?p=17969 */ var panelGlobal = this; var palette = (function () { // UI 界面 var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "真实复制文件夹"; palette.orientation = "row"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var real_folder_btn = palette.add("button", undefined, undefined, { name: "real_folder_btn" }); real_folder_btn.helpTip = ""; // 小提示 real_folder_btn.text = "复制"; real_folder_btn.preferredSize.width = 80; real_folder_btn.onClick = real_folder_it // 主函数 function real_folder_it() { var proj = app.project; var selFolder var tarFolder for (var i = 1; i <= proj.numItems; i++) { var itm = proj.item(i) if (itm.selected && itm instanceof FolderItem) { selFolder = itm tarFolder = app.project.items.addFolder(itm.name + "_output"); tarFolder.parentFolder = itm.parentFolder } } if (selFolder instanceof FolderItem) { app.beginUndoGroup("Duplicate Folder"); folder_recursive(selFolder, tarFolder) app.endUndoGroup(); } } // UI 结尾 palette.layout.layout(true); palette.layout.resize(); palette.onResizing = palette.onResize = function () { this.layout.resize(); } if (palette instanceof Window) palette.show(); return palette; }()); // 真实复制合成 function duplicateStructure(comp) { // Duplicate the incoming comp source_name = comp.name var comp = comp.duplicate(); comp.name = source_name // 循环合成内的图层与子合成 for (var i = 1; i <= comp.numLayers; i++) { var layer = comp.layer(i); //…- 0
- 0
- 238
-
【脚本示例】创建初始化文件夹
/** * Creates a number of folders (or, if ran as a window, lets you customzie folder names to create) * 在项目面板,创建一些文件夹 * * Based on DefaultFolders by Impudent1 from http://aenhancers.com/viewtopic.php?t=37 * * If run via Window, Shows a UI to set folder names * 如果在 窗口-运行脚本 则可以手动设置文件夹内容 * * If run via File > Script, creates folders from preferences * 如果直接运行,则使用默认文件夹名 * * * @author Zack Lovatt <zack@zacklovatt.com> * @version 2.0.2 */ // 设置默认文件夹名 (function defaultFolders(thisObj) { var defaultFolderNames = [ "Cross Referenced Solids", "Pre Comps", "Source Footage", "Guides/Adjustment Layers", "Render Queue Comps", "Work In Progress" ]; /** * Creates folders from folderNames array * * @param {String[]} folderNames Array of folder names to create */ function createFolders(folderNames) { for (var ii = 0, il = folderNames.length; ii < il; ii++) { var folderName = folderNames[ii]; if (folderName === "") continue; app.project.items.addFolder(folderName); } } /** * Gets folder names from prefs (if present), or defaults * * @returns {String[]} Array of folder names */ function getFolderNames() { if (app.settings.haveSetting("DefaultFolderPrefs", "Folder1")) { return [ app.settings.getSetting("DefaultFolderPrefs", "Folder1"), app.settings.getSetting("DefaultFolderPrefs", "Folder2"), app.settings.getSetting("DefaultFolderPrefs", "Folder3"), app.settings.getSetting("DefaultFolderPrefs", "Folder4"), app.settings.getSetting("DefaultFolderPrefs", "Folder5"), app.settings.getSetting("DefaultFolderPrefs", "Folder6") ]; } return defaultFolderNames; } /** * Sets folder names to prefs from parameter…- 0
- 0
- 151
-
【脚本示例】在2个图层位置中间创建1个空对象
/** * Creates a null positioned at the average position of all selected layers. * 在2个图层位置中间创建1个空对象 (引导层) * * Modifiers: * - Hold SHIFT to set to a fixed average at current time, vs dynamic expression * - 不按shift键 可以绑定动态表达式 * * * @author Zack Lovatt <zack@zacklovatt.com> * @version 0.4.0 */ (function setToAvgPosition() { var useFixed = ScriptUI.environment.keyboardState.shiftKey; var comp = app.project.activeItem; if (!(comp && comp instanceof CompItem)) { alert("Please select a composition!"); return; } var layers = comp.selectedLayers; if (layers.length < 2) { alert("Select at least 2 layers!"); return; } app.beginUndoGroup("Set to Average Position"); var avgNull = comp.layers.addNull(); avgNull.name = "Average Position Null"; avgNull.guideLayer = true; avgNull.label = 14; if (useFixed) { var sum = [0, 0]; for (var ii = 0, il = layers.length; ii < il; ii++) { var layer = layers[ii]; sum += layer.position.valueAtTime(comp.time, false); } var avg = sum / layers.length; avgNull.position.setValue(avg); } else { var firstLayerIndex = layers[0].index; var lastLayerIndex = layers[layers.length - 1].index; avgNull.position.expression = [ "var firstLayerIndex = " + firstLayerIndex + ";", "var lastLayerIndex = " + lastLayerIndex + ";", "", "var sum = [0, 0];", "var numLayers = lastLayerIndex - firstLayerIndex + 1;", "", "for (var ii = firstLayerIndex; ii…- 0
- 0
- 96
-
“向下”复制图层
[sc name="zhuanzai" author="朝倉すぐる" link="https://twitter.com/SgrGuitarOrgan" ][/sc] 默认AE是“向上”复制的,该脚本允许“向下”复制。 如果你把它放在 ScriptUI Panels 文件夹中,它有一个 UI,如果放在 Scripts 文件夹中,它可以在没有 UI 的情况下工作。 /*------------------------------------- Duplicate Under It Version History 1.0.0 [Current version] - Sep 02, 2021 Initial release -------------------------------------*/ //______Files Path______ var thisFile = new File(this); var thisFolderPath = thisFile.path; //______Build Main Panel______ function buildUI(thisObj){ if(thisObj instanceof Panel){ var win = thisObj; }else{ dupUnderIt(); } return win; } try{ var win = buildUI(this); var buttonRect = [0, 0, 100, 30]; var panelButtonSpace = [5, 5, 5, 5]; var buttonSpace = [55, 0, 55, 0]; var buttonA = win.add("Button", panelButtonSpace + buttonRect, "Duplicate"); function dupUnderIt(){ app.beginUndoGroup("dui"); var comp = app.project.activeItem; var slLayers = comp.selectedLayers for(i=0; i<slLayers.length; i++){ slLayers[i].duplicate(); slLayers[i].moveBefore(comp.layer(slLayers[i].index-1)); slLayers[i].selected = false; comp.layer(slLayers[i].index+1).selected = true; } app.endUndoGroup(); } buttonA.onClick = function(){ dupUnderIt(); } }catch(e){ } //try catch <-- To make it work even if you don't have it in ScriptUI Panels.- 0
- 0
- 272
-
【AE脚本】图层批量位移 | 朝仓 | 免费
将所选图层的入点完全移动到指示器的位置(可分配快捷方式) /*------------------------------------- Version History 1.0.2 [Current version] - Aug 16, 2021 Change file name. 1.0.1 - Aug 13, 2021 Fix for bug with a trimmed layer. 1.0.0 - Aug 13, 2021 Initial release -------------------------------------*/ app.beginUndoGroup("layerShifter"); var comp = app.project.activeItem; var currentTime = comp.time; var slLayers = comp.selectedLayers; var startTimesArr = []; var startTimesArrSort = []; // Get start points. for(var i = 0; i < slLayers.length; i++){ startTimesArr.push(slLayers[i].startTime); startTimesArrSort.push(slLayers[i].inPoint); } // Sort(SortGet the start point of the foremost layer.) startTimesArrSort.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); // Change start points. for(var i = 0; i < startTimesArr.length; i++){ slLayers[i].startTime = currentTime + startTimesArr[i] - startTimesArrSort[0]; } app.endUndoGroup();- 0
- 0
- 330
-
【AE脚本】添加修剪调整图层 | 朝仓 | 免费
UI版本 /*------------------------------------- Select Parents N Children Version History 1.0.0 - Aug 16, 2021 Initial release -------------------------------------*/ //______Files Path______ var thisFile = new File(this); var thisFolderPath = thisFile.path; //______Build Main Panel______ function buildUI(thisObj){ if (thisObj instanceof Panel){ var win = thisObj; }else{ execute(); } return win; } try{ var win = buildUI(this); var buttonRect = [0, 0, 170, 24]; var panelButtonSpace = [5, 5, 5, 5]; var buttonSpace = [0, 30, 0, 30]; var buttonA = win.add("button", panelButtonSpace + buttonRect, "Trimmed Adjustment Layer"); buttonA.helpTip = "Shift Click = Add adjustment layers to each selected layers"; buttonA.onClick = function(){ execute(); } }catch (e){ } //try catch <-- To make it work even if you don't have it in ScriptUI Panels. var comp = app.project.activeItem; // Sort array function sortArr(arr){ arr.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); } // Add Trimmed Adjustment Layer function atal(){ app.beginUndoGroup("atal"); var comp = app.project.activeItem; var slLayers = comp.selectedLayers; var inPArr = []; var outPArr = []; for(i=0; i<slLayers.length; i++){ inP = slLayers[i].inPoint; inPArr.push(inP); outP = slLayers[i].outPoint; outPArr.push(outP); } sortArr(inPArr); sortArr(outPArr); app.executeCommand(2279); //Adjustment Layer var slAdLayers = comp.selectedLayers; slAdLayers[0].inPoint = inPArr[0]; slAdLayers[0].outPoint = outPArr[outPArr.length-1]; app.endUndoGroup(); } //…- 0
- 0
- 339
-
[AE脚本]选择轨道遮罩层
/*------------------------------------- Select MatteLayers Version History 1.0.0 - Sep 08, 2021 Initial release -------------------------------------*/ //______Files Path______ var thisFile = new File(this); var thisFolderPath = thisFile.path; //______Build Main Panel______ function buildUI(thisObj){ if(thisObj instanceof Panel){ var win = thisObj; }else{ selectMatte(); } return win; } try{ var win = buildUI(this); var buttonRect = [0, 0, 100, 30]; var panelButtonSpace = [5, 5, 5, 5]; var buttonSpace = [55, 0, 55, 0]; var buttonA = win.add("Button", panelButtonSpace + buttonRect, "Select TrackMatte"); function selectMatte(){ app.beginUndoGroup("selectMatte"); var comp = app.project.activeItem; if(comp.selectedLayers.length<1){ app.executeCommand(23); //Select All } var slLayers = comp.selectedLayers; for(i=0; i<slLayers.length; i++){ if(slLayers[i].isTrackMatte && !slLayers[i].locked){ slLayers[i].selected = true; }else{ slLayers[i].selected = false; } } app.endUndoGroup(); } buttonA.onClick = function(){ selectMatte(); } }catch (e){ } //try catch <-- To make it work even if you don't have it in ScriptUI Panels.- 0
- 0
- 166