├── dist └── .gitkeep ├── .gitignore ├── documents ├── AddShapeLayers │ └── demo.gif └── Utility Tools │ ├── Disassemble Repeater preview.gif │ └── Disassemble Repeater preview multi dimension.gif ├── Scripts ├── ScriptUI Panels │ ├── Liesegang │ │ └── AddShapeLayers │ │ │ ├── Fan.png │ │ │ ├── Star.png │ │ │ ├── Star6.png │ │ │ ├── Circle.png │ │ │ ├── Circle.psd │ │ │ ├── Ellipse.png │ │ │ ├── Ellipse.psd │ │ │ ├── Square.png │ │ │ ├── Square.psd │ │ │ ├── Triangle.png │ │ │ ├── Triangle.psd │ │ │ ├── Rectangle.png │ │ │ ├── Rectangle.psd │ │ │ ├── Fan Control.ffx │ │ │ ├── Star Control.ffx │ │ │ ├── Star6 Control.ffx │ │ │ ├── Annular Sector.png │ │ │ ├── Circle Control.ffx │ │ │ ├── Ellipse Control.ffx │ │ │ ├── Square Control.ffx │ │ │ ├── Rectangle Control.ffx │ │ │ ├── Triangle Control.ffx │ │ │ └── Annular Sector Control.ffx │ ├── Utility Tools.jsx │ └── Add Shape Layers.jsx ├── !00AddNullAndCam.jsx ├── !01ToggleFill.jsx └── !02ToggleStroke.jsx ├── .vscode └── launch.json ├── templates ├── UI_template.jsx ├── text.jsx └── helper_functions.jsx ├── automation └── build.py ├── LICENSE.txt ├── .github └── workflows │ └── release.yml └── readme.md /dist/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/*.jsxbin 2 | dist/* -------------------------------------------------------------------------------- /documents/AddShapeLayers/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/documents/AddShapeLayers/demo.gif -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Fan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Fan.png -------------------------------------------------------------------------------- /documents/Utility Tools/Disassemble Repeater preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/documents/Utility Tools/Disassemble Repeater preview.gif -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star6.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Circle.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Circle.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Circle.psd -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Ellipse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Ellipse.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Ellipse.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Ellipse.psd -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Square.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Square.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Square.psd -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Triangle.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Triangle.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Triangle.psd -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Rectangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Rectangle.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Rectangle.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Rectangle.psd -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Fan Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Fan Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star6 Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Star6 Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Annular Sector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Annular Sector.png -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Circle Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Circle Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Ellipse Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Ellipse Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Square Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Square Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Rectangle Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Rectangle Control.ffx -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Triangle Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Triangle Control.ffx -------------------------------------------------------------------------------- /documents/Utility Tools/Disassemble Repeater preview multi dimension.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/documents/Utility Tools/Disassemble Repeater preview multi dimension.gif -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Annular Sector Control.ffx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Liesegang/liesegangs_aescripts/HEAD/Scripts/ScriptUI Panels/Liesegang/AddShapeLayers/Annular Sector Control.ffx -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // IntelliSense を使用して利用可能な属性を学べます。 3 | // 既存の属性の説明をホバーして表示します。 4 | // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "extendscript-debug", 9 | "request": "launch", 10 | "name": "現在のファイルをExtendScriptとして実行", 11 | "program": "${file}", 12 | "stopOnEntry": false 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /templates/UI_template.jsx: -------------------------------------------------------------------------------- 1 | // ScriptName 2 | // Ver 1.0.1 3 | // Liesegang 2020 (yyama0704@gmail.com) 4 | 'use strict'; 5 | 6 | (function (thisObj) { 7 | function buildUI(thisObj) { 8 | var windowName = "ScriptName"; 9 | var myPanel = (thisObj instanceof Panel) ? thisObj : new Window("window", windowName, undefined, { 10 | resizeable: true 11 | }); 12 | 13 | // Write UI Code Here 14 | 15 | myPanel.onResizing = myPanel.onResize = function () { 16 | this.layout.resize(); 17 | }; 18 | if (myPanel instanceof Window) { 19 | myPanel.center(); 20 | myPanel.show(); 21 | } else { 22 | myPanel.layout.layout(true); 23 | myPanel.layout.resize(); 24 | } 25 | } 26 | 27 | // Write Code Here 28 | 29 | buildUI(thisObj); 30 | })(this); 31 | -------------------------------------------------------------------------------- /automation/build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # build release 3 | 4 | import os 5 | import sys 6 | import re 7 | import zipfile 8 | 9 | targetDir = "Scripts" 10 | distDir = "dist" 11 | name = "liesegangs_aescripts" 12 | exclude = [".psd"] 13 | 14 | def main(argv): 15 | if(len(argv) < 2): 16 | return 17 | 18 | version = argv[1] 19 | if(not re.match('^v(\d+\.)?(\d+\.)?(\*|\d+)$', version)): 20 | return 21 | 22 | with zipfile.ZipFile(f'{distDir}/{name}_{version}.zip', 'w', zipfile.ZIP_DEFLATED) as zipFile: 23 | for root, dirs, files in os.walk(targetDir): 24 | for file in files: 25 | if(os.path.splitext(file)[1] in exclude): 26 | continue 27 | zipFile.write(os.path.join(root, file), 28 | os.path.relpath( 29 | os.path.join(root, file), 30 | os.path.join(targetDir, '..') 31 | ) 32 | ) 33 | 34 | if __name__ == "__main__": 35 | main(sys.argv) -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Liesegang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /templates/text.jsx: -------------------------------------------------------------------------------- 1 | (function(){ 2 | #include "./helper_functions.jsx" 3 | 4 | // Map 5 | $.writeln("Map"); 6 | assert([1,2,3].map(function(x){return x+1;}), [2,3,4]); 7 | assert([].map(function(x){return x+1;}), []); 8 | assert(["a", "b"].map(function(x){return x+"c";}), ["ac", "bc"]); 9 | 10 | //Filter 11 | $.writeln("Filter"); 12 | assert([1,2,3].filter(function(x){return true;}), [1,2,3]); 13 | assert([1,2,3,4,5].filter(function(x){return x % 2 != 0;}), [1,3,5]); 14 | assert([].filter(function(x){return true;}), []); 15 | 16 | //Acc 17 | $.writeln("Acc"); 18 | assert([1,2,4].acc() === 7); 19 | assert([1,2,4].acc(void 0, 2) === 9); 20 | assert([1,2,4].acc(function(a, b){return a * b;}) === 8); 21 | assert([].acc() === void 0); 22 | assert([].acc(void 0, 4) === 4); 23 | assert([].acc(function(a, b){return a + b;}) === void 0); 24 | assert([].acc(function(a, b){return a + b;}, 4) === 4); 25 | assert(["a", "b", "c"].acc(function(a, b){return b + a;}, "d") === "cbad"); 26 | 27 | //Includes 28 | $.writeln("Includes"); 29 | assert([1,2,3,4].includes(3) === true); 30 | assert([1,2,3,4].includes(5) === false); 31 | assert([].includes(2) === false); 32 | assert([12].includes([12]) === false); 33 | })() -------------------------------------------------------------------------------- /Scripts/!00AddNullAndCam.jsx: -------------------------------------------------------------------------------- 1 | // AddNullAndCam 2 | // Ver 1.0.1 3 | // Liesegang 2020 (yyama0704@gmail.com) 4 | 'use strict'; 5 | 6 | (function () { 7 | function complaydate() { 8 | comp = app.project.activeItem; 9 | if (comp != null) { 10 | complay = comp.layers; 11 | selay = comp.selectedLayers; 12 | selaylength = selay.length; 13 | if (selaylength != 0) 14 | selayindex = selay[0].index; 15 | else 16 | selayindex = 1; 17 | fps = comp.frameRate; 18 | } else { 19 | alert("Please access compsiton"); 20 | fps = 30; 21 | } 22 | } 23 | function Addtodur() { 24 | Din = 0; 25 | Dout = comp.duration; 26 | } 27 | function Addtoset() { 28 | selay = comp.selectedLayers; 29 | selay[0].inPoint = Din; 30 | selay[0].outPoint = Dout; 31 | if (selayindex > 1) { 32 | selay[0].moveAfter(comp.layer(selayindex)); 33 | } 34 | } 35 | 36 | function AddNullCamera() { 37 | complaydate(); 38 | Addtodur(); 39 | complay.addCamera("camera", [-comp.width / 2, - comp.height / 2]); 40 | var Camera = comp.selectedLayers[0]; 41 | Addtoset(); 42 | complaydate(); 43 | Addtodur(); 44 | complay.addNull().threeDLayer = true; 45 | var Null = comp.selectedLayers[0]; 46 | Null.name = "camera_ctrl"; 47 | Addtoset(); 48 | Camera.parent = Null; 49 | } 50 | 51 | app.beginUndoGroup("AddNullAndCam"); 52 | AddNullCamera(); 53 | app.endUndoGroup(); 54 | })() -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v[0-9]+.[0-9]+.[0-9]+' 7 | 8 | jobs: 9 | convert: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | python-version: [3.8] 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | - name: Set up Python ${{ matrix.python-version }} 20 | uses: actions/setup-python@v2 21 | with: 22 | python-version: ${{ matrix.python-version }} 23 | 24 | - name: build release file 25 | run: | 26 | python3 automation/build.py ${GITHUB_REF##*/} 27 | 28 | - name: Create release 29 | id: create_release 30 | uses: actions/create-release@v1.0.0 31 | env: 32 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 33 | with: 34 | tag_name: ${{ github.ref }} 35 | release_name: ${{ github.ref }} 36 | draft: false 37 | prerelease: false 38 | 39 | - name: Set release version 40 | run: echo "release_version=${GITHUB_REF##*/}" >> $GITHUB_ENV 41 | 42 | - name: Upload Release Asset 43 | id: upload-release-asset 44 | uses: actions/upload-release-asset@v1.0.1 45 | env: 46 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 47 | with: 48 | upload_url: ${{ steps.create_release.outputs.upload_url }} 49 | asset_path: ./dist/liesegangs_aescripts_${{ env.release_version }}.zip 50 | asset_name: liesegangs_aescripts_${{ env.release_version }}.zip 51 | asset_content_type: application/zip -------------------------------------------------------------------------------- /Scripts/!01ToggleFill.jsx: -------------------------------------------------------------------------------- 1 | // ToggleFill 2 | // Ver 1.1.1 3 | // Liesegang 2020 (yyama0704@gmail.com) 4 | 'use strict'; 5 | 6 | (function () { 7 | Array.prototype.map = function(func){ 8 | var arr = this; 9 | var ret = []; 10 | var len = arr.length; 11 | for(var i = 0; i < len; i++){ 12 | ret.push(func(arr[i], i)); 13 | } 14 | return ret; 15 | }; 16 | 17 | Array.prototype.includes = function(x){ 18 | var arr = this; 19 | var len = arr.length; 20 | for(var i = 0; i < len; i++){ 21 | if(x === arr[i]) return true; 22 | } 23 | return false; 24 | }; 25 | 26 | function mapAllProperties(obj, func){ 27 | if(obj.numProperties !== void 0) { 28 | var len = obj.numProperties; 29 | for(var i = 1; i <= len; i++){ 30 | func(obj.property(i)); 31 | } 32 | } 33 | }; 34 | 35 | function walkObjects(obj, matchName, func, args, only) { 36 | if (obj.matchName === matchName) func(obj); 37 | if (only === void 0 || only.includes(obj.matchName)) { 38 | mapAllProperties(obj, function (x) { 39 | walkObjects(x, matchName, func, args, only); 40 | }) 41 | } 42 | }; 43 | 44 | var comp = app.project.activeItem; 45 | if (comp === null) return; 46 | 47 | var layers = comp.selectedLayers; 48 | if (layers.length == 0) return; 49 | 50 | app.beginUndoGroup("ToggleFill"); 51 | layers.map(function (layer, index) { 52 | switch (true) { 53 | case (layer instanceof ShapeLayer): 54 | var contents = layer.property("ADBE Root Vectors Group"); 55 | walkObjects(contents, "ADBE Vector Graphic - Fill", function (obj) { 56 | obj.enabled ^= true; 57 | }, void 0, ["ADBE Vector Group", "ADBE Vectors Group", "ADBE Root Vectors Group"]); 58 | break; 59 | case (layer instanceof TextLayer): 60 | var textProp = layer.property("Source Text"); 61 | var textDocument = textProp.value; 62 | textDocument.applyFill ^= true; 63 | textProp.setValue(textDocument); 64 | break; 65 | default: 66 | break; 67 | } 68 | }); 69 | app.endUndoGroup(); 70 | })(); -------------------------------------------------------------------------------- /Scripts/!02ToggleStroke.jsx: -------------------------------------------------------------------------------- 1 | // ToggleStroke 2 | // Ver 1.1.1 3 | // Liesegang 2020 (yyama0704@gmail.com) 4 | 'use strict'; 5 | 6 | (function () { 7 | Array.prototype.map = function(func){ 8 | var arr = this; 9 | var ret = []; 10 | var len = arr.length; 11 | for(var i = 0; i < len; i++){ 12 | ret.push(func(arr[i], i)); 13 | } 14 | return ret; 15 | }; 16 | 17 | Array.prototype.includes = function(x){ 18 | var arr = this; 19 | var len = arr.length; 20 | for(var i = 0; i < len; i++){ 21 | if(x === arr[i]) return true; 22 | } 23 | return false; 24 | }; 25 | 26 | function mapAllProperties(obj, func){ 27 | if(obj.numProperties !== void 0) { 28 | var len = obj.numProperties; 29 | for(var i = 1; i <= len; i++){ 30 | func(obj.property(i)); 31 | } 32 | } 33 | }; 34 | 35 | function walkObjects(obj, matchName, func, args, only) { 36 | if (obj.matchName === matchName) func(obj); 37 | if (only === void 0 || only.includes(obj.matchName)) { 38 | mapAllProperties(obj, function (x) { 39 | walkObjects(x, matchName, func, args, only); 40 | }) 41 | } 42 | }; 43 | 44 | var comp = app.project.activeItem; 45 | if (comp === null) return; 46 | 47 | var layers = comp.selectedLayers; 48 | if (layers.length === 0) return; 49 | 50 | app.beginUndoGroup("ToggleStroke"); 51 | layers.map(function (layer, index) { 52 | switch (true) { 53 | case (layer instanceof ShapeLayer): 54 | var contents = layer.property("ADBE Root Vectors Group"); 55 | walkObjects(contents, "ADBE Vector Graphic - Stroke", function (obj) { 56 | obj.enabled ^= true; 57 | }, void 0, ["ADBE Vector Group", "ADBE Vectors Group", "ADBE Root Vectors Group"]); 58 | break; 59 | case (layer instanceof TextLayer): 60 | var textProp = layer.property("Source Text"); 61 | var textDocument = textProp.value; 62 | textDocument.applyStroke ^= true; 63 | textProp.setValue(textDocument); 64 | break; 65 | default: 66 | break; 67 | } 68 | }); 69 | app.endUndoGroup(); 70 | })(); -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Liesegang's AE Scripts 2 | 3 | ## 導入方法 4 | 5 | 1. [リリース](https://github.com/Liesegang/liesegangs_aescripts/releases/)から最新の `liesegangs_aescripts.zip` をダウンロード 6 | 2. zipを展開し,`Scripts`フォルダ内のすべてのファイル,フォルダを`(After Effectsがインストールされているフォルダ)\Support Files\Scripts` にコピー 7 | + デフォルトの場所は `C:\Program Files\Adobe\Adobe After Effects <バージョン>\Support Files\Scripts\ScriptUI Panels` になります. 8 | 3. 必要に応じて,`!`から始まるスクリプトにショートカットキーを割り当てる. 9 | + [こちらのページ](https://sites.google.com/view/youuu4/script%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95ae#h.p_CRVg-gE4sgMp)を参考にしてください 10 | 11 | 12 | ## 説明 13 | 14 | ### Add Shape Layers 15 | シェイプをワンクリックで追加します.よく使うプロパティが,エフェクトとして追加されます. 16 | 17 | ![top-page](documents/AddShapeLayers/demo.gif) 18 | 19 | 図形は, 20 | 21 | + 円 22 | + 楕円 23 | + 正方形 24 | + 長方形 25 | + 正三角形 26 | + 五芒星 27 | + 六芒星 28 | + 扇形 29 | + 環状扇型 30 | 31 | に対応しています. 32 | 33 | 扇型,環状扇型のみ,境界線に非対応です. 34 | 35 | ### Utility Tools 36 | シェイプ関係の便利ツールをまとめたパネルです。まだ"Disassemble Repeater"しかありません。 37 | 38 | #### Disassemble Repeater 39 | シェイプレイヤーのリピーターで複製したオブジェクトを、個別のレイヤーとして分解します。リピーターの各要素に時間差をつけたアニメーションを施したいときに使うことを想定しています。 40 | 時間をずらすためには、[Motion Tools](https://motiondesign.school/products/motion-tools/)、[Rift](https://aescripts.com/rift/)、[UtilityBox](https://voxyde.gumroad.com/l/VFKbZ)などが使えます。 41 | とくにRiftは時間差に対するイーズなど細かい設定ができて便利です。 42 | 43 | 実際行われるのは、シェイプレーヤーをコピー数分複製し、コピー数を1にした後、オフセットをそれぞれに設定します。 44 | 45 | ![](documents/Utility%20Tools/Disassemble%20Repeater%20preview.gif) 46 | 47 | リピーターが多重に掛けられている場合も複数回実行することで対応できます。 48 | ![](documents/Utility%20Tools/Disassemble%20Repeater%20preview%20multi%20dimension.gif) 49 | 50 | ### ShortcutScripts 51 | ショートカットキーを割り当てることを前提に作ったスクリプトです. 52 | 本来After Effectsではショートカットキーを割り当てられない操作(ヌルとそれを親としたカメラを,ショートカットキーで追加したいなど)にショートカットキーを割り当てるときに使います. 53 | スクリプトにショートカットキーを割り当てる方法は,[こちらのページ](https://sites.google.com/view/youuu4/script%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95ae#h.p_CRVg-gE4sgMp)を参考にしてください 54 | 55 | #### !00AddNullAndCam 56 | ヌルとそれを親としたカメラを挿入する.Nullが上になります. 57 | 58 | #### !01ToggleFill 59 | 選択しているレイヤーのうち,すべてのテキストレイヤーのFill,すべてのシェイプレイヤー内のすべてのFillの表示,非表示を反転します. 60 | 61 | #### !02ToggleStroke 62 | 選択しているレイヤーのうち,すべてのテキストレイヤーのStroke,すべてのシェイプレイヤー内のすべてのStrokeの表示,非表示を反転します. 63 | 64 | 65 | 66 | ## Change Logs 67 | ### ShortcutScripts 68 | #### !00AddNullAndCam 69 | + 1.0.1 70 | + カメラの中心位置がずれる問題を修正しました. 71 | 72 | #### !01ToggleFill 73 | + 1.1.0 74 | + テキストレイヤーに対応 75 | + UndoGroupに対応 76 | 77 | #### !02ToggleStroke 78 | + 1.1.0 79 | + テキストレイヤーに対応 80 | + UndoGroupに対応 81 | 82 | ### ScriptUI Panels 83 | -------------------------------------------------------------------------------- /templates/helper_functions.jsx: -------------------------------------------------------------------------------- 1 | // Array Prototypes 2 | Array.prototype.map = function(func){ 3 | var arr = this; 4 | var ret = []; 5 | var len = arr.length; 6 | for(var i = 0; i < len; i++){ 7 | ret.push(func(arr[i], i)); 8 | } 9 | return ret; 10 | }; 11 | 12 | Array.prototype.filter = function(func){ 13 | var arr = this; 14 | var ret = []; 15 | var len = arr.length; 16 | for(var i = 0; i < len; i++){ 17 | if(func(arr[i])) ret.push(arr[i]); 18 | } 19 | return ret; 20 | }; 21 | 22 | Array.prototype.acc = function(func, initial){ 23 | var arr = this; 24 | var ret; 25 | 26 | if(arr.length === 0){ 27 | if(initial !== void 0){ 28 | return initial; 29 | }else{ 30 | return void 0; 31 | } 32 | } 33 | 34 | if(func === void 0){ 35 | func = function(x, y){return x + y;}; 36 | } 37 | 38 | if(initial === void 0){ 39 | ret = arr[0]; 40 | }else{ 41 | ret = func(initial, arr[0]); 42 | } 43 | 44 | var len = arr.length; 45 | for(var i = 1; i < len; i++){ 46 | ret = func(ret, arr[i]); 47 | } 48 | return ret; 49 | }; 50 | 51 | Array.prototype.includes = function(x){ 52 | var arr = this; 53 | var len = arr.length; 54 | for(var i = 0; i < len; i++){ 55 | if(x === arr[i]) return true; 56 | } 57 | return false; 58 | }; 59 | 60 | 61 | // For AE Objects 62 | function mapAllProperties(obj, func){ 63 | if(obj.numProperties !== void 0) { 64 | var len = obj.numProperties; 65 | for(var i = 1; i <= len; i++){ 66 | func(obj.property(i)); 67 | } 68 | } 69 | }; 70 | 71 | function walkObjects(obj, matchName, func, args, only) { 72 | if (obj.matchName === matchName) func(obj); 73 | if (only === void 0 || only.includes(obj.matchName)) { 74 | mapAllProperties(obj, function (x) { 75 | walkObjects(x, matchName, func, args, only); 76 | }) 77 | } 78 | }; 79 | 80 | 81 | // For Development 82 | function printMatchNameTree(obj, depth){ 83 | if(obj.matchName === void 0) return; 84 | 85 | if(depth === void 0) depth = 0; 86 | for(var i = 0; i < depth; i++){ 87 | $.write(" "); 88 | } 89 | $.writeln(obj.matchName); 90 | 91 | mapAllProperties(obj, function (x){printMatchNameTree(x, depth+1);}); 92 | } 93 | 94 | function assert(a, b){ 95 | if(b === void 0){ 96 | if(a){ 97 | $.writeln("OK"); 98 | }else{ 99 | $.writeln("Error!"); 100 | } 101 | return; 102 | } 103 | 104 | if(a instanceof Array){ 105 | assert(a.toString() == b.toString()); 106 | return; 107 | } 108 | 109 | $.writeln("Error!"); 110 | } -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Utility Tools.jsx: -------------------------------------------------------------------------------- 1 | // Utility Tools 2 | // Ver 1.0.0 3 | // Liesegang 2021 (yyama0704@gmail.com) 4 | 'use strict'; 5 | 6 | (function (thisObj) { 7 | function buildUI(thisObj) { 8 | var windowName = "Utility Tools"; 9 | var myPanel = (thisObj instanceof Panel) ? thisObj : new Window("window", windowName, undefined, { 10 | resizeable: true 11 | }); 12 | 13 | // Write UI Code Here 14 | var buttonSize = [0, 0, 27, 28]; 15 | var margin = 4; 16 | 17 | myPanel.spacing = 0; 18 | myPanel.margins = 4; 19 | 20 | var mainGroup = myPanel.add("group"); 21 | mainGroup.orientation = "stack"; 22 | mainGroup.alignment = ["center", "center"]; 23 | 24 | var rowGroup = mainGroup.add("group"); 25 | rowGroup.orientation = "row"; 26 | rowGroup.alignment = ["center", "center"]; 27 | rowGroup.spacing = margin; 28 | rowGroup.margins = 0; 29 | 30 | var btn = rowGroup.add("button", undefined, "Disassemble Repeater"); 31 | btn.helpTip = "Disassemble repeater shapes from shape layer"; 32 | btn.onClick = function() { 33 | disassembleRepeater(); 34 | }; 35 | 36 | myPanel.onResizing = myPanel.onResize = function () { 37 | this.layout.resize(); 38 | }; 39 | if (myPanel instanceof Window) { 40 | myPanel.center(); 41 | myPanel.show(); 42 | } else { 43 | myPanel.layout.layout(true); 44 | myPanel.layout.resize(); 45 | } 46 | } 47 | 48 | // Write Code Here 49 | // Library 50 | Array.prototype.map = function(func){ 51 | var arr = this; 52 | var ret = []; 53 | var len = arr.length; 54 | for(var i = 0; i < len; i++){ 55 | ret.push(func(arr[i], i)); 56 | } 57 | return ret; 58 | }; 59 | 60 | Array.prototype.includes = function(x){ 61 | var arr = this; 62 | var len = arr.length; 63 | for(var i = 0; i < len; i++){ 64 | if(x === arr[i]) return true; 65 | } 66 | return false; 67 | }; 68 | 69 | function mapAllProperties(obj, func){ 70 | if(obj.numProperties !== void 0) { 71 | var len = obj.numProperties; 72 | for(var i = 1; i <= len; i++){ 73 | func(obj.property(i)); 74 | } 75 | } 76 | }; 77 | 78 | function walkObjects(obj, matchName, func, args, only) { 79 | if (obj.matchName === matchName) func(obj); 80 | if (only === void 0 || only.includes(obj.matchName)) { 81 | mapAllProperties(obj, function (x) { 82 | walkObjects(x, matchName, func, args, only); 83 | }) 84 | } 85 | }; 86 | 87 | function copyArray(arr) { 88 | var ret = []; 89 | for (var i = 0; i< arr.length; i++) { 90 | ret.push(arr[i]); 91 | } 92 | return ret; 93 | } 94 | 95 | function findObjectBfs(obj, matchName) { 96 | var queue = []; 97 | var ret = []; 98 | queue.push([obj, []]); 99 | while(queue.length > 0) { 100 | var top = queue.shift(); 101 | var q = top[0]; 102 | var path = top[1]; 103 | if(q.numProperties !== void 0) { 104 | var len = q.numProperties; 105 | for(var i = 1; i <= len; i++){ 106 | var newPath = copyArray(path); 107 | newPath.push(i); 108 | if(q.property(i).matchName === matchName) { 109 | ret.push([q.property(i), newPath]); 110 | } 111 | queue.push([q.property(i), newPath]); 112 | } 113 | } 114 | } 115 | return ret; 116 | } 117 | 118 | function printMatchNameTree(obj, depth){ 119 | if(obj.matchName === void 0) return; 120 | 121 | if(depth === void 0) depth = 0; 122 | for(var i = 0; i < depth; i++){ 123 | $.write("\t"); 124 | } 125 | $.writeln(obj.matchName); 126 | 127 | mapAllProperties(obj, function (x){printMatchNameTree(x, depth+1);}); 128 | } 129 | 130 | function getObjectFromPath(obj, path) { 131 | var ret = obj; 132 | for(var i = 0; i < path.length; i++) { 133 | ret = ret.property(path[i]); 134 | } 135 | return ret; 136 | } 137 | 138 | // Main 139 | function disassembleRepeater() { 140 | var comp = app.project.activeItem; 141 | if (comp === null) { 142 | alert("Select composition."); 143 | return; 144 | } 145 | 146 | var layers = comp.selectedLayers; 147 | if (layers.length === 0) { 148 | alert("Select shape layer."); 149 | return; 150 | } 151 | 152 | var count = 0; 153 | 154 | app.beginUndoGroup("DisassembleRepeater"); 155 | layers.map(function (layer, index) { 156 | switch (true) { 157 | case (layer instanceof ShapeLayer): 158 | var root = layer.property("ADBE Root Vectors Group"); 159 | var repeaters = findObjectBfs(root, "ADBE Vector Filter - Repeater"); 160 | for (var i = 0; i < repeaters.length; i++) { 161 | var repeater = repeaters[i][0]; 162 | var path = repeaters[i][1]; 163 | var numCopie = Math.floor(repeater.property("ADBE Vector Repeater Copies").value); 164 | if (numCopie >= 2) { 165 | var layername = layer.name; 166 | var offset = repeater.property("ADBE Vector Repeater Offset").value; 167 | count++; 168 | repeater.property("ADBE Vector Repeater Copies").setValue(1); 169 | layer.name = layername + " : " + offset; 170 | for(var j = 1; j < numCopie; j++) { 171 | layer = layer.duplicate(); 172 | layer.name = layername + " : " + (offset + j); 173 | var newRepeater = getObjectFromPath(layer.property("ADBE Root Vectors Group"), path); 174 | newRepeater.property("ADBE Vector Repeater Copies").setValue(1); 175 | newRepeater.property("ADBE Vector Repeater Offset").setValue(offset + j); 176 | } 177 | break; 178 | } 179 | } 180 | break; 181 | default:s 182 | break; 183 | } 184 | }); 185 | app.endUndoGroup(); 186 | 187 | if(count === 0) { 188 | alert("Cannot found valid repeater (copies must be more than 1)"); 189 | } 190 | } 191 | buildUI(thisObj); 192 | })(this); 193 | -------------------------------------------------------------------------------- /Scripts/ScriptUI Panels/Add Shape Layers.jsx: -------------------------------------------------------------------------------- 1 | // Add Shape Layers 2 | // Ver 1.0.0 3 | // Liesegang 2020 (yyama0704@gmail.com) 4 | 'use strict'; 5 | 6 | function add_shape_layers_script(thisObj) { 7 | var add_shape_layers = {}; 8 | 9 | add_shape_layers.FileCheck = function(){ 10 | var ret = true; 11 | for(var i = 0; i < add_shape_layers.resourceFileList.length; i++) { 12 | if(!(new File(add_shape_layers.resourcePath + "/" + add_shape_layers.resourceFileList[i]).exists)){ 13 | alert("error -- " + add_shape_layers.resourceFileList[i] + " does not exist."); 14 | ret = false; 15 | } 16 | } 17 | return ret; 18 | } 19 | 20 | add_shape_layers.GetIconPath = function(fileName) { 21 | return add_shape_layers.resourcePath + "/" + fileName + ".png"; 22 | } 23 | 24 | add_shape_layers.GetFFX = function(shape) { 25 | return new File(add_shape_layers.resourcePath + "/" + shape + " Control.ffx"); 26 | } 27 | 28 | add_shape_layers.addStrokeAndFill = function(group) { 29 | // Stroke 30 | var stroke = group.addProperty("ADBE Vector Graphic - Stroke"); 31 | var strokeOpacity = stroke.property("ADBE Vector Stroke Opacity"); 32 | strokeOpacity.expression = 'effect("Control")("Stroke")>0?value:0'; 33 | var strokeWidth = stroke.property("ADBE Vector Stroke Width"); 34 | strokeWidth.expression = 'effect("Control")("Stroke Width")'; 35 | var strokeColor = stroke.property("ADBE Vector Stroke Color"); 36 | strokeColor.expression = 'effect("Control")("Stroke Color")'; 37 | 38 | // Fill 39 | var fill = group.addProperty("ADBE Vector Graphic - Fill"); 40 | var fillOpacity = fill.property("ADBE Vector Fill Opacity"); 41 | fillOpacity.expression = 'effect("Control")("Fill")>0?value:0'; 42 | var fillColor = fill.property("ADBE Vector Fill Color"); 43 | fillColor.expression = 'effect("Control")("Fill Color")'; 44 | } 45 | 46 | add_shape_layers.AddShape = function(shapeType) { 47 | var currentComp = app.project.activeItem; 48 | if(currentComp === null) { 49 | alert("Select composition!"); 50 | return; 51 | } 52 | 53 | var currentLayers = currentComp.selectedLayers; 54 | var adaptable = false; 55 | // if(currentLayers.length == 0) adaptable = false; 56 | // for(var i = 0; i < currentLayers.length; i++) { 57 | // if(!(currentLayers[i] instanceof ShapeLayer)) adaptable = false; 58 | // } 59 | if(!adaptable){ 60 | currentLayers = [currentComp.layers.addShape()]; 61 | } 62 | 63 | for(var i = 0; i < currentLayers.length; i++) { 64 | var currentLayer = currentLayers[i]; 65 | currentLayer.name = shapeType; 66 | currentLayer.applyPreset(new File(add_shape_layers.GetFFX(shapeType))); 67 | 68 | var group = currentLayer.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group").property("ADBE Vectors Group"); 69 | group.parentProperty.name = shapeType; 70 | 71 | switch(shapeType){ 72 | case "Circle": 73 | var shape = group.addProperty("ADBE Vector Shape - Ellipse"); 74 | var size = shape.property("ADBE Vector Ellipse Size"); 75 | size.expression = 'r=effect("Control")("Radius")*2;[r,r]'; 76 | size.enableExpression = true; 77 | add_shape_layers.addStrokeAndFill(group); 78 | break; 79 | case "Ellipse": 80 | var shape = group.addProperty("ADBE Vector Shape - Ellipse"); 81 | var size = shape.property("ADBE Vector Ellipse Size"); 82 | size.expression = 'effect("Control")("Size");'; 83 | size.enableExpression = true; 84 | add_shape_layers.addStrokeAndFill(group); 85 | break; 86 | case "Square": 87 | var shape = group.addProperty("ADBE Vector Shape - Rect"); 88 | var size = shape.property("ADBE Vector Rect Size"); 89 | size.expression = 't=effect("Control")("Size");[t,t]'; 90 | size.enableExpression = true; 91 | add_shape_layers.addStrokeAndFill(group); 92 | break; 93 | case "Rectangle": 94 | var shape = group.addProperty("ADBE Vector Shape - Rect"); 95 | var size = shape.property("ADBE Vector Rect Size"); 96 | size.expression = 'effect("Control")("Size");'; 97 | size.enableExpression = true; 98 | add_shape_layers.addStrokeAndFill(group); 99 | break; 100 | case "Triangle": 101 | var shape = group.addProperty("ADBE Vector Shape - Star"); 102 | shape.property("ADBE Vector Star Type").setValue(2); 103 | shape.property("ADBE Vector Star Points").setValue(3); 104 | var size = shape.property("ADBE Vector Star Outer Radius"); 105 | size.expression = 'effect("Control")("Radius");'; 106 | size.enableExpression = true; 107 | add_shape_layers.addStrokeAndFill(group); 108 | break; 109 | case "Star": 110 | var shape = group.addProperty("ADBE Vector Shape - Star"); 111 | shape.property("ADBE Vector Star Type").setValue(1); 112 | shape.property("ADBE Vector Star Points").setValue(5); 113 | var innserSize = shape.property("ADBE Vector Star Inner Radius"); 114 | innserSize.expression = 'effect("Control")("Radius")*0.383;'; 115 | innserSize.enableExpression = true; 116 | var outerSize = shape.property("ADBE Vector Star Outer Radius"); 117 | outerSize.expression = 'effect("Control")("Radius");'; 118 | outerSize.enableExpression = true; 119 | add_shape_layers.addStrokeAndFill(group); 120 | break; 121 | case "Star6": 122 | var shape = group.addProperty("ADBE Vector Shape - Star"); 123 | shape.property("ADBE Vector Star Type").setValue(1); 124 | shape.property("ADBE Vector Star Points").setValue(6); 125 | var innserSize = shape.property("ADBE Vector Star Inner Radius"); 126 | innserSize.expression = 'effect("Control")("Radius")*0.5775;'; 127 | innserSize.enableExpression = true; 128 | var outerSize = shape.property("ADBE Vector Star Outer Radius"); 129 | outerSize.expression = 'effect("Control")("Radius");'; 130 | outerSize.enableExpression = true; 131 | add_shape_layers.addStrokeAndFill(group); 132 | break; 133 | case "Fan": 134 | var shape = group.addProperty("ADBE Vector Shape - Ellipse"); 135 | var size = shape.property("ADBE Vector Ellipse Size"); 136 | size.expression = 'r=effect("Control")("Radius");[r,r]'; 137 | size.enableExpression = true; 138 | var trimPath = group.addProperty("ADBE Vector Filter - Trim"); 139 | var start = trimPath.property("ADBE Vector Trim Start"); 140 | var end = trimPath.property("ADBE Vector Trim End"); 141 | start.expression = 'effect("Control")("Start Angle")/3.6;' 142 | start.enableExpression = true; 143 | end.expression = 'effect("Control")("End Angle")/3.6;' 144 | end.enableExpression = true; 145 | var stroke = group.addProperty("ADBE Vector Graphic - Stroke"); 146 | var strokeWidth = stroke.property("ADBE Vector Stroke Width"); 147 | strokeWidth.expression = 'effect("Control")("Radius")'; 148 | var strokeColor = stroke.property("ADBE Vector Stroke Color"); 149 | strokeColor.expression = 'effect("Control")("Color")'; 150 | break; 151 | case "Annular Sector": 152 | var shape = group.addProperty("ADBE Vector Shape - Ellipse"); 153 | var size = shape.property("ADBE Vector Ellipse Size"); 154 | size.expression = 't=effect("Control")("Inner Radius")+effect("Control")("Outer Radius");[t,t]'; 155 | size.enableExpression = true; 156 | var trimPath = group.addProperty("ADBE Vector Filter - Trim"); 157 | var start = trimPath.property("ADBE Vector Trim Start"); 158 | var end = trimPath.property("ADBE Vector Trim End"); 159 | start.expression = 'effect("Control")("Start Angle")/3.6;' 160 | start.enableExpression = true; 161 | end.expression = 'effect("Control")("End Angle")/3.6;' 162 | end.enableExpression = true; 163 | var stroke = group.addProperty("ADBE Vector Graphic - Stroke"); 164 | var strokeWidth = stroke.property("ADBE Vector Stroke Width"); 165 | strokeWidth.expression = 't=effect("Control")("Outer Radius")-effect("Control")("Inner Radius");t>=0?t:0'; 166 | var strokeColor = stroke.property("ADBE Vector Stroke Color"); 167 | strokeColor.expression = 'effect("Control")("Color")'; 168 | break; 169 | default: 170 | alert("Unknown shape!"); 171 | break; 172 | } 173 | } 174 | } 175 | 176 | add_shape_layers.BuildUI = function(thisObj) { 177 | add_shape_layers.scriptName = "Add Shape Layers"; 178 | add_shape_layers.version = "1.0.0"; 179 | add_shape_layers.ms = 4; // margin size 180 | add_shape_layers.bs = [0, 0, 27, 28]; // button size 181 | 182 | add_shape_layers.palette = (thisObj instanceof Panel) ? thisObj : new Window("palette" , add_shape_layers.scriptName + " " + add_shape_layers.version, undefined , {resizeable:true}); 183 | add_shape_layers.palette.spacing = 0; 184 | add_shape_layers.palette.margins = 4; 185 | 186 | var mainGroup = add_shape_layers.palette.add("group"); 187 | mainGroup.orientation = "stack"; 188 | mainGroup.alignment = ["center", "center"]; 189 | 190 | var rowGroup = mainGroup.add("group"); 191 | rowGroup.orientation = "row"; 192 | rowGroup.alignment = ["center", "center"]; 193 | rowGroup.spacing = add_shape_layers.ms; 194 | rowGroup.margins = 0; 195 | 196 | for(var i = 0; i < add_shape_layers.shapes.length; i++){ 197 | var shape = add_shape_layers.shapes[i]; 198 | var btn = rowGroup.add("iconbutton", add_shape_layers.bs, add_shape_layers.GetIconPath(shape)); 199 | btn.helpTip = "Add " + shape; 200 | (function() { 201 | var localShape = shape; 202 | btn.onClick = function() { 203 | app.beginUndoGroup("AddShape"); 204 | add_shape_layers.AddShape(localShape); 205 | app.endUndoGroup(); 206 | }; 207 | })(); 208 | } 209 | 210 | add_shape_layers.palette.layout.layout(true); 211 | add_shape_layers.palette.onResizing = function(){ 212 | add_shape_layers.palette.layout.resize(); 213 | }; 214 | add_shape_layers.palette.onResize = function(){ 215 | add_shape_layers.palette.layout.resize(); 216 | }; 217 | } 218 | 219 | add_shape_layers.rootPath = new File(new File($.fileName).parent); 220 | add_shape_layers.resourcePath = add_shape_layers.rootPath.fullName + "/Liesegang/AddShapeLayers"; 221 | add_shape_layers.resourceFileList = []; 222 | add_shape_layers.shapes = ["Circle", "Ellipse", "Square", "Rectangle", "Triangle", "Star", "Star6", "Fan", "Annular Sector"]; 223 | 224 | if(!add_shape_layers.FileCheck()){ 225 | return; 226 | } 227 | 228 | add_shape_layers.BuildUI(thisObj); 229 | if(!(add_shape_layers.palette instanceof Panel)) { 230 | add_shape_layers.palette.show(); 231 | } 232 | }; 233 | 234 | add_shape_layers_script(this); --------------------------------------------------------------------------------