javascriptでテキストフレームの重なり取得は?

[5731]javascriptでテキストフレームの重なり取得は? | 投稿者:amiza_ret | 投稿日:2011/04/14(Thu) 11:34:55
WindowsXP InDesignCS4 or CS5の環境にて。

javascriptで、テキストフレームの重なりを取得する事は可能でしょうか?
重なりの順番などは必要なく、重なっているかどうかのみ取得出来ればいいのです。
テキストフレームには写真が貼ってあります。

基本的に「同一レイヤー」で「グループ化」はなしの状態です。

コツコツと1ページづつ、一つ一つのテキストフレームの4つの座標を調べて行く方法しかないのでしょうか?

もし、ヒントでも分かる方がいれば、よろしくご指導をお願いします。
» 1
[5732]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:いき | 投稿日:2011/04/14(Thu) 11:48:45
市川せうぞーさんが書かれた記事がありますが、いかがでしょうか。
*http://d.hatena.ne.jp/seuzo/20090423/1240460709
» 2
[5733]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:いき | 投稿日:2011/04/14(Thu) 11:58:12
私、勘違いしてますね。......出直します。
» 3
[5734]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:(z-) | 投稿日:2011/04/14(Thu) 12:31:17
>テキストフレームには写真が貼ってあります。
それはグラフィックフレームという事でよろしいでしょうか(わりとどうでもいい)

そういうメソッドがあればいいんでしょうけど、ありません。
「パスファインダ:追加」で前後のspread.pageItems.lengthを見るとかでどうでしょうか?
» 4
[5735]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:お~まち | 投稿日:2011/04/14(Thu) 12:42:55
ずばりそのもの、というのはないので、コツコツと調べていく方法しかないでしょう。

でもこのケースはDTPではあまりなくても、ゲームプログラミングでは当たり前ですので(ブロック崩しとか、射撃とか、ある形とある形が重なっているかどうかを判定することが必要)、たとえばFlashでゲームプログラミングを解説しているページとか、ひょっとするとそのものズバリのコードがあるかも知れません。

上記とは全く関係ないですが、一つの案として
「判定する2つのフレームの幅と高さを取得しておいて、一度その2つのフレームをグループ化し、幅と高さを取得する。グループ化されたオブジェクトの幅もしくは高さが元のフレームのそれぞれの合計よりも大きければ重なっていない、小さければ重なっている」
というのを思いつきました。参考までに。
» 5
[5736]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:(z-) | 投稿日:2011/04/14(Thu) 12:44:44
ちょい訂正

>前後のspread.pageItems.lengthを見る
・スプレッド全体を「パスファインダ:追加」した場合はその後に複合パスを解除する必要がある
・事前に複合パスがある場合(アウトライン文字など)は処理対象に含めない必要がある
・どれとどれが重なっているのか、を見るには事前に各オブジェクトの座標を最低2点、配列で記憶しておく必要がある
» 6
[5737]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:(z-) | 投稿日:2011/04/14(Thu) 12:53:48
>お~まち様

まあ、半分冗談ですけど "^
attached image
» 7
[5738]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:お~まち | 投稿日:2011/04/14(Thu) 13:45:14
>(z-)さん
いやいや、ご指摘のとおり、回転が掛かってると目論見どおりにはいかないですね。さすが現役の方は冴えてますね。
» 8
[5739]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:amiza_ret | 投稿日:2011/04/14(Thu) 13:53:01
みなさん、ありがとうございました!!

>いきさん
私も最初、せうぞーさんの所に行きつきました。

>(z-)さん
> それはグラフィックフレームという事でよろしいでしょうか(わりとどうでもいい)

contentType = ContentType.graphicType
です。
パスファインダですと、なかなか難しい気が(私の技術不足)しています。

確かに、Ovalや回転してある物についてはグループ化の方法はダメですね。
今回、やろうとしている仕事に関してはそれらはないので、下記の方法で行う事としました。

>お~まちさん
> 上記とは全く関係ないですが、一つの案として
さすがです!
この方法で作成してみようと思います。

ただ、一応(もしや...)と思い「当たり判定」で検索してみました。
お~まちさんが言う通り、ヒントとなるwebがたくさん引っ掛かってきました。

例:
if(X0 < X3 && X2 < X1 && Y0 < Y3 && Y2 < Y1)
{
<九州工業大学情報工学部の一部活 C3のホームページより>

そこで、上記を利用しちょっと書いてみたのが(分析もせず)下記のソースです。

imgObja= app.activeDocument.selection[0];
imgObjb= app.activeDocument.selection[1];

var X0 = imgObja.visibleBounds[1];
var X1 = imgObja.visibleBounds[3];
var Y0 = imgObja.visibleBounds[0];
var Y1 = imgObja.visibleBounds[2];

var X2 = imgObjb.visibleBounds[1];
var X3 = imgObjb.visibleBounds[3];
var Y2 = imgObjb.visibleBounds[0];
var Y3 = imgObjb.visibleBounds[2];

if(X0 < X3 && X2 < X1 && Y0 < Y3 && Y2 < Y1){  
   alert("重なってます");
  } else {
   alert("離れてます");
}

今の所、大丈夫そうです。
お~まちさんのヒントで簡単に出来そうです!!
» 9
[5740]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:(z-) | 投稿日:2011/04/14(Thu) 16:49:23
ええと、上記は結局
>コツコツと1ページづつ、一つ一つのテキストフレームの4つの座標を調べて行く方法
ですよね。
まあ、それでいいならいいんですけど......
蛇足ながら、パスファインダを利用する場合というのを書いてみました。

//グループ、ロックされたオブジェクト、非表示のレイヤー、マスターページアイテムはナシの場合とする
function modosimaFunc(){
   while(doc.undoHistory.length > unHis){
       doc.undo();
       }
   }

var spObj = app.activeWindow.activeSpread;
var doc = spObj.parent;
var unHis = doc.undoHistory.length;
doc.selection=null;
var pLen=spObj.pageItems.length;
var i=0, targetObj, hettakaObj, kasanattemasseAry=[];
while(i<pLen-1){
   for(j=i+1; j<pLen; j++){
       targetObj=spObj.pageItems[i].addPath(spObj.pageItems[j]);
       targetObj.releaseCompoundPath();
       hettakaObj=spObj.pageItems.length;
       modosimaFunc();
       if(hettakaObj != pLen){
           kasanattemasseAry.push(spObj.pageItems[i], spObj.pageItems[j]);
           }
       }
   i++;
   }

if(kasanattemasseAry.length){
   doc.selection=kasanattemasseAry;
   alert("こんだけ重なってました");
   }
else alert("重なり合っているオブジェクトはありません");
» 10
[5741]Re: javascriptでテキストフレームの重なり取得は? | 投稿者:amiza_ret | 投稿日:2011/04/14(Thu) 17:33:52
(z-)さん、ありがとうございました。
動作確認いたしました。

今回の仕事に合うのはどちらかを検討・検証し、参考にさせて頂きます。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)