Illustratorで複数のレイヤーを使っていると,レイヤー構造をキープしたままコピー&ペーストしたくなるときがあります。
そんなときはレイヤーパネルのメニューからコピー元のレイヤーにペーストを選択すれば,元の階層にペーストする設定になります。
でも,パネルのメニューを開いたりクリックしたりするのは面倒です。設定を戻し忘れて後で警告が出た方も多いのではないでしょうか。
思わず「気がきかないな!」と悪態をついてしまいますね。
そこで今回は,コピー元のレイヤーにペーストに設定し,ペーストしたあと元の設定に戻すJavaScriptを紹介します。
あらましを教えて
[コピー元のレイヤーにペースト]にチェックを入れ,ペーストしたあと元の設定に戻すIllustrator用スクリプトです。ファイル名を特定の形式にすることで,ただの[ペースト][前面へペースト]など動作の種類を指定できます。あらかじめ設定済みのスクリプト(pasteKeepLayers=paste.jsxなど)6個セットです。
Keyboard MaestroやSPAi,SPPYなどスクリプトにキーボードショートカットを設定するアプリと組み合わせて使うと便利です。
どのバージョンに対応してるの?
Illustrator CS6 かそれ以降のバージョンに対応しています。pasteKeepLayers=paste.jsx のみ,もっと古いバージョンでも動くはずです。
使いかたは?
それではこちらのファイルをダウンロードしてください。
sttk3-pasteKeepLayers
Illustratorでオブジェクトを普通にコピーしたあと,pasteKeepLayers=pasteFront.jsx などスクリプトを実行するだけです。
[コピー元のレイヤーにペースト]の設定がどちらになっていても,レイヤー構造を保ったままペーストを実行します。実行後も[コピー元~]の設定は変わらずそのままになっているはずです。
この機能にキーボードショートカットを割り当てれば,思い立ったときにすぐ[コピー元のレイヤーにペースト]できるようになります。
どうやって種類を指定するの?
スクリプトのファイル名を pasteKeepLayers=pasteFront.jsx のような特定の形式にすることで,実行するペーストの種類を指定します。ファイル名pasteFront部分の編集により,それらの設定を変えられます。
どんな種類が指定できるの?
次のようになっています。
ペーストの種類 | 動作説明 |
---|---|
paste | 通常の[ペースト]を実行する |
pasteFront | [前面へペースト]を実行する |
pasteBack | [背面へペースト]を実行する |
pasteInPlace | [同じ位置にペースト]を実行する |
pasteInAllArtboard | [すべてのアートボードにペースト]を実行する |
dialog | ダイアログでペーストの種類を選択して実行する |
argv | ペーストの種類 “pasteFront” などをスクリプト実行時の引数で指定する |
pasteKeepLayers=dialog.jsx では,ダイアログでペーストの種類を選択して実行できます。各項目の左にある数字がショートカットキーです。単体でキーを押して項目を選択し,returnキーで確定します。
動画にするとこうなります。
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
/** * @file 一時的に"コピー元のレイヤーのペースト"にしてからペーストし,その後設定を戻す。 * pasteKeepLayers=pasteFront.jsxのようなファイル名からペーストの種類を取り出しそれを実行する。 * pasteKeepLayers=paste : ペースト * pasteKeepLayers=pasteFront : 前面へペースト * pasteKeepLayers=pasteBack : 背面へペースト * pasteKeepLayers=pasteInPlace : 同じ位置にペースト * pasteKeepLayers=pasteInAllArtboard : すべてのアートボードにペースト * pasteKeepLayers=dialog : ペーストの種類をダイアログで指定 * pasteKeepLayers=argv : ペーストの種類をargumentsで指定 * @version 1.2.0 * @author sttk3.com * @copyright (c) 2020 sttk3.com */ //#target 'illustrator' var AiPasteCommands = [ {en: 'paste', ja: 'ペースト'}, {en: 'pasteFront', ja: '前面へペースト'}, {en: 'pasteBack', ja: '背面へペースト'}, {en: 'pasteInPlace', ja: '同じ位置にペースト'}, {en: 'pasteInAllArtboard', ja: 'すべてのアートボードにペースト'} ] ; (function(argv) { $.localize = true ; if(app.documents.length <= 0) {return ;} // ファイル名から引数を生成する var tempArgv = parseArguments(decodeURIComponent(new File($.fileName).name), argv) ; if(tempArgv == null) { alert({en: 'The command name was unknown.', ja: '動作の指定が不明でした。'}) ; return ; } var command = tempArgv.option ; if(command == 'dialog') { // ペースト種類リストを作る var hotKeys = '12345' ; var delim = '\t' ; var commandList = [] ; for(var i = 0, len = AiPasteCommands.length ; i < len ; i++) { commandList.push((hotKeys[i] || ' ') + delim + AiPasteCommands[i]) ; } if(commandList.length <= 0) {return ;} // ダイアログ var win = new Window('dialog', 'pasteKeepLayers') ; // リスト var body = win.add('group', undefined) ; body.orientation = 'column' ; body.alignChildren = ['fill', 'fill'] ; body.add('statictext', undefined, {en : 'Choose paste command', ja : 'ペーストの種類を選択'}) ; var list = body.add('listbox', undefined, commandList) ; list.selection = list.items[0] ; list.active = true ; win.addEventListener('keyup', function(e) { var dstIndex = hotKeys.indexOf(e.keyName) ; if(dstIndex >= 0) {list.selection = list.items[dstIndex] ;} }) ; // Cancel | OK var footer = win.add('group', undefined) ; footer.orientation = 'row' ; footer.alignChildren = ['center', 'fill'] ; var cancelButton, okButton ; var os = $.os ; var cancelLabel = 'Cancel' ; var okLabel = 'OK' ; if(/^w/i.test(os)) { okButton = footer.add('button', undefined, okLabel) ; cancelButton = footer.add('button', undefined, cancelLabel) ; } else { cancelButton = footer.add('button', undefined, cancelLabel) ; okButton = footer.add('button', undefined, okLabel) ; } okButton.selected = true ; var doCancel = false ; okButton.onClick = okButton.onSubmit = function(e) {win.close() ;} ; cancelButton.onClick = function(e) { doCancel = true ; win.close() ; } ; // ダイアログを表示する win.show() ; if(doCancel) {return ;} command = AiPasteCommands[list.selection.index].en ; } // 実際にペーストする pastePreserveLayers(command) ; })(arguments) ; /** * pasteKeepLayers=pasteFront.jsxのような文字列を解析する * @param {String} str 対象の文字列 * @param {Arguments} argv ファイル実行引数 * @return {Object} {mode: String, option: String} */ function parseArguments(str, argv) { var res ; var matchObj = str.match(/^(pasteKeepLayers)[\s ]*[==][\s ]*(pasteInAllArtboard|pasteInPlace|pasteBack|pasteFront|paste|dialog|argv)[\s ]*(?:\.js(?:x|xbin)?)?$/i) ; if(!matchObj) {return res ;} var mode = matchObj[1] ; // ペーストコマンド名。'pasteFront'のような文字が来る var opt = matchObj[2] ; // 単一ファイルで引数を受け取るパターンに対応する if(/^argv$/i.test(opt)) { var tempStr = $.getenv('sttk3_arguments') ; if(tempStr == '') { if(argv.length <= 0) {return res ;} tempStr = argv[0].toString() ; } res = {mode: mode, option: tempStr} ; } else { res = {mode: mode, option: opt} ; } return res ; } /** * 一時的に"コピー元のレイヤーのペースト"にしてからペーストし,その後設定を戻す * @param {String} pasteCommandName 実行するペースト関連コマンド名<br /> * paste : ペースト<br /> * pasteFront : 前面へペースト<br /> * pasteBack : 背面へペースト<br /> * pasteInPlace : 同じ位置にペースト<br /> * pasteInAllArtboard : すべてのアートボードにペースト * @return なし */ function pastePreserveLayers(pasteCommandName) { if(!pasteCommandName) {var pasteCommandName = 'paste' ;} var pref = app.preferences ; var keyName = 'layers/pastePreserve' ; var prefModified = false ; try { // コピー元のレイヤーにペースト になっているか確認し,なっていなければ切り替える var originalLayerPreserve = pref.getBooleanPreference(keyName) ; if(!originalLayerPreserve) { pref.setBooleanPreference(keyName, true) ; prefModified = true ; } // ペーストを実行 switch(pasteCommandName) { case 'paste' : // CS6以前でも使える app.paste() ; break ; case 'pasteFront' : case 'pasteBack' : case 'pasteInPlace' : case 'pasteInAllArtboard' : // CS6以降のみ実行 if(appVersion()[0] >= 16) { app.executeMenuCommand(pasteCommandName) ; } else { alert({en: '"' + pasteCommandName + '" requires Illustrator CS6 or later', ja: '"' + pasteCommandName + '" は Illustrator CS6 以降のみに対応しています。'}) ; } break ; default : alert({en: 'The command name was unknown.', ja: '動作の指定が不明でした。'}) ; break ; } } finally { // コピー元のレイヤーにペースト の状態を元に戻す if(prefModified) {pref.setBooleanPreference(keyName, originalLayerPreserve) ;} } } /** * スクリプト実行元アプリケーションのバージョンを取得して数値の配列にする。16.0.4の場合[16, 0, 4] * @return {Array of numbers} */ function appVersion() { var tmp = app.version.toString().split('.') ; var res = [] ; for(var i = 0, len = tmp.length ; i < len ; i++) { res.push(Number(tmp[i])) ; } return res ; } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。