構造の選択された要素のページアイテムの位置と大きさのスクリプトは、これで良いのかな・・・?
/*
構造の選択された要素のページアイテムの位置と大きさ
更新 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;
}
/* 位置と大きさを指定する関数の宣言終了*/