Practice makes Perfect !

ExtendedScript素人です。同じ境遇の方、一緒に脱素人を目指しましょう!

実験016_2025.8-3

InDesign】テキストフレーム内マージンをテキストの位置をずらさずに0にするスクリプト(回転対応版?)

前回の記事の“【InDesign】テキストフレーム内マージンをテキストの位置をずらさずに0にするスクリプト”を回転のかかっているテキストフレームにも対応できるように、とお声がけをいただいたので考えてみました。

p-makes-p.hatenablog.com

回転のかかっているテキストフレームに対してどのように処理したらよいのだろうといろいろ考えましたが、単純に

①基準点を中央にセットした後に角度を0にする
②フレーム内マージンの数値にあわせてgeometricBounds を操作
③もとの角度に戻す

でよいのではないかと思いました。

まずスクリプトはこんな感じになりました。
テキストフレームの回転あり・なしで分けて処理するようにしました。

if (app.documents.length > 0) {
    function main() {
        var sel = app.selection;
        if (sel.length === 0) {
            alert("オブジェクトが選択されていません。");
            return;
        }

        for (var i = 0; i < sel.length; i++) {
            var tf = sel[i];
            if (!(tf instanceof TextFrame)) continue;

            var insets = tf.textFramePreferences.insetSpacing;
            var top = insets[0], left = insets[1], bottom = insets[2], right = insets[3];
            if (top === 0 && left === 0 && bottom === 0 && right === 0) continue;

            var angle = tf.rotationAngle;
            var oldRef = app.activeWindow.transformReferencePoint;

            // 基準点を中央にセット
            app.activeWindow.transformReferencePoint = AnchorPoint.CENTER_ANCHOR;

            if (angle % 360 === 0) {
                // 回転なしは従来のやり方
                var gb = tf.geometricBounds;
                tf.geometricBounds = [
                    gb[0] + top,
                    gb[1] + left,
                    gb[2] - bottom,
                    gb[3] - right
                ];
            } else {
                // 回転ありは回転解除してから geometricBounds を操作
                tf.rotationAngle = 0;

                var gb = tf.geometricBounds;
                tf.geometricBounds = [
                    gb[0] + top,
                    gb[1] + left,
                    gb[2] - bottom,
                    gb[3] - right
                ];

                tf.rotationAngle = angle; // 元の角度に戻す
            }

            // フレーム内マージンをゼロに
            tf.textFramePreferences.insetSpacing = [0, 0, 0, 0];

            // 基準点を戻す
            app.activeWindow.transformReferencePoint = oldRef;
        }
    }
}

app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "回転対応・フレーム内マージンを0に");


図のようなテキストフレームがありまして、テキストフレーム内マージンは上下左右統一されています。

わかりやすいようにフレーム内マージンに沿ってグラフィックフレームを当てました。

これを45°回転させます。

これに対してスクリプトを実行すると図のようになります。

わーい!できたー!って喜んだんですけど、そんなに甘いものではありませんでした。


いろいろ試していたら、このスクリプトが機能するのはフレーム内マージンが統一されている場合のみでした。

試しにフレーム内マージンが統一されていないテキストフレームに対して処理してみます。


これを同様に45°回転させて処理すると…

本来あってほしい位置からずれてしまいます。

本来あってほしい座標
実際の座標

よく考えたらテキストフレームの中心とテキストエリア(赤いグラフィックフレーム)の中心は、回転前にすでに同じではないので当たり前の話ですね…

それなら上下のマージンの平均、左右のマージンの平均をとってテキストフレームをずらしてから角度を戻して…などと考えましたがうまくいきませんでいた…残念…

ということで、「フレーム内マージンが統一されていれば回転していてもテキストフレーム内マージンをテキストの位置をずらさずに0にするスクリプト」という何とも長い名前のスクリプトとなりました…