JavaScriptでのフレーム調整オプション設定
[9142]JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/08 16:50:59
アドビ製品の製品名とバージョン番号
オペレーティングシステムの種別とバージョン番号
エラーメッセージの全文
問題が発生した時の操作状況
JavaScriptでフレーム調整オプションがうまく動作しません
InDesign CS5
Mac OSX 10.6.8
JavaScriptの質問です。
画像フレームを新規作成し、フレーム調整オプションの整列位置を天地左右センターにする
という目的で下記のスクリプトを作りました。
CS4までは問題なく動作しましたが、CS5以降ではフレーム調整オプションの部分でエラーが発生します。(添付画像参照)
回避策として、フレームを指定し直すことで一応動くようにはなりました。これはCS5以降で仕様が変わったという事でしょうか。
もっと根本的な解決方法があれば、ご教示のほどよろしくお願いいたします。
また、このスクリプトでは先頭ページにフレームが作成されます。画面上のページに作成する方法はありますでしょうか。
以上、よろしくお願いいたします。
var myFrame = app.activeDocument.textFrames.add();
myFrame.visibleBounds = ["10mm","10mm","287mm","200mm"];
myFrame.contentType = ContentType.GRAPHIC_TYPE;
//CS5以降は次の行をコメントアウトしないと動かない?
//myFrame = app.activeDocument.allPageItems[0];
myFrame.frameFittingOptions.fittingAlignment = AnchorPoint.CENTER_ANCHOR;
オペレーティングシステムの種別とバージョン番号
エラーメッセージの全文
問題が発生した時の操作状況
JavaScriptでフレーム調整オプションがうまく動作しません
InDesign CS5
Mac OSX 10.6.8
JavaScriptの質問です。
画像フレームを新規作成し、フレーム調整オプションの整列位置を天地左右センターにする
という目的で下記のスクリプトを作りました。
CS4までは問題なく動作しましたが、CS5以降ではフレーム調整オプションの部分でエラーが発生します。(添付画像参照)
回避策として、フレームを指定し直すことで一応動くようにはなりました。これはCS5以降で仕様が変わったという事でしょうか。
もっと根本的な解決方法があれば、ご教示のほどよろしくお願いいたします。
また、このスクリプトでは先頭ページにフレームが作成されます。画面上のページに作成する方法はありますでしょうか。
以上、よろしくお願いいたします。
var myFrame = app.activeDocument.textFrames.add();
myFrame.visibleBounds = ["10mm","10mm","287mm","200mm"];
myFrame.contentType = ContentType.GRAPHIC_TYPE;
//CS5以降は次の行をコメントアウトしないと動かない?
//myFrame = app.activeDocument.allPageItems[0];
myFrame.frameFittingOptions.fittingAlignment = AnchorPoint.CENTER_ANCHOR;
[9143]Re: JavaScriptでのフレーム調整オプション設定 投稿者:たう 投稿日:2017/03/08 19:32:27
別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
最初からtextFramesじゃなくてrectangles.add()を使えばcontentTypeを変える必要もないし、バージョンに依存するようなこともなくなるかと思います。
最初からtextFramesじゃなくてrectangles.add()を使えばcontentTypeを変える必要もないし、バージョンに依存するようなこともなくなるかと思います。
[9144]Re: JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/09 11:01:06
たう様
早速のご返答、ありがとうございます。
>別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
はい、その通りです。あくまで必要なのは画像フレームです。
いきなり画像フレームを作成する命令がなかったので、テキストフレーム→画像フレームという流れにしました。
rectangles.add() を使わなかったのは、InDesignのデフォルトカラー設定ではフレームに枠線がついてしまうためです。textFrames.add() の場合は線なしになるので、こちらを使った次第です。
ヒントをいただけたので、もう少し検証することといたします。
自分の投稿を改めてみたら、最初の4行(アドビ製品〜)は下書きの削除漏れでした。お恥ずかしい限りです。
早速のご返答、ありがとうございます。
>別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
はい、その通りです。あくまで必要なのは画像フレームです。
いきなり画像フレームを作成する命令がなかったので、テキストフレーム→画像フレームという流れにしました。
rectangles.add() を使わなかったのは、InDesignのデフォルトカラー設定ではフレームに枠線がついてしまうためです。textFrames.add() の場合は線なしになるので、こちらを使った次第です。
ヒントをいただけたので、もう少し検証することといたします。
自分の投稿を改めてみたら、最初の4行(アドビ製品〜)は下書きの削除漏れでした。お恥ずかしい限りです。
[9145]Re: JavaScriptでのフレーム調整オプション設定 投稿者:(z-) 投稿日:2017/03/09 12:16:17
CS5以降で動作しなかった点は他の神様に譲るとしてw
var myFrame = app.activeDocument.textFrames.add();
のところ、
var myFrame = app.activeWindow.activePage.textFrames.add();
とすることで、おさわり中のページ上に作成されます。
表示状況によってはアクティブなページではなくスプレッドの左上に作成されますが。。環境設定「定規の開始位置」を「スプレッド」にしてしのいでください。
var myFrame = app.activeDocument.textFrames.add();
のところ、
var myFrame = app.activeWindow.activePage.textFrames.add();
とすることで、おさわり中のページ上に作成されます。
表示状況によってはアクティブなページではなくスプレッドの左上に作成されますが。。環境設定「定規の開始位置」を「スプレッド」にしてしのいでください。
[9146]Re: JavaScriptでのフレーム調整オプション設定 投稿者:uske_s 投稿日:2017/03/09 15:20:41
アクティブなページにフレームを作るやり方はz-さんのコードをさんしょうしていただくとして、
肝心のCS5以降でエラーになる件です。
contentTypeを変更した後に
alert(myFrame.constructor.name);
を挟んでみると「TextFrame」と返ってきます。
このことから、contentTypeを変更しても、textFrames.add()で生成されたオブジェクト自体の属性は、
そのスクリプト上では変更されません。
(コンストラクタとインスタンスについては僕も詳しくないので、この方面に明るい方に譲ります)
さて、エラーになるframeFittingOptionsですが、
CS3とCS4ではTextFrameオブジェクトに対してもプロパティが与えられていました。
しかしCS5以降、このframeFittingOptionsはTextFrameオブジェクトには対応しなくなっています。
(現行最新版のCC2017まですべてです)
ここがCS5以降でエラーになる原因で、お察しのとおり仕様が変更されたためです。
続いて、myFrameを取得し直すとエラーにならない(下記の1行を追加するとエラーにならない)のは、
var myFrame = app.activeDocument.allPageItems[0];
InDesignが新たにオブジェクトを探し出すからです。
スクリプト上ではtextFrames.add()で生成されたオブジェクトですが、
InDesignが探し出したのはcontentTypeを変更されてグラフィックフレームになっているRectangleです。
これはInDesignで長方形フレームツールで作成した長方形オブジェクトと同じと判断され、
RectangleとしてmyFrameに参照されます。
結果、TextFrameではなくRectangleのプロパティを参照できるようになるということです。
以上より、解決の方法ですが、
1.var myFrame = app.activeDocument.allPageItems[0];のような方法で取得し直す
2.たうさんがおっしゃっているように、Rectangleとして生成する
3.スクリプトバージョンを落とす(CS4相当、つまり6.0などにする)
2については、懸念されているとおりInDesignのデフォルト設定を持ったままフレームを作成してしまうため、
プロパティひとつひとつを好みの設定に書き換えていくか、
グラフィックスタイルを用意してあてがう必要があります。
3については、非常に後ろ向きでおすすめできませんが、スクリプトのバージョンを下げるやり方です。
具体的には
app.scriptPreferences.version = 6.0;
と記述するのですが、これを記述した部分以降はすべてこのバージョンのスクリプトを参照します。
よく注意してお使いください。
肝心のCS5以降でエラーになる件です。
contentTypeを変更した後に
alert(myFrame.constructor.name);
を挟んでみると「TextFrame」と返ってきます。
このことから、contentTypeを変更しても、textFrames.add()で生成されたオブジェクト自体の属性は、
そのスクリプト上では変更されません。
(コンストラクタとインスタンスについては僕も詳しくないので、この方面に明るい方に譲ります)
さて、エラーになるframeFittingOptionsですが、
CS3とCS4ではTextFrameオブジェクトに対してもプロパティが与えられていました。
しかしCS5以降、このframeFittingOptionsはTextFrameオブジェクトには対応しなくなっています。
(現行最新版のCC2017まですべてです)
ここがCS5以降でエラーになる原因で、お察しのとおり仕様が変更されたためです。
続いて、myFrameを取得し直すとエラーにならない(下記の1行を追加するとエラーにならない)のは、
var myFrame = app.activeDocument.allPageItems[0];
InDesignが新たにオブジェクトを探し出すからです。
スクリプト上ではtextFrames.add()で生成されたオブジェクトですが、
InDesignが探し出したのはcontentTypeを変更されてグラフィックフレームになっているRectangleです。
これはInDesignで長方形フレームツールで作成した長方形オブジェクトと同じと判断され、
RectangleとしてmyFrameに参照されます。
結果、TextFrameではなくRectangleのプロパティを参照できるようになるということです。
以上より、解決の方法ですが、
1.var myFrame = app.activeDocument.allPageItems[0];のような方法で取得し直す
2.たうさんがおっしゃっているように、Rectangleとして生成する
3.スクリプトバージョンを落とす(CS4相当、つまり6.0などにする)
2については、懸念されているとおりInDesignのデフォルト設定を持ったままフレームを作成してしまうため、
プロパティひとつひとつを好みの設定に書き換えていくか、
グラフィックスタイルを用意してあてがう必要があります。
3については、非常に後ろ向きでおすすめできませんが、スクリプトのバージョンを下げるやり方です。
具体的には
app.scriptPreferences.version = 6.0;
と記述するのですが、これを記述した部分以降はすべてこのバージョンのスクリプトを参照します。
よく注意してお使いください。
[9147]Re: JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/09 17:15:16
(z-)様
アドバイスいただき、ありがとうございます。
activePage指定を試してみました。バッチリです。現在開いているページ上に作成できます。マスターページ上でも同様に動きをしてくれました。これでほぼ希望通りになりました。
轟く本物の方にもちょくちょくお邪魔しますので、そちらでもよろしくお願いいたします。
uske_s様
検証のご報告と丁寧なご説明をいただきまして、ありがとうございます。スクリプト勉強中の私にはとても分かりやすくて助かりました。ホント大助かりです。
解決案も複数、提案していただきとても参考になりました。それぞれの利点・注意点も記載されているご配慮がうれしいです。
今回は、1.の案で乗り切る予定です。そもそも今回のスクリプトはInDesignを出力台紙として使うものなので、おそらくこれで問題ないかと思われます。あらかじめ、フレーム調整オプションのデフォルト設定をセンターにしておいても良いですし。
わからないのは、最初から画像フレームを作る graphicFrames.add() のような命令が用意されていないのはなぜでしょうかね。うーむ、不思議です。
という訳で皆様のアドバイスのおかげでほぼ解決いたしました。
本当にありがとうございました。
アドバイスいただき、ありがとうございます。
activePage指定を試してみました。バッチリです。現在開いているページ上に作成できます。マスターページ上でも同様に動きをしてくれました。これでほぼ希望通りになりました。
轟く本物の方にもちょくちょくお邪魔しますので、そちらでもよろしくお願いいたします。
uske_s様
検証のご報告と丁寧なご説明をいただきまして、ありがとうございます。スクリプト勉強中の私にはとても分かりやすくて助かりました。ホント大助かりです。
解決案も複数、提案していただきとても参考になりました。それぞれの利点・注意点も記載されているご配慮がうれしいです。
今回は、1.の案で乗り切る予定です。そもそも今回のスクリプトはInDesignを出力台紙として使うものなので、おそらくこれで問題ないかと思われます。あらかじめ、フレーム調整オプションのデフォルト設定をセンターにしておいても良いですし。
わからないのは、最初から画像フレームを作る graphicFrames.add() のような命令が用意されていないのはなぜでしょうかね。うーむ、不思議です。
という訳で皆様のアドバイスのおかげでほぼ解決いたしました。
本当にありがとうございました。
[9148]Re: JavaScriptでのフレーム調整オプション設定 投稿者:たう 投稿日:2017/03/10 00:13:30
1.でいくならオブジェクトの再取得は
myFrame = myFrame.getElements()[0];
を使うとよいです。
ですけどやっぱり枠線をなくすためだけにわざわざテキストフレームにするというのはよろしくないと思います。rectanglesで作って、オブジェクトスタイル[なし]あたりを適用してやるのがスジかと。
graphicFrames.add() のようなのが無いのはグラフィックフレームもrectalge等のパスオブジェクトも実質的には同じものだからでしょう
myFrame = myFrame.getElements()[0];
を使うとよいです。
ですけどやっぱり枠線をなくすためだけにわざわざテキストフレームにするというのはよろしくないと思います。rectanglesで作って、オブジェクトスタイル[なし]あたりを適用してやるのがスジかと。
graphicFrames.add() のようなのが無いのはグラフィックフレームもrectalge等のパスオブジェクトも実質的には同じものだからでしょう
[9149]Re: JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/10 16:16:18
たう様
補足、ありがとうございます。
再取得については、ご指摘通りでした。確認したところ、
myFrame = app.activeDocument.allPageItems[0];
では、先頭ページのフレームを取得していました。これではダメですね。
フレーム作成についてのご意見は、とても参考になりました。様々なアプローチがある中から、最適なものを見つけるのも面白いものです。もう少しいろいろ試してみます。
しかし、スクリプトは自分で書いてみないと、本当に理解しているか分からないものですね。思ったよりもわかっていませんでした。むむむ。
補足、ありがとうございます。
再取得については、ご指摘通りでした。確認したところ、
myFrame = app.activeDocument.allPageItems[0];
では、先頭ページのフレームを取得していました。これではダメですね。
フレーム作成についてのご意見は、とても参考になりました。様々なアプローチがある中から、最適なものを見つけるのも面白いものです。もう少しいろいろ試してみます。
しかし、スクリプトは自分で書いてみないと、本当に理解しているか分からないものですね。思ったよりもわかっていませんでした。むむむ。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)