| << | 2012/06 | >> | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 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 |
改良しました。
改良できていません。
検証したらキャンセルきかねえわ、オブジェクトレイヤーオプションの記述がこれでは通らねえわ。
前者の理由は関数 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の状態は無視!
2012/04/23に改良版アップしました。→ changeBackGround改良版
前回の日記について、よく考えたら選択中のオブジェクトを全て背景白(または透明)にする処理の方が、白と透明を交換する処理なんかよりもずっと実用的ですね。
そこで、ラジオボタンによる選択式に書き直してみました。
例によってせうぞー師匠のテンプレートを利用しています。
実行方法:オブジェクトを選択して下記スクリプトをスクリプトパネル上でダブルクリック。
グループとインライングラフィックについては今回も無視。
相変わらず、動作確認は以下の環境だけです。
Mac/WinともCS2以降なら動く可能性もありますが、ご利用は自己責任で。
動作確認環境:Mac OS X 10.6.8/InDesign CS4(6.0.6)
/*///////////////////////////////////////// changeBG改良版 2012.04.20 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]; ////////////////メイン処理 (function() { var mySel = app.selection; for (var i=0; i < mySel.length; i++) { if (mySel[i].constructor.name !== Group) { //グループ以外のオブジェクトを対象に if (mySel[i].contentType !== 1735553140) { //画像フレーム以外は処理しない /* //k_iki用おぼえがき GRAPHIC_TYPE 1735553140 グラフィック TEXT_TYPE 1952412773 テキスト UNASSIGNED 1970168179 割り当てなし */ return }; if (mySel[i].graphics.length !== 0 ) { var current_link_path = mySel[i].graphics[0].itemLink.filePath; var pNum = mySel[i].graphics[0].pdfAttributes.pageNumber; if (ans_int == 0) { //背景を透明に app.pdfPlacePreferences.transparentBackground = true; } else if (ans_int == 1) { //背景を白に app.pdfPlacePreferences.transparentBackground = false; } app.pdfPlacePreferences.pageNumber = pNum; mySel[i].place(File (current_link_path)); } } } })();
2012/04/23に改良版アップしました。→ changeBackGround改良版
読み込みオプションについて- InD-Board過去ログについて、自分用にカスタマイズしてみました。
すでにInDesign上に配置したPDF(AI)について、背景が白なら透明に、透明なら白に変更します。
実行方法:オブジェクトを選択して下記スクリプトをスクリプトパネル上でダブルクリック。
グループとかインライングラフィックは無視します(^^;
最初は掲示板のソースをほぼ改変せず使っていたんですが、そうすると配置していた複数ページPDFについて、配置していたページとは別のページに更新されてしまう可能性が高いです。
CSまでにはなかったプロパティですが、CS2以降なら pdfAttributes.pageNumber を参照すれば現在貼り込まれているページ数を参照できます。
そんなわけで、動作確認は以下の環境だけですがCS2以降なら動く可能性もあります。
動作確認環境:Mac OS X 10.6.8/InDesign CS4(6.0.6)
(function () { var mySel = app.selection; for (var i=0; i < mySel.length; i++) { //グループなら処理しない if (mySel[i].constructor.name == Group) { return }; //グラフィック以外なら処理しない if (mySel[i].contentType !== ContentType.GRAPHIC_TYPE) { return }; if (mySel[i].graphics.length === 0 ) { return }; if (mySel[i].graphics[0].pdfAttributes.transparentBackground == false){ var current_link_path = mySel[i].graphics[0].itemLink.filePath; //複数ページPDFの可能性を考慮し、ページ番号を記憶 var pNum = mySel[i].graphics[0].pdfAttributes.pageNumber; app.pdfPlacePreferences.transparentBackground = true; app.pdfPlacePreferences.pageNumber = pNum; mySel[i].place(File (current_link_path)); } else { var current_link_path = mySel[i].graphics[0].itemLink.filePath; var pNum = mySel[i].graphics[0].pdfAttributes.pageNumber; app.pdfPlacePreferences.transparentBackground = false; app.pdfPlacePreferences.pageNumber = pNum; mySel[i].place(File (current_link_path)); } } } )();
ルビの検索置換 - 名もないテクノ手について、同じくせうぞー師匠んちの「run_Queries」のソースを追加して検索範囲を設定できるようにしました。
ついでに、親文字/ルビ文字/置換後のルビ文字 について、ユーザーが入力できるようにしました。
動作確認環境:WindowsXP sp3/InDesign CS5(7.0.4)
var my_find_p = prompt("検索するルビの親文字(列)を入力してください。"); var my_find_ruby = prompt("検索するルビ文字(列)を入力してください。"); var my_change_str =prompt("置換したいルビ文字(列)を入力してください。"); ////////////////////////////////////////////エラー処理 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(); } } ////////////////////////////////////////////選択テキストのストーリを返す。選択チェックを兼ねる。 function get_story() { var mydocument = app.activeDocument; if (mydocument.selection.length == 0) {myerror("テキストを選択してください")} var myselection = mydocument.selection[0]; var myclass =myselection.reflect.name; myclass = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(myclass); if (myclass == null) {myerror("テキストを選択してください")} return myselection.parentStory;//ストーリーオブジェクトを返す } ////////////////////////////////////////////以下処理 if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")} var mydocument = app.activeDocument; //検索範囲を指定 app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; var my_range = radioDialog("rubystring_replace", "検索範囲を指定してください", ["選択範囲", "ストーリー", "ドキュメント"]); if (my_range ==0) {//選択範囲 get_story();//選択チェックとして使用 var my_range_obj = mydocument.selection[0]; } else if (my_range == 1) {//ストーリー var my_range_obj = get_story(); } else if (my_range == 2) {//"ドキュメント" var my_range_obj = mydocument; } else { myerror("処理をキャンセルしました"); } function my_RegexFindChange(my_range, my_find) { //検索の初期化 app.findGrepPreferences = NothingEnum.nothing; app.changeGrepPreferences = NothingEnum.nothing; //検索オプション app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか app.findGrepPreferences.properties = my_find;//検索の設定 return my_range.findGrep();//検索のみの場合:マッチしたオブジェクトを返す } var my_doc = app.documents[0]; var my_texts = my_RegexFindChange(my_doc, {findWhat:my_find_p}); for (var i = 0; i < my_texts.length; i++) { my_texts[i].rubyString = my_texts[i].rubyString.replace(my_find_ruby, my_change_str); }
要は、よく見掛ける try if 〜 else 〜 catch の書き方を覚えたかっただけです。
んで、カーソルを入れている時は段落全体を直後の行に複製、テキスト範囲を選択しているときは選択範囲の直後に選択範囲のテキストを複製というのを書きました。
その後、“InDesign duplicate”のキーワードでさらに情報を検索していたところ、半年前に米国Adobe Forumsで質問があり、Peter Kahrelさんがお書きになったものと一緒でした……。
まあ、これも学習の過程ということで、置いておきます。
動作確認環境:WindowsXP sp3/InDesign CS3(5.0.4)・CS5(7.0.4)
try { //フレーム内に挿入点を置いている時 if (app.selection[0] instanceof InsertionPoint) { var myPar = app.selection[0].paragraphs[0]; if (myPar.characters[-1].contents != "\r") myPar.insertionPoints[-1].contents = "\r"; myPar.duplicate (LocationOptions.after, myPar.insertionPoints[-1]) } //テキスト範囲を選択している時 else { var mySel = app.selection[0]; mySel.duplicate (LocationOptions.after, mySel.insertionPoints[-1]); } } catch (_){}