-
【AE脚本】图层Label循环取色
/** * @author fabiantheblind * @description cycle thru label colors * @source:https://github.com/ff6347/after-effects-script-snippets/blob/master/cycle-labels.jsx * this is CS6+ feature I think * * @todo [description] */ fun(); function fun() { app.beginUndoGroup('XXX'); var curComp = app.project.activeItem; if (!curComp || !(curComp instanceof CompItem)) { alert('noComp'); return; } for(var i = 0; i < curComp.selectedLayers.length; i++) { var lay = curComp.selectedLayers[i]; // 1~16循环。当然你可以基于某种规则设置 lay.label = (i + 1) % 16; } }- 0
- 0
- 165
-
【脚本案例】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
-
【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脚本】一键开关项目面板选中合成中的所有文字层
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
-
【AE脚本】基于选择顺序 把图层首尾相连
/* written for this stackoverflow question http://stackoverflow.com/questions/24115505/after-effects-composition-start-time-on-timeline/24117772#24117772 */ function fun() { app.beginUndoGroup('XXX'); var curComp = app.project.activeItem; if (!curComp || !(curComp instanceof CompItem)) { alert('选个合成行不行'); return; } selLayers = curComp.selectedLayers if(selLayers.length < 3) { alert('多选点图层行不行'); return; } for (var i = 1; i < selLayers.length; i++) { selLayers[i].startTime = selLayers[i-1].outPoint - (selLayers[i].inPoint - selLayers[i].startTime); } app.endUndoGroup(); } fun();- 0
- 0
- 245
-
【AE脚本】基于图层长宽 创建空对象矩阵
// https://github.com/ff6347/after-effects-script-snippets/blob/master/array-of-nulls.js var main = function (){ app.beginUndoGroup("XXX"); var curComp = app.project.items.addComp('foo', 1000, 1000, 1, 5, 25); // 判断是否在合成内 if (!curComp || !(curComp instanceof CompItem)){ alert("noComp"); return; }; for(var x = 0; x < curComp.width; x+=200){ for(var y = 0; y < curComp.height; y+=200){ var l = curComp.layers.addNull(5); l.threeDLayer = true; l.position.setValue([x,y,Math.random() * 100 -50]); } } app.endUndoGroup(); }; main();- 0
- 0
- 115
-
【AE脚本】connect-with-path 图层与路径连接 还没研究
/** * @author fabiantheblind * @description tries to connect selected layers with a path * @source:https://github.com/ff6347/after-effects-script-snippets/blob/master/connect-with-path.jsx * * * @todo get also parented position and position with expressions */ (function(thisObj){ // basic panel mpo_import(thisObj); function mpo_import(thisObj){ // this is global import_data = { 'x':10, 'y':10 }; /// THIS WILL CHECK IF PANEL IS DOCKABLE OR FLAOTING WINDOW var win = buildUI(thisObj ); if ((win !== null) && (win instanceof Window)) { win.center(); win.show(); } // end if win null and not a instance of window function buildUI (thisObj ) { var H = 25; // the height var W = 30; // the width var G = 5; // the gutter var x = G; var y = G; var rownum = 1; var columnnum = 3; var gutternum = 2; var win = (thisObj instanceof Panel) ? thisObj : new Window('palette', 'Connect With Path',[0,0,gutternum*G + W*columnnum,gutternum*G + H*rownum],{resizeable: true}); if (win !== null) { // win.check_box = win.add('checkbox',[x,y,x+W*2,y + H],'check'); // win.check_box.value = metaObject.setting1; win.do_it_button = win.add('button', [x ,y,x+W*3,y + H], 'connect them'); // win.up_button = win.add('button', [x + W*5+ G,y,x + W*6,y + H], 'Up'); // win.check_box.onClick = function (){ // alert("check"); // }; win.do_it_button.onClick = function ()…- 0
- 0
- 131
-
AE脚本 复刻预合成效果
//一键预合成(Ae自有预合成功能复刻) v1.0.1 2021-06-09 //Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019) var win = new Window( palette { margins: 10, spacing: 5, alignChildren: 'left', \ A: RadioButton { text: '保留合成中的所有属性', value: false }, \ B: RadioButton { text: '将所有属性移动到新合成', value: true }, \ C: Group { margins: [17, 0, 0, 0], \ A: Checkbox { text: '将合成持续时间调整为...', helpTip: '将合成持续时间调整为所选图层的时间范围', value: true } \ }, \ D: Group { margins: [1, 0, 0, 0], \ A: Checkbox { text: '打开新合成', value: false } \ } \ E: EditText { size: [200, 25], text: '预合成' }, \ F: Button { size: [200, 25], text: '一键预合成' } \ } ); win.show(); var rdb_keepAttributes = win.A; var rdb_moveAttributes = win.B; var ckb_matchDuration = win.C.A; var ckb_openPreComp = win.D.A; var edt_preComp = win.E; var preCompose = win.F; rdb_keepAttributes.onClick = function () { ckb_matchDuration.enabled = !rdb_keepAttributes.value; }; rdb_keepAttributes.addEventListener('mouseover', keepAttributesButtonsOnMoveHandle()); rdb_keepAttributes.addEventListener('mouseout', keepAttributesButtonsOnMoveHandle()); rdb_moveAttributes.onClick = function () { ckb_matchDuration.enabled = true; }; function keepAttributesButtonsOnMoveHandle() { return function () { var activeItem = getActiveItem(); if (!activeItem) return; if (activeItem.selectedLayers.length === 1) { rdb_keepAttributes.enabled = true; return; } var buttonState = (rdb_keepAttributes.value = rdb_keepAttributes.enabled = false); rdb_moveAttributes.value = !buttonState; ckb_matchDuration.enabled = !buttonState; }; } preCompose.onClick = function () { var activeItem…- 0
- 0
- 247
-
【脚本案例】选中图层的源(在项目中显示图层源可多个)
与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
-
【AE脚本】案例:如何用脚本实现True Duplicate
介绍 直接复制合成 知识点 项目id:在内部用于标识项目的唯一且持久的标识号。 源码 // 名称:直接复制 V1.01 // 作者: Brennan Chapman // 创建合成副本,包括子合成. // 当然,如果某个合成重复使用,只会复制一次 // 其他的重复项也会指向该合成 function duplicateStructure(comp) { // 复制合成 var comp = comp.duplicate(); // 循环遍历合成里的图层,如果有子合成,则进行检测 for (var i = 1; i <= comp.numLayers; i++) { var layer = comp.layer(i); //检查是否为合成 if (layer.source && layer instanceof CompItem) { // 检查合成是否被复制 check = checkPreviousComps(layer.source.id); if (check == null) { // 子合成没有复制过 // 保存合成id到合成集 var sourceID = layer.source.id; // 替换图层源,并检查子合成 layer.replaceSource(duplicateStructure(layer.source), false); // 存储新合成的ID 并储存在检查列表里 var destID = layer.source.id; previousComps[sourceID] = destID; } else { // 替换已经有源的合成 layer.replaceSource(check, false); } } } // 为了再次检查,返回合成对象 return comp; } // 判断合成有没有复制过 function checkPreviousComps(checkID) { if (previousComps[checkID]) { return getItemWithID(previousComps[checkID]); } return null; } // 返回项目item的独特id function getItemWithID(id) { for (x = 1; x <= app.project.numItems; x++) { if (app.project.item(x).id == id) { return app.project.item(x); } } return null; } mainComp = app.project.activeItem; if (mainComp && mainComp instanceof CompItem) { app.beginUndoGroup("Duplicate Hierarchy"); previousComps = []; // Go! duplicateStructure(mainComp); app.endUndoGroup(); } else if (!mainComp) { alert("请选择一个合成进行复制."); } else { alert("ERROR: 没有选择合成.n 请在项目面板重新选择."); }- 0
- 0
- 194
-
获取图层控件的当前图层名称
//获取具有图层选择属性的效果器的当前选择图层的名称 v1.0.0 2021-08-17 //Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019) var activeItem = app.project.activeItem; // 当前合成 var selectefLayer = activeItem.selectedLayers[0]; // 当前选择的图层 var layer_control_value = selectefLayer.effect.property('ADBE Layer Control').property('Layer').value; var trg_layer_name = activeItem.layer(layer_control_value).name; alert(trg_layer_name);- 0
- 0
- 141
-
[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
-
【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脚本】基于图层名称,切换图层小眼睛开关
source:https://github.com/ff6347/after-effects-script-snippets/blob/master/switch-layer-on-off.jsx#L2 function fun() { app.beginUndoGroup('change_eye_status');// 启动撤销组 // 先决条件 必须在合成内 var curComp = app.project.activeItem; if (!curComp || !(curComp instanceof CompItem)) { alert('先点进合成里面好不好'); return; } // 基于选择的图层,循环查找。如果图层名 = hhh,则关掉/开启他的小眼睛。 for(var i = 1; i < curComp.layers.length + 1; i++) { // 验证名称 if(curComp.layers[i].name == 'hhh') { // 反转小眼睛 curComp.layers[i].enabled = !curComp.layers[i].enabled; } } app.endUndoGroup(); //闭合撤销组 } fun();- 0
- 0
- 188
-
【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
-
【AE脚本】图层随机排序
// by 熊喵 if (!Array.prototype.derangedArray) { Array.prototype.derangedArray = function() { for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x); return this; }; } function allLayer(comp){ var arr = [] for(i=1;i<=comp.numLayers;i++){ arr.push(comp.layer(i)) } return arr } app.beginUndoGroup("打乱图层顺序"); var sl = app.project.activeItem.selectedLayers; if(sl.length == 0){sl = allLayer(app.project.activeItem)} //如果没有图层被选中则随机排序合成中的所有图层 sl = sl.derangedArray(); //打乱数组 for(var i = 1; i<sl.length; i++){ //移动图层 app.project.activeItem.layer(sl[i].index).moveAfter(sl[i-1]) // 月离注(可替换为): sl[i].moveAfter(sl[i-1]) } app.endUndoGroup(); 其他 /** * @author Dan Ebberts * @description randomize order of layers * @source :https://github.com/ff6347/after-effects-script-snippets/blob/master/randomOrderSelectedLayers.jsx * random order found on: http://forums.creativecow.net/thread/227/10609 * by Dan Ebberts * @todo [description] */ randomOrder(); function randomOrder() { app.beginUndoGroup('randomOrder selected Layers'); var myComp = app.project.activeItem; var selayerNums = myComp.selectedLayers.length; var selLayers = []; var selLayerIndexs = []; for (var i = 0; i < selayerNums; i++) { selLayerIndexs[i] = i; selLayers[i] = myComp.selectedLayers[i]; } var idx; var temp; for (var i = 0; i < selLayers.length; i++) { idx = i + Math.floor(Math.random() * (selayerNums - i)); temp = selLayerIndexs[i]; selLayerIndexs[i] = selLayerIndexs[idx]; selLayerIndexs[idx] = temp; } for (var i = 0; i < selLayers.length; i++) { selLayers[selLayerIndexs[i]].moveToBeginning(); } app.endUndoGroup(); }- 0
- 0
- 452
-
【AE脚本】选择一个图层的所有蒙版
/** * @author redefinery with some edits by fabiantheblind * @description :选择一个图层所有蒙版 * source:https://github.com/ff6347/after-effects-script-snippets/blob/master/select-all-masks-on%20layer.jsx * @todo [description] */ // 需求: // layer = 图层对象, 而且该对象可以应用蒙版 // fun(); function fun() { app.beginUndoGroup('XXX'); var curComp = app.project.activeItem; if (!curComp || !(curComp instanceof CompItem)) { alert('noComp'); return; } var layer = curComp.selectedLayers[0]; var masksGroup = layer('Masks'); var selectedMasks = new Array(); // 存储蒙版对象; 起始为空 if (masksGroup != null) { // 遍历masksGroup(蒙版组) // 追加蒙版进组 for (var i = 1; i <= masksGroup.numProperties; i++) { masksGroup.property(i).selected = true; } // ~ if (masksGroup.property(i).selected) // ~ selectedMasks[selectedMasks.length] = masksGroup.property(i); // ~ } // The selectedMasks array now contains the list of selected masks // in top-to-bottom order } app.endUndoGroup(); }- 0
- 0
- 202
-
【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
-
【脚本示例】创建初始化文件夹
/** * 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
-
【AE脚本】基于选择的顺序 批量按序号重命名
/** * @author fabiantheblind * @description rename selected layers with number * this happens in comp and project panel * source:https://github.com/ff6347/after-effects-script-snippets/blob/master/rename-layers.jsx * * @todo catch error if layer as no source */ fun(); function fun() { app.beginUndoGroup('rename layers'); var curComp = app.project.activeItem; if (!curComp || !(curComp instanceof CompItem)) { alert('noComp'); return; } // 判断是否选择图层 var promttxt = 'layer'; if(curComp.selectedLayers.length < 1) { alert('no selection'); return; } // 设置默认名称 promttxt = curComp.selectedLayers[0].name; // 弹出命名对话框 var basename = prompt('请输入命名前缀', promttxt); if(basename.length < 1) { alert('nothing is to short'); return; } for(var i = 0; i < curComp.selectedLayers.length; i++) { var name = basename + ' ' + String(i + 1); var currLayer = curComp.selectedLayers[i]; currLayer.name = name; } app.endUndoGroup(); }- 0
- 0
- 135
-
[AE脚本]选择相同源 图层
选择与所选图层具有相同源的所有图层。 如果放在 ScriptUI Panels 文件夹中,它有一个 UI,如果你把它放在 Scripts 文件夹中,它可以在没有 UI 的情况下工作。 /*------------------------------------- Select SameSource 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{ selectSameSource(); } return win; } try{ var win = buildUI(this); var buttonRect = [0, 0, 110, 30]; var panelButtonSpace = [5, 5, 5, 5]; var buttonSpace = [55, 0, 55, 0]; var buttonA = win.add("Button", panelButtonSpace + buttonRect, "Select SameSource"); function selectSameSource(){ app.beginUndoGroup("selectSameSource"); var comp = app.project.activeItem; var sourceArr = []; if(comp.selectedLayers.length<1){ }else{ var slLayers = comp.selectedLayers; } for(i=0; i<slLayers.length; i++){ sourceArr.push(slLayers[i].source); } app.executeCommand(2514); //Invert Selection var slLayersRe = comp.selectedLayers; for(i=0; i<sourceArr.length; i++){ for(j=0; j<slLayersRe.length; j++){ if(slLayersRe[j].source==sourceArr[i] && !slLayersRe[j].locked){ slLayersRe[j].selected = false; } } } app.executeCommand(2514); //Invert Selection app.endUndoGroup(); } buttonA.onClick = function(){ selectSameSource(); } }catch(e){ } //try catch <-- To make it work even if you don't have it in ScriptUI Panels.- 0
- 0
- 197
-
【AE脚本】批量变更图层叠加模式
//批量变更图层叠加模式 v1.0.0 2021-08-24 //© Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019) scriptName.call(this, buildUiElements, initUiElements); function scriptName(bulildUiElementsCallBack, initUiElementsCallBack) { var thisInGlobalIsPanel = this instanceof Panel; var mainPanel = thisInGlobalIsPanel ? this : new Window('palette', undefined, undefined, { resizeable: true }); mainPanel.onResize = function () { this.layout.resize(); }; mainPanel.alignChildren = ['center', 'center']; initUiElementsCallBack(bulildUiElementsCallBack(mainPanel)); if (thisInGlobalIsPanel) return mainPanel.layout.layout(true); mainPanel.center(); mainPanel.show(); } function buildUiElements(mainPanel) { return mainPanel.add('group'); } function Blend() { var blendingMode = {}; return { add: function (blendingName, enumeratedValue) { blendingMode[blendingName] = enumeratedValue; }, get: function () { return blendingMode; }, }; } function addButtonToGroup(groupElement, buttonName) { var button = groupElement.add('button', undefined, buttonName); button.size = [100, 25]; return button; } function getSelectedLayers() { var activeItem = app.project.activeItem; return ( activeItem && activeItem instanceof CompItem && activeItem.selectedLayers.length > 0 && activeItem.selectedLayers ); } function changeSelectedLayersBlendingMode(enumeratedValue) { var selectedLayers = getSelectedLayers(); if (!selectedLayers) return; for (var i = 0, l = selectedLayers.length; i- 0
- 0
- 420
-
批量变更图层叠加模式
(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
-
“向下”复制图层
[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