Illustratorを使っていると,特定の領域からはみ出た線を削除したくなることがあります(マスクで隠すのではなく)。そういうときにはパスファインダを使うと速いのですが,いざやってみると不要な部分を自分で選択して消すなど地道な作業をしなければなりません。
これってかなり面倒ですよね。
そこで今回はオープンパスを一瞬で切り抜く驚きの方法を紹介します。
パスファインダの切り抜きじゃだめなの?
手慣れている方ならまずこの機能を選ぶと思います。でも切り抜きの対象になるのは塗りだけです。なので目的の結果を出すためには,塗りにしたり線に戻したり,余計な手間がたくさん増えてしまうんですね。
じゃあどうすればいいの?
BACKSTAGE技術部さんが画期的な方法を紹介していらっしゃいます。まとめると,以下の手順で操作すればいいようです。
- 削除したい領域を塗りですっぽり隠すように複合パスを作る
- そのオブジェクトと線を選択してライブペイントを作成する
- ライブペイントを拡張し,塗りの部分を削除する
それってもっと手間が増えてない?
はいその通りです。というわけでスクリプトにしました。ダウンロードはこちらです。
cropStroke.jsx
1 ファイル 3.31 KB
使いかたは,ただ目的のオブジェクトを選択してスクリプトを実行するだけです。選択したパスの最前面のものでほかのパスを切り抜きます。最前面のパスがクローズパスでない場合は何も起こりません。
仕様上の都合によりIllustrator CS6以降のみに対応しています。
では実際にやってみます。
大成功です!
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
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 |
/** * @fileOverview クローズパスで線を切り抜く * @author sttk3.com */ #target 'illustrator' (function() { if(app.documents.length <= 0) {return ;} var doc = app.documents[0] ; var sel = allPageItemOfSelection(doc.selection) ; if(sel.length <= 0) {return ;} if(appVersion()[0] < 16) { var msg = {en : 'This script requires Illustrator CS6 or later', ja : 'このスクリプトは Illustrator CS6 以降のみに対応しています。'} ; alert(localize(msg)) ; return ; } // selectionからPathItemとCompoundPathItemだけを取り出す。 // できたArrayのlengthが1以下か,1番目がクローズパスでない場合は終了 sel = filterItems(function(aItem) {return /PathItem$/.test(aItem.constructor.name) ;}, sel) ; if(sel.length <= 1 || !sel[0].closed) {return ;} // 対象全体を覆える四角のposition・寸法を取得 doc.selection = sel ; var selLayer = sel[0].layer ; app.executeMenuCommand('sendToFront') ; app.executeMenuCommand('group') ; var pathGroup = selLayer.groupItems[0] ; var itemArea = pathGroup.visibleBounds ; var itemWidth = Math.abs(itemArea[2] - itemArea[0]) ; var itemHeight = Math.abs(itemArea[1] - itemArea[3]) ; // 四角を実際に作成。塗りあり・線なしにする必要がある var targetLayer = pathGroup.layer ; var frameGroup = targetLayer.groupItems.add() ; // boundsが[left, top, right, bottom]なのに対し,rectangleは(top, left, width, height)でleftとtopが逆 frameGroup.pathItems.rectangle(itemArea[1], itemArea[0], itemWidth, itemHeight) ; var framePath = frameGroup.pathItems[0] ; framePath.resize(105, 105, true, false, false, false, false, Transformation.CENTER) ; framePath.filled = true ; framePath.stroked = false ; // 切り抜かれる線は,塗りなし・線ありにする必要がある var pathGroupContents = pathGroup.pageItems ; for(var i = pathGroupContents.length - 1 ; i >= 0 ; i--) { var currentItem = pathGroupContents[i] ; currentItem.filled = false ; currentItem.stroked = true ; } // 線を削除する領域を表すcompoundPathItemを作成 pathGroup.pathItems[0].move(frameGroup, ElementPlacement.PLACEATBEGINNING) ; doc.selection = [frameGroup] ; app.executeMenuCommand('compoundPath') ; /* 等価 app.executeMenuCommand('Live Pathfinder Subtract') ; app.executeMenuCommand('expandStyle') ; app.executeMenuCommand('ungroup') ; */ // ライブペイントを使って線を切り抜く。塗りによって隠された部分の線が削除される var tempSelArray = doc.selection ; tempSelArray.push(pathGroup) ; doc.selection = tempSelArray ; app.executeMenuCommand('Make Planet X') ; app.executeMenuCommand('Expand Planet X') ; // 余計な塗りを削除 var maskGroup = doc.selection[0] ; var groupContents = maskGroup.groupItems ; var groupContentsLength = groupContents.length ; if(groupContentsLength > 0) { for(var i = groupContents.length - 1 ; i >= 0 ; i--) { if(groupContents[i].pathItems[0].filled) {groupContents[i].remove() ;} } app.executeMenuCommand('ungroup') ; //app.executeMenuCommand('ungroup') ; } else { maskGroup.remove() ; } })() ; /** * スクリプト実行元アプリケーションのバージョンを取得して数値の配列にする。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 ; } /** * 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 ; } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを固く禁じます。それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。