Illustratorで表やグラフを作っていると,縦線だけ削除したり横線だけ破線にするなど,縦横で別々の処理をする状況があります。
この場合は大抵邪魔な線を一旦隠したり,シフトを押しながら1つずつ選択を追加していくといった手間をかけなければなりません。
「そんなの機械がやればいいじゃない。幅も高さも知ってるでしょ?」なんて言いたくなってしまいますね。
そこで今回は,Illustratorで縦線・横線だけを選択するスクリプトを紹介します。
使いかた
こちらからスクリプトをダウンロードしてください。縦用がselectLineVertical.jsx,横用がselectLineHorizontal.jsxです。
selectLine.zip
使いかたは,Illustrator書類を開いた状態でスクリプトを実行するだけです。縦用なら書類上の縦線全部,横用なら同じく横線全部が選択されます(ロックされているもの,非表示のものを除く)。
こんなつかみにくい横線も一瞬です。気が利きますね!
注意点
Illustrator CS6以上のバージョンに対応しています。それ以前のバージョンでは動きません。
選択スクリプトは,対象のオブジェクトが多いと固まって動かなくなることがあります。一応書類中に含まれるパスが多いときに実行を止める仕様ですが,それでも処理能力の低いPCではフリーズするかもしれません。現時点では書類中にパスが7000個ある状態を停止の目安にしています。
また,このスクリプトではオブジェクトに設定されたメモを変更します。メモ機能を使っていない人にとっては何の害もありませんが,利用している場合はせっかく設定したメモが白紙になってしまいます。メモは属性パネルで確認できます。
このへんの話は【解決】Illustratorスクリプトで選択をもっと速くしたい!でもしているので,興味のある方は参照してみてください。
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
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 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
/** * @fileOverview 縦線だけを選択する。CS6以上に対応。事前に設定されていたメモがあった場合,メモは消える * @author sttk3.com */ #target 'illustrator' (function() { $.localize = true ; if(appVersion()[0] < 16) { var msg = {ja : 'Illustrator CS6以上だけに対応しています。', en : 'This script requires Illustrator CS6 or later.'} ; alert(msg) ; return ; } if(app.documents.length <= 0) {return ;} var doc = app.documents[0] ; var targetItems = doc.pathItems ; if(targetItems.length >= 7000) { var msg = {ja : 'パスが多すぎてクラッシュの危険があります。終了します。', en : 'There are too many PathItems.'} ; alert(msg) ; return ; } var tolerance = 0.003 ; // 少し斜めになっていても許容する var selectKeyword = 'com.sttk3.selectline.vertical' ; try { var currentItem ; var modifiedItems = [] ; for(var i = 0, len0 = targetItems.length ; i < len0 ; i++) { currentItem = targetItems[i] ; // 幅が限りなく0に近く,縦に長い,編集可能なアイテムにメモを付与する if((currentItem.width <= tolerance) && (currentItem.height > currentItem.width) && (currentItem.editable)) { modifiedItems.push(currentItem) ; currentItem.note = selectKeyword ; } } } catch(e) { // 途中で止まった場合,付与したメモを削除する。もともとメモが設定されていたものも問答無用で消してしまう for(var j = 0, len1 = modifiedItems.length ; j < len1 ; j++) { modifiedItems[j].note = '' ; } return ; } // メモに基づいてアクションで選択し,メモを白紙に戻す var ust = ustring(selectKeyword) ; var actionCode = '''/version 3 /name [ 6 73656c656374 ] /isOpen 1 /actionCount 1 /action-1 { /name [ 6 62794e6f7465 ] /keyIndex 0 /colorIndex 0 /isOpen 1 /eventCount 2 /event-1 { /useRulersIn1stQuadrant 0 /internalName (adobe_setSelection) /localizedName [ 27 e382aae38396e382b8e382a7e382afe38388e38292e981b8e68a9e ] /isOpen 0 /isOn 1 /hasDialog 0 /parameterCount 3 /parameter-1 { /key 1952807028 /showInPalette 4294967295 /type (ustring) /value [ ''' + ust.length + ''' ''' + ust.hex + ''' ] } /parameter-2 { /key 2003792484 /showInPalette 4294967295 /type (boolean) /value 1 } /parameter-3 { /key 1667330917 /showInPalette 4294967295 /type (boolean) /value 1 } } /event-2 { /useRulersIn1stQuadrant 0 /internalName (adobe_attributePalette) /localizedName [ 12 e5b19ee680a7e8a8ade5ae9a ] /isOpen 0 /isOn 1 /hasDialog 0 /parameterCount 1 /parameter-1 { /key 1852798053 /showInPalette 4294967295 /type (ustring) /value [ 0 ] } } }''' ; tempAction(actionCode, function(actionItems) { actionItems[0].exec(false) ; }) ; return true ; })() ; /** * スクリプト実行元アプリケーションのバージョンを取得して数値の配列にする。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 ; } /** * アクションのソースコード内のNameやustringを作る機能 * @param {String} str 変換したい文字列 * @return {Object} { * source : strそのまま, * hex : utf8の16進数文字コード, * length : 文字数 * } */ function ustring(str) { var tempStr = str.replace(/[0-9A-Za-z!'()*._~-]/g, function(c) { return c.charCodeAt(0).toString(16) ; }) ; tempStr = encodeURIComponent(tempStr).replace(/%/g, '') ; var len = tempStr.length / 2 ; var res = {source : str, hex : tempStr, length : len} ; return res ; } /** * アクションを文字列から生成し実行するブロック構文。終了時・エラー発生時の後片付けは自動 * @param {String} actionCode アクションのソースコード * @param {Function} func ブロック内処理をここに記述する * @return なし */ function tempAction(actionCode, func) { // utf8の16進数文字コードをJavaScript内部で扱える文字列に変換する var hexToString = function(hex) { var res = decodeURIComponent(hex.replace(/(.{2})/g, '%$1')) ; return res ; } ; // ActionItemのconstructor。ActionItem.exec()を使えばわざわざ名前を直接指定しなくても実行できる var ActionItem = function ActionItem(index, name, parent) { this.index = index ; this.name = name ; // actionName this.parent = parent ; // setName } ; ActionItem.prototype.exec = function(showDialog) { doScript(this.name, this.parent, showDialog) ; } ; // ActionItemsのconstructor。 // ActionItems['actionName'], ActionItems.getByName('actionName'), // ActionItems[0], ActionItems.index(-1) // などの形式で中身のアクションを取得できる var ActionItems = function ActionItems() { this.length = 0 ; } ; ActionItems.prototype.getByName = function(nameStr) { for(var i = 0, len = this.length ; i < len ; i++) { if(this[i].name == nameStr) {return this[i] ;} } } ; ActionItems.prototype.index = function(keyNumber) { var res ; if(keyNumber >= 0) { res = this[keyNumber] ; } else { res = this[this.length + keyNumber] ; } return res ; } ; // アクションセット名を取得 var regExpSetName = /^\/name\s+\[\s+\d+\s+([^\]]+?)\s+\]/m ; var setName = hexToString(actionCode.match(regExpSetName)[1].replace(/\s+/g, '')) ; // セット内のアクションを取得 var regExpActionNames = /^\/action-\d+\s+\{\s+\/name\s+\[\s+\d+\s+([^\]]+?)\s+\]/mg ; var actionItemsObj = new ActionItems() ; var i = 0 ; var matchObj ; while(matchObj = regExpActionNames.exec(actionCode)) { var actionName = hexToString(matchObj[1].replace(/\s+/g, '')) ; var actionObj = new ActionItem(i, actionName, setName) ; actionItemsObj[actionName] = actionObj ; actionItemsObj[i] = actionObj ; i++ ; if(i > 1000) {break ;} // limiter } actionItemsObj.length = i ; // aiaファイルとして書き出し var failed = false ; var aiaFileObj = new File(Folder.temp + '/tempActionSet.aia') ; try { aiaFileObj.open('w') ; aiaFileObj.write(actionCode) ; } catch(e) { failed = true ; alert(e) ; return ; } finally { aiaFileObj.close() ; if(failed) {try {aiaFileObj.remove() ;} catch(e) {}} } // 同名アクションセットがあったらunloadする。これは余計なお世話かもしれない try {app.unloadAction(setName, '') ;} catch(e) {} // アクションを読み込み実行する var actionLoaded = false ; try { app.loadAction(aiaFileObj) ; actionLoaded = true ; func.call(func, actionItemsObj) ; } catch(e) { alert(e) ; } finally { // 読み込んだアクションと,そのaiaファイルを削除 if(actionLoaded) {app.unloadAction(setName, '') ;} aiaFileObj.remove() ; } } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。