Illustratorで「リンクを再設定」のダイアログを開くと,意図しないフォルダが表示されるときがあります。
どうも前回「配置」や「別名で保存」などで選んだフォルダがダイアログの起点になるようです。
基本的にリンク画像は同じフォルダにまとめて置いてあることが多いので,配置画像からそのフォルダを取得して表示してくれたら楽になりますよね。
そこで今回は選択した配置画像のあるフォルダを起点にして再リンクダイアログを開くスクリプトを紹介します
それではこちらのスクリプトをダウンロードしてください。
relinkDialog.jsx
1 ファイル 2.58 KB
使いかたは,リンク画像を選択してスクリプトを実行するだけです。
リンクが生きているときは,そのリンク画像があるフォルダを起点にします。もしリンクが行方不明になっていたら,開いているIllustrator書類の保存先を起点とします。
このスクリプトが開くダイアログは,正確に言うと「リンクを再設定」とは別物です。aiやpdfを配置するとき,ページやトリミング指定をする画面が出ないという違いがあります。そういった概念のない画像を扱うときは気にする必要はないでしょう。
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
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 |
/** * @fileOverview リンクを再設定風ダイアログ。リンクが生きていればそのファイルを,切れていればIllustrator書類をダイアログの起点にする * @version 1.0.0 * @author sttk3.com */ //#target 'illustrator' (function() { if(app.documents.length <= 0) {return ;} var doc = app.documents[0] ; // placedItemだけを取り出す var originalSelection = doc.selection ; var sel = allPageItemOfSelection(originalSelection) ; if(sel.length <= 0) {return ;} var targetItems = filterItems(function(aItem) {return /^PlacedItem$/.test(aItem.constructor.name)}, sel) ; if(targetItems.length <= 0) {return ;} doc.selection = [] ; var defaultMessage = 'リンクを再設定' ; var currentItem, baseDir, newLink, message, missing ; for(var i = 0, len = targetItems.length ; i < len ; i++) { // 複数選択している場合,人間が見たときにわかりやすいよう現在のターゲットだけを選択状態にする。それ以外に副作用などはない currentItem = targetItems[i] ; doc.selection = [currentItem] ; app.redraw() ; // リンクファイルの存在を確認する try { with(currentItem.file) { if(i == 0) {baseDir = parent ;} message = defaultMessage + ' : ' + name ; } } catch(e) { if(i == 0) { baseDir = doc.path ; missing = true ; } message = defaultMessage ; } // 再リンク処理する newLink = baseDir.openDlg(message, extFilter('tiff', 'jpeg', 'svgz', 'pdf', 'bmp', 'eps', 'gif', 'jpg', 'png', 'psd', 'svg', 'tif', 'ai'), false) ; if(!newLink) {return ;} currentItem.file = newLink ; // リンクが行方不明だったとき,2個目からは再リンクしたファイルを起点とする if(missing) { baseDir = newLink.parent ; missing = false ; } } // 選択状態を元に戻す doc.selection = originalSelection ; })() ; /** * selectionからgroupItemの中身を含めたすべてのpageItemを返す * @param {Array} sel selection * @return {Array} */ function allPageItemOfSelection(sel) { var res = [] ; for(var i = 0, len = sel.length ; i < len ; i++) { var currentItem = sel[i] ; switch(currentItem.constructor.name) { case 'GroupItem' : res.push(currentItem) ; res = res.concat(arguments.callee(currentItem.pageItems)) ; break ; default : res.push(currentItem) ; break ; } } return res ; } /** * Array.filterみたいなもの * @param {Function} func 条件式 * @param {Array} targetItems 対象のArrayかcollection。lengthとindexがあれば何でもいい * @return {Array} */ function filterItems(func, targetItems) { var res = [] ; for(var i = 0, len = targetItems.length ; i < len ; i++) { if(i in targetItems) { var val = targetItems[i] ; if(func.call(targetItems, val, i)) {res.push(val) ;} } } return res ; } /** * File.openDialogなどで使う,拡張子フィルタを生成して返す * @param {String} ext 対象の拡張子。'eps' 'ai'など.(ドット)をつけない形式。可変長の引数 * @return {Array | Function} * @usage File.openDialog('選択してください', extFilter('eps', 'ai'), true) ; */ function extFilter(ext) { var res ; if(/^w/i.test($.os)) { // windows用。['*eps', '*ai']みたいな配列を返す res = [] ; for(var i = 0, len = arguments.length ; i < len ; i++) { res.push('*' + arguments[i]) ; } } else { // mac用。関数を返す var arr = [] ; for(var i = 0, len = arguments.length ; i < len ; i++) { arr.push(arguments[i]) ; } var reExt = new RegExp('\.(?:' + arr.join('|') + ')$', 'i') ; res = function(aFile) {return reExt.test(aFile.name) || (aFile instanceof Folder && !(/\.app$/i.test(aFile.name))) ;} ; } return res ; } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。