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;

attached image
[9143]Re: JavaScriptでのフレーム調整オプション設定 投稿者:たう 投稿日:2017/03/08 19:32:27
別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
最初からtextFramesじゃなくてrectangles.add()を使えばcontentTypeを変える必要もないし、バージョンに依存するようなこともなくなるかと思います。
[9144]Re: JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/09 11:01:06
たう様
早速のご返答、ありがとうございます。

>別に「テキストフレームを画像フレームに変換」がやりたいわけじゃないんですよね?
はい、その通りです。あくまで必要なのは画像フレームです。
いきなり画像フレームを作成する命令がなかったので、テキストフレーム→画像フレームという流れにしました。
rectangles.add() を使わなかったのは、InDesignのデフォルトカラー設定ではフレームに枠線がついてしまうためです。textFrames.add() の場合は線なしになるので、こちらを使った次第です。
ヒントをいただけたので、もう少し検証することといたします。

自分の投稿を改めてみたら、最初の4行(アドビ製品〜)は下書きの削除漏れでした。お恥ずかしい限りです。
CS5以降で動作しなかった点は他の神様に譲るとしてw

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;
と記述するのですが、これを記述した部分以降はすべてこのバージョンのスクリプトを参照します。
よく注意してお使いください。
[9147]Re: JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/09 17:15:16
(z-)様
アドバイスいただき、ありがとうございます。
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等のパスオブジェクトも実質的には同じものだからでしょう
[9149]Re: JavaScriptでのフレーム調整オプション設定 投稿者:chirico 投稿日:2017/03/10 16:16:18
たう様

補足、ありがとうございます。
再取得については、ご指摘通りでした。確認したところ、
myFrame = app.activeDocument.allPageItems[0];
では、先頭ページのフレームを取得していました。これではダメですね。

フレーム作成についてのご意見は、とても参考になりました。様々なアプローチがある中から、最適なものを見つけるのも面白いものです。もう少しいろいろ試してみます。

しかし、スクリプトは自分で書いてみないと、本当に理解しているか分からないものですね。思ったよりもわかっていませんでした。むむむ。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)