LoginSignup
1
1

More than 1 year has passed since last update.

InDesign スクリプト 位置と大きさ(構造の選択された要素のページアイテムの)

Last updated at Posted at 2021-06-08

構造の選択された要素のページアイテムの位置と大きさのスクリプトは、これで良いのかな・・・?

/*
構造の選択された要素のページアイテムの位置と大きさ
更新 2021/06/09
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "位置と大きさ(構造の選択された要素のページアイテムの)";

//スクリプト動作指定(一つのアンドゥ履歴にする及びアンドゥ名の指定)
app.doScript(function () {

    // ダイアログ
    var dialogueFlg = confirm(" 構造の選択された要素のページアイテムの位置と大きさをページの左上を原点に最後に選択された要素のページアイテムを基準に指定します。" + "\r\r" + " テキストフレームにのみ対応。", "", scriptName);

    // Noの場合
    if (dialogueFlg == false) {

        // スクリプトを終了
        exit();
    }

    // 選択されているオブジェクト
    selectObjects = app.activeDocument.selection;

    // すべての選択を解除
    app.activeDocument.selection = null;

    // 指定数
    var assignedNumber = 0;

    // 選択が0より多い場合
    if(selectObjects.length > 0){

        // 基準のオブジェクトの位置と大きさ
        var baselineObjectGeometricBounds;

        // 基準のオブジェクトのページの位置と大きさ
        var baselineObjectPageBounds;

        // 基準のオブジェクトのフラグにfalseを入れる
        var baselineObjectFlg = false;

        // 最後の選択がXMLElementの場合
        if(selectObjects[selectObjects.length - 1].constructor.name == "XMLElement"){

            // (最後の選択の)XML要素の参照がStoryの場合
            if(selectObjects[selectObjects.length - 1].xmlContent.constructor.name == "Story"){

                // 基準のオブジェクトの位置と大きさに(最後の選択の)XML要素の参照の持つ最初のテキストフレームの位置と大きさを入れる
                baselineObjectGeometricBounds = selectObjects[selectObjects.length - 1].xmlContent.textContainers[0].geometricBounds;

                // (最後の選択のXML要素の参照の)parentPageに値がある場合
                if (selectObjects[selectObjects.length - 1].xmlContent.textContainers[0].parentPage){

                    // 元のオブジェクトのページの位置と大きさに(最後の選択の)XML要素の参照の持つ最初のテキストフレームのあるページの位置と大きさを入れる
                    baselineObjectPageBounds = selectObjects[selectObjects.length - 1].xmlContent.textContainers[0].parentPage.bounds;

                    // 選択に追加
                    selectObjects[selectObjects.length - 1].select(SelectionOptions.addTo);

                    // 基準のオブジェクトのフラグにtrueを入れる
                    baselineObjectFlg = true;
                }

            // 以外の場合
            }else{
                // 画像の場合とか作成予定
            }
        }

        // 基準のオブジェクトのフラグがfalseの場合
        if(baselineObjectFlg == false){

            // 選択状態を元に戻す
            app.activeDocument.selection = selectObjects;

            // 結果表示
            alert("最後に選択された要素のページ(ページアイテム)を取得出来ませんでした。",scriptName);

            // スクリプトを終了
            exit();
        }

        // 選択の数引く1だけ繰り返す
        for(var i = 0; i < selectObjects.length - 1; i++){

            // 選択がXMLElementの場合
            if(selectObjects[i].constructor.name == "XMLElement"){

                // (選択の)XML要素の参照がStoryの場合
                if(selectObjects[i].xmlContent.constructor.name == "Story"){

                    // テキストフレームの数だけ繰り返す
                    for(var ii = 0; ii < selectObjects[i].xmlContent.textContainers.length; ii++){

                        // (選択のXML要素の参照の)parentPageに値がある場合
                        if (selectObjects[i].xmlContent.textContainers[ii].parentPage){

                            // (選択のXML要素の参照の持つ)テキストフレームがロックされていない場合
                            if(selectObjects[i].xmlContent.textContainers[ii].locked == false){

                                // (選択のXML要素の参照の持つ)テキストフレームの位置と大きさに位置と大きさを指定する関数の結果を入れる(配列全体で入れるないとうまくいかない)
                                selectObjects[i].xmlContent.textContainers[ii].geometricBounds = assignBounds(baselineObjectGeometricBounds,baselineObjectPageBounds,selectObjects[i].xmlContent.textContainers[ii].parentPage.bounds)

                                // 指定数追加
                                assignedNumber++;

                                // 選択に追加
                                selectObjects[i].select(SelectionOptions.addTo);
                            }
                        }
                    }

                // 以外の場合
                }else{

                }
            }
        }

        // 結果表示
        alert("指定の元の要素と指定された要素を選択しました。" + "\r" + "指定数 " + assignedNumber,scriptName);
    }

//スクリプト動作指定(一つのアンドゥ履歴にする及びアンドゥ名の指定)の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);

/* 位置と大きさを指定する関数、引数(元のオブジェクトの位置と大きさ、元のオブジェクトのページの位置と大きさ、選択オブジェクトのページの位置と大きさ)の宣言*/
function assignBounds(baselineObjectGeometricBounds,baselineObjectPageBounds,selectObjectPageBounds){

    // 指定するオブジェクトの位置と大きさ
    var assignObjectBounds = [0,0,0,0];

    // 指定するオブジェクトの位置と大きさの左上のYに基準のオブジェクトの位置と大きさの左上のY引く基準のオブジェクトのページの位置と大きさの左上のY足す選択オブジェクトのページの位置と大きさの左上のYを入れる
    assignObjectBounds[0] = baselineObjectGeometricBounds[0] - baselineObjectPageBounds[0] + selectObjectPageBounds[0];

    // 指定するオブジェクトの位置と大きさの左上のXに基準のオブジェクトの位置と大きさの左上のX引く基準のオブジェクトのページの位置と大きさの左上のX足す選択オブジェクトのページの位置と大きさの左上のXを入れる
    assignObjectBounds[1] = baselineObjectGeometricBounds[1] - baselineObjectPageBounds[1] + selectObjectPageBounds[1];

    // 指定するオブジェクトの位置と大きさの左上のYに基準のオブジェクトの位置と大きさの左上のY引く基準のオブジェクトのページの位置と大きさの左上のY足す選択オブジェクトのページの位置と大きさの左上のYを入れる
    assignObjectBounds[2] = baselineObjectGeometricBounds[2] - baselineObjectPageBounds[0] + selectObjectPageBounds[0];

    // 指定するオブジェクトの位置と大きさの左上のXに基準のオブジェクトの位置と大きさの左上のX引く基準のオブジェクトのページの位置と大きさの左上のX足す選択オブジェクトのページの位置と大きさの左上のXを入れる
    assignObjectBounds[3] = baselineObjectGeometricBounds[3] - baselineObjectPageBounds[1] + selectObjectPageBounds[1];

    // 指定するオブジェクトの位置と大きさを返す
    return assignObjectBounds;
}
/* 位置と大きさを指定する関数の宣言終了*/
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1