-
[AE脚本]独显小助手
介绍 有时候需要独显图层查看不同效果. 独显小助手, 用来保存当前独显的图层, 基于图层的索引 使用方法 添加设置: 选择图层, 在文字输入框内设置名字, 按回车/随便其他地方单击 删除设置: ctrl 单击设置, 即可恢复设置的独显图层 使用: 直接单击设置 脚本源码 'use strict'; // https://cg.yuelili.com/ae/ae-dev/ae-dev-script/ae-script-unique-display-assistant/ var activeComp = function activeComp() { return app.project.activeItem; }; function arrIndexOf(target, arr) { for (var i_2 = 0; i_2 < arr.length; i_2++) { var item = arr[i_2]; if (item == target) { return i_2; } } return -1; } var panelGlobal = this; (function () { var presetStore = panelGlobal instanceof Panel ? panelGlobal : new Window('palette', undefined, undefined, { resizeable: true, }); if (!(panelGlobal instanceof Panel)) presetStore.text = '独显小助手'; presetStore.preferredSize.width = 200; presetStore.preferredSize.height = 150; presetStore.orientation = 'column'; presetStore.alignChildren = ['left', 'center']; presetStore.spacing = 0; presetStore.margins = 0; var group1 = presetStore.add('group', [0, 0, 200, 50], { name: 'group1', }); group1.orientation = 'row'; group1.alignChildren = ['left', 'center']; group1.spacing = 10; group1.margins = 0; var listbox = presetStore.add('listbox', [0, 0, 200, 150], undefined, { name: 'listbox1', multiselect: true, }); listbox.onChange = soloLayers; var nameControl = group1.add('edittext', [0, 0, 95, 30]); var disableSoloBtn = group1.add('button', [0, 0, 95, 30], undefined, { name: 'button1', }); disableSoloBtn.text = '禁用'; disableSoloBtn.onClick = disableSolo; var LayerStore = (function () { function LayerStore() { this.layers = {}; } LayerStore.prototype.add = function (key, layers) { if…- 0
- 0
- 140
-
[AE脚本] 储存效果/图层样式 等等
使用方法 只需将storeStyleLayer 传入顶级需要保存的属性组名称即可, 因为原本只想储存图层样式的, 懒得改函数名了 typescript版本 import { activeLayer } from 'base/variables'; class PropertyItem { script: string; constructor(prop: Property, parent: PropertyCollection) { let tmpScript = ''; const propertyMatchName = prop.matchName; const propertyValue = prop.value; const propertyString = parent.name + '.property("' + propertyMatchName + '")'; // 储存值 if (prop.expressionEnabled) { try { const expressionValue = prop.expression; tmpScript += propertyString + '.expression="' + expressionValue + '";\n'; tmpScript += propertyString + '.expressionEnabled=true;\n'; } catch (error) {} } else { // 没有表达式 直接复制值 tmpScript += propertyString + '.setValue(' + propertyValue + ');\n'; } // TODO 储存关键帧 if (prop.numKeys > 0) { } this.script = tmpScript; } parse(): string { return this.script; } } class PropertyCollection { name: string = ''; // 当前层级属性的脚本名称 props: (PropertyItem | PropertyCollection)[] = []; // 储存的属性与属性组 constructor(name: string) { this.name = name; } parse(): string { let tmpScript = ''; for (const prop of this.props) { tmpScript += prop.parse(); } return tmpScript; } add(prop: PropertyItem | PropertyCollection) { this.props.push(prop); } } function storeStyleLayer(layer: Layer, groupName = 'ADBE Layer Styles') { const styles = layer.property(groupName); const rootPropertyCollection = new PropertyCollection(`.property('${groupName}')`); loopPropertyClass(styles, rootPropertyCollection); let tmpScript = rootPropertyCollection.parse(); alert(tmpScript); } function loopPropertyClass(px: _PropertyClasses, parent: PropertyCollection) { // 判断是不是属性 if (px.propertyType === PropertyType.PROPERTY) {…- 0
- 0
- 100
-
-
-
AE脚本-颜色选择器
这是smallpath大佬为Adobe脚本重建的颜色选择器。 支持所有Adobe软件,例如PS,AI,AE等。 引入方法 #include './colorPicker.js' 或者复制粘贴js文件中的所有代码; 调用 resultColor; //得到一个 RGB数组 如[0.5,0.5,0.5] 你也可以传入参数让面板预先选中某个颜色,示例: var resultColor = colorPicker('4a4a4a'); 预选颜色支持 RGB、HEX 和 HSB 选项 类型 描述 RGB 数组 范围从 [0,0,0] 至 [1,1,1] 大RGB 数组 范围从 [0,0,0] 至 [255,255,255] Hex 字符串 范围从 �00000 至 FFFFFF 短Hex 字符串 F7C 同于 FF77CC HSB 数组 范围从 [0,0,0,hsb] 至 [360,100,100,hsb] 支持软件 PS、AI、AE、ESTK- 0
- 0
- 47
-
[AE脚本]使用可执行文件给脚本源码加密
ae脚本源码基本上就是jsx 或者jsxbin, 但是现在很多破解工具, 源码基本上裸奔... 可以通过ae脚本执行exe文件, 其中源码包含在exe文件内部, 再通过exe与ae通信执行脚本, 可以一定程度提高脚本破解难度 大致流程 AE->运行脚本->调用exe->执行真正脚本内容->发送给ae 其中调用exe可以使用cnd直接调用 exe发送给ae 可以使用 cmd AfterFX-脚本- 0
- 0
- 45
-
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
- 116
-
[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脚本]给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
- 214
-
[AE脚本开发]合并多条路径为一条
使用方法 选择要合并的路径, 运行脚本即可 脚本源码 'use strict'; var comp = app.project.activeItem; if (comp && comp instanceof CompItem) { var selectedShapes = comp.selectedProperties; var extend = function extend(array1, array2) { var newArray = []; for (var index = 0; index < array1.length; index++) { newArray.push(array1[index]); } for (var index = 0; index < array2.length; index++) { newArray.push(array2[index]); } return newArray; }; var selectedShapes = comp.selectedProperties; var propertyArrays = { featherInterps: [], featherRadii: [], featherRelCornerAngles: [], featherRelSegLocs: [], featherSegLocs: [], featherTensions: [], featherTypes: [], inTangents: [], outTangents: [], vertices: [], closed: false, }; for (var i = 0; i < selectedShapes.length; i++) { var prop = selectedShapes[i]; if (prop.matchName === 'ADBE Vector Shape') { var propV = prop.value; for (var key in propertyArrays) { if (key == 'closed') { propertyArrays[key] = propV[key]; continue; } if (propertyArrays.hasOwnProperty(key)) { propertyArrays[key] = extend(propertyArrays[key], propV[key]); } } } } var myShape = new Shape(); for (var key in propertyArrays) { if (propertyArrays.hasOwnProperty(key) && (propertyArrays[key].length > 0 || key == 'closed')) { myShape[key] = propertyArrays[key]; } } var newShapeLayer = comp.layers.addShape(); newShapeLayer.name = 'Merged Shapes'; var shapeGroup = newShapeLayer.property('ADBE Root Vectors Group'); var pGroup = shapeGroup.addProperty('ADBE Vector Shape - Group'); pGroup.property('ADBE Vector Shape').setValue(myShape); } else { alert('请在合成中选择路径!'); }…- 0
- 0
- 174
-
[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
- 180
-
[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脚本示例] 遍历效果并创建文件夹
今天我想做做内置效果笔记, 于是想先遍历所有效果, 并创建对应的.md文件 用到的脚本方法与关键点 effects fsName (文件的特定平台的完整路径名) 源码 var effects = app.effects; var effects_store = {}; // 引入File类 var File = File || $.global.File; // 获取当前脚本文件所在的文件夹路径 var scriptFile = File($.fileName); var scriptFolder = scriptFile.parent.fsName; // 遍历所有效果 for (var i = 0; i < effects.length; i++) { var effect = effects[i]; var cat = effect.category; // 将效果添加到字典中 if (!effects_store.hasOwnProperty(cat)) { effects_store[cat] = []; } effects_store[cat].push(effect.displayName); } // 遍历储存的效果字典 for (var category in effects_store) { if (effects_store.hasOwnProperty(category)) { var effs = effects_store[category]; // 有的效果没有分类, 所以分类名为空, // 如果你也想获取这些效果, 请在else里处理 if (category) { // 创建文件夹,文件夹名字为 category // 保存在脚本目录下的cache目录里 var folderPath = scriptFolder + "/cache/" + category; var folder = new Folder(folderPath); if (!folder.exists) { folder.create(); } // 遍历effs,并创建文件 for (var i = 0; i < effs.length; i++) { var fileName = effs[i] + ".md"; // 文件名为效果名称 var filePath = folderPath + "/" + fileName; // 打印下文件路径吧 $.writeln(filePath); var file = new File(filePath); if (!file.exists) { file.open("w"); file.close(); } } } } }- 0
- 0
- 249
-
【AE脚本】下拉菜单快速选择图层 | DropTune
当图层数量较多时,从效果下拉菜单中选择目标图层太费劲了。请使用此脚本。 (function (aGbl) { function mCreateUI(aObj) { var mPorW = (aObj instanceof Panel) ? aObj : new Window("palette", "DropTune", undefined); mPorW.preferredSize = [200, 200]; mPorW.margins = [10, 10, 10, 10]; mPorW.spacing = 4; mPorW.mCbDrpDwn = mPorW.add("checkbox { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : '锁定'}"); mPorW.mGpDrpDwn = mPorW.add("group { orientation : 'column', alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}"); mPorW.mBtDrpDwn = mPorW.mGpDrpDwn.add("button { preferredSize : [180,20] , alignment : [ 'left','top' ] ,text : '获取下拉菜单'}"); mPorW.mEtPropN = mPorW.mGpDrpDwn.add("edittext { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : ''}"); mPorW.mEtPrmN = mPorW.mGpDrpDwn.add("edittext { preferredSize : [180,20] ,alignment : [ 'left','top' ] ,text : ''}"); mPorW.mGpBrnk = mPorW.add("group { orientation : 'stack', preferredSize : [20,20] , alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 0}"); mPorW.mGpBrnk.add("statictext { preferredSize : [20,20] ,alignment : ['left','center' ] ,text : ''}"); mPorW.mGpBrnk.add("panel { preferredSize : [180,1],alignment : [ 'fill','center' ] , margins : [0, 0, 0, 0], spacing : 0}"); mPorW.mGpEftLyr = mPorW.add("group { orientation : 'column',alignment : [ 'left','top' ] , margins : [0, 0, 0, 0], spacing : 4}"); mPorW.mGpEftLyrBtCb = mPorW.mGpEftLyr.add("group {alignment : […- 0
- 0
- 455
-
[AE脚本] 删除有错误的表达式 DelErrorExps
删除当前活动合成中的错误表达式。 复制下面代码到文本txt中,更改扩展名为 DelErrorExps.jsx (function () { app.beginUndoGroup("DelErrorExps"); // 为了确保不会错误地处理项目面板中的一个项目,暂时将查看器设为活动状态。 app.activeViewer.setActive(); var mAi = app.project.activeItem; var mLyrs = mAi.layers; var mAllValProps = []; //检查是否隐藏的常规表达式。 var mRegExpHdn = new RegExp("hidden"); // 从所有的图层中收集带有"value"属性。 for (var i = 1; i <= mLyrs.length; i++) { mAllValProps = mAllValProps.concat(mGetValProps(mLyrs[i])); } //将其中具有可应用表达式且错误消息不为空(即存在错误)的表达式设置为""(空字符串)。 for (var i = 0; i < mAllValProps.length; i++) { var mProp = mAllValProps[i]; if (mProp.canSetExpression && mProp.expressionError !== "" && !(mIsHidden(mProp, mRegExpHdn))) { mProp.expression = ""; } } app.endUndoGroup(); //-------------------------------------------------- //-------------------------------------------------- // 从图层中收集具有"value"属性的属性。 function mGetValProps(aLyr) { var mRstProps = []; mFunc(aLyr); function mFunc(aProp) { if (aProp.propertyType === PropertyType.PROPERTY) { mRstProps.push(aProp); } else { for (var i = 1; i <= aProp.numProperties; i++) { mFunc(aProp(i)); } } } return mRstProps; } //检查属性是否为隐藏状态。请注意关键帧被全部选择的情况。 function mIsHidden(aProp, aRegExpHdn) { try { aProp.selected = aProp.selected; return false; } catch (e) { return aRegExpHdn.test(e.message); } } })(); 用法 当执行这段 JSX 代码时,它将从当前活动合成中提取所有图层的所有属性。然后删除其中存在表达式错误的属性的表达式。 没有用户界面(UI)。 不适用于整个项目。如果要应用于整个项目,这可能会有些麻烦。您需要单击错误消息下方的放大镜图标,在打开的错误合成中逐个执行此 JSX。 如果存在"存在错误但未显示的属性",它们将不会被处理。例如,如果您将图层先设置为3D图层,并对"方向"属性应用表达式,然后出现表达式错误,但将3D开关重新设置为2D,以便消除错误,这种情况将不会被处理。这也可能在图层样式中发生。 解释 目前,您正在从合成中收集所有图层,并使用递归函数收集它们的所有属性。然后,您将对这些属性中的表达式错误不为空的属性(即存在错误的属性)的表达式进行清空处理。第一个空字符串("")用于检查是否存在错误消息,第二个空字符串("")是用于清空表达式的空字符串,请注意它们是不同的。 我也尝试创建了适用于整个项目的版本,但似乎检查表达式错误是否为空字符串(即是否存在错误)的功能在未打开的合成中的行为似乎是不确定的。我认为这与打开的合成中没有在查看器中显示错误警告有关,即使合成中存在具有错误表达式的合成,如果未打开合成,可能不会在查看器中显示错误警告。 另外,关于hidden属性,例如2D图层的"方向"属性或未应用的图层样式等,这些都是"实际上图层已经具有但被隐藏的属性",除非将其显示出来,否则脚本无法处理它们。严格来说,虽然可以处理它们,但无法更改其值等。由于缺乏能够检查hidden属性的方法,您正在使用以下判断函数来处理此类情况。如果出现错误并且错误消息中包含"hidden",则返回true,否则返回false。对于这些函数返回true的属性,您将省略处理。- 0
- 0
- 314
-
[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
- 279
-
[AE脚本开发]事件监听 鼠标篇
姊妹篇: 事件监听 按键篇 var myButton = new Window("palette", "我的按钮"); myButton.button = myButton.add("button", undefined, "单击我"); // 监听右键菜单事件 myButton.button.addEventListener("mousedown", clickHandler); // 鼠标左键是 0 中间滚轮是 1 右键 是2 function clickHandler(event) { if (event.button == 0) { alert("点了左键") } if (event.button == 1) { alert("滚轮") } if (event.button == 2) { alert("点了右键") } } myButton.show();- 0
- 0
- 383
-
[AE脚本开发]使用curl 获取网页信息
curl 命令介绍 https://www.cnblogs.com/zhuzhenwei918/p/6781314.html // 定义缓存文件 var tempFile = new File(Folder.temp.fullName + '/' + 'curl.txt'); // 获取网页信息,并写入文件 system.callSystem("cmd.exe /c \"curl https://zhuanlan.zhihu.com/p/537632849 -o \"" + tempFile.fsName + "\"\""); // 其他操作 可以复制,也可以读取文件内容之类 system.callSystem('cmd.exe /c \"clip < ' + tempFile.fsName + '\"');- 0
- 0
- 319
-
将多个文件二进制数据以对象形式写入桌面
/** * @description 获取文件二进制数据源码 * @param {Object} file 目标文件 */ function getBinary(file) { var file = isFile(file) ? file : new File(file); file.open("r"); file.encoding = "BINARY"; var binaryBuffer = file.read(); file.close(); var binaryString = binaryBuffer.toSource(); binaryString = binaryString.slice(13, -3); return binaryString } /** * @description 将文件二进制数据以对象形式写入桌面json文件 */ function writeBinary() { var desktopFolder = new Folder(Folder.desktop); var files = File.openDialog("Select a file.", "All files:*.*", true); var result = []; var obj = {}; files.map(function (file, index) { obj.id = index; obj.name = file.name; obj.data = getBinary(file); var content = obj.stringifys(); result.push(content); }) var outFile = [desktopFolder.fsName, files[0].name.split(".")[0] + ".json"].join("/"); writeFile(result.stringifys(), outFile); File(outFile).execute(); } // 对象转换为字符串 Object.prototype.stringifys = function () { var str = ""; str += "{"; for (var p in this) { if (this.hasOwnProperty(p)) { if (typeof this[p] === 'number') { str += "\"" + p.toString() + "\"" + ":" + this[p] + ","; } else { str += "\"" + p.toString() + "\"" + ":" + "\"" + this[p].toString() + "\"" + ","; } } } str += "}"; return str } // 数组转换为字符串 Array.prototype.stringifys = function () { var str = ""; str += "["; for (var i = 0, il = this.length; i < il; i++) {…- 0
- 0
- 375
-
【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脚本示例】如何从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
-
用鼠伸缩放形状层,但不挤压描边宽度
概括一下思路: 1.锁死缩放属性,缩放属性不能改变,否则描边一定会被挤压 2.不改变缩放,那就改变形状的比例,也就是说,用鼠标伸缩形状图层,但不改变图层的缩放属性,而是改变形状的比例属性 3.然后将 描边属性 应用到改变后的形状,即:把形状属性组里的描边,移到外层的内容属性组,与它原先的父级属性组平级 但是没有这种功能,只能在内容属性组下新添加一个描边属性,把原先的描边属性里的参数一个个复制过来 app.beginUndoGroup("neverchange") var curcomp = app.project.activeItem; var curlayer = curcomp.selectedLayers[0]; var curPro = curcomp.selectedProperties[0]; //锁死缩放 curlayer.scale.expression = "if(time<thisLayer.outPoint)\n" + " {[" + curlayer.scale.value[0] + "," + curlayer.scale.value[1] + "]}\n" + "else\n" + " {value}" //比例值由缩放的原始值改变 curlayer("ADBE Root Vectors Group")(1)("ADBE Vector Transform Group")("ADBE Vector Scale").expression = "a=transform.scale.valueAtTime(outPoint);\n" + "b=transform.scale.value;\n" + "[a[0]/b[0]*100,a[1]/b[1]*100]" //在内容组里添加描边,把形状组里的描边属性拷贝到内容组里的描边 curlayer("ADBE Root Vectors Group").addProperty("ADBE Vector Graphic - Stroke") var newstroke = curlayer("ADBE Root Vectors Group")("ADBE Vector Graphic - Stroke") var oldstroke = curlayer("ADBE Root Vectors Group")("ADBE Vector Group")("ADBE Vectors Group")("ADBE Vector Graphic - Stroke") //复制描边里的基础属性 for (i = 1; i <= 7; i++) { newstroke(i).setValue(oldstroke(i).value) } //复制虚线组下的属性 for (i = 1; i <= 7; i++) { if (oldstroke("ADBE Vector Stroke Dashes")(i).isModified) { newstroke("ADBE Vector Stroke Dashes").addProperty(oldstroke("ADBE Vector Stroke Dashes")(i).matchName); newstroke("ADBE Vector Stroke Dashes")(i).setValue(oldstroke("ADBE Vector Stroke Dashes")(i).value); } } //锥度 for (i = 1; i <= 9; i++) { if (oldstroke("ADBE Vector Stroke Taper")(i).isModified) { newstroke("ADBE Vector Stroke Taper")(i).setValue(oldstroke("ADBE Vector Stroke Taper")(i).value); } } //波形 for (i = 1; i <= 5; i++) { if (oldstroke("ADBE Vector Stroke Wave")(i).isModified) { newstroke("ADBE Vector Stroke Wave")(i).setValue(oldstroke("ADBE Vector Stroke Wave")(i).value); } } //移除形状组里的描边 oldstroke.remove() app.endUndoGroup()- 0
- 0
- 786
-
【AE脚本示例】合成度遍历示例
//AE合成度遍历示例 v1.0 2022-05-04 //Raymond Yan 2022 (RaymondClr@outlook.com / QQ: 1107677019) function _arrayEach(array, iteratee) { var index = -1; var length = array.length; while (++index < length) iteratee(array[index], index, array); } function _contains(array, value) { var index = -1; var length = array.length; while (++index < length) if (array[index] === value) return true; return false; } function _stubTrue() { return true; } function isCompLayer(layer) { return layer.source instanceof CompItem; } function baseEachLayers(compItem, iteratee) { var index = 0; var numLayers = compItem.numLayers + 1; while (++index < numLayers) iteratee(compItem.layer(index), index); } function baseFindLayer(compItem, predicate, iteratee) { var compLayers = []; baseEachLayers(compItem, function (layer) { iteratee(layer); if (isCompLayer(layer) && predicate(layer)) compLayers.push(layer); }); _arrayEach(compLayers, function (layer) { baseFindLayer(layer.source, predicate, iteratee); }); } function eachLayersDeep(compItem, iteratee) { baseFindLayer(compItem, _stubTrue, iteratee); } function eachLayersDeepOnce(compItem, iteratee) { var seen = []; baseFindLayer( compItem, function (layer) { var id = layer.source.id; return _contains(seen, id) ? false : (seen.push(id), true); }, iteratee ); } //用法一:无论子合成是否存在重复,都进行遍历。 var result = []; eachLayersDeep(app.project.activeItem.selectedLayers[0].source, function (layer) { result.push(layer.name); }); $.writeln(result.join("\n")); //用法二:当子合成存在重复时,只遍第一次发现的子合成。 var result = []; eachLayersDeepOnce(app.project.activeItem.selectedLayers[0].source, function (layer) { result.push(layer.name); }); $.writeln(result.join("\n"));- 0
- 0
- 534
-
【AE脚本示例】ScriptUI通过radioButton切换面板组
//ScriptUI通过radioButton切换面板组 v1.0 2022-04-20 //Raymond Yan 2022 (RaymondClr@outlook.com / QQ: 1107677019) var mainWindow = new Window("palette", undefined, undefined, { resizeable: true }); mainWindow.onResizing = function () { this.layout.resize(); }; mainWindow.preferredSize = [300, 200]; mainWindow.alignChildren = ["fill", "top"]; var group1 = mainWindow.add("group"); var group2 = mainWindow.add("group"); group1.alignChildren = ["center", "top"]; var radioButton1 = group1.add("radiobutton", undefined, "A"); var radioButton2 = group1.add("radiobutton", undefined, "B"); var radioButton3 = group1.add("radiobutton", undefined, "C"); var radioButton4 = group1.add("radiobutton", undefined, "D"); group2.orientation = "stack"; group2.alignChildren = group2.parent.alignChildren; var group3 = group2.add("group"); var group4 = group2.add("group"); var group5 = group2.add("group"); var group6 = group2.add("group"); group3.alignChildren = group3.parent.alignChildren; group4.alignChildren = group4.parent.alignChildren; group5.alignChildren = group5.parent.alignChildren; group6.alignChildren = group6.parent.alignChildren; group3.add("listbox", undefined, ["1", "2", "3", "4"]); group4.orientation = "column"; group4.add("checkbox", undefined, "enabled"); group4.add("checkbox", undefined, "enabled"); group4.add("checkbox", undefined, "enabled"); group4.add("button", undefined, "Click1"); group5.add("button", undefined, "Click2"); group6.add("button", undefined, "Click3"); mainWindow.show(); function handleEvent() { group3.visible = radioButton1.value; group4.visible = radioButton2.value; group5.visible = radioButton3.value; group6.visible = radioButton4.value; } (function initGroupState() { radioButton1.value = true; handleEvent(); })(); radioButton4.onClick = radioButton3.onClick = radioButton2.onClick = radioButton1.onClick = handleEvent;- 0
- 0
- 389
-
【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