リンクをクリップボードにコピー
コピー完了
ExtendScriptでテキストフレームのスプレッドを取得する方法が知りたいです。
// スプレッド取得(オブジェクト)
function getSpread(hierarchyObject){
// Spread、または、MasterSpreadの場合
if(hierarchyObject.constructor.name == "Spread" || hierarchyObject.constructor.name == "MasterSpread"){
// 戻す
return hierarchyObject;
// 文字(アンカーオブジェクト)の場合
}else if(hierarchyObject.constructor.name == "Character"){
// 再帰処理(親のテキストフレーム)
hierarchyObject = getSpread(hierarchyObject.parentTextFrames[0]);
// 以外の場合
}else{
// 再帰処理(一つ上の階層のオブジェクト)
hierarchyObject = getSpread(hierarchyObject.parent);
}
// 戻す
return hierarchyObject;
}の様な方法を考えてみたのですが、これで良いものか・・・
スマートな取得方法はありますでしょうか?
リンクをクリップボードにコピー
コピー完了
function getSpread(obj){
var reg = new RegExp(/Spread/);
while(reg.test(obj.reflect.name) == false){
//$.writeln(obj);
if(obj.parent.reflect.name == "Story"){ //アンカーオブジェクト対策のつもり
obj = obj.parentTextFrames[0];
}
obj = obj.parent;
}
return obj;
}
alert(getSpread(app.selection[0]));
とりあえずセル内文字とアンカーオブジェクト内文字には対応できたようなので、いけると思うんですが(スマートかどうかわかりませんが)
リンクをクリップボードにコピー
コピー完了
testとreflectを使う方法、興味深く拝見させて頂きました。
参考に成りました。
有難うございます。
リンクをクリップボードにコピー
コピー完了
私の考えは、琥珀 猫太郎と同じ下から辿っていく方法ですが、「文字(アンカーオブジェクト)の場合」の処理を、テキストリンクや表内のアンカーオブジェクトを考慮します。
「文字(アンカーオブジェクト)の場合」の処理関数を記載しておきます。
// 親テーブルの取得
function GetParentTable(pageItem)
{
var ret = null;
if (pageItem != null) {
var parentItem = pageItem.parent;
var szParent = parentItem.constructor.name;
if (szParent == "Table") {
ret = parentItem;
} else {
// 親テーブルの取得
ret = GetParentTable(parentItem);
}
}
return ret;
}
// Characterの親テキストフレームの取得
function GetParentTextFrame(characterItem)
{
var ret = null;
var nFrameCnt, nFramePos;
var nCharCnt, nCharPos;
if (characterItem != null) {
var parentItem = characterItem.parent;
var szParent = parentItem.constructor.name;
if (szParent == "Story") {
nFrameCnt = characterItem.parentTextFrames.length;
if (nFrameCnt > 0) {
for (nFramePos = 0; nFramePos < nFrameCnt; nFramePos++) {
var textFrame = characterItem.parentTextFrames[nFramePos];
nCharCnt = textFrame.characters.length;
for (nCharPos = 0; nCharPos < nCharCnt; nCharPos++) {
var frameCharacter = textFrame.characters[nCharPos];
if (frameCharacter == characterItem) {
ret = textFrame;
break;
}
}
if (nCharPos < nCharCnt) {
break;
}
}
if (ret == null) {
ret = characterItem.parentTextFrames[0];
}
}
}
else if (szParent == "Cell") {
// 親テーブルの取得
ret = GetParentTable(parentItem);
}
}
return ret;
}
リンクをクリップボードにコピー
コピー完了
parentPageプロパティが便利です(CS5以降の実装です)。
app.activeDocument.textFrames[0].parentPage.parent
Pageオブジェクトの親がSpreadになるので、基本はこれで取得できます。
選択したオブジェクトが対象なら、これも使えます。
app.activeWindow.activePage.parent
選択している=アクティブなページから親をたどるだけです。
もしCS5よりも古いバージョンのInDesignだと、他の方が工夫されているように割と面倒なアプローチが必要です。
parentPageが実装されて、オブジェクトとページの紐付けがやりやすくなりました。
リンクをクリップボードにコピー
コピー完了
parentPageですが、ページ外の部品はnullなので、その場合のルールを考えておかないといけません。
リンクをクリップボードにコピー
コピー完了
それは確かにそうですね。
ペーストボード上のオブジェクトを対象としてどういう処理を行うか、スクリプトの仕様次第というところでしょうか。
リンクをクリップボードにコピー
コピー完了
ページ内にあると限定した場合はparentPageが良いですね
選択がある場合は、activeWindow.activeSpreadでも良いかもですね
activeWindowを使う方法は全く思いつきませんでした。
有難うございます。
新しいアドビコミュニティで、さらに多くのインスピレーション、イベント、リソースを見つけましょう
今すぐ検索