読者です 読者をやめる 読者になる 読者になる

k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

changeBackGround改良版

改良しました。
改良できていません。
検証したらキャンセルきかねえわ、オブジェクトレイヤーオプションの記述がこれでは通らねえわ。
前者の理由は関数 groupLoop(mySel); を if(ans_int == n) 分岐の外に置いたからだってことにはすぐ気づくことができましたが、後者がわかりません。
流星さんにヘルプを求め、
obj.graphics[0].graphicLayerOptions.updateLinkOption = ...
の行が無効になっているとのことでした。(理由:このプロパティはR/O、書き込み不可)
引き続きご指導を受けつつ、時間を見つけて改良したいと思っております。
 
あと、PDFやAI以外の画像が選択セットの中に含まれていたらエラー出る。
これはスクリプト書く時点においてpsdファイルやepsファイルが配置されている可能性を考慮していなかったからです。
これはもう、スクリプト使う人には背景を変更したいpdf画像やai画像のフレームだけ選択してスクリプト実行してね、と頼むしか(^^;
 
このエントリは、下記2つの過去日記とともに勉強の過程として置いておきます。
前回の日記
前々回の日記
 
【改良の動機1】
PDF配置オプションについて、InDesign側でコントロールしていたレイヤー表示オプションが、リンクを張り直すことで全レイヤー表示状態になってしまいました。

【改良の動機2】
カネムーさんが良エントリを書いていらっしゃいましたので、グループにも対応させてみることにしました。
カネムーメモ:pageItemsとallPageItems
 
とりあえず、私の環境に関して言えば、レイヤー表示はInDesign側でコントロールしたいし、背景表示のデフォルトは透明にしておきたい。
それらを踏まえ、下記のように修正しました。
 

/*/////////////////////////////////////////
changeBackGround 改良版
2012.04.23 k_iki

配置済みPDFおよびAI画像の背景について
読み込みオプションダイアログを開くことなく
透明または白に変更して再配置する。

・インライングラフィックは処理しない。
*//////////////////////////////////////////

////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}


////////////////////////////////////////////ラジオダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ラジオボタンに展開するリスト

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}

	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}



////実行
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
if (app.selection.length == 0) {myerror("オブジェクトが選択されていません")}

////////////////処理の選択
var myList = ["背景を透明に", 
"背景を白に",];
var ans_int = radioDialog("ChangeBG", "PDF及びAIの背景を変更します\n", myList);
//myList[ans_int];

////////////////メイン処理
var mySel = app.activeDocument.selection;

groupLoop = function(objs) {
	for (var i=0; i < objs.length; i++) {
		var obj = objs[i].getElements()[0];
		if (obj.constructor.name == "Group") {
			var groupObjs = obj.pageItems;
			arguments.callee(groupObjs);
			}
		else if (mySel[i].contentType == 1735553140) {
			if (obj.graphics.length !== 0) {
				var current_link_path = obj.graphics[0].itemLink.filePath;
				var pNum = obj.graphics[0].pdfAttributes.pageNumber;
				if (ans_int == 0) { //背景を透明に
					app.pdfPlacePreferences.transparentBackground = true;
					}
				else if (ans_int == 1) { //背景を白に
					app.pdfPlacePreferences.transparentBackground = false;
					}
				obj.graphics[0].graphicLayerOptions.updateLinkOption = UpdateLinkOptions.keepOverrides;
				app.pdfPlacePreferences.pageNumber = pNum;
				obj.place(File (current_link_path));
				}
			}
		}
	};
 
groupLoop(mySel);
app.pdfPlacePreferences.transparentBackground = true;

 
ちなみに今、AJABON博士を巻き込んで検証していただいておりますが、
車車車く本牛勿 -Rolin' Real-:InDesign:PDF_CropViewerだいじな修正
をコメント欄まで含めて読むと分かるように、cropの状態をいじると素敵な罠が用意されているようです。
CS4CS5でcropの種類が追加された、とか。
CS5だと配置していた画像を消去して再配置しても以前の情報が残ってるらしい、とか。
いずれも私自身は未検証です。
よって、このスクリプトではcropの状態は無視!