テキストフレームの拡縮(JS)

[890]テキストフレームの拡縮(JS) | 投稿者:(-_-メ) | 投稿日:2008/03/27(Thu) 16:48:16
はじめてJavaScriptを書こうと思っています。
数あるテキストフレームを、手動で個別に選択しながら
決まった位置、サイズにするというようなものです。

app.activeDocument.selection

この一文を何かの変数に入れて、
それに対して座標指定してあげればいいのかな? というところまでは
何となくわかったのですが、それ以降がまったく見当もつかず(-_-;)

どなたかお助けください。
よろしくお願いします。
(環境:Mac、CS3)
» 1
[891]Re: テキストフレームの拡縮(JS) | 投稿者:せうぞー | 投稿日:2008/03/27(Thu) 17:16:33
app.activeDocument.selection
は現在開いているドキュメントの選択しているオブジェクトの「配列」です。
これを変数に入れるというのは
var my_selection = app.activeDocument.selection;
になります。「my_selection」は「app.activeDocument.selection」に名前を付けただけですので、やはり配列です。
my_selection[0];
がひとつ目のオブジェクトそのものになります。
これかたとえばテキストフレームだったとします。テキストフレームにはvisibleBounds(線幅を含む大きさ)という属性があり、これがオブジェクトの座標値を表しています。座標も配列になっていて「[y1, x1, y2, x2]」になっています。ですから、現在の座標が知りたければ
my_selection[0].visibleBounds;
とします。この座標値を変更すれば、オブジェクトの位置や大きさが変わります。
my_selection[0].visibleBounds = [10, 20, 110, 220];
あと、位置だけを変えたいならmove()というコマンドもあります。
少しずつやれば、難しくはありません。がんばってくださいね。
» 2
[892]Re: テキストフレームの拡縮(JS) | 投稿者:梅花藻 | 投稿日:2008/03/27(Thu) 17:16:51
CS3はあるものの、ほとんど触っていないのですが、
app.activeDocument.selection[0]
を弄る形になるかと思います。
CS2の場合ですが、
app.activeDocument.selection[0].move([0,0]);//座標(0,0)に移動
app.activeDocument.selection[0].resize(200,200);//縦横200%に拡大
とか。

サンプルスクリプトのAddGuides.jsx(選択したオブジェクトの周囲にガイドを引く)とかを参考にするとよいかと思います。
(凝ったスクリプトなので、いらない部分はバスッバスッ切って、必要最低限なことから作る方がいいのかもしれないです)
» 3
[893]Re: テキストフレームの拡縮(JS) | 投稿者:(-_-メ) | 投稿日:2008/03/27(Thu) 17:46:01
さっそくのお返事ありがとうございます。
お二人の書き込みを見て、だいたいわかりました。
で、私が考えていたものは1行で済むことがわかりました(^_^)

app.activeDocument.selection[0].visibleBounds = ["10mm","10mm","20mm","20mm"];

単位を入れないと、そのとき選択されている単位系に結果が左右されるんですね。
» 4
[895]Re: テキストフレームの拡縮(JS) | 投稿者:小泉 | 投稿日:2008/03/27(Thu) 19:38:54
jsではありませんが、私はこんなの作って使ってます。

http://www.uni-factory.jp/bsf/index.php?mode=res_view&no=13

色々自分でできるようになると楽ですよ。
» 5
[896]Re: テキストフレームの拡縮(JS) | 投稿者:(-_-メ) | 投稿日:2008/03/28(Fri) 11:18:18
すみません、もう少しお付き合いください。

処理を施したいフレームは、サイズこそ同じですが、Xの値が
それぞれ違いました。昨日書いた1行だと、ある決まった位置の
フレームにしか適用できず、あまりに汎用性がないなと(;-_-メ;)

まぁ、条件といっても、それほど多くないので、
今回は条件分だけ、1行スクリプトを書こうかとも思ったんですが、
その条件そのものをスクリプトで書けないものかと考えはじめました。

調べてみると、if文で対処できそうなことがわかりました。

選択しているオブジェクトの座標を調べて
条件1と座標値が一致したら、処理1
条件2と座標値が一致したら、処理2
……

というような処理です。

で、いったんどんな座標値が返ってくるのか調べてみたところ、
ドキュメント上では整数値なのに、スクリプトで返ってくるのは
ものすごい桁数の数値なんです。しかも、なぜかx1、x2の値だけ。
(少数第13位まで返してきた(-_-;))
yはドキュメント上と同じ数値を返しました。

このせいかどうかわかりませんが、スクリプトを書いてみても
まともに動いてくれません(ウンともスンともいわない)。

どこか私が勘違いしているような気がするんですが、
アドバイスの程、よろしくお願いします。
» 6
[897]Re: テキストフレームの拡縮(JS) | 投稿者:匿名A | 投稿日:2008/03/28(Fri) 11:22:24
>まともに動いてくれません(ウンともスンともいわない)。
こういうときは、書いた物をアップした方が早いです。
» 7
[898]Re: テキストフレームの拡縮(JS) | 投稿者:小泉 | 投稿日:2008/03/28(Fri) 11:41:35
jsはわかりませんが。

>しかも、なぜかx1、x2の値だけ。

座標がページ単位になっているとこうなると思います。
左ページだと×1。右ページだと×2。
処理前にスプレッド単位の処理にするスクリプトを追加すれば良いと思います。

>ものすごい桁数の数値なんです。
これは仕様と思ったほうがてっとり早いでしょう。
小数点以下を四捨五入する処理がjsにもあるでしょうからそれを使うとか、

(条件1-1)>条件1>(条件1+1)の場合。

のようなif文にするとか
» 8
[903]Re: テキストフレームの拡縮(JS) | 投稿者:梅花藻 | 投稿日:2008/03/28(Fri) 17:18:20
>ドキュメント上では整数値なのに、スクリプトで返ってくるのは
>ものすごい桁数の数値

たとえば、x1の小数点以下4桁めを四捨五入して、小数点以下3桁までの数値に丸める
x1 = Math.round(x1*1000)/1000.0;
(1000倍して小数点以下を四捨五入し、1000で割る)
という方法ではどうでしょう。

InDesignの内部で扱う単位系と、表示に用いる単位系の間の換算誤差というものもありますが、それだけでもないような感じでもあります。

ただ、誤差はかなりちいさな値ですので、上記のような形でたぶん大丈夫だったと思います。
» 9
[904]Re: テキストフレームの拡縮(JS) | 投稿者:匿名A | 投稿日:2008/03/28(Fri) 18:13:17
比較に使うだけなら、わざわざもう一度割らなくっても(^^
» 10
[906]Re: テキストフレームの拡縮(JS) | 投稿者:小泉 | 投稿日:2008/03/28(Fri) 23:28:52
>比較に使うだけなら、わざわざもう一度割らなくっても(^^

小数点以下3桁とまではいかないまでも、
結構0.5刻みで処理させたい場合があったりするので、
そういう場合は私も梅花藻さんのような手法を使います。

この手のスクリプトを書いていく上では知ってて損はないですよ。
» 11
[907]Re: テキストフレームの拡縮(JS) | 投稿者:匿名A | 投稿日:2008/03/29(Sat) 08:38:02
私の文章から引用なので、私に対するコメントと理解して。

x1 = Math.round(x1*1000)/1000.0;
でなくて、
x1 = Math.round(x1*1000);
で充分用は足りるということです。
もちろん、0.5刻みでも同じ。

割り算は、2進数が得意な分野ではありません。不要なことはしなくても。
» 12
[908]Re: テキストフレームの拡縮(JS) | 投稿者:小泉 | 投稿日:2008/03/29(Sat) 11:05:59
あ、すみません。私が勘違いしているかも。
ASでいうところの。

--
set b to 50.1234
set x1 to 50.123

set b to (round (b * 1000)) / 1000
if x1 = b then beep
--

こういう処理をするためかとおもいまして。
» 13
[909]Re: テキストフレームの拡縮(JS) | 投稿者:匿名A | 投稿日:2008/03/29(Sat) 13:16:42
>こういう処理をするためかとおもいまして。

 それはあってます。
--
set b to 50.1234
set x1 to 50123

set b to (round (b * 1000))
if x1 = b then beep
--
» 14
[910]Re: テキストフレームの拡縮(JS) | 投稿者:梅花藻 | 投稿日:2008/03/29(Sat) 21:24:56
x1 = Math.round(x1*1000)/1000.0;

>比較に使うだけなら、わざわざもう一度割らなくっても(^^

もちろん比較するためだけならば、割る必要はないのですが、ここはx1を小数点以下3桁に丸める処理をしているということです。

x1の値が前提としている値と違う、それが小数点以下13桁まであることに起因しているのではないかと思われる。
ならば、小数点以下3桁に丸めてみる。
この1行(ないし2行)を途中に挟むことで、書いたスクリプトの他の場所を弄らずに、考えた通りの動きをするか確認することが出来ます。

そういう意味もあって、x1を1000倍して丸め1000で割り、さらにx1に書き戻しているのです。
» 15
[911]Re: テキストフレームの拡縮(JS) | 投稿者:小泉 | 投稿日:2008/03/30(Sun) 01:04:52
梅花藻さんのいっていることを言いたかったのですが、
私がx1とbを逆に書いたからいけませんでした。
» 16
[912]Re: テキストフレームの拡縮(JS) | 投稿者:PICTRIX | 投稿日:2008/03/30(Sun) 09:50:57
こんにちは。
双方正しいのではないでしょうか。
処理速度やコードの簡潔さなどを考慮すれば、No.907で匿名Aさんが書いていられる様に
この割り算は使わない方がいいのでしょう。
基準にしたい比較する座標値も、最初から1000倍とかにしておけばいいのですから。
ただ「値は1000倍されている」って事を意識しないといけなくなりますが。
なんて事を思ったりしました。。。
» 17
[913]Re: テキストフレームの拡縮(JS) | 投稿者:匿名A | 投稿日:2008/03/30(Sun) 10:53:16
どうでも書ける部分で、あの文章に突っ込むところじゃないんですよ(^^
「比較するだけなら」と断ってあるとおり。

で、「比較するだけなら」if文の条件として(割らずに)入れる。
値が必要なら、(割ってから)変数に代入する。

現実には、(今のマシンで、スクリプト程度なら)このコストはそんな高いわけじゃありません。どっちても構わない。
» 18
[914]Re: テキストフレームの拡縮(JS) | 投稿者:小泉 | 投稿日:2008/03/31(Mon) 15:28:22
確かに「比較するだけなら」必要ないですね。
比較するだけって使い方をあまりしないのでよくわかってませんでした。
» 19
[933]Re: テキストフレームの拡縮(JS) | 投稿者:(-_-メ) | 投稿日:2008/04/02(Wed) 18:39:09
いろいろ書き込んでいただき、ありがとうございました。

結局、試行錯誤している時間がなくなってしまい、
今回、条件分岐を含めたスクリプトはあきらめて、
条件分だけ、1行スクリプトを書くというゴリ押しで(笑)

それでも手作業でやるよりははるかに速くて、間違いもない。
スクリプトって素晴らしいですね。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア