以前の記事【解決】Illustratorにもオートフィルがほしい!により,選択した2つのテキストフレームの距離でアイテムを複製移動し,数値をオートフィルできるようになりました。
スクリプト実行にショートカットを割り振れば,ショートカットを連打するだけで一定間隔での複製と数値の打ち替えができます。便利ですね。
しかし作業をしていると「パスとかグループとか一定間隔で複製移動だけしてくれないか? 数値はオートフィルしなくていいから」と思うことがあります。リピートグリッドがあれば解決しそうですが,連打でできる爽快感も良いものです。
そこで今回は,選択した2つのアイテムの距離でアイテムを複製移動するIllustratorスクリプトを紹介します。
あらまし
選択した2つのアイテムの距離でアイテムを複製移動するIllustratorスクリプトです。2種類入っています。
autoCopy=next.jsx:古い(背面にある)アイテムから新しい(前面にある)アイテムに向かう方向と距離で,新しいほうのアイテムを複製移動します。
autoCopy=prev.jsx:nextの逆方向です。新しい(前面にある)アイテムから古い(背面にある)アイテムに向かう方向と距離で,古いほうのアイテムを複製移動します。
選択アイテムが両方ポイントテキストの場合アンカーポイントで,それ以外の場合は左上座標で距離を測ります。
このリンクからダウンロードしてください。
sttk3-autoCopy.zip
使いかたは?
難しいことは何もありません。2つのアイテムを選択し,スクリプトを実行するだけです。
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
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 |
/** * @file 選択した2つのアイテムの距離でアイテムを複製移動する * @version 2.0.0 * @author sttk3.com * @copyright (c) 2022 sttk3.com */ //#target 'illustrator' $.localize = true ; (function(argv) { // スクリプトファイル名から引数を生成する 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 == '') {command = 'next' ;} if(app.documents.length <= 0) {return ;} var doc = app.documents[0] ; // 種類は何でもいいが2つのアイテムを対象とする。過不足があれば終了する var targetItems = doc.selection ; if(targetItems.length != 2) {return ;} targetItems.reverse() ; // 移動距離を算出する。ポイントテキスト同士のときはanchorで,それ以外はpositionで計算する var propName = 'position' ; if( (targetItems[0].constructor.name == 'TextFrame') && (targetItems[1].constructor.name == 'TextFrame') && (targetItems[0].kind == TextType.POINTTEXT) && (targetItems[1].kind == TextType.POINTTEXT) ) { propName = 'anchor' ; } var pos0 = targetItems[0][propName] ; var pos1 = targetItems[1][propName] ; var deltaXY = [pos1[0] - pos0[0], pos1[1] - pos0[1]] ; // アイテムを複製して移動する var newSelection ; switch(command) { case 'prev': case 'previous': // 移動方向を反転する。idea is from [Sergey Osokin](https://twitter.com/Creold) targetItems.push(targetItems[0].duplicate()) ; targetItems[2].translate(-1 * deltaXY[0], -1 * deltaXY[1]) ; targetItems[2].move(targetItems[0], ElementPlacement.PLACEAFTER) ; newSelection = [targetItems[0], targetItems[2]] ; break ; default: // case 'next'とその他。通常の移動方向 targetItems.push(targetItems[1].duplicate()) ; targetItems[2].translate(deltaXY[0], deltaXY[1]) ; newSelection = [targetItems[1], targetItems[2]] ; break ; } doc.selection = newSelection ; })(arguments) ; /** * autoCopy=next.jsxのような文字列を解析する * @param {String} str 対象の文字列 * @param {Arguments} argv ファイル実行引数 * @return {Object} {mode: String, option: String} */ function parseArguments(str, argv) { var res ; var matchObj = str.match(/^(autoCopy)[\s ]*[==](next|prev(?:vius)?|argv)(?:\.js(?:x|xbin)?)?$/i) ; if(!matchObj) {return res ;} var mode = matchObj[1] ; // コマンド名。'next'のような文字が来る var opt = matchObj[2] ; // 単一ファイルで引数を受け取るパターンに対応する if(/^argv$/i.test(opt)) { var tempStr = $.getenv('sttk3_arguments') ; if((tempStr == null) || (tempStr == '')) { if(argv.length <= 0) {return res ;} tempStr = argv[0].toString() ; } res = {mode: mode, option: tempStr} ; } else { res = {mode: mode, option: opt} ; } res.option = res.option.toLowerCase() ; return res ; } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。