忍者ブログ

ぼんぷろぐ

InDesign、イラレ、フォトショ(CS6 Win)の勉強中。。。(旧まとめいみブログ)

[InDesign]
単位ポイントに変換する関数(InDesignスクリプト)

InDesignスクリプトで生成できるダイアログのウィジェットにMeasurementEditboxてのがあるんです。
使い方しらべてみると、どうやら任意の単位で入力された数値から、単位ポイントに換算した値を取得できるみたい。

そこで、Dialogオブジェクトを生成しといてダイアログは表示させず、MeasurementEditboxを単位変換のためだけに使う
ってのを思いついちゃったので書いてみた。
まあ今更こんなもの書いてもほとんど使い道はないんですけどね。あれが実装されたから……

function makePtFunc(uni){//単位ポイントに変換する関数を生成する関数
    var myMeasurementEditbox=app.dialogs.add({label:"PtFunc"}).dialogColumns.add().measurementEditboxes.add({editUnits:uni});
    return function(s){
        myMeasurementEditbox.editContents=""+s;
        return myMeasurementEditbox.editValue;
    }
}


引数に
MeasurementUnits.AGATES
MeasurementUnits.AMERICAN_POINTS
MeasurementUnits.BAI
MeasurementUnits.CENTIMETERS
MeasurementUnits.CICEROS
MeasurementUnits.HA
MeasurementUnits.INCHES
MeasurementUnits.INCHES_DECIMAL
MeasurementUnits.MILLIMETERS
MeasurementUnits.MILS
MeasurementUnits.PICAS
MeasurementUnits.PIXELS
MeasurementUnits.POINTS
MeasurementUnits.Q
MeasurementUnits.U
のどれかを指定すると、その単位で与えられた数値をポイントに換算して返す関数を返します。

たとえば

var MmToPt=makePtFunc(MeasurementUnits.MILLIMETERS);
alert(MmToPt(1));
で2.83464566929134が表示されます。(1mm=2.83464566929134pt)

環境に応じた単位変換もできます。たとえば

var ptX=makePtFunc(app.activeDocument.viewPreferences.horizontalMeasurementUnits);
var ptY=makePtFunc(app.activeDocument.viewPreferences.verticalMeasurementUnits);
var ptLine=makePtFunc(app.activeDocument.viewPreferences[app.scriptPreferences.version<7?"lineMeasurementUnits":"strokeMeasurementUnits"]);
var ptText=makePtFunc(app.activeDocument.viewPreferences.textSizeMeasurementUnits);
var ptTypo=makePtFunc(app.activeDocument.viewPreferences.typographicMeasurementUnits);

//ドキュメントデフォルトのフォントサイズと行送りをptで取得
with(app.activeDocument.textDefaults){
var DefoPointSize=ptText(pointSize);
var DefoLeading=(leading==Leading.AUTO?ptText(pointSize)*autoLeading/100:ptTypo(leading));
}

//選択物のvisibleBoundsをptで取得
function getVisibleBounds(Obj){
    var vb=Obj.visibleBounds;
    return [ptY(vb[0]),ptX(vb[1]),ptY(vb[2]),ptX(vb[3])];
}
var myVB=getVisibleBounds(app.activeDocument.selection[0]);

みたいな。

スクリプトの最後にこれ↓を書きましょう。でないと表示すらされないダイアログさん達が延々とメモリに残り続けます(InDesignを終了するまで)。
for (var n=app.dialogs.length-1;n>=0;n--) {//単位変換に使ったダイアログオブジェクトをデストロイ
    if (app.dialogs[n].label=="PtFunc") app.dialogs[n].destroy();
}

あとGridDataInformationのcharacterAkiとlineAkiは環境によらずいつもptで返ってくるってのは覚えとこう。

って長々と書いたけど、
結局CS5以降では最初に
app.scriptPreferences.measurementUnit=MeasurementUnits.POINTS;
って書いとけばpointSizeもleadingもvisibleBoundsもみーんなポイントで取得できるので
こんなのまったく全然使う必要ないんです。
そうでなくても単位変換なんてしょせん定数の掛け算なんだから素直にその定数出しといた方がよっぽど速いんじゃねえのって気もするけどなんかほら誤差とかたぶんあるし…
古いバージョンのスクリプト書いてる方がいらしたらご参考にってことで。

おつかにょん
ーーーーーーーーーーーーーーー

せっかくなので単位変換のための係数も求めとく。
makePtFunc(MeasurementUnits.XXXX)(1)の値です。ポイントに直す時は掛け算、ポイントから各単位に換算するときは割り算します。
MeasurementUnits.AGATES    5.14285714285714
MeasurementUnits.AMERICAN_POINTS    0.99609448818898
MeasurementUnits.BAI    6.336
MeasurementUnits.CENTIMETERS    28.3464566929134
MeasurementUnits.CICEROS    12.7878751998
MeasurementUnits.HA    0.70866141732283
MeasurementUnits.INCHES    72
MeasurementUnits.INCHES_DECIMAL    72
MeasurementUnits.MILLIMETERS    2.83464566929134
MeasurementUnits.MILS    0.072
MeasurementUnits.PICAS    12
MeasurementUnits.PIXELS    1
MeasurementUnits.POINTS    1
MeasurementUnits.Q    0.70866141732283
MeasurementUnits.U    0.792
PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

単位が違う数値の演算

通りすがりの者です。

単位付き演算は以下のような方法を使います。

//UnitValueによる異なる単位同士の演算
var uVal_a= new UnitValue(1, 'in'); //inch
var uVal_b= new UnitValue(36, 'pt'); //point
var num= uVal_a+uVal_b; //違う単位同士の演算
alert ( num ); //1.5in
num= uVal_b+uVal_a; //演算の順番を変更
alert ( num ); //108pt


上の例でも分かる通り、演算結果の単位は先頭のものになります。


メージャーに依存しない環境が整ったとしても、異なる単位の数値演算が必要になる場合はありますので、今後のご参考まで。

Re:単位が違う数値の演算

通りすがりさん
おおぉ こんなものがあったのですね
そういやその昔オブジェクトモデルビューワで見かけて使い方がさっぱり分からず放置したような…

JavaScript Tools Guideに解説ありますね。以下メモメモ…
使える単位は
in , ft , yd , mi , mm , cm , m , km , pt , pc , tpt , tpc , ci , px , %

.as('pt') でpt換算した数値が返って
.convert('pt') で自身の単位設定を変更する(成功したらtrueが返る)と。
そのまんま四則演算できちゃうのがすごいですね。作った人エライ
最終的にはasで取り出すことを想定するなら、演算の順番とか気にしなくていいのかしら

  • あるふぁ(仮)
  • 2014/11/09(Sun.)

プロフィール

あるふぁ(仮)
InDesignで新聞組版のようなことをしてる人です。

InDesignスクリプトについて

つくったInDesignスクリプトのまとめ

twitter

5つの「く」

ハタハタのすばらしさをまとめました。