穴アケのアタリを描画する

穴アケのある伝票などを作成するときに便利なスクリプトを作ってみました。
このスクリプトを使うと、アタリのレイヤを作成し、シアンで穴アケの位置を示します。トンボ付きで校正紙を印刷することを想定して、ついでに紙面の矩形もシアンで描画します。
スクリプトの実行結果をInDesign上で見ると、こんな感じ。

校正紙はこんな感じで出力できます。

【動作確認】
Windows7 x64
InDesign CS4
【使い方】
1) 見開きオフで文書を作成します。
2) 本スクリプトを実行します。
3) 穴アケの仕様を入力するダイアログボックスが表示されるので、必要に応じて値を修正してください。

4) [OK]ボタンをクリックすると、マスターページの「アタリ」レイヤーにアタリが描画され、「アタリ」レイヤーはロックされます。
【注意】
コメントにも書いてありますが、このスクリプトは見開きオフの文書を対象にしています。見開きオンの文書の場合は、ノドに穴を空けるのが当たり前なので、別のスクリプトを書いた方がいいだろうと判断しました。

/*
 * 穴あけ位置のアタリを描画する(見開き:オフ)
 * 
 * Rev01 2011.10.01 初版
 * 
 * 【注意】
 *  このスクリプトは、見開きがオフの文書を対象にアタリを描画します。
 *  見開きがオンの文書にアタリを描画するスクリプトは別途作成します。
 */

/*******************************************************************************
 * グローバル変数
 *******************************************************************************/
if (app.documents.length == 0) {
  myError("文書が開かれていません。\n文書を開いてから実行してください。");
}
var docObj = app.activeDocument;
var cyan = [100, 0, 0, 0];  // シアン
var colorCyan = app.activeDocument.colors.add({model:ColorModel.process,space:ColorSpace.cmyk,colorValue:cyan});

var pageWidth = app.activeDocument.documentPreferences.pageWidth;    // ページ幅
var pageHeight = app.activeDocument.documentPreferences.pageHeight;  // ページ高

var val_diameter;  // 穴の直径
var val_distance;  // 穴の間隔
var val_pos;       // 穴の位置(left, right, top, bottom)
var val_offset;    // 紙の端からの距離

var defDiameter = 5;   // 穴の直径の初期値
var defDistance = 80;  // 穴の間隔の初期値
var defPos = "left";   // 穴あけ位置の初期値
var defOffset = 10;    // 紙の端からの距離の初期値

main();

/*******************************************************************************
 * メインルーチン
 *******************************************************************************/
function main() {
	// グラフィック情報を書き出すためのレイヤを作る
	var guideLayerObj = make_layer("アタリ");

	// 穴アケの仕様を設定するためのダイアログボックスを表示する
	inputRoundSpec();

	/* $.writeln("幅="+pageWidth);
	$.writeln("高さ="+pageHeight);
	$.writeln("穴の直径="+val_diameter);
	$.writeln("穴の間隔="+val_distance);
	$.writeln("穴の位置="+val_pos);
	$.writeln("端からの距離="+val_offset); */

	// 穴の位置と紙面の矩形をシアンで描画する
	drawGuideLine();
	
	// アタリのレイヤをロックする
	guideLayerObj.locked = true;
	
	exit();
}

/*******************************************************************************
 * [概要] 指定された名前のレイヤを探し、なかったら作る
 * 
 * [引数]
 *   my_layer_name : レイヤー名
 *
 * [戻り値]
 *   引数で指定された名前のレイヤーオブジェクト
 *******************************************************************************/
function make_layer(my_layer_name) {
	var my_document = app.documents[0];
	for (var i = 0; i< my_document.layers.length; i++) {
		if (my_document.layers[i].name === my_layer_name) {
			my_document.activeLayer = my_document.layers[i];  // 発見されたらアクティブレイヤーに
			return my_document.layers[i];
		}
	}
	return my_document.layers.add({name:my_layer_name});  // レイヤーがなければ引数名でレイヤーを作成する
}

/*******************************************************************************
 * [概要] 穴アケの仕様を設定するためのダイアログボックスを表示する
 *
 * [引数]
 *    なし
 * [戻り値]
 *    なし
 *******************************************************************************/
function inputRoundSpec() {
	var my_dialog = app.dialogs.add({name:"穴アケ位置のアタリを描画", canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:"穴アケ位置の情報を入力してください。"});
			with (borderPanels.add()) {
				staticTexts.add({staticLabel:"穴の直径(mm)"});
				var inp_diameter = integerEditboxes.add({editValue:defDiameter});
			}
			with (borderPanels.add()) {
				staticTexts.add({staticLabel:"穴の間隔(mm)"});
				var inp_distance = integerEditboxes.add({editValue:defDistance});
			}
			with (borderPanels.add()) {
				staticTexts.add({staticLabel:"穴の位置"});
				var inp_pos = dropdowns.add({stringList: ["left","right","top","bottom"], selectedIndex:0});
			}
			with (borderPanels.add()) {
				staticTexts.add({staticLabel:"紙の端からの距離"});
				var inp_offset = integerEditboxes.add({editValue:defOffset});
			}
		}
	}

	if (my_dialog.show() == true) {
		val_diameter = inp_diameter.editValue;  // 穴の直径
		val_distance = inp_distance.editValue;  // 穴の間隔
		val_pos = inp_pos.stringList[inp_pos.selectedIndex];  // 穴の位置
		val_offset = inp_offset.editValue;      // 紙の端からの距離
		my_dialog.destroy();
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
		exit();
	}
}

/*******************************************************************************
 * [概要] アタリ(穴の位置と紙面の矩形)をシアンで描画する
 *
 * [引数]
 *    なし
 * [戻り値]
 *    なし
 *******************************************************************************/
function drawGuideLine() {
	// 紙面のアタリを描画する
	var masterPg = docObj.masterSpreads[0].pages[0];
	var my_rect = masterPg.rectangles.add();
	my_rect.geometricBounds = [0, 0, pageHeight, pageWidth];  // [y1,x1,y2,x2]
	my_rect.strokeWeight = "0.1mm";  // 線幅=0.1mm
	my_rect.strokeType = "ベタ";     // 線種=ベタ
	my_rect.strokeColor = colorCyan; // 線の色=シアン

	// 穴の位置を計算する
	var o1_x1, o1_y1, o1_x2, o1_y2;  // 1つ目の穴の座標
	var o2_x1, o2_y1, o2_x2, o2_y2;  // 2つ目の穴の座標
	var center;  // 穴と穴の中間位置
	if (val_pos == "left") {
		center = pageHeight/2;
		// 上側の穴の座標を計算
		o1_x1 = val_offset - val_diameter/2;
		o1_x2 = val_offset + val_diameter/2;
		o1_y1 = center - val_distance/2 - val_diameter/2;
		o1_y2 = center - val_distance/2 + val_diameter/2;
		// 下側の穴の座標を計算
		o2_x1 = val_offset - val_diameter/2;
		o2_x2 = val_offset + val_diameter/2;
		o2_y1 = center + val_distance/2 - val_diameter/2;
		o2_y2 = center + val_distance/2 + val_diameter/2;
	} else if (val_pos == "right") {
		center = pageHeight/2;
		// 上側の穴の座標を計算
		o1_x1 = pageWidth - val_offset - val_diameter/2;
		o1_x2 = pageWidth - val_offset + val_diameter/2;
		o1_y1 = center - val_distance/2 - val_diameter/2;
		o1_y2 = center - val_distance/2 + val_diameter/2;
		// 下側の穴の座標を計算
		o2_x1 = pageWidth - val_offset - val_diameter/2;
		o2_x2 = pageWidth - val_offset + val_diameter/2;
		o2_y1 = center + val_distance/2 - val_diameter/2;
		o2_y2 = center + val_distance/2 + val_diameter/2;
	} else if (val_pos == "top") {
		center = pageWidth/2;
		// 左側の穴の座標を計算
		o1_x1 = center - val_distance/2 - val_diameter/2;
		o1_x2 = center - val_distance/2 + val_diameter/2;
		o1_y1 = val_offset - val_diameter/2;
		o1_y2 = val_offset + val_diameter/2;
		// 右側の穴の座標を計算
		o2_x1 = center + val_distance/2 - val_diameter/2;
		o2_x2 = center + val_distance/2 + val_diameter/2;
		o2_y1 = val_offset - val_diameter/2;
		o2_y2 = val_offset + val_diameter/2;
	} else if (val_pos == "bottom") {
		center = pageWidth/2;
		// 左側の穴の座標を計算
		o1_x1 = center - val_distance/2 - val_diameter/2;
		o1_x2 = center - val_distance/2 + val_diameter/2;
		o1_y1 = pageHeight - val_offset - val_diameter/2;
		o1_y2 = pageHeight - val_offset + val_diameter/2;
		// 右側の穴の座標を計算
		o2_x1 = center + val_distance/2 - val_diameter/2;
		o2_x2 = center + val_distance/2 + val_diameter/2;
		o2_y1 = pageHeight - val_offset - val_diameter/2;
		o2_y2 = pageHeight - val_offset + val_diameter/2;
	}
	// 上側あるいは左側の穴のアタリを描画する
	var my_oval1 = masterPg.ovals.add();
	my_oval1.geometricBounds = [o1_y1, o1_x1, o1_y2, o1_x2];  // [y1, x1, y2, x2]
	my_oval1.strokeWeight = "0mm";
	my_oval1.fillColor = colorCyan;
	// 下側あるいは右側の穴のアタリを描画する
	var my_oval2 = masterPg.ovals.add();
	my_oval2.geometricBounds = [o2_y1, o2_x1, o2_y2, o2_x2];  // [y1, x1, y2, x2]
	my_oval2.strokeWeight = "0mm";
	my_oval2.fillColor = colorCyan;
}

/*******************************************************************************
 * [概要] エラーメッセージを表示して、スクリプトを抜ける
 * 
 * [引数]
 *   msg : エラーメッセージ
 * [戻り値]
 *    なし
 *******************************************************************************/
function myError(msg) { 
  if (arguments.length > 0) { alert(msg); }
  exit();
}

【 免 責 】
上記スクリプトの使用により発生する、データの破損などのあらゆる不具合・不利益については、一切の責任を負いかねますのでご了解ください。