2015年10月6日火曜日

FrameMakerスクリプトでFMObjectをTextFrameへ「キャスト」する

ニッチすぎて99.9999%の方には何言ってるか意味不明と思うが、スクリプティングガイドにもネット上にもまったく記述がなくあれこれ試行錯誤して2時間ほどハマったので吐き出したい。

FrameMaker 10のスクリプトで(whileループ内にいると思いねえ)、




//アンカー枠の先頭グラフィック
var oGraphic = oAframe.FirstGraphicInFrame;
if (oGraphic == null || oGraphic.constructor.name == "InvalidObject") break;//FMObject.ObjectValid()はない
//グラフィックがテキスト枠でないなら除外
if (oGraphic.constructor.name != "TextFrame") break;
//テキスト枠の先頭段落
var oParaFrame = oGraphic.FirstPgf;
if (oParaFrame == null || !oParaFrame.ObjectValid()) break;

とするとoParaFrameはInvalidObjectになってしまう。

これはいわば、AFrame.FirstGraphicInFrameがジェネリックなFMObject型であるため、具体型TextFrameのFirstPgfを正しく返せていない状態と言えるのだと思う。

以下のようにすると解決できた。


//アンカー枠の先頭グラフィック
var oGraphic = oAframe.FirstGraphicInFrame;
if (oGraphic == null || oGraphic.constructor.name == "InvalidObject") break;//FMObject.ObjectValid()はない
//グラフィックがテキスト枠でないなら除外
if (oGraphic.constructor.name != "TextFrame") break;
var qGraphic = oGraphic.Unique;
var oTextframe = oDoc.GetUniqueObject(Constants.FO_TextFrame, qGraphic);
if (oTextframe == null || !oTextframe.ObjectValid()) break;
//テキスト枠の先頭段落
var oParaFrame = oTextframe.FirstPgf;
if (oParaFrame == null || !oParaFrame.ObjectValid()) break;
できたときは思わず拍手してしまった。
文書オブジェクトを介して間接的に「キャスト」してるっていうか…。

もっとエレガントな、あるいは教科書的な、やり方があったら教えてください。

0 件のコメント:

コメントを投稿