クリエイター手抜きプロジェクト[421]Illustrator CS6〜CC 2014編 すべてのアートボード外の図形や画像を完全に削除する/古籏一浩

投稿:  著者:  読了時間:8分(本文:約3,500文字)



今回は、読者からリクエストがあったスクリプトです。以前、アクティブになっているアートボード以外のパス/テキストフレームを削除するスクリプトを掲載しました。

Illustrator CS4以降では、複数のアートボードを自由に扱うことができます。アートボードの位置やサイズは自由なので、複数のアートボードが重なったりすることもあります。

デザインを考えていると、とりあえず図形やテキストを配置し、いらなくなったら「削除せずにアートボードその外」に移動させておく(一時待避といったところ)ことがあります。

最終的には一時待避させておいた図形や画像は削除するのですが、運悪くポイントだけが残ったり、透明なパスが残ってしまうこともあります。

そこで、今回は完全にすべてのアートボードの外にあるパスやテキストを削除するように改良しました。以下が実際のスクリプトです。特に図形を選択したりする必要はなく、実行すればアートボード外の図形が削除されます。




// 完全にすべてのアートボード外にあるパスを削除する
var n1 = removePath(activeDocument.pathItems);
// ドキュメント全体から該当テキストフレームを削除
var n2 = removePath(activeDocument.textFrames);
var count = n1 + n2;
if (count){
alert(count+"個のパスを削除しました");
}else{
alert("削除するパスはありませんでした");
}

// パスを削除する関数
function removePath(p){
var count = 0;
for(var i=p.length-1; i>=0; i--){
var flag = checkCoords(p[i]);
if (!flag){
p[i].remove(); // すべてのアートボード外なら削除
count = count + 1;
}
}
return count;
}
// すべてのアートボード外にパスがあるか調べる
// 少しでもパスがアートボードにかかっている場合は0以上の数値
// 完全にアートボード外の場合はfalseを返す
function checkCoords(myPath){
// カウンタ。アートボード内にあれば1増やす
var count = 0;
// アートボードの数だけ繰り返す
for(var i=0; i<app.activeDocument.artboards.length; i++){
// 指定されたアートボードのサイズを求める
var rect = app.activeDocument.artboards[i].artboardRect;
var ax1 = rect[0]; // アートボードの座標値を読み出す
var ay1 = -rect[1];
var ax2 = rect[2];
var ay2 = -rect[3];
//$.writeln("artboard:("+ax1+","+ay1+")-("+ax2+","+ay2+")");
var geo = myPath.geometricBounds;
// 座標情報がない場合はfalseを返して関数から抜ける
if (!geo){ return flase; }
var x1 = geo[0]; // 座標値を読み出す
var y1 = -geo[1];
var x2 = geo[2];
var y2 = -geo[3];
//$.writeln("("+x1+","+y1+")-("+x2+","+y2+")");
// アートボード内に少しでも座標値が収まっているか調べる
if (x2 < ax1){ continue; }
if (x1 > ax2){ continue; }
if (y2 < ay1){ continue; }
if (y1 > ay2){ continue; }
count = count + 1; // カウンタを増やす
}
if (count){ return true; }
}

パスやテキストフレームではなく、Illustratorにおけるすべての図形/画像なども削除したい場合は、以下のスクリプトを使ってください。なお、このスクリプトで間違って削除してしまった場合でも、アンドゥ 1回で以前の状態に戻すことができます。実行しても致命的な状態になることはありません。

// 完全にすべてのアートボード外にある図形などを削除する
var count = removePath(activeDocument.pageItems);
if (count){
alert(count+"個の図形を削除しました");
}else{
alert("削除する図形はありませんでした");
}

// パスを削除する関数
function removePath(p){
var count = 0;
for(var i=p.length-1; i>=0; i--){
var flag = checkCoords(p[i]);
if (!flag){
p[i].remove(); // すべてのアートボード外なら削除
count = count + 1;
}
}
return count;
}
// すべてのアートボード外にパスがあるか調べる
// 少しでもパスがアートボードにかかっている場合は0以上の数値
// 完全にアートボード外の場合はfalseを返す
function checkCoords(myPath){
// カウンタ。アートボード内にあれば1増やす
var count = 0;
// アートボードの数だけ繰り返す
for(var i=0; i<app.activeDocument.artboards.length; i++){
// 指定されたアートボードのサイズを求める
var rect = app.activeDocument.artboards[i].artboardRect;
var ax1 = rect[0]; // アートボードの座標値を読み出す
var ay1 = -rect[1];
var ax2 = rect[2];
var ay2 = -rect[3];
//$.writeln("artboard:("+ax1+","+ay1+")-("+ax2+","+ay2+")");
var geo = myPath.geometricBounds;
// 座標情報がない場合はfalseを返して関数から抜ける
if (!geo){ return flase; }
var x1 = geo[0]; // 座標値を読み出す
var y1 = -geo[1];
var x2 = geo[2];
var y2 = -geo[3];
//$.writeln("("+x1+","+y1+")-("+x2+","+y2+")");
// アートボード内に少しでも座標値が収まっているか調べる
if (x2 < ax1){ continue; }
if (x1 > ax2){ continue; }
if (y2 < ay1){ continue; }
if (y1 > ay2){ continue; }
count = count + 1; // カウンタを増やす
}
if (count){ return true; }
}


【古籏一浩】openspc@alpha.ocn.ne.jp
< http://www.openspc2.org/ >

ということで、何かリクエストがあればお待ちしてます。さすがに10年以上続けているとネタが減ってきました。CEPでパネル付きで機能拡張だと、ちょっとコードが長くなるので、とりあえずコアな処理だけということで。コアな処理を作っておけばCEP+HTML5で誰かがUIを作ってくれるでしょう(と思うのですが、敷居が高いのかも)。

・Adobe JavaScriptリファレンス
< http://www.amazon.co.jp/dp/B00FZEK6J6/ >

・Illustrator自動化基本編
< http://www.amazon.co.jp/dp/B00R5MZ1PA >

・ExtendScript Toolkit(ESTK)基本編
< http://www.amazon.co.jp/dp/B00JUBQKKY/ >

・データビジュアライゼーションのためのD3.js徹底入門
< http://www.amazon.co.jp/dp/4797368861 >

・4K/ハイビジョン映像素材集
< http://www.openspc2.org/HDTV/ >

・JavaScript逆引きハンドブック
< http://www.amazon.co.jp/dp/4863541082 >

・クリエイター手抜きプロジェクト
< http://www.openspc2.org/projectX/ >