Adobe Illustrator CS4〜CC編 アクティブなアートボード外のパスを削除する

Illustrator CS4以降では複数のアートボードを持つことができます。CS3までは一枚のアートボードだったのが複数になっただけでなく、自由に配置できるようになりました。

CS4以降では複数のアートボードが使えるようになり便利になりました。しかし、プログラムで何か処理しようとすると、アートボード関係の処理は面倒な部分もあります。用意されている命令が少ないというのもありますが、どのアートボードがアクティブなのかによって読み出されるパスの座標が変わってしまうからです。

ということで本題です。いろいろ描いていると、最後にアートボードからはみだしているパスなどを削除したい場合があります。そんな時に便利なのが以下のスクリプトです。アクティブになっているアートボードに、完全に収まっていないパス/テキストを一括して削除します。


// アクティブになっているアートボード内にあるパスだけ残す
// ドキュメント全体から該当パスを削除
removePath(activeDocument.pathItems);
// ドキュメント全体から該当テキストフレームを削除
removePath(activeDocument.textFrames);
// パスを削除する関数
function removePath(p){
// アクティブにアートボードのインデックス番号を求める
var abIndex = app.activeDocument.artboards.getActiveArtboardIndex();
// アクティブなアートボードのサイズを求める
var rect = app.activeDocument.artboards[abIndex].artboardRect;
var ax1 = rect[0];
var ay1 = -rect[1];
var ax2 = rect[2];
var ay2 = -rect[3];
for(var i=p.length-1; i>=0; i--){
var geo = p[i].geometricBounds;
if (!geo){ continue; }
var x1 = geo[0];
var y1 = -geo[1];
var x2 = geo[2];
var y2 = -geo[3];
// アートボード内に完全に座標値が収まっているか調べる
if((x1>=ax1) && (y1>=ay1)&&(x2<=ax2)&&(y2<=ay2)) {
// アートボード内に収まっている場合に処理したい場合は、ここで何か行う
}else{
// 削除する
p[i].remove();
}
}
}

作成するデータは、完全にアートボードに収まっていないこともあります。そこで、完全にアクティブなアートボードからはみだしているパス/テキストを削除するのが、以下のスクリプトです。

// アクティブになっているアートボード内にあるパスだけ残す
// ドキュメント全体から該当パスを削除
removePath(activeDocument.pathItems);
// ドキュメント全体から該当テキストフレームを削除
removePath(activeDocument.textFrames);
// パスを削除する関数
function removePath(p){
// アクティブにアートボードのインデックス番号を求める
var abIndex = app.activeDocument.artboards.getActiveArtboardIndex();
// アクティブなアートボードのサイズを求める
var rect = app.activeDocument.artboards[abIndex].artboardRect;
var ax1 = rect[0];
var ay1 = -rect[1];
var ax2 = rect[2];
var ay2 = -rect[3];
//$.writeln("artboard:("+ax1+","+ay1+")-("+ax2+","+ay2+")");
for(var i=p.length-1; i>=0; i--){
var geo = p[i].geometricBounds;
if (!geo){ continue; }
var x1 = geo[0];
var y1 = -geo[1];
var x2 = geo[2];
var y2 = -geo[3];
//$.writeln("("+x1+","+y1+")-("+x2+","+y2+")");
// アートボード内に少しでも座標値が収まっているか調べる
if (x2 < ax1){ p[i].remove(); continue; }
if (x1 > ax2){ p[i].remove(); continue; }
if (y2 < ay1){ p[i].remove(); continue; }
if (y1 > ay2){ p[i].remove(); continue; }
// 完全にアートボード内なので何か処理したい場合は、以下に何か入れる
}
}

[サンプルをダウンロード]