-
【脚本案例】表达式小助手
界面 使用 快速保存与读取存储的表达式内容。丢在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
-
【脚本案例】素材本地文件重命名
介绍 在项目面板选择一个素材文件,输入替换内容,即可一键重命名,并且重新读取该文件。 源码 /** * 功能:在项目面板选择一个素材文件,输入替换内容,即可一键重命名,并且重新读取该文件 * 源码: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
-
【脚本开发】AE菜单命令
https://hyperbrew.co/blog/after-effects-command-ids 在After Effects中构建脚本或扩展时,有些无法通过API实现的,如撤销/重做、视口控制等。 Command IDs(菜单ID)这时就有了作业,本质上是模仿用户点击一个按钮的行为,或者触发特定功能的热键。 在API中,你总是可以尝试用名字来搜索你想要的命令。 var cmdId = app.findMenuCommandId('Redo'); // Result: 2371 获取菜单(撤销)的ID:2371 app.executeCommand(cmdId); // Execute Redo 执行它 问题是,这种方法相当繁琐,除非提前知道菜单名称。不同语言不同版本还不一样! 解决方案 https://hyperbrew.github.io/after-effects-command-ids 由于Adobe没有提供官方的命令ID列表,我们在React中建立了一个简单的查看器来快速搜索命令,并找到每个版本的After Effects的命令ID。 要使用一个命令,只需找到它的命令ID号,然后用以下方法执行它。 app.executeCommand(2035); 查看器从我们为每个版本的After Effects生成的一系列JSON文件中提取数据。(见下文) 它是如何工作的 没有文档,如何得出清单?幸运的是,它们在应用程序字典文件中。 所在地(中文为例):Adobe After Effects 2020\Support Files\Dictionaries\zh_CN\after_effects_zh_CN.dat "$$$/AE/MenuID/0003/Duplicate_2080=重复(&D)" 然后通过解析器运行该文件,将名称与命令ID分开。下面是我们写的一个解析器,是为了和Node.js脚本一起运行的,欢迎大家试一试。 const fs = require("fs"); const path = require("path"); const stream = require("stream"); const readline = require("readline"); const getCmdIds = (datFile) => { return new Promise((resolve) => { const instream = fs.createReadStream(datFile, "utf8"); const outstream = new stream(); const rl = readline.createInterface(instream, outstream); let menuIDs = {}; rl.on("line", (line) => { if (line.match(/\$\$\$\/AE\/MenuID/)) { line = line.substring(line.lastIndexOf("/") + 1); const data = line.match(/[a-z|A-Z|0-9]*\_[0-9]*/); if (data) { const name = data[0].match(/[a-z|A-Z|0-9]*\_/)[0].slice(0, -1); const number = data[0].match(/\_[0-9]*/)[0].substr(1); if (number && name) { menuIDs[number] = name; } } } }); rl.on("close", () => resolve(menuIDs)); }); }; const version = 2022; const datFile = C:/Program Files/Adobe/Adobe After Effects ${version}/Support Files/Dictionaries/es_ES/after_effects_es_ES.dat; getCmdIds(datFile).then((res) => { console.log(${Object.keys(res).length} Command IDs Found); const txt = JSON.stringify(res, null, "\t"); const outFile = path.join(__dirname, ${version}.json); fs.writeFileSync(outFile, txt, { encoding: "utf-8", }); console.log(File written to: ${outFile}); }); 解析器识别所有的命令ID及其相应的名称,然后将数据保存到一个JSON文件中。我们已经为每个版本的After Effects生成了JSON文件,从After Effects CC 2015到最新的After Effects CC 2022。 这些文件也可以在你自己的脚本或扩展中参考,你可以在下面下载它们。- 0
- 0
- 812
-
[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
-
用鼠伸缩放形状层,但不挤压描边宽度
概括一下思路: 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脚本】添加修剪调整图层 | 朝仓 | 免费
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
-
监听冲突(优化)
// 熊猫 var res = palette { orientation:'row', \ A: DropDownList { properties:{items:['A','B','C','D','E','F','G']} }, \ B: DropDownList { properties:{items:['A','B','C','D','E','F','G']} }, \ }; var win = new Window (res); win.show(); var L = win.A; L.selection = 0; var R = win.B; R.selection = 1; function A() { return 0 } function B() { return 0 } //========================错误的实现========================== L.onChange = function () {var i = this.selection.index; R.selection = B(); this.selection = i} R.onChange = function () {var i = this.selection.index; L.selection = A(); this.selection = i} //============================================================ //目前的问题:L绑定了监听,R绑定了监听,L值发生改变会使R的值发生改变,R值的改变又会触发R的监听,导致L的值被改变,反之亦然。 //期望的结果:L发生改变时,R的值发生改变,但不触发R的监听(或不执行相应的处理程序)。R发生改变时,L的值发生改变,但不触发R的监听(或不执行相应的处理程序)。 /*=======================一种解决方案========================= var change = false; function pass() { change ? change = false : change = true; } L.onChange = function () { pass(); if(change) R.selection = B(); pass();} R.onChange = function () { pass(); if(change) L.selection = A(); pass();} //===========================================================*/- 0
- 0
- 139
-
【AE脚本】文字图层与文字的一些操作
var myProject = app.project; var myComposition = myProject.items.addComp("happy_holidays", 1920, 1080, 1.0, 5, 24); //新建合成 var myTextLayer = myComposition.layers.addText("new_text_layer"); //新建文字图层 var myTextDocument = myTextLayer.property("ADBE Text Properties").property("ADBE Text Document") //添加文字对象 var textDocument1 = myTextDocument.value; myString = "Happy holidays!"; textDocument1.resetCharStyle(); //重置字体样式 textDocument1.fontSize = 60; //设置字体大小 textDocument1.fillColor = [1, 0, 0]; //设置填充颜色 textDocument1.strokeColor = [0, 1, 0]; //设置描边颜色 textDocument1.strokeWidth = 2; //设置描边宽度 textDocument1.font = "TimesNewRomanPSMT"; //设置字体 textDocument1.strokeOverFill = true; //设置描边在填充上 textDocument1.applyStroke = true; //设置描边 textDocument1.applyFill = true; //设置填充 textDocument1.text = myString; //文字内容 textDocument1.justification = ParagraphJustification.CENTER_JUSTIFY; //设置段落对齐 myTextDocument.setValue(textDocument1);- 0
- 0
- 401
-
【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
- 349
-
【脚本案例】导入预设文件 修改合成尺寸
用户需求 导入指定位置aep,并且基于选择的素材修改预设aep内合成大小 自定义 代码第10行:可以设置导入预设文件位置 代码第14行:可以设置修改合成内容(高宽、持续时间、帧速率) 源码 /** / https://www.yuelili.com/?p=18012 * 导入预设文件aep,并且基于项目面板选择的素材,批量修改合成尺寸等 */ var panelGlobal = this; var palette = (function () { // 用户自定义区。预设aep位置 var file = new File("F:/Footage/cell预设.aep") // 对合成进行修改内容,基于选择的素材。如果不想更改那么多,可以在每行前面加 “// “ 比如当前帧速率就不会随素材更改 function do_some_change(comp) { comp.width = selFootage.width // 合成宽度 comp.height = selFootage.height // 合成高度 // comp.frameRate = selFootage.frameRate // 合成帧速率 comp.duration = selFootage.duration // 合成持续时间 } // 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 = create_it // 主函数区 function create_it() { var selItems = app.project.selection if (selItems.length === 0) { alert("请在项目面板选择至少一个素材文件") } else { app.beginUndoGroup("import file") selFootage = selItems[0] // 导入预设 var itemFolder = app.project.importFile(new ImportOptions(file)); for (var i = 1; i <= itemFolder.numItems; i++) { var mainComp = itemFolder.item(i); // 判断顶级合成名称 if (mainComp.name == "合成1") { if (mainComp && mainComp instanceof CompItem) { // 嵌套合成处理 do_some_change(mainComp) app.beginUndoGroup("Comp Recursive"); previousComps = []; comp_recursive(mainComp); app.endUndoGroup(); } } } app.endUndoGroup() } } function comp_recursive(comp) { // 循环合成内的图层与子合成 for (var i =…- 0
- 0
- 286
-
【脚本案例】批量修改合成以及子合成信息
介绍 选择一个合成,设置参数,自动修改当前合成以及子合成信息 更新 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
-
[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脚本示例】如何从aep文件中提取其中的素材路径
function aepToPaths(aepFile){ var paths = [] aepFile.encoding = "BINARY"; aepFile.open ("r"); var content = aepFile.read(); aepFile.close(); content.replace(/\"fullpath\":\"([^"]*)\"/g,function(mstr,s1){ paths.push(File.decode(escape(s1))) return mstr }) return paths } var paths = aepToPaths(File("~/Desktop/abc.aep"))- 0
- 0
- 567
-
【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脚本】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
-
【脚本问答】怎么给脚本加注册码 | 加密 验证
/@草哥 只说关键几步,具体需要自己写 //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
-
【脚本案例】基于选择图层时间 创建新图层
来源:朝倉老师的基于当前选择图层创建调整图层如下 本脚本介绍 基于选择的图层创建新图层。 单击:只创建一个,时间为所有图层的起始与结束 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
-
【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脚本开发】必学!UI:一个按钮,单击执行功能
只要把你的函数放在函数区,然后单击按钮,就可以执行你的函数啦 比如我是单击按钮,alert一段文字。 你也可以把写好的脚本放在ae安装目录\Support Files\Scripts\ScriptUI Panels下,这样就可以停靠了。记得重启ae再打开 代码 /** * 作者:yueli * 源码:https://www.yuelili.com/?p=19664 */ 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 create = palette.add("button", undefined, undefined, { name: "create" }); create.helpTip = "提示文字"; create.text = "按钮名称"; create.preferredSize.width = 80; // 按钮长度 create.onClick = create_it // 绑定函数 // 主函数功能区 function create_it() { // 写你的功能 alert("hello world") } // UI 结束区(展示) 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
- 668
-
PSR归零
//熊猫 function sseett(ll) { //ll.property(String('castsShadows')).setValue(0); //ll.property(String('acceptsShadows')).setValue(0); //ll.property(String('acceptsLights')).setValue(0); ll.property(String('scale')).setValue([0,0,0]); ll.property(String('position')).setValue([0,0,0]); ll.property(String('rotation')).setValue(0); } var comp = app.project.activeItem; if(comp && comp.selectedLayers.length > 0){ for(var i = 0 ; i < comp.selectedLayers.length ; i++){ var layer = comp.selectedLayers[i]; sseett(layer); }; }else{ alert('您没有选中图层。'); };- 0
- 0
- 150
-
[AE脚本示例]一个标记管理器
简单的获取设置标记 Get: 当前选择图层 => 获取图层标记, 否则获取合成的 Set: 当前选择图层 => 设置图层标记, 设置获取合成的 放置 要丢在 scrip Ui 文件夹里 代码 // Author: 月离 // Version: 0.0.1 // 链接: https://www.yuelili.com/?p=22409 // Get: 当前选择图层 => 获取图层标记, 否则获取合成的 // Set: 当前选择图层 => 设置图层标记, 设置获取合成的 var panelGlobal = this; var palette = (function () { /* Code for Import https://scriptui.joonas.me — (Triple click to select): {"activeId":2,"items":{"item-0":{"id":0,"type":"Dialog","parentId":false,"style":{"enabled":true,"varName":"","windowType":"Palette","creationProps":{"su1PanelCoordinates":false,"maximizeButton":false,"minimizeButton":false,"independent":false,"closeButton":true,"borderless":false,"resizeable":false},"text":"Marker","preferredSize":[0,0],"margins":16,"orientation":"column","spacing":10,"alignChildren":["center","top"],"item-1":{"id":1,"type":"Button","parentId":0,"style":{"enabled":true,"varName":null,"text":"Get","justify":"center","preferredSize":[0,0],"alignment":null,"helpTip":null,"item-2":{"id":2,"type":"Button","parentId":0,"style":{"enabled":true,"varName":null,"text":"Set","justify":"center","preferredSize":[0,0],"alignment":null,"helpTip":null},"order":[0,1,2],"settings":{"importJSON":true,"indentSize":false,"cepExport":false,"includeCSSJS":true,"showDialog":true,"functionWrapper":true,"afterEffectsDockable":true,"itemReferenceList":"None" */ // PALETTE // ======= var palette = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) palette.text = "Marker"; palette.orientation = "column"; palette.alignChildren = ["center", "top"]; palette.spacing = 10; palette.margins = 16; var button1 = palette.add("button", undefined, undefined, { name: "button1" }); button1.text = "Get"; var button2 = palette.add("button", undefined, undefined, { name: "button2" }); button2.text = "Set"; var marker_time = [] button1.onClick = function () { app.beginUndoGroup("Get Marker Time"); var comp = app.project.activeItem; var selLayers = comp.selectedLayers; if (selLayers.length > 0) { marker_time = get_layer_marker_time(selLayers[0]) } else { marker_time = get_comp_marker_time(comp) } app.endUndoGroup(); } button2.onClick = function () { app.beginUndoGroup("Set Marker Time"); var comp = app.project.activeItem; var selLayers = comp.selectedLayers; if (selLayers.length > 0 && marker_time) { set_layer_marker_time(selLayers[0], marker_time) } else { set_comp_marker_time(comp, marker_time) } app.endUndoGroup(); } /** * @description:获取合成标记时间列表 * @param comp :合成 * @returns…- 0
- 0
- 280
-
一键RGB分离
效果展示 功能 选择一个图层,使用脚本。会基于当前图层,分离RGB,变成3个图层 知识点 撤销组 图层选择 图层复制 图层重命名 混合模式 图层添加属性 更改属性 源代码 /* AR_AddChromaticAberration Author: Arttu Rautio (aturtur) Website: http://aturtur.com/ Name-US: AR_AddChromaticAberration Description-US: Creates Chromatic aberration setup from selected comp item. Selected item should be a pre-comp or a layer that does not have any effects. github: https://github.com/aturtur/after-effects-scripts/blob/master/ Written for Adobe After Effects CC 2019 (Version 16.0.1 Build 48) */ //@target aftereffects // 这个函数没用到 不知道干嘛的 function rangeMap(value, minInput, maxInput, minOutput, maxOutput) { var remapped = (value - minInput) * (maxOutput - minOutput) / (maxInput - minInput) + minOutput return remapped } function ChromaticAberration() { // 创建撤销组 app.beginUndoGroup("AR_AddChromaticAberration"); // 选择一个图层 var comp = app.project.activeItem; var selectedLayer = comp.selectedLayers[0]; // 复制2个图层 var red = selectedLayer; var blue = selectedLayer.duplicate(); var green = selectedLayer.duplicate(); // 重命名为红绿蓝 red.name = "Red"; green.name = "Green"; blue.name = "Blue"; // 设置后2层的混合模式 green.blendingMode = BlendingMode.ADD; blue.blendingMode = BlendingMode.ADD; // 分别为R/G/B图层添加属性 var rchan = red.Effects.addProperty("Set Channels"); rchan.property("Set Red To Source 1’s").setValue(1); // 设置 red channel 为'Red' rchan.property("Set Green To Source 2’s").setValue(10); // 设置 green channel 为 'Off' rchan.property("Set Blue To Source 3’s").setValue(10); // 设置 blue channel 为 'Off' var gchan = green.Effects.addProperty("Set Channels"); gchan.property("Set Red To Source 1’s").setValue(10); // 设置 red channel 为 'Off' gchan.property("Set Green To Source 2’s").setValue(2);…- 0
- 0
- 240
-
自定义绘图-画圆 v1.0
//自定义绘图-画圆 v1.0 2022-04-05 //Raymond Yan 2022 (RaymondClr@outlook.com / QQ: 1107677019) var palette = new Window("palette{properties:{resizeable:true},canvas:Custom{type:'customView'"); palette.alignChildren = ["center", "center"]; palette.margins = 0; //一个窗口事件侦听,在调整窗口边界时,让画板实时居中。 palette.onResizing = function () { this.layout.resize(); }; var 画板 = palette.canvas; //画板大小 画板.size = [600, 600]; var 描边宽度 = 5; var 描边颜色 = [1, 1, 1, 1]; var 填充颜色 = [1, 0, 0, 1]; var 笔刷类型 = 画板.graphics.PenType.SOLID_COLOR; var 钢笔 = 画板.graphics.newPen(笔刷类型, 描边颜色, 描边宽度); var 笔刷 = 画板.graphics.newBrush(笔刷类型, 填充颜色); 画板.onDraw = function () { var 圆左上角起点x = 描边宽度, 圆左上角起点y = 描边宽度, //设置起点等于描边宽度以及减去描边宽度*2都是为了防止描边超出画板被裁切 圆右下角终点x = 画板.size[0] - 描边宽度 * 2, 圆右下角终点y = 画板.size[1] - 描边宽度 * 2; //用控件的ellipsePath方法画圆 画板.graphics.ellipsePath(圆左上角起点x, 圆左上角起点y, 圆右下角终点x, 圆右下角终点y); //描边要用钢笔 画板.graphics.strokePath(钢笔); //填色要用笔刷 画板.graphics.fillPath(笔刷); }; palette.show();- 0
- 0
- 336
-
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
-
【脚本案例】关键帧时间复刻
介绍 选择一个带关键帧的属性,单击抓手拾取时间。选择新的属性们,单击应用,会基于时间生成线性关键帧 应用前 应用后 源码 /** * 名称:关键帧时间复刻(或叫关键帧复刻) * 功能:选择一个带关键帧的属性,单击抓手拾取时间。选择新的属性们,单击应用,会基于时间生成线性关键帧 * V1.2 : 忘了每次拾取的时候,把时间列表先清空了 >_< * V1.1 :忘了加撤销组,补上 * V1.0 * 源码:https://www.yuelili.com/?p=18058 */ var panelGlobal = this; var main = (function () { /* Code for Import https://scriptui.joonas.me — (Triple click to select): {"activeId":4,"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":false,"resizeable":false},"text":"提醒保存小助手","preferredSize":[0,0],"margins":16,"orientation":"row","spacing":10,"alignChildren":["center","top"],"item-3":{"id":3,"type":"Image","parentId":0,"style":{"enabled":true,"varName":"catch_img","image":["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACS0lEQVRIieWWTYhOURjH/6/NlGZYSZMFpcRM5CMki9mILCilxIyYhGQ1WShKKTWl2WiYbLBBPsdi8jmLaUqU2FjZTSYlJh8ZNSNeP536vzneeee991zLeerpnOe5z//+3nPuuc97NeOsVFkwkLL2+ZJ6JU1K6pL0Ka+wVCr9mwjgBH/IX7uWop1iCeKjRrYBOz3fnQqeVeBstXgclvTE82aPg2ENksYkrah3kyzwYkkjvtkF535E1395/CapR9ImSd2SypKGci1jmq35CnwEbntLDwNdnofrDZ6fA74D/c63O99a5BlvrBK/BN4CfRG45PmIx23OX3E8rwh4ucWdjg85HvVOVOrGnR+PcsEGPN8KLE091cEeed4ETDr3Iar54twNxxscXwReR69dd9ihvOD+aFuDX68BflG1zb2Oy8AE0AIcce5MXvA+C9Y6Xu34alSzAFgfxe+iVa50bp3jS3nBTRb05GwQayLo9ig/6tzmvODgb4D3OcGNwGNgf5Q7ZWhHass8YeGihLZa8WZrX2Wd6mXAmIuHgDnAQsd7CoDvWttaD7zF3eezX6GKDXi8kwhts+5sVgO55cJVLpoN3Ix+wHAieNC6xizwMRdervGcTgNLEqBzoyaiLHDwkxbcK/A8Y++oev8zwcGPWzT4H+D7VR0vFzj4QQufFgQT/UUmgYPv8g2eJUIr3auzKDiGp6z8fK3TnAqW21+wBznB5Xq7lAIOfoA0a88Cp3zQ75C0V9KEpJ/+AAz+O6ppkPRcUt90N5nyQT8zTNIfh/Zbfkki7F0AAAAASUVORK5CYII="],"alignment":null,"helpTip":null,"item-4":{"id":4,"type":"Image","parentId":0,"style":{"enabled":true,"varName":"apply_img","image":["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAABz0lEQVRIie2WyyvFQRTHP9c7JNkoZUHyKI9sbC1kwcZKSbbIRkphY+NfsCO2ZOORndW1sWF7S1IWEqXIKxJHP82vpuk385vxWvnWNOfeOXc+c2buOTP866+U0TkiEpuzQJPnGt6BXWArzTGTySQPiEiRiKzI19QTLdzVrBKR+S9CIz2ISL4vuMBYRKtmbwBZ8zjMTQKmgXqgDKgAbtK2PAn8pNnrwKbHHH0KLL7QJLC+HzXGWDvQoXxivzegUfMZBR61XSoEjoGDNLBNa8BQik8EW7KMRUc2ApzHX+R5QNs8oGnqBuZ0Hx9w1zehsapCwS8/BH4OBTsynx1gDLgNXYUL/G70SYrObRnoBO6+A87X7Hiie8fva1V/pmr7oy/YTKdizV4AJoBydWm8GVUssnPa50uV53tAne8CPiUiA5Y67Cz+Rhu2zLHqingb6AcWVRlEldFBFbGpfeDa2LGZoGhVxHqrVG3ccSP1av4FInLi8HVGrCtOkSuHz4XqS4EjoME3SJ88LnOMRTncAhwCzb5QX7DrPp5U/+yWEKgvuCR0UouKQsE5Dx8fvVp9HLmZDXh7JelURNp0lu15a6oamFJ9qO7UAyFnfd7+69cEfACTHfD/B8fzSAAAAABJRU5ErkJggg=="],"alignment":null,"helpTip":null},"order":[0,3,4],"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"); if (!(panelGlobal instanceof Panel)) main.text = "关键帧时间复刻"; main.orientation = "row"; main.alignChildren = ["center", "top"]; main.spacing = 10; main.margins = 16; var catch_img_imgString = "%C2%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%1E%08%06%00%00%00%3B0%C2%AE%C2%A2%00%00%02KIDATH%C2%89%C3%A5%C2%96M%C2%88NQ%18%C3%87%C3%BF%C2%AF%C3%8D%C2%94fXI%C2%93%05%C2%A5%C3%84L%C3%A4%23%24%C2%8B%C3%99%C2%88%2C(%C2%A5%C3%84%C2%8C%C2%98%C2%84d5Y(J)5%C2%A5%C3%99h%C2%98l%C2%B0A%3E%C3%87b%C3%B29%C2%8BiJ%C2%94%C3%98X%C3%99M%26%25%26%1F%195%23%5E%3F%C2%9D%C3%BA%C2%BF9%C3%9Ey%C3%A7%C2%BD%C3%B7%5C%C3%8By%C3%AA%C3%A9%C2%9C%C3%A7%C2%B9%C3%8F%C3%BF%C3%BE%C3%9Es%C3%AE%C2%B9%C3%8F%7B5%C3%A3%C2%ACTY0%C2%90%C2%B2%C3%B6%C3%B9%C2%92z%25MJ%C3%AA%C2%92%C3%B4)%C2%AF%C2%B0T*%C3%BD%C2%9B%08%C3%A0%04%7F%C3%88_%C2%BB%C2%96%C2%A2%C2%9Db%09%C3%A2%C2%A3F%C2%B6%01%3B%3D%C3%9F%C2%9D%0A%C2%9EU%C3%A0l%C2%B5x%1C%C2%96%C3%B4%C3%84%C3%B3f%C2%8F%C2%83a%0D%C2%92%C3%86%24%C2%AD%C2%A8w%C2%93%2C%C3%B0bI%23%C2%BE%C3%99%05%C3%A7~D%C3%97%7Fy%C3%BC%26%C2%A9G%C3%92%26I%C3%9D%C2%92%C3%8A%C2%92%C2%86r-c%C2%9A%C2%AD%C3%B9%0A%7C%04n%7BK%0F%03%5D%C2%9E%C2%87%C3%AB%0D%C2%9E%C2%9F%03%C2%BE%03%C3%BD%C3%8E%C2%B7%3B%C3%9FZ%C3%A4%19o%C2%AC%12%C2%BF%04%C3%9E%02%7D%11%C2%B8%C3%A4%C3%B9%C2%88%C3%87m%C3%8E_q%3C%C2%AF%08x%C2%B9%C3%85%C2%9D%C2%8E%0F9%1E%C3%B5NT%C3%AA%C3%86%C2%9D%1F%C2%8Fr%C3%81%06%3C%C3%9F%0A%2CM%3D%C3%95%C3%81%1Ey%C3%9E%04L%3A%C3%B7!%C2%AA%C3%B9%C3%A2%C3%9C%0D%C3%87%1B%1C_%04%5EG%C2%AF%5Dw%C3%98%C2%A1%C2%BC%C3%A0%C3%BEh%5B%C2%83_%C2%AF%01~Q%C2%B5%C3%8D%C2%BD%C2%8E%C3%8B%C3%80%04%C3%90%02%1Cq%C3%AEL%5E%C3%B0%3E%0B%C3%96%3A%5E%C3%AD%C3%B8jT%C2%B3%00X%1F%C3%85%C3%AF%C2%A2U%C2%AEtn%C2%9D%C3%A3Ky%C3%81M%16%C3%B4%C3%A4l%10k%22%C3%A8%C3%B6(%3F%C3%AA%C3%9C%C3%A6%C2%BC%C3%A0%C3%A0o%C2%80%C3%B79%C3%81%C2%8D%C3%80c%60%7F%C2%94%3BehGj%C3%8B%3Ca%C3%A1%C2%A2%C2%84%C2%B6Z%C3%B1fk_e%C2%9D%C3%AAe%C3%80%C2%98%C2%8B%C2%87%C2%809%C3%80B%C3%87%7B%0A%C2%80%C3%AFZ%C3%9BZ%0F%C2%BC%C3%85%C3%9D%C3%A7%C2%B3_%C2%A1%C2%8A%0Dx%C2%BC%C2%93%08m%C2%B3%C3%AElV%03%C2%B9%C3%A5%C3%82U.%C2%9A%0D%C3%9C%C2%8C~%C3%80p%22x%C3%90%C2%BA%C3%86%2C%C3%B01%17%5E%C2%AE%C3%B1%C2%9CN%03K%12%C2%A0s%C2%A3%26%C2%A2%2Cp%C3%B0%C2%93%16%C3%9C%2B%C3%B0%3Cc%C3%AF%C2%A8z%C3%BF3%C3%81%C3%81%C2%8F%5B4%C3%B8%1F%C3%A0%C3%BBU%1D%2F%178%C3%B8A%0B%C2%9F%16%04%13%C3%BDE%26%C2%81%C2%83%C3%AF%C3%B2%0D%C2%9E%25B%2B%C3%9D%C2%AB%C2%B3(8%C2%86%C2%A7%C2%AC%C3%BC%7C%C2%AD%C3%93%C2%9C%0A%C2%96%C3%9B_%C2%B0%079%C3%81%C3%A5z%C2%BB%C2%94%02%0E~%C2%804k%C3%8F%02%C2%A7%7C%C3%90%C3%AF%C2%90%C2%B4W%C3%92%C2%84%C2%A4%C2%9F%C3%BE%00%0C%C3%BE%3B%C2%AAi%C2%90%C3%B4%5CR%C3%9Ft7%C2%99%C3%B2A%3F3L%C3%92%1F%C2%87%C3%B6%5B~I%22%C3%AC%5D%00%00%00%00IEND%C2%AEB%60%C2%82"; var catch_img = main.add("image", undefined, File.decode(catch_img_imgString), { name: "catch_img" }); catch_img.addEventListener("click", catch_it, false) var apply_img_imgString = "%C2%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%1E%08%06%00%00%00%3B0%C2%AE%C2%A2%00%00%01%C3%8FIDATH%C2%89%C3%AD%C2%96%C3%8B%2B%C3%85A%14%C3%87%3F%C3%97%3B%24%C3%99(eA%C3%B2(%C2%8Fll-d%C3%81%C3%86JI%C2%B6%C3%88FJac%C3%A3_%C2%B0%23%C2%B6d%C3%A3%C2%91%C2%9D%C3%95%C2%B5%C2%B1a%7BKR%16%12%C2%A5%C3%88%2B%12G%3F%C3%8D%C2%AF%C2%A6%C3%A97%C3%B3%C2%9B%C3%B1Z%C3%B9%C3%964%C3%A7%C3%9E9w%3Esf%C3%AE93%C3%BC%C3%AB%C2%AF%C2%94%C3%919%22%12%C2%9B%C2%B3%40%C2%93%C3%A7%1A%C3%9E%C2%81%5D%60%2B%C3%8D1%C2%93%C3%89%24%0F%C2%88H%C2%91%C2%88%C2%AC%C3%88%C3%97%C3%94%13-%C3%9C%C3%95%C2%AC%12%C2%91%C3%B9%2FB%23%3D%C2%88H%C2%BE%2F%C2%B8%C3%80XD%C2%ABfo%00Y%C3%B38%C3%8CM%02%C2%A6%C2%81z%C2%A0%0C%C2%A8%00n%C3%92%C2%B6%3C%09%C3%BC%C2%A4%C3%99%C3%AB%C3%80%C2%A6%C3%87%1C%7D%0A%2C%C2%BE%C3%90%24%C2%B0%C2%BE%1F5%C3%86X%3B%C3%90%C2%A1%7Cb%C2%BF7%C2%A0Q%C3%B3%19%05%1E%C2%B5%5D*%04%C2%8E%C2%81%C2%834%C2%B0Mk%C3%80P%C2%8AO%04%5B%C2%B2%C2%8CEG6%02%C2%9C%C3%87_%C3%A4y%40%C3%9B%3C%C2%A0i%C3%AA%06%C3%A6t%1F%1Fp%C3%977%C2%A1%C2%B1%C2%AAB%C3%81%2F%3F%04~%0E%05%3B2%C2%9F%1D%60%0C%C2%B8%0D%5D%C2%85%0B%C3%BCn%C3%B4I%C2%8A%C3%8Em%19%C3%A8%04%C3%AE%C2%BE%03%C3%8E%C3%97%C3%ACx%C2%A2%7B%C3%87%C3%AFkU%7F%C2%A6j%C3%BB%C2%A3%2F%C3%98L%C2%A7b%C3%8D%5E%00%26%C2%80rui%C2%BC%19U%2C%C2%B2s%C3%9A%C3%A7K%C2%95%C3%A7%7B%40%C2%9D%C3%AF%02%3E%25%22%03%C2%96%3A%C3%AC%2C%C3%BEF%1B%C2%B6%C3%8C%C2%B1%C3%AA%C2%8Ax%1B%C3%A8%07%16U%19D%C2%95%C3%91A%15%C2%B1%C2%A9%7D%C3%A0%C3%9A%C3%98%C2%B1%C2%99%C2%A0hU%C3%84z%C2%ABTm%C3%9Cq%23%C3%B5j%C3%BE%05%22r%C3%A2%C3%B0uF%C2%AC%2BN%C2%91%2B%C2%87%C3%8F%C2%85%C3%AAK%C2%81%23%C2%A0%C3%817H%C2%9F%3C.s%C2%8CE9%C3%9C%02%1C%02%C3%8D%C2%BEP_%C2%B0%C3%AB%3E%C2%9ET%C3%BF%C3%AC%C2%96%10%C2%A8%2F%C2%B8%24tR%C2%8B%C2%8AB%C3%819%0F%1F%1F%C2%BDZ%7D%1C%C2%B9%C2%99%0Dx%7B%25%C3%A9TD%C3%9At%C2%96%C3%ADyk%C2%AA%1A%C2%98R%7D%C2%A8%C3%AE%C3%94%03!g%7D%C3%9E%C3%BE%C3%AB%C3%97%04%7C%00%C2%93%1D%C3%B0%C3%BF%07%C3%87%C3%B3H%00%00%00%00IEND%C2%AEB%60%C2%82"; var apply_img = main.add("image", undefined, File.decode(apply_img_imgString), { name: "apply_img" }); apply_img.addEventListener("click", apply_it, false) // 全局变量 var time_list = [] // 记住属性的关键帧时间 function get_key_time(prop) { time_list = [] var selKeyList = prop.selectedKeys if (selKeyList.length > 0) { for (var j = 0; j < selKeyList.length; j++) { var k = prop.keyTime(selKeyList[j]) time_list.push(k) } } return time_list } function apply_key(propGroup, time_list) { for (var i = 0; i < propGroup.length; i++) { prp = propGroup[i] for (var j = 0; j < time_list.length; j++) { prp.setValueAtTime(time_list[j], prp.valueAtTime(time_list[j],true)) } } } // prp.setValueAtTime(time, newValue) // 记住属性 function rem_prop_group(propGroup) { var rem_prop_group_res =…- 0
- 0
- 233