-
【AE脚本】获取/设置一个关键帧的所有信息
使用方法 使用获取函数,获取这个关键帧的所有信息(需要一个属性,和关键帧索引)返回关键帧信息 再使用创建关键帧函数,创建一个新关键帧(需要关键帧信息,和新的时间、是否删除旧关键帧) 源码(获取) /** * @param {*} prop :属性 * @param {*} key_index :关键帧索引 * @returns :关键帧所有信息 */ function save_key_info(prop, key_index) { var inInterp = prop.keyInInterpolationType(key_index); // 入点插值类型(线性、贝塞尔、定格) var outInterp = prop.keyOutInterpolationType(key_index); //出点插值类型(线性、贝塞尔、定格) key_info = { "prop":prop, // 所在属性(废话 "index": key_index, // 关键帧索引 "time":prop.keyTime(key_index), // 当前关键帧的时间 "value": prop.keyValue(key_index), // 关键帧的值 "both_bezier": (inInterp === KeyframeInterpolationType.BEZIER) && (outInterp === KeyframeInterpolationType.BEZIER), // 判断入点/出点贝塞尔 如果都是的话 先存一下 "key_hold": outInterp !== KeyframeInterpolationType.HOLD, // 判断出点是不是 非定格 "key_space": (prop.propertyValueType === PropertyValueType.TwoD_SPATIAL) || (prop.propertyValueType === PropertyValueType.ThreeD_SPATIAL), // 判断是不是空间值 } // 判断入点/出点贝塞尔 如果是的话 先存一下 if ((key_info["both_bezier"])) { key_info["tempAutoBezier"] = prop.keyTemporalAutoBezier(key_index); // 时间自动贝塞尔 → 布尔 key_info["tempContBezier"] = prop.keyTemporalContinuous(key_index); // 时间连续性 → 布尔 } // 判断出点是不是 非定格 if ((key_info["key_hold"])) { key_info["inTempEase"] = prop.keyInTemporalEase(key_index); // 入点关键帧缓入(1/2/3个对象) key_info["outTempEase"] = prop.keyOutTemporalEase(key_index); // 出点关键帧缓入(1/2/3个对象) } // 2D空间值 与 3D空间值:锚点、位置之类 if ((key_info["key_space"])) { key_info["spatAutoBezier"] = prop.keySpatialAutoBezier(key_index); // 空间自动贝塞尔 → 布尔 key_info["spatContBezier"] = prop.keySpatialContinuous(key_index); // 空间连续性 → 布尔 key_info["inSpatTangent"] = prop.keyInSpatialTangent(key_index); // 入点空间线性 → 浮点值数组(2/3) key_info["tempAutoBezier"] = prop.keyOutSpatialTangent(key_index); // 出点空间线性 → 浮点值数组(2/3) key_info["outSpatTangent"] = prop.keyRoving(key_index); } return key_info } 源码(创建) /** * @param {*} key_info :关键帧信息,使用save_key_info(prop,index)获得 * @param {*} newTime :新关键帧的时间:数值(秒) */ function create_new_key(key_info, newTime) { var prop = key_info["prop"] var newKeyIndex = prop.addKey(newTime); prop.setValueAtKey(newKeyIndex, key_info.value); // 设置关键帧的值 if ((key_info["key_hold"])) { prop.setTemporalEaseAtKey(newKeyIndex, key_info["inTempEase"], key_info["outTempEase"]); // 设置指定关键帧的入点出点时间缓动 }…- 0
- 8
- 452
-
【AE脚本】案例:把信息传递到系统剪贴板
介绍 提供一个函数,可以把内容反馈到Windows 或者 Mac 剪切板 知识点 判断是windows 还是 mac cmd命令的调用 源码 方法1(不能带\n) // 名称:复制信息到系统剪切板 // 作者: Adobe 社区 // 源码:https://www.yuelili.com/?p=10424 // from Adobe 社区 function copyToClipboard(string) { var cmd, isWindows; // 判断是不是字符串 string = (typeof string === 'string') ? string : string.toString(); isWindows = $.os.indexOf('Windows') !== -1; //OS的命令 cmd = 'echo "' + string + '" | pbcopy'; //windows的cmd命令 if (isWindows) { cmd = 'cmd.exe /c start /min /b cmd.exe /c "echo ' + string + ' | clip"'; //cmd = 'cmd.exe /c cmd.exe /c "echo ' + string + ' | clip"'; } system.callSystem(cmd); } // 比如 把AE版本名复制到粘贴板 copyToClipboard(app.buildName) 方法2(不能带\n) // 使用fs验证 function copyToClipboard(text) { text = "hello world" if (Folder.fs === "Windows") { var cmdCommand = 'cmd.exe /c cmd.exe /c "echo ' + text + ' | clip"'; system.callSystem(cmdCommand); } else if (Folder.fs === "Macintosh") { // macOS var osaCommand = 'echo "' + text + '" | pbcopy'; system.callSystem("osascript -e '" + osaCommand + "'"); } else { alert("Unsupported operating system."); } } 方法3(能带\n) function copyToClipboard(text) { // 创建临时文本文件 var tempFile = new File(Folder.temp.fullName + "/temp.txt"); tempFile.open("w"); tempFile.write(text); tempFile.close(); if (Folder.fs === "Windows") { var cmdCommand = 'cmd.exe /c cmd.exe /c "type ' + tempFile.fsName + '…- 0
- 5
- 242
-
[AE脚本]给ui快速添加右键菜单
粗略演示 这是代码 function ringhtClickMenu(container, window) { if (container.orientation === stack) { window.addEventListener(blur, function (event) { window.hide(); }); container.addEventListener(mouseup, function (event) { if (event.button === 2 && event.detail === 1) { window.frameLocation = [event.screenX, event.screenY]; window.show(); } }); } else if (container.orientation === row || undefined) { container.orientation = stack; ringhtClickMenu(container, window); } else { return alert(已设置orientation,请单独打组,再把orientation设置为stack, + \n + 再监听组.); } } function myMenu() { var $win = new Window(palette, undefined, undefined, { borderless: true }); var button1 = $win.add(button, undefined, 1); var button2 = $win.add(button, undefined, 2); var button3 = $win.add(button, undefined, 3); var button4 = $win.add(button, undefined, 4); button1.onClick = function () { $win.hide(); alert(1); }; button2.onClick = function () { $win.hide(); alert(2); }; button3.onClick = function () { $win.hide(); alert(3); }; button4.onClick = function () { $win.hide(); alert(4); }; return $win; } var win = new Window(palette); var group = win.add(group); group.size = [360, 240]; group.graphics.backgroundColor = group.graphics.newBrush(group.graphics.BrushType.SOLID_COLOR, [1, 0, 1]); ringhtClickMenu(group, myMenu()); win.show();- 0
- 4
- 215
-
【脚本案例】表达式小助手
界面 使用 快速保存与读取存储的表达式内容。丢在Scripts\ScriptUI Panels内就有面板了 保存 选中一个带表达式的属性,单击保存即可保存到配置文件 删除 删除当前下拉列表的表达式 应用 把表达式应用到所选的所有属性上 弹窗 如果把配置文件的user_info中的alert后面改为true 。则保存表达式时会弹窗,否则不弹窗 源码 // 名称: 表达式小助手1.1 // 源码: https://www.yuelili.com/?p=17940 // 构建UI Panel 函数 var panelGlobal = this; var palette = (function () { // JSON的polyfill "object" != typeof JSON && (JSON = {}), function () { "use strict"; var rx_one = /^[\],:{}\s]*$/, rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rx_four = /(?:^|:|,)(?:\s*\[)+/g, rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta, rep; function f(t) { return t < 10 ? "0" + t : t } function this_value() { return this.valueOf() } function quote(t) { return rx_escapable.lastIndex = 0, rx_escapable.test(t) ? '"' + t.replace(rx_escapable, function (t) { var e = meta[t]; return "string" == typeof e ? e : "\\u" + ("0000" + t.charCodeAt(0).toString(16)).slice(-4) }) + '"' : '"' + t + '"' } function str(t, e) { var r, n, o, u, f, a = gap, i = e[t]; switch (i && "object" == typeof i && "function" == typeof i.toJSON && (i = i.toJSON(t)), "function" == typeof rep && (i = rep.call(e, t, i)), typeof i) { case "string": return quote(i); case "number": return isFinite(i) ? String(i) : "null"; case "boolean": case "null": return String(i); case "object": if…- 0
- 3
- 2.5k
-
【脚本案例】自定义导入序列
需求 遍历目标文件夹,将制定文件夹内的序列文件导入AE,并且预合成,放入当前选择文件夹下的01_cel文件夹与_footage内 知识点 遍历本地文件夹并判断、遍历项目面板文件夹、AE项目文件夹的父子关系、导入设置、创建合成等相关知识。 UI的话 在线构建就行:https://scriptui.joonas.me/ 如何使用 新建:创建“导入序列.txt”并打开,复制源码,粘贴入该txt。 重命名:把“导入序列.txt”改为“导入序列.jsx” 放置:丢在AE根目录下的 Scripts\ScriptUI Panels内即可 其他:其他自定义内容,请看 源码 - “用户自定义”区 难点 由于openDlg获取文件夹对话框太难用了,这里使用saveDlg,然后重新New 一个Folder对象 源码 // Author:Yueli // 源码:https://www.yuelili.com/?p=17943 // Vision: 1.2 var panelGlobal = this; var palette = (function () { // UI 界面 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 seq_import = palette.add("button", undefined, undefined, { name: "seq_import" }); seq_import.text = "导入"; seq_import.onClick = import_seq // 主函数区 function import_seq() { // 用户自定义区 // 1.导入文件夹名称 var name_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"] var footage_list = ["png", "tga"] // 2.初始加载文件夹(就是对话框文件夹)默认为根目录 你可以把 ~ 改成诸如 "F:\\work\\AE project" var folderObj = new Folder('') // 3.是否弹窗:true则错误操作弹窗 false则不弹窗 var user_alert = false // 判断项目面板选择的文件夹 var proj = app.project; var trg_folder var footage_folder var cel_folder var comp_stage for (var i = 1; i <= proj.numItems; i++) { var itm = proj.item(i) if (itm.selected) { trg_folder = itm } } // 文件夹遍历加判断 function folder_recursive(folderGroup) { for (var i = 1; i <= folderGroup.numItems; i++) { var items = folderGroup.item(i); // 判断当前属性是否为文件夹,如果是,则继续遍历 if (items instanceof…- 0
- 2
- 385
-
【脚本案例】选择摄像机,创建空对象并绑定
介绍 选择一个摄像机,单击创建,可以创建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
-
-
【AE脚本】获取本工程所有效果,并发送到剪切板
代码 /** * @description : 获取本工程所有效果,并复制到剪切板 * @link: https://www.yuelili.com/?p=18805 */ var previousComps; var effect_list = []; function folder_recursive(folderGroup) { for (var i = 1; i <= folderGroup.numItems; i++) { var items = folderGroup.item(i); num += 1; // 判断当前属性是否为文件夹,如果是,则继续遍历 if (items instanceof FolderItem) { //对每个文件夹逐个操作 比如判断名称 folder_recursive(items); continue; } if (items instanceof CompItem) { previousComps = []; comp_recursive(items); } } } folder_recursive(app.project.rootFolder); send_to_clipboard(uniqueArray(effect_list)) function effect_recursive(layer) { var eff = layer.property("ADBE Effect Parade"); for (var i = 1, l = eff.numProperties; i <= l; i++) { effect_list.push(eff(i).name); // 对每个效果进行操作 // effectMissing(eff(i).matchName) // 如果你想的话,这里可以获取缺失效果 } } function send_to_clipboard(info) { var cmd, isWindows; // 判断是不是字符串 info = typeof info === "string" ? info : info.toString(); isWindows = $.os.indexOf("Windows") !== -1; //OS的命令 cmd = 'echo "' + info + '" | pbcopy'; //windows的cmd命令 if (isWindows) { cmd = 'cmd.exe /c cmd.exe /c "echo ' + info + ' | clip"'; } system.callSystem(cmd); } function uniqueArray(arr) { return arr.filter(function (item, pos) { return arr.indexOf(item) == pos; }); } function comp_recursive(comp) { // 循环合成内的图层与子合成 for (var i = 1; i <= comp.numLayers; i++) { var layer = comp.layer(i); // 检查图层是否有源 并且类型为合成 if (layer.source && layer.source instanceof CompItem) { // 检查是否遍历过该合成 check = checkPreviousComps(layer.source.id); if (check == null)…- 0
- 2
- 478
-
[AE脚本源码]快速选择图层
介绍 文本框输入内容按回车 或者失焦, 就可以选择当前合成包含此文本的图层 js源码 /** * name:Fast Select * version: 0.0.1 * description: You can input some text, then this script will select all layer that contain this text * author: yueli * link: https://www.yuelili.com/ae/ae-dev/ae-dev-script/ae-script-source-code-quickly-select-layers/ */ var panelGlobal = undefined; (function () { var fast_select = panelGlobal instanceof Panel ? panelGlobal : new Window('palette', undefined, undefined, { resizeable: true, }); if (!(panelGlobal instanceof Panel)) fast_select.text = 'Fast Select'; fast_select.preferredSize.width = 104; fast_select.preferredSize.height = 61; fast_select.orientation = 'row'; fast_select.spacing = 10; fast_select.margins = 16; var input = fast_select.add('edittext'); input.text = '输入图层名'; input.onChange = selectLayers; function selectLayers() { if (input.text.length === 0 || input.text == '输入图层名') { return; } var activeComp = app.project.activeItem; if (!activeComp || !(activeComp instanceof CompItem)) { return; } else { app.executeCommand(2004); for (var i = 1; i <= activeComp.layers.length; i++) { var layer = activeComp.layer(i); if (layer.name.indexOf(input.text) !== -1) { layer.selected = true; } } } } fast_select.layout.layout(true); fast_select.layout.resize(); fast_select.onResizing = fast_select.onResize = function () { this.layout.resize(); }; if (fast_select instanceof Window) fast_select.show(); return fast_select; })(); typescript源码 const panelGlobal: any = this; (function () { /* Code for Import https://scriptui.joonas.me — (Triple click to select): {"activeId":1,"items":{"item-0":{"id":0,"type":"Dialog","parentId":false,"style":{"enabled":true,"varName":"fast_select","windowType":"Palette","creationProps":{"su1PanelCoordinates":false,"maximizeButton":false,"minimizeButton":false,"independent":false,"closeButton":true,"borderless":false,"resizeable":true},"text":"Fast Select","preferredSize":[104,61],"margins":16,"orientation":"row","spacing":10,"alignChildren":["right","center"],"item-1":{"id":1,"type":"EditText","parentId":0,"style":{"enabled":true,"varName":"input","creationProps":{"noecho":false,"readonly":false,"multiline":false,"scrollable":false,"borderless":false,"enterKeySignalsOnChange":false},"softWrap":false,"text":"EditText","justify":"left","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" */ // FAST_SELECT // =========== var fast_select = panelGlobal instanceof…- 0
- 2
- 181
-
【AE脚本案例】预设小助手
展示 用法 保存:弹出保存预设对话框,请保存到脚本同级目录下的Custom_Presets文件夹内 删除:删除当前预设,注意:本地文件也会被删除 应用:应用所选预设到所有选择的图层上 源码 // 构建UI Panel 函数 var panelGlobal = this; var palette = (function () { // JSON的polyfill "object" != typeof JSON && (JSON = {}), function () { "use strict"; var rx_one = /^[\],:{}\s]*$/, rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rx_four = /(?:^|:|,)(?:\s*\[)+/g, rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta, rep; function f(t) { return t < 10 ? "0" + t : t } function this_value() { return this.valueOf() } function quote(t) { return rx_escapable.lastIndex = 0, rx_escapable.test(t) ? '"' + t.replace(rx_escapable, function (t) { var e = meta[t]; return "string" == typeof e ? e : "\\u" + ("0000" + t.charCodeAt(0).toString(16)).slice(-4) }) + '"' : '"' + t + '"' } function str(t, e) { var r, n, o, u, f, a = gap, i = e[t]; switch (i && "object" == typeof i && "function" == typeof i.toJSON && (i = i.toJSON(t)), "function" == typeof rep && (i = rep.call(e, t, i)), typeof i) { case "string": return quote(i); case "number": return isFinite(i) ? String(i) : "null"; case "boolean": case "null": return String(i); case "object": if (!i) return "null"; if (gap += indent, f = [], "[object Array]" === Object.prototype.toString.apply(i))…- 0
- 1
- 375
-
【脚本案例】素材本地文件重命名
介绍 在项目面板选择一个素材文件,输入替换内容,即可一键重命名,并且重新读取该文件。 源码 /** * 功能:在项目面板选择一个素材文件,输入替换内容,即可一键重命名,并且重新读取该文件 * 源码:https://www.yuelili.com/?p=17988 */ 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 save_name = palette.add('edittext {properties: {name: "save_name"'); save_name.text = "77"; save_name.helpTip = "输入新名称"; save_name.preferredSize.width = 100; var rename = palette.add("button", undefined, undefined, { name: "rename" }); rename.helpTip = "选择一个素材,然后单击"; rename.text = "重命名"; rename.preferredSize.width = 50; rename.onClick = rename_it function rename_it() { // 当前项目选择的文件 var selItem = app.project.selection[0] // 判断文件是否有本地文件 if (selItem.mainSource instanceof FileSource) { // 获取素材本地文件对象 var source_File = File(selItem.file.path + "/" + selItem.name) // 获取文件后缀 inx = selItem.name.lastIndexOf(".") endfix = selItem.name.substr(inx, 9) // 判断输入内容是否为空 if (save_name.text.length == 0) { alert("重命名后的名称不能为空") } else { // 本地文件重命名 source_File.rename(save_name.text + endfix) // 替换本地文件 selItem.replace(source_File) } } else { alert("当前文件无本地文件源") } } palette.layout.layout(true); palette.layout.resize(); palette.onResizing = palette.onResize = function () { this.layout.resize(); } if (palette instanceof Window) palette.show(); return palette; }());- 0
- 1
- 326
-
【脚本示例】随机添加效果
/** * souce:https://github.com/zlovatt/zl_Scriptlets * Adds a random AE effect to selected layers. * * @author Zack Lovatt <zack@zacklovatt.com> * @version 1.0.1 */ (function addRandomEffect() { var comp = app.project.activeItem; if (!(comp && comp instanceof CompItem)) { alert('Open a comp!'); return; } var layer = comp.selectedLayers[0]; if (!layer) { alert('No layer selected!'); return; } var layerEffects = layer.property('ADBE Effect Parade'); var numEffects = app.effects.length; var randomEffectNumber = numEffects * Math.random(0, numEffects - 1); var randomEffect = app.effects[Math.floor(randomEffectNumber)]; app.beginUndoGroup('Add Random Effect'); if (layerEffects.canAddProperty(randomEffect.matchName)) { layerEffects.addProperty(randomEffect.matchName); } app.endUndoGroup(); })();- 0
- 1
- 209
-
【AE脚本】照片墙 IMAGES WALL | 免费
来源 https://www.motionboutique.com 用法 在项目面板中选择一个文件夹。 执行脚本并调整参数(#rows、#cols、transition)。 单击创建。 源码 太长,见下载链接- 0
- 1
- 438
-
[AE脚本] 如何快速修改AE版本语言?
众所周知,修改AE版本的语言是到AE的安装目录下,修改一个名叫application.xml的文件 那既然涉及到了XML,那这个时候就有人问了?怎么读取XML? 那也是非常的简单,先new一个XML,然后把读取到的内容,放在XML里就行了,也是非常的简单,好像eval也行,不过推荐new XML,因为我没试过eval 那怎么调用XML的属性和值呢?推荐去看文档 那既然获得了XML对象,那怎么获得AE的安装目录呢?也是非常的简单,new一个File或者Folder出来,打印一下,你会发现内容是这样的: alert(new File().fsName) // F:\Adobe\Adobe After Effects 2024\Support Files\tmp00000001 那么开始写代码了 if (confirm('确定要切换AE语言吗?')) { var f = new File(new File().parent.toString() + '/AMT/application.xml'), l = prompt('请输入语言', app.isoLanguage); if (l && l.length >= 4) { f.open('r'); var t = new XML(f.read()); t.xpath("/Payload[@adobeCode='{AEFT-24.2.1-64-ADBEADBEADBEADBEADBEA}']/Data[@key='installedLanguages']")[0] = l; f.open('w'); if (f.write('<?xml version="1.0" encoding="utf-8"?>\n' + t)) { f.close(); alert('切换成功请重启AE'); } else { f.close(); alert('切换失败'); } } } 那么到这里就结束了- 0
- 1
- 243
-
AE[脚本](颜色选择器)
项目地址 源代码 (function() { "use strict"; var const_undef = void 0; var rgbNormalize = function(rgb) { return [ rgb[0] / 255, rgb[1] / 255, rgb[2] / 255 ]; }; var hsbNormalize = function(hsb) { return [ hsb[0] / 360, hsb[1] / 100, hsb[2] / 100 ]; }; var rgbToHex = function(rgb) { return "#" + ((rgb[0] << 16) + (rgb[1] << 8) + rgb[2]).toString(16); }; function hsbToRgb(hsb) { var _a = hsbNormalize(hsb), h = _a[0], s = _a[1], b = _a[2]; var r, g, _b; if (0 === s) { r = g = _b = b; } else { var i = Math.floor(6 * h); var f = 6 * h - i; var p = b * (1 - s); var q = b * (1 - s * f); var t = b * (1 - s * (1 - f)); switch (i % 6) { case 0: r = b, g = t, _b = p; break; case 1: r = q, g = b, _b = p; break; case 2: r = p, g = b, _b = t; break; case 3: r = p, g = q, _b = b; break; case 4: r…- 0
- 1
- 117
-
【脚本演示】修改纯色层尺寸为1920*1080
先选择纯色图层 var res = "palette { A: Button { text:'修改固态层尺寸' } }"; var win = new Window(res); win.show(); var button = win.A; var w = 1920, h = 1080; function setSolidLayerSize() { var solidLayer = app.project.activeItem.selectedLayers[0]; solidLayer.source.width = w; solidLayer.source.height = h; return solidLayer; } button.onClick = function () { setSolidLayerSize(); }- 0
- 0
- 199
-
【AE脚本】案例:移除所选图层的所有表达式
介绍 选择一个或者多个图层,会移除它们的所有表达式 ## 知识点 属性组/属性循环遍历:下面的[yl_keyword]recurse_children[/yl_keyword]函数 ## 源码 // 名称:移除所选图层的表达式 // 来源: // 源码:https://www.yuelili.com/?p=10427 app.beginUndoGroup(Remove all Expressions); { var comp = app.project.activeItem; var layerNumber = comp.selectedLayers.length; var chosenLayers = comp.selectedLayers; if (layerNumber >= 1) { for (var i = 0; i < layerNumber; i++) { var layerNames = chosenLayers[i].index; recurse_children(comp.layers[layerNames]); } } else { alert('no layer selected'); } function recurse_children(propParent) { if (propParent != null) { var prop; for (var i = 1; i <= propParent.numProperties; i++) { prop = propParent.property(i); switch (prop.propertyType) { case PropertyType.PROPERTY: if (prop.canSetExpression && prop.expression) prop.expression = ''; break; case PropertyType.INDEXED_GROUP: recurse_children(prop); break; case PropertyType.NAMED_GROUP: recurse_children(prop); break; default: break; } } } } } app.endUndoGroup();- 0
- 0
- 258
-
【AE脚本】怎么用AE脚本给文件重命名?
答:@草哥 获取文件夹,获取此文件的里面的文件,for循环一个个改名。 var newFolder=Folder('/D/MediaTools/output/'); var allFiles=newFolder.getFiles (); for(var i=0;i<allFiles.length;i++) { allFiles[i].rename(allFiles[i].displayName.split('_')[0]+'.jpg'); }- 0
- 0
- 391
-
【AE脚本】NT - 批量导入表达式(位置、缩放、不透明度)
[sc name="zhuanzai" author="NT" link="https://github.com/NTProductions/basic-expression-injector/blob/master/Expression%20Injector.jsx" ][/sc] 备注:我稍微改了下文字编辑区 //UI 构建 var mainWindow = new Window("palette", "表达式插入器", undefined); mainWindow.orientation = "column"; // 下拉菜单 var groupOne = mainWindow.add("group", undefined, "groupOne"); groupOne.orientation = "row"; groupOne.alignment = "left"; var dropDown = groupOne.add("dropdownlist", undefined, ["位置", "缩放", "不透明度"]); dropDown.selection = 0; // 表达式编辑区 var groupTwo = mainWindow.add("group", undefined, "groupTwo"); groupTwo.orientation = "row"; var expressionText = mainWindow.add('edittext {size: [200,80], properties: {name: "expressionText", multiline: true'); expressionText.text = "请输入表达式"; // 应用按钮 var groupThree = mainWindow.add("group", undefined, "groupThree"); groupThree.orientation = "row"; groupThree.alignment = "right"; var applyButton = groupThree.add("button", undefined, "应用表达式"); mainWindow.center(); mainWindow.show(); applyButton.onClick = function () { if (app.project.activeItem.selectedLayers.length < 1) { alert("请先选择图层", ""); return false; } else { app.beginUndoGroup("Expression Injection"); injectExpression(app.project.activeItem.selectedLayers); app.endUndoGroup(); } } function injectExpression(layerArray) { for (var i = 0; i < layerArray.length; i++) { layerArray[i].property(getPropertyName()).expression = expressionText.text; } alert("成功应用!", ""); } function getPropertyName() { switch (dropDown.selection.index) { case 0: return "Position"; break; case 1: return "Scale"; break; case 2: return "Opacity"; break; } }- 0
- 0
- 341
-
【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
-
【脚本问答】获取文件夹路径,比如说工程的文件夹,渲染输出的文件夹?
//获取项目工程的路径 app.project.file.fsName //设置渲染的路径 var Path = "/c/output/" var myRQ = proj.renderQueue; myRQ.item(i).outputModule(1).file=new File(Path); //获取渲染路径 myRQ.item(i).outputModule(1).file.fsName;- 0
- 0
- 243
-
【脚本问答】怎么给脚本加注册码 | 加密 验证
/@草哥 只说关键几步,具体需要自己写 //1.获取电脑的mac地址 //苹果机 var info=system.callSystem("ifconfig"); var patt = /[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}/ig; info = patt.exec(info); newMacArr = info[0].replace (/[:]/g, ""); //PC机 var info=system.callSystem("wmic nicconfig get macaddress"); var patt = /[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}:[0-9A-Z]{2}/ig; info = patt.exec(info); newMacArr = info[0].replace (/[:]/g, ""); // 2.对mac地址加密,变成注册码 //自己随便编个算法 var macAddress; var output=(macAddress*123/36+2-19)*3.14;//类似于这样 // 3.对比脚本算出来的和输入框里面的注册码是不是一样,一样的话脚本按钮才起作用 var code = "ef783vg3999bhs6" if(output === code){alert("Do something!")} // 4.如何把用户输入的注册码存起来? //看看getSetting()方法和saveSetting()方法- 0
- 0
- 262
-
【AE脚本】怎么设置渲染输出的模板和路径?
var templateName = "png" //写入你自己建的模板的名字 var myRQ= app.project.renderQueue; var numItems=app.project.renderQueue.numItems; var DefaultFolderPath="/c/output/" //设置你渲染的路径 for(var i=1;i<=myRQ.numItems;i++){ app.project.renderQueue.item(i).outputModule(1).applyTemplate(templateName); var oldName=myRQ.item(i).outputModule(1).file.name; myRQ.item(i).outputModule(1).file=new File(DefaultFolderPath+"/"+oldName); }- 0
- 0
- 580
-
【AE脚本】怎么把图片变成代码写入脚本?
var path='/c/test/'; var f= File(path+"1.png" ); f.encoding='BINARY'; f.open('e'); var binary; binary =f.read().toSource(); var myFile=new File ("/c/test/1.txt"); myFile.open("w"); myFile.encoding = "UTF-8"; myFile.write(binary); myFile.close(); $.writeln(binary); f.close();- 0
- 0
- 266
-
【AE脚本】如何用脚本打开一个网页
// 源码: https://www.yuelili.com/?p=13025 function urlOpen(url){ $.writeln(system.osName); if ( $.os.indexOf("Windows") != -1 ) { //Windows系统 system.callSystem("cmd.exe /c\"start "+url+"\"" ); }else{ //MAC系统 system.callSystem("open http://"+url+ "\""); } } //调用 urlOpen('https://baidu.com')- 0
- 0
- 188