-
【脚本案例】表达式小助手
界面 使用 快速保存与读取存储的表达式内容。丢在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脚本】翻译小助手 | 一键获取效果所有属性
使用前 记得打开 编辑-> 首选项 -> 脚本与表达式 -> 允许脚本访问网络与文件读写 更新 0.0.3 修复了下,少var了一个变量。 使用方法 把文件放在AE脚本路径的UI Panel 文件夹里。 运行ae 选择一个图层,点击“翻译”按钮,将获取图层中的效果的所有参数,并保存到桌面文件(AE translattion xxx.txt)。 后续做笔记啊 弄中英对照都会方便很多 源码 /* 名称:翻译小助手 * 版本号:0.0.2 * 说明:选择一个图层,点击“翻译”按钮,将获取图层中的效果的所有参数,并保存到桌面。 * 源码:https://www.yuelili.com/?p=21499 */ var panelGlobal = this; var dialog = (function () { // UI开始 var dialog = (panelGlobal instanceof Panel) ? panelGlobal : new Window("palette"); if (!(panelGlobal instanceof Panel)) dialog.text = "翻译小助手0.0.1"; dialog.orientation = "column"; dialog.alignChildren = ["center", "top"]; dialog.spacing = 10; dialog.margins = 16; var btn = dialog.add("button", undefined, undefined, { name: "btn" }); btn.helpTip = "选择要翻译的图层"; btn.text = "开始获取属性名称"; btn.onClick = myFunction; // 函数功能区 var res = "" File.prototype.write_file = File.prototype.write_file || function (data) { this.open('w', undefined, undefined); this.encoding = "UTF-8"; this.write(data); this.close(); } function property_recursive(propertyGroup) { for (var i = 1; i <= propertyGroup.numProperties; i++) { var property = propertyGroup.property(i); if (property instanceof PropertyGroup) { property_recursive(property); res += "----\n\n" continue; } res += property.name + "\n"; } } function effect_recursive(layer) { var eff = layer.property("ADBE Effect Parade"); for (var i = 1, l = eff.numProperties; i <= l; i++) { res += "-------" + eff(i).name + "| Start-------\n" property_recursive(eff(i)) // 对每个效果进行操作 res += "-------" + eff(i).name + "| End-------\n" } } function get_format_time() { var nowDate =…- 0
- 0
- 1.2k
-
AE内置效果预览包v1.0
https://www.bilibili.com/video/BV1rM4y1N7pD/ 使用AEViewer,进行AE内置效果预览及运用 能力一般,水平有限 加上时间原因,以下几类效果未做成预览(期待有想法的同学一起完善) Audio - 音频 Channel - 通道 Color Correction - 颜色校正 Immersive Video - 沉浸式视频 Obsolete - 过时 Utility - 实用工具 *本效果整合包大部分效果为 次元饺子(B站)制作 *小部分效果以及脚本整合为 JimWho (B站)制作 *(效果包本人测试版本AE2020,使用效果有问题及时联系我)- 0
- 0
- 963
-
【AE脚本】手柄控制升级版 Create Nulls From Paths
Create Nulls From Paths EXTENDED在 AE 2018 中,Adobe 引入了使用表达式控制路径的可能性,与该版本一起出现的是由 Adobe 创建的 Create Nulls From Paths。 这是对 After Effects 的路径功能一个很好的补充,但缺少一些功能。这和Create Nulls From Paths师出同源,但它扩展了一些更多的功能。 除了对脚本的一些小改进外,添加的功能还有:从选定的创建路径、手柄控件、使用定位器,可以更精确控制路径,也可以方便制作贝塞尔曲线可视化。 该脚本适用于 AE 2018 及更高版本,由Thor Sarup添加了这些重大改进。 /* Create Nulls From Paths.jsx v.0.5 Attach nulls to shape and mask vertices, and vice-versa. Changes: - wraps it all in an IIFE - fixes call to missing method array.indexOf */ /* Extended version by crunchycph.dk - youtube.com/c/crunchycphdk Added features: - Add controls for bezier handles - Use locators instead of nulls - Create path from nulls - Uniform bezierepath - Auto soft / round corners - Close path - Save settings - Responsive interface Possibly upcoming features: - Parent nulls to shape layer - Remove controls from path - Option to create locator master style */ /* Modified by Thor Sarup - Ability to rotate / scale points (handles follow) - locked rotation and scaling of handles (only for indicators) - sets handles to shy - renamed script to Path tools to save precious panel space :) */ /* Update by crunchy 30. oct. 2017 - Fixed bug when both handle controls and use locators was selected for Create Path From Selected - Renamed the plugin back to it's original, since…- 0
- 0
- 815
-
【脚本开发】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
-
用鼠伸缩放形状层,但不挤压描边宽度
概括一下思路: 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
-
-
【脚本归纳】常见变量与函数归纳
有时候,在逻辑上要先判断所属关系,再进行下一步,因此整一个判断汇总 常规 // 变量篇 var comp = app.project.activeItem; // 当前激活的合成 var items = app.project.selection; // 项目面板的选择项目集合 var selLayers = app.project.activeItem.selectedLayers; // 当前合成的图层选择列表 var layerSelProps = layer.selectedProperties; // 当前图层/合成的属性选择列表。合成要用合成.selectedProperties var propSelKeys = prop.selectedKeys; // // 数量 arr.length; // 普通列表 arr[i] project.numItems; // 项目面板的项目集 project.item(i) comp.numLayers; // 合成里的图层集 comp.layer(i) propGroup.numProperties; // 属性组里的属性集 propGroup.property(i) // 撤销组 app.beginUndoGroup("My Undo Group 01"); app.endUndoGroup(); 判断 普通判断 // 常见判断对象 xx instanceof ↓ PropertyGroup 属性组 CompItem 合成 ShapeLayer 形状图层 Folder 文件夹 p.propertyType = PropertyType.PROPERTY // 判断是不是一个普通属性 判断图层类型 //判断图层类型 var theLayer = 你的图层 // 自己定义下 if (theLayer instanceof AVLayer) { if (theLayer.source instanceof CompItem) { alert("合成"); } else if (theLayer.source instanceof FootageItem) { if (theLayer.nullLayer) { alert("空对象"); } else if (theLayer.source.mainSource instanceof SolidSource) { if (theLayer.adjustmentLayer == true) { alert("调整图层"); } else if (theLayer.frameBlendingType) { alert("纯色图层"); } else { alert("空对象"); } } else { alert("素材"); } } } else { alert("不是 AV"); } // 或者使用构造器 layer.constructor.name === "ShapeLayer"; 遍历 遍历选择的图层 var comp = app.project.activeItem; // 活动合成 var slLayers = comp.selectedLayers; // 选择图层集 var layerNumber = comp.selectedLayers.length; // 选择图层个数 if(layerNumber >= 1){ for(var i = 0,l = layerNumber; i < l; i++){ // 对选择图层逐个操作 slLayers[i].XXX } } 遍历合成里的图层(不检测子合成) var comp = app.project.activeItem; // 活动合成 for (var ii…- 0
- 0
- 706
-
【AE脚本开发】颜色转换
[sc name="zhuanzai" author="jonathantneal" link="https://github.com/jonathantneal/convert-colors/tree/master/src" ][/sc] HEX and RGB @无名 正则hex转rgb function hexToRgb(hex) { var result; hex = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/gi, '$1$1$2$2$3$3'); hex.replace(/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/gi, function (match, $1, $2, $3) { result = [parseInt($1, 16), parseInt($2, 16), parseInt($3, 16)]; }); return result; } function hex2rgb(hex) { // #<hex-color>{3,4,6,8} const hexColorMatch = /^#?(?:([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?)$/i; const [, r, g, b, a, rr, gg, bb, aa] = hex.match(hexColorMatch) || []; if (rr !== undefined || r !== undefined) { const red = rr !== undefined ? parseInt(rr, 16) : parseInt(r + r, 16); const green = gg !== undefined ? parseInt(gg, 16) : parseInt(g + g, 16); const blue = bb !== undefined ? parseInt(bb, 16) : parseInt(b + b, 16); const alpha = aa !== undefined ? parseInt(aa, 16) : a !== undefined ? parseInt(a + a, 16) : 255; return [red, green, blue, alpha].map(c => c * 100 / 255); } return undefined; } export function rgb2hex(rgbR, rgbG, rgbB) { return `#${((1 << 24) + (Math.round(rgbR * 255 / 100) << 16) + (Math.round(rgbG * 255 / 100) << 8) + Math.round(rgbB * 255 / 100)).toString(16).slice(1)}`; } HSL and hsv function hsl2hsv(hslH, hslS, hslL) { const hsv1 = hslS * (hslL < 50 ? hslL…- 0
- 0
- 672
-
[AE脚本] 笔记向: 获取所有效果的更改参数
最近在学赤动的教程, 顺手想写写笔记, 但是效果太多了而且截图好麻烦, 于是写个脚本, 用来获取已选图层上, 所有效果中, 参数更改的内容, 并发送到剪切板, 效果如下 ____________ Curves ____________ VC Color Vibrance Brightness: 0.5 Matte Alpha: 2 ____________ Glow Glow Radius: 100 ____________ Glow 2 Glow Threshold: 97.5 Glow Radius: 100 更新 2023/7/20: 修复某些属性获取不了的问题, 加了个try顶一下, 暂时没空研究 2023/7/6: 追加表达式更改检测 脚本源码 只需复制内容, 新建一个getAllChangeProperties.jsx 文件,然后记事本打开, 粘贴进去, 再用ae调用即可 // 源码: https://www.yuelili.com/?p=22695 // 介绍: 获取当前选择图层所有效果已更改的属性名和数值 // 字符串发送到剪切板 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 + ' | clip"'; system.callSystem(cmdCommand); } else if (Folder.fs === "Macintosh") { var osaCommand = 'cat "' + tempFile.fsName + '" | pbcopy'; system.callSystem("osascript -e '" + osaCommand + "'"); } else { alert("Unsupported operating system."); } // 删除临时文件 tempFile.remove(); } var activeComp = app.project.activeItem; if (activeComp instanceof CompItem) { var selectedLayer = activeComp.selectedLayers[0]; if (selectedLayer) { var effects = selectedLayer.property("ADBE Effect Parade"); var result = "" // 遍历所有效果 for (var i = 1; i <= effects.numProperties; i++) { var effect = effects.property(i); // 检查效果是否被更改 if (effect.isModified) { var effectName = effect.name; result += "\n\n---\n\n"; result += "\n" + effectName; var numProperties = effect.numProperties; // 遍历属性 for (var j = 1; j <= numProperties; j++) {…- 0
- 0
- 668
-
【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
- 667
-
【AE脚本】自动全景变焦 PAN & ZOOM | 免费
来源 https://www.motionboutique.com 用法 执行脚本,然后在电脑上选择一个图像文件夹。还是可以研究下源码的 源码 // PanZoom.jsx // Copyright (c) 2011 Motion Boutique function createPanZoom(comp, layer) { var rulesOfThirdsPoints = [[1 / 3, 1 / 3], [2 / 3, 1 / 3], [1 / 3, 2 / 3], [2 / 3, 2 / 3]]; // points of interest in image var zoomModes = ["IN", "OUT"]; var rdIdx = Math.floor(Math.random() * rulesOfThirdsPoints.length); var f = rulesOfThirdsPoints[rdIdx]; var deltaZoomPoint = [f[0] * comp.width, f[1] * comp.height] - [comp.width / 2, comp.height / 2]; var rdIdx = Math.floor(Math.random() * zoomModes.length); var zoomMode = zoomModes[rdIdx]; var keyTimes = [panZoomStart, panZoomEnd]; var keyValues; switch (zoomMode) { case "IN": keyValues = [[100, 100], [150, 150]]; break; case "OUT": keyValues = [[150, 150], [100, 100]]; break; default: break; } var nullL = comp.layers.addNull(); layer.scale.expression = "sx = 100 * thisComp.width / width; \r" + "sy = 100 * thisComp.height / height; \r" + "s = Math.max(sx,sy); \r" + "[s,s];"; layer.parent = nullL; nullL.anchorPoint.setValue(nullL.anchorPoint.value + deltaZoomPoint); nullL.position.setValue(nullL.position.value + deltaZoomPoint); nullL.scale.setValuesAtTimes(keyTimes, keyValues); } function isInArray(array, element) { var found = false; for (var i = 0; !found && i < array.length; i++) { if (array[i] == element) found = true; } return found; } function isImageFile(fileName) { var ext…- 0
- 0
- 652
-
【AE脚本】深度遍历文件并删除(用于清理磁盘缓存)
//取得缓存文件夹的位置(使用预设函数) var CacheFilePath = app.preferences.getPrefAsString("Disk Cache Controls", "Folder 7")+"\\Adobe"; //将单斜杠转为双斜杠 var FullCacheFilePath = CacheFilePath.split('\\').join("\\\\"); removeFolder(FullCacheFilePath); function removeFolder(path) { var folder = new Folder(path); var files = folder.getFiles(); for (var i = 0; i < files.length; i++) { var f = files[i]; //如果该数组位置指向的类型是文件就移除 if (f instanceof File) { f.remove(); } //如果该数组位置指向的类型是文件夹就进入文件夹判断 else if (f instanceof Folder) { removeFolder(f.fullName, true); } } } //感谢熊喵、萝莉还有无名的帮助,我的代码真的太菜了 //基本靠着大家哄孩子式细微的帮助才写了这么一段- 0
- 0
- 640
-
【AE脚本开发】给脚本写个联网激活机制
/* 激活流程: 1.用户填写授权码; 2.利用授权码与机器码生成网页链接; 3.脚本调用curl程序访问链接。如果授权码有效,得到服务器通过机器码计算出来的激活码;否则得到服务器返回的授权码不可用。 4.将激活码存于本地。 说明:重装系统等原因导致本地激活码丢失,电脑需要再次激活时,只需联网验证机器码即可,无需再次填授权码。这个步骤自己扩展,这里写首次激活的示例。 */ //打开注册面板 function zhuCe(){ if(pc.pcJQM.length == 0 && (!isMac ())){ alert ("请先启用已禁用的网卡!\n然后关闭脚本重新打开。","无法验证激活状态!"); system.callSystem("cmd.exe /c ncpa.cpl"); return; } var zhuCeW = new Window("dialog", "注册"); var res = "group {\ orientation:'column', alignment:['fill','fill'],preferredSize:[0,0] \ GG: Group { \ orientation:'row', alignment:['fill','fill'],preferredSize:[0,0] \ }, \ fen: Panel { alignment:['fill','top'],preferredSize:[300,2] }, \ GG2: Group{\ orientation:'column', alignment:['fill','fill'],preferredSize:[0,0] \ t1 : Group { alignment:['fill','center']\ text: StaticText { text:'注册码:', alignment:['left','center'] }, \ passText: EditText { text:'', characters:20, alignment:['fill','center'] }, \ },\ btn: Group { \ orientation:'row', alignment:['fill','fill'],preferredSize:[0,0] \ zhuCe: Button { text:'注册', alignment:['right','center'],preferredSize:[150,30] }, \ gouMai: Button { text:'去淘宝购买注册码', alignment:['left','center'],preferredSize:[150,30] }, \ }, \ },\ }"; zhuCeW.gr = zhuCeW.add(res); //注册 zhuCeW.gr.GG2.btn.zhuCe.onClick = function(){ var sma = zhuCeW.gr.GG2.t1.passText.text.replace (/\W/g, ""); //app.settings.saveSetting(Hound.name,"sma" , strToUrl (sma)); if(pc.pcJQM.length == 0){alert("识别主板失败!\n请先启用以太网卡(win7:本地连接)。")} if(sma.length == 30){ if(web_jihuo (sma, pc.pcJQM.toString ().replace (/,/g, ''))){alert("注册成功!");zhuCeW.close ()} } else{alert("注册码输入有误!")} } //去淘宝购买注册码 //zhuCeW.gr.GG2.btn.gouMai.onClick = function(){ openURL(url.taobao) ;zhuCeW.close();}; zhuCeW.show(); } //获取机器码 function getPcMac(){ if(isMac ()){ var macId = system.callSystem("ifconfig en0 | awk '/ether/{print $2}'"); macId = macId.substr(0,17); if(macId.substr (0, 8) !=="ifconfig"){ pc.pcJQM.push (mac2jqm (macId)); } var patt = new RegExp(/[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}/ig); var s , j; macId = system.callSystem("ifconfig"); while((s = patt.exec(macId)) != null){ j = s.toString().replace (/\:/g, "").replace(/\s/g,""); if(pc.pcJQM.toString ().indexOf (j) == -1 && pc.pcJQM.length <…- 0
- 0
- 630
-
【AE脚本】PropDrive 属性效果管理器 | 免费
https://terriblejunkshow.com/manual/howtousepropdrive 简介 如果需要对属性、关键帧、效果进行批处理。比如同时关闭含该属性的图层眼睛,删除效果之类的。说明太长 懒得翻译。 界面截图 使用方法 选择属性或者效果 然后单击“GetInfo”按钮以获取有关该属性的各种信息。 选择喜欢的图层 如果应用列中选择“所有图层”,则不需要选择图层。在整个合成中搜索该属性。 如果选择 SelectedLayers,则处理选定的图层。 批处理列表 从列表中选择一个进程并双击它。即可分批处理! 参数 & copy:如果选中,当您使用GetInfo 获取信息时,将复制该属性。如果你想粘贴关键帧,后面会有用处。 regex for Incl:如果勾选,去掉name字段中name后面的“空格或连字符或下划线+数字”,并在正则表达式中添加各种条件“包括~”。可以添加的函数)。 可以通过打开和关闭检查来添加或删除它,因此如果您认为“我想处理包括名称在内的所有内容”,只需将其打开。 可以添加的正则表达式为“.” “.”代表某个字符,“”代表0次或多次重复。 获取信息字段 根属性(Root Prop):所选属性顶部的属性。也可以说是图层正下方的一个属性。 例如,如果选择形状路径,则为“内容”,如果选择效果,则为“效果”。 匹配名称(matchName):所选属性的官方名称,由 AE 脚本分类。 *只有当你真的想一次操作不同类型的属性时,才可以将其留空。在这种情况下,您可能还需要将 root Prop 留空。 名称(name):名称。如果可以通过属性类型搜索处理目标(例如,“我想消除所有分形噪声,无论名称如何”),请清除右侧的复选框。 propertyIndex:属性的编号。说到效果,效果栏最上面是1。当您只想关闭效果数量时,请选中此项。 propertyDepth:属性在哪一层?是。对于形状路径等复杂层次的属性,在“我想删除组1中的路径,但我想保留组1中的组2的路径”的情况下检查它。 自定义值:应用列下方的列。如果要对值进行处理,可以将原始值放在这里进行处理,但GetInfo会自动输入选中属性的值,以了解值的形状。如果该属性没有值,则输入为未定义。 可输入的形式因参数而异,例如一个参数一个数值,两个参数用逗号分隔的两个数值。格式请参考取件结果。[] 两个或多个数字(数组)不需要。 ■ 批量处理列表 Del Key at Indicator:如果指标时间有key,则将其删除。 Eye OnOff:打开和关闭眼球标记。 选择和删除:选择并执行与按键盘上的“del”相同的操作。如果选择的参数是参数,则删除所有关键帧,如果该属性不是参数且可以删除,则删除该属性本身。 选择并粘贴:选择并执行与按键盘上的“Ctrl + V”相同的操作。如果选中 & Copy,则可以轻松粘贴关键帧。 如果您想粘贴属性本身但不起作用,请注意以下几点。 如果要复制粘贴某个属性,正常的操作是选择“该属性的父属性”,然后按Ctrl+V。我想重现它,所以先正常选择属性,用Ctrl + C复制它,选择它的父属性,取消选中&复制和GetInfo。现在,GetInfo 获取的 parent 属性将被批量处理。您所要做的就是按“选择并粘贴”。 此外,在效果的情况下,您所要做的就是选择一个图层并复制和粘贴。 选择:选择。 设置自定义键:按当前指标时间在“自定义值”字段中输入的值的键。您可以设置 Select & Paste 无法设置的原始值。 设置自定义值或键:将在“自定义值”字段中输入的值应用到当前指标时间。如果该属性具有现有键,则点击该键,否则应用静态值。您可以设置 Select & Paste 无法设置的原始值。 (NotToUse) Del All Key in the folder :擦除所有关键帧。效果与选择和删除相同。 Del Prop:擦除所有属性。效果与选择和删除相同。 查找隐藏的道具:如果检索到的属性中有隐藏的属性,它们会提醒您它们的图层索引、名称和父属性名称。 关于 forPropDrive 文件夹 这包含处理列中描述的处理脚本。 您可以通过在此处进行更改来自由组织流程。 如果你说“我不需要这个过程”,你可以把它放在(不使用)文件夹中,它不会显示在列表中。 如果要更改名称,可以随意更改每个 jsx 的文件名。也支持日语,但不推荐。 如何制作一个原始的过程 在ShapeDrive和EffectsDrive中,在文中写流程是一个规范,但是难度比较大,所以选择了jsx的读取方式。 创建一个原始进程,将其封装在一个立即函数中,将其放入“forPropDrive 文件夹”中,就大功告成了。 可以使用的变量如下。 props:所有属性的知情数组。 valueTxt:“自定义值”字段中的字符串。 valueObj:如果是对象,则包含GetInfo获取的属性的对象。 hiddenProps:隐藏属性(隐藏)检查为真的属性数组。由于 props 省略了预先隐藏,因此 props 中没有隐藏的 Props。 对于撤消组,您不必编写 app.beginUndoGroup() 和 app.endUndoGroup(),因为它们在 PropDrive 中。 如果在PropDrive端做类型推断和for语句,原来处理中能做的事情也是有限的,所以我们把它们改成在处理脚本中做的规范。 每种方法都可以在After Effects Script Reference网站上确认。 PropertyBase 对象、PropertyGroup 对象、Property 对象子页面“属性”和“方法”以及图层属性匹配名称很有帮助。 如果您收到有关隐藏的警报 如果基于该信息获取的属性组中存在“AE UI 中未显示但存在”的隐藏属性,则会发出以下警报。 有些属性是隐藏的。 脚本无法处理隐藏的属性。 继续吗? 隐藏的属性不能被脚本处理,所以如果你想“继续处理而不对隐藏的属性做任何事情”,请按是。如果您不想处理它,请按否。由于它是在AE中实际更改某些内容的过程之前,因此按No并不意味着该过程在奇怪的地方结束。 ■ 隐藏属性示例 相机、光比例等。 未应用图层样式的各种图层样式。 与插件部分(ver4)的“ShowSystems”设置为非零时的编号不对应的系统属性。这可以通过预先准备来避免,例如在批处理中将 ShowSystems 设置为零(显示全部)。- 0
- 0
- 598
-
【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脚本示例】如何从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脚本管理器
{ // rd_ScriptLauncher.jsx // Copyright (c) 2005-2016 redefinery (Jeffrey R. Almasol). All rights reserved. // check it: www.redefinery.com // // Name: rd_ScriptLauncher // Version: 2.5 // // Description: // This script displays a palette of the installed scripts // in the selected Scripts folder (and subfolders). Only // scripts with .jsx, and .jsxbin extensions are // displayed. Double-click a script to launch it. Scripts // located in subfolders whose names are enclosed in // parentheses are ignored. You can change the // Scripts folder at any time, and refresh the scripts // list if the contents of the folder have changed. The // selected scripts folder is stored as a setting, so you // don't have to reselect it every time you reopen this palette. // // Note: The palette cannot detect any errors in the scripts // that you run from it. It's just a quick way of launching // scripts without restarting AE or using ExtendScript // Toolkit (i.e., switching away from AE). // // If a PNG file of a similar name and same folder as the // script file (but with a .png file name extension) exists, // it will appear next to the script name…- 0
- 0
- 546
-
【AE脚本】图层按选择顺序重新排序(其他图层位置不变)
//头号咸鱼 app.beginUndoGroup("SortLayers"); var thisComp = app.project.activeItem; var selLayers = thisComp.selectedLayers; var LN = selLayers.length; var In = []; for (var i=0; i < LN; i++) { In[i] = selLayers[i].index; } In = In.sort(function(a,b){return a-b}); //选择图层顺序列表 // 随便复制一层置底,防止选择了最后一个图层 var last_layer = selLayers[0].duplicate(); last_layer.moveToEnd(); // 遍历 并复制一层(占位图层)、把选择的图层移动到最后 for (var i = 0; i < LN; i++) { selLayers[i].duplicate(); selLayers[i].moveAfter(last_layer); } // 遍历 把底部选择的图层 放置到顺序index列表后,再把占位图层删掉 for (var i = 0; i < LN; i++) { selLayers[i].moveAfter(thisComp.layer(In[i])); thisComp.layer(In[i]).remove(); } last_layer.remove(); app.endUndoGroup(); 思路 先获取选择图层列表,再获取顺序排列的index列表 Array.sort() 随便复制一层置底,防止选择了最后一个图层 遍历选择图层,复制该图层(占个位置),并移动到最后 再把选择的图层移动到顺序数组的图层后 然后把占位图层删掉 反向排序的话,中间的In.sort();后面加一句 In.reverse(); 优化1:可以把复制图层改成新建一个空白图层?(by月离) 优化2:直接倒序插入也可(by熊猫) 其他思路2(by熊猫) 把选中的图层index存进一个数组 从小到大排序该数组 Array.sort() 遍历选中的图层,判断当前图层的index与数组index是否对应 一致则不变,不一致则与目标index的图层 其他(Moelody) 参考即可,我懒得polyfill了 Array.prototype.forEach = Array.prototype.forEach || function(callback, context) { if (Object.prototype.toString.call(this) === '[object Array]') { var i, len for (i = 0, len = this.length; i < len; i++) { if (typeof callback === 'function' && Object.prototype.hasOwnProperty.call(this, i)) { if (callback.call(context, this[i], i, this) === false) { break } } } } };- 0
- 0
- 538
-
【AE脚本示例】合成度遍历示例
//AE合成度遍历示例 v1.0 2022-05-04 //Raymond Yan 2022 (RaymondClr@outlook.com / QQ: 1107677019) function _arrayEach(array, iteratee) { var index = -1; var length = array.length; while (++index < length) iteratee(array[index], index, array); } function _contains(array, value) { var index = -1; var length = array.length; while (++index < length) if (array[index] === value) return true; return false; } function _stubTrue() { return true; } function isCompLayer(layer) { return layer.source instanceof CompItem; } function baseEachLayers(compItem, iteratee) { var index = 0; var numLayers = compItem.numLayers + 1; while (++index < numLayers) iteratee(compItem.layer(index), index); } function baseFindLayer(compItem, predicate, iteratee) { var compLayers = []; baseEachLayers(compItem, function (layer) { iteratee(layer); if (isCompLayer(layer) && predicate(layer)) compLayers.push(layer); }); _arrayEach(compLayers, function (layer) { baseFindLayer(layer.source, predicate, iteratee); }); } function eachLayersDeep(compItem, iteratee) { baseFindLayer(compItem, _stubTrue, iteratee); } function eachLayersDeepOnce(compItem, iteratee) { var seen = []; baseFindLayer( compItem, function (layer) { var id = layer.source.id; return _contains(seen, id) ? false : (seen.push(id), true); }, iteratee ); } //用法一:无论子合成是否存在重复,都进行遍历。 var result = []; eachLayersDeep(app.project.activeItem.selectedLayers[0].source, function (layer) { result.push(layer.name); }); $.writeln(result.join("\n")); //用法二:当子合成存在重复时,只遍第一次发现的子合成。 var result = []; eachLayersDeepOnce(app.project.activeItem.selectedLayers[0].source, function (layer) { result.push(layer.name); }); $.writeln(result.join("\n"));- 0
- 0
- 535
-
【AE脚本】对齐整数帧V1.2
介绍 在使用alt拖拽关键帧时,你一定遇到过,拖时一时爽,拖完火葬场(拖后关键帧可能不是整数)这时候本脚本就派上用场啦 ### 修复前 修复后 更新 V1.0 @草哥 首发 V1.1 @RaymondClr 完善 源码V1.1 //将所有选择属性的关键帧对齐到整数帧 v1.0.10 2021-07-30 //Raymond Yan 2021 (RaymondClr@outlook.com / QQ: 1107677019) ('use strict'); var win = new Window(palette { A: Button {text: '对齐关键帧' } }); win.show(); win.A.onClick = function () { var activeItem = getActiveItem(); if (!activeItem) return; var selectedProperties = getSelectedProperties(activeItem); if (!selectedProperties) return; var valueProperties = getSelectedValueProperties(selectedProperties); if (valueProperties.length === 0) return; app.beginUndoGroup('Align Keyframes'); alignKeyframes(activeItem.frameRate, valueProperties); app.endUndoGroup(); }; function getActiveItem() { var activeItem = app.project.activeItem; return activeItem instanceof CompItem ? activeItem : false; } function alignKeyframes(frameRate, valueProperties) { for (var i = 0, l = valueProperties.length; i < l; i++) { setNewKeyframes(frameRate, valueProperties[i]); } } function getSelectedProperties(activeItem) { return ( activeItem instanceof CompItem && activeItem.selectedLayers.length > 0 && activeItem.selectedProperties.length > 0 && activeItem.selectedProperties ); } function getSelectedValueProperties(selectedProperties) { var valuePropertiesArr = []; for (var i = 0, l = selectedProperties.length; i < l; i++) { var property = selectedProperties[i]; if (!(property.propertyType === PropertyType.PROPERTY)) continue; valuePropertiesArr.push(selectedProperties[i]); } return valuePropertiesArr; } function setNewKeyframes(frameRate, valueProperty) { for (var i = valueProperty.numKeys; i > 0; i--) { var keyValue = valueProperty.keyValue(i); var newKeyTime = Math.round(valueProperty.keyTime(i) * frameRate) / frameRate; valueProperty.removeKey(i); valueProperty.setValueAtTime(newKeyTime, keyValue); } } 源码V1.2 //将所有选择属性的关键帧对齐到整数帧 v1.0.2 2021-07-31 //Raymond Yan…- 0
- 0
- 533
-
【AE脚本开发】调用ae自带颜色拾取
Github link=https://github.com/Belonit/AEColorPicker 方法一 外部插件 安装 Windows: 将 AEColorPicker.aex 复制到文件夹 Adobe After Effects 安装目录\Support Files\Plug-ins Mac: 将 AEColorPicker.plugin 复制到文件夹 Applications/Adobe After Effects [version]/Plug-ins 调用 var externalLibrary = new ExternalObject('lib:C:\\AEColorPicker.aex'); var oldColor = 0x20F186; var newColor = externalLibrary.colorPicker(oldColor, dialog_title); if(newColor == -1){ //Returns -1 if user clicked on cancel newColor = oldColor; } 方法二 脚本生成 或者你可以通过一些小技巧使用脚本完成 // https://community.adobe.com/t5/after-effects-discussions/calling-the-after-effects-color-picker-through-script/td-p/11954317 function ColorPicker(startValue) { // find the active comp var crntComp = app.project.activeItem; if (!crntComp || !(crntComp instanceof CompItem)) { alert('Please open a comp first'); return []; } // add a temp null; var newNull = crntComp.layers.addNull(); var newColorControl = newNull('ADBE Effect Parade').addProperty('ADBE Color Control'); var theColorProp = newColorControl('ADBE Color Control-0001'); // set the value given by the function arguments if (startValue && startValue.length == 3) { theColorProp.setValue(startValue); } // prepare to execute var editValueID = 2240; // or app.findMenuCommandId("Edit Value..."); theColorProp.selected = true; app.executeCommand(editValueID); // harvest the result var result = theColorProp.value; // remove the null if (newNull) { newNull.remove(); } return result; } alert(ColorPicker([1, 1, 1]));- 0
- 0
- 530
-
Github 简单脚本(可以自己练习)
1.第一组 来源:https://github.com/kyletmartinez/After-Effects-Scripts 将标记添加到选定图层 使用可选注释向所有选定图层添加新制造商 将选定的属性添加到基本图形面板 使用效果名称而不是表达式控件的属性名称将所有选定的属性添加到基本图形面板 计算关键帧值之间的差异 计算两个关键帧值之间的差异 计算二维图层之间的距离 计算两个二维图层之间的距离 中心组成 在合成面板中居中合成。按住 ALT 键或 SHIFT 键进行其他缩放级别 清理渲染队列 清理渲染队列 清理选定的文件夹 清除任何选定文件夹中未使用的项目。删除空文件夹,除非它们是顶级的 复印合成工作区 从活动合成复制工作区。按住 ALT 键将复制的工作区粘贴到活动合成中。 循环合成背景颜色 在黑色、灰色和白色之间循环合成背景颜色 强制合成面板刷新 强制合成面板刷新当前帧 硬单层 在所有未选择的图层上禁用(切换眼球图标) 反转选定的关键帧 反转选定的关键帧值 锁定所有图层 锁定项目中每个构图中的每一层 保持关键帧 将选定的关键帧转换为保持关键帧 随机化层开始时间 在提供的范围内随机移动所有选定图层的开始时间 随机化选定的关键帧值 随机化选定的一维关键帧的值 将合成重命名为文件名 将当前合成重命名为与项目相同的名称 将第一层重命名为合成名称 重命名每个选定合成中的第一层以匹配合成名称 重命名图层源 重命名当前选定层的源 重命名所选图层 重命名所选图层并附加零填充数字 将源重命名为图层名称 重命名所选图层的源以匹配 重置合成工作区 设置工作区以覆盖整个构图 移动选定的图层 将所有选定图层作为一个组移动到当前时间指示器,同时保持相对时间 设置新颜色 根据原始颜色、混合模式和不透明度设置新颜色 将效果粘贴到图层 使用选定的位置属性(例如 CC Bend It 或 Gradient Ramp)强制效果正确粘贴到图层 Toggle 保持比例表达式 禁用或启用保持图层在 Z 空间中定位时的视觉比例的表达式 切换洋葱皮 在当前合成中切换洋葱皮 零位 将所有选定图层的位置归零 第二组 观看:快速概览 将调色板从 Ray Dynamic Color 复制到剪贴板 (转到 Ray-Comp 并运行脚本:copy-colors.jsx) 非常适合 KBar https://aescripts.com/kbar/ 在 C4D 中粘贴为色板或彩色平面 (在 Cinema 4D 中运行脚本:paste-colors.py) Adobe After Effects 的精彩“aequery”脚本库的使用:http ://aequery.aenhancers.com/ 拉伸和序列层.jsx 通过“输入”拉伸选定的图层并创建一个序列。 非常适合 KBar https://aescripts.com/kbar/ cc-shapelayer.jsx 创建一个快速调整层。(作为形状层) #NoSolids 始终插入所选图层的顶部 设置一些表达式以始终适合您的合成大小。 非常适合 KBar https://aescripts.com/kbar/ null-shapelayer.jsx 创建一个快速的空层。(作为形状层) #NoSolids 始终插入所选图层的顶部 引导层 + 不透明度为零。 非常适合 KBar https://aescripts.com/kbar/ 冻结帧调整长度.jsx 对于每个选定的图层: 图层 > 时间 > 冻结帧 适合图层的输入和输出以进行合成 非常适合 KBar https://aescripts.com/kbar/ add-selected-precomps-to-renderqueue.jsx 将活动 Comp 的选定 PreComp 添加到 RenderQueue 非常适合 KBar https://aescripts.com/kbar/ 复制项目到 watchfolder.jsx 保存项目并将副本发送到您的 AME-Watch-Folder。 非常适合 KBar https://aescripts.com/kbar/- 0
- 0
- 496
-
【脚本相关】借助AutoHotKey来实现保存预设自动化操作(有瑕疵)
半自动化看这边:【脚本相关】使用脚本来半自动化保存预设 前面代码部分一样,后半部分用AutoHotKey模拟点击Ctrl+V以及Alt+S保存,实现自动化保存流程。 不过有瑕疵,像选中效果控件里面的插件,还需要用户手动操作,目前还做不到完全的全自动化。不过也没差了,我们可以在脚本设定好预设保存文件夹、文件名,至于预设什么内容由用户选择也没什么不好2333 因为双方编码不一致,导致传递过去的中文会乱码,所以我这边提供两个方法:一个只允许英文;另一个是把中文参数保存在确定位置的文本文件里,然后用AutoHotKey去解析该文本文件获得内容,并拷贝到剪贴板。 myPreset.jsx var comp = app.project.activeItem; // 获取合成 var layer = comp.selectedLayers; // 获取选中图层 var effect = layer[0].property("ADBE Effect Parade"); // 获取图层的效果列表 var num = effect.numProperties; // 获取效果列表的数量 var plug = effect.property(1); // 序号可以用for遍历,或者用name、matchName查找 // 用名称或者元属性名的时候,如果没找到返回null var isSeleEffect = plug.selected; //检测是否在效果控件选中插件 var presetPath = Folder.temp.fsName + "ae_ffxpath.ffx"; // 声明一个ffx文件的保存全路径,Folder.temp是系统缓存文件夹 copyToClipboard(presetPath); // 把内容推送到系统的剪贴板,如果不用可以注释掉 // https://www.yuelili.com/ae-script-case-transferring-information-to-the-system-clipboard/ function str2cmd(str, list) { var cmd = str; for (i = 0, ii = list.length; i < ii; i++) { var tmp = '"' + list[i] + '"'; // var tmp = list[i]; cmd = cmd.toString().replace("${" + (i + 1) + "}", tmp); } return cmd; } var list = ["(pwcode)\\AutoHotkey","AutoHotkeyU64.exe","autoSavePreset.ahk"]; var cmd = str2cmd('cmd /c start "" /d ${1} ${2} ${3}', list); system.callSystem(cmd); // 启动AutoHotKey待命 app.executeCommand(3075); // 模拟点击 菜单栏的保存预设功能 其中的list是一个占位数组,对应 ${Number},Number从1开始。str2cmd函数原理是替换占位符,再也不用手动用+"'来连接变量。 system.callSystem一定要放在app.executeCommand前面,打开的AutoHotKey可以在后台等待触发条件,一旦保存预设文件窗口弹出,立马模拟点击Ctrl+V以及Alt+S,自动化操作。 如果你的可执行文件放到子文件夹里或者其他位置,那么用/d path指定程序所在的path文件夹就会方便很多,这样你只需要输入程序名即可,打开程序时自动在当前位置寻找程序运行。如果程序在脚本同目录 /d path 可以删掉。 下面是总结出来的cmd字符串指令内容,start 后面必须跟随一个空的双引号,这是因为start会把第一个双引号当成打开新窗口的标题,如果没有/d /min等start参数隔断,会把加了双引号的可执行程序当成标题。 var cmd = 'cmd /c start "" "program.exe" "parameter"' program.exe 可执行文件,在这边是AutoHotKey.exe parameter yao 要传递给可执行文件的参数,这边是一个ahk脚本文件 这行代码的作用是用ahk程序运行ahk脚本文件,在任务栏能看到一个绿绿的H图标就是了,右键可以选择暂停或者编辑脚本文件后需要手动reload导入。 有关start和system.callSystem详细介绍可以移步另一个帖子观看:【脚本相关】关于system.callSystem()踩坑记录与解决方法探索 接下来介绍ahk脚本文件,我已经在代码块里解释清楚了,也没啥可补充的了,另外软件有安装版和解压即用的便携版。 如果是便携版的,需要你把ahk文件打开方式选择成AutoHotKey程序,或者是把文件拽托到exe直接运行,单纯双击exe是没反应的。有几个exe,选择u64就行。 autoSavePreset.ahk clipboard := "" ; 清空剪贴板 ClipWait ; 等待剪贴板重新拷贝新内容 ; clipboard := A_Temp "\ae_ffxpath.ffx" ; A_Temp 是系统缓存文件夹,需要注意ahk无需用+来连接字符串 ; 如果不用剪贴板传递数据,想用确定的文件路径 ; 可以用分号把前面的剪贴板代码注释掉 ; 至于用AutoHotKey读取文本文件,等有空再来研究 = = ; MsgBox % clipboard ; 英文版AE用这个英文关键词,中文用中文关键词 WinWait Save Animation Preset…- 0
- 0
- 479
-
【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