[ 掲示板に戻る ]

記事No.5737に関するスレッドです

javascriptでテキストフレームの重なり取得は? / amiza_ret
WindowsXP InDesignCS4 or CS5の環境にて。

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

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

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

もし、ヒントでも分かる方がいれば、よろしくご指導をお願いします。

No.5731 2011/04/14(Thu) 11:34:55
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16

Re: javascriptでテキストフレームの重なり取得は? / いき URL
市川せうぞーさんが書かれた記事がありますが、いかがでしょうか。
http://d.hatena.ne.jp/seuzo/20090423/1240460709

No.5732 2011/04/14(Thu) 11:48:45
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729)

Re: javascriptでテキストフレームの重なり取得は? / いき URL
私、勘違いしてますね。……出直します。
No.5733 2011/04/14(Thu) 11:58:12
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729)

Re: javascriptでテキストフレームの重なり取得は? / (z-) Email URL
>テキストフレームには写真が貼ってあります。
それはグラフィックフレームという事でよろしいでしょうか(わりとどうでもいい)

そういうメソッドがあればいいんでしょうけど、ありません。
「パスファインダ:追加」で前後のspread.pageItems.lengthを見るとかでどうでしょうか?

No.5734 2011/04/14(Thu) 12:31:17
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/4.1.3 Safari/533.19.4

Re: javascriptでテキストフレームの重なり取得は? / お〜まち URL
ずばりそのもの、というのはないので、コツコツと調べていく方法しかないでしょう。

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

上記とは全く関係ないですが、一つの案として
「判定する2つのフレームの幅と高さを取得しておいて、一度その2つのフレームをグループ化し、幅と高さを取得する。グループ化されたオブジェクトの幅もしくは高さが元のフレームのそれぞれの合計よりも大きければ重なっていない、小さければ重なっている」
というのを思いつきました。参考までに。

No.5735 2011/04/14(Thu) 12:42:55
Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.8.131 Version/11.10

Re: javascriptでテキストフレームの重なり取得は? / (z-) Email URL
ちょい訂正

>前後のspread.pageItems.lengthを見る
・スプレッド全体を「パスファインダ:追加」した場合はその後に複合パスを解除する必要がある
・事前に複合パスがある場合(アウトライン文字など)は処理対象に含めない必要がある
・どれとどれが重なっているのか、を見るには事前に各オブジェクトの座標を最低2点、配列で記憶しておく必要がある

No.5736 2011/04/14(Thu) 12:44:44
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/4.1.3 Safari/533.19.4

Re: javascriptでテキストフレームの重なり取得は? / (z-) Email URL
>お〜まち様

まあ、半分冗談ですけど "^

No.5737 2011/04/14(Thu) 12:53:48
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/4.1.3 Safari/533.19.4

Re: javascriptでテキストフレームの重なり取得は? / お〜まち URL
>(z-)さん
いやいや、ご指摘のとおり、回転が掛かってると目論見どおりにはいかないですね。さすが現役の方は冴えてますね。

No.5738 2011/04/14(Thu) 13:45:14
Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.8.131 Version/11.10

Re: javascriptでテキストフレームの重なり取得は? / amiza_ret
みなさん、ありがとうございました!!

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

>(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("離れてます");
}

今の所、大丈夫そうです。
お〜まちさんのヒントで簡単に出来そうです!!

No.5739 2011/04/14(Thu) 13:53:01
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16

Re: javascriptでテキストフレームの重なり取得は? / (z-) Email URL
ええと、上記は結局
>コツコツと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("重なり合っているオブジェクトはありません");

No.5740 2011/04/14(Thu) 16:49:23
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/4.1.3 Safari/533.19.4

Re: javascriptでテキストフレームの重なり取得は? / amiza_ret
(z-)さん、ありがとうございました。
動作確認いたしました。

今回の仕事に合うのはどちらかを検討・検証し、参考にさせて頂きます。

No.5741 2011/04/14(Thu) 17:33:52
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16