InDesign CS3以降、PageItemの変形はtransform関数を使って行います。

 

< 現在の変形マトリクスを取得する >

 

オブジェクトに適用されている変形マトリクスはtransformValuesOf関数で取得することができ、引数には座標軸(後述)を設定します。

//現在の変形を取得
var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
var xMatrixz = obj.transformValuesOf(CoordinateSpaces.PASTEBOARD_COORDINATES);
var xMatrix = xMatrixz[0];
$.writeln ("Rotation Angle: "+xMatrix.counterclockwiseRotationAngle+"\r");
$.writeln ("Shear Angle: "+xMatrix.clockwiseShearAngle+"\r");
$.writeln ("Horizontal Scale Factor: "+xMatrix.horizontalScaleFactor+"\r");
$.writeln ("Vertical Scale Factor: "+xMatrix.verticalScaleFactor+"\r");
$.writeln ("Horizontal Translation: "+xMatrix.horizontalTranslation+"\r");
$.writeln ("Vertical Translation: "+xMatrix.verticalTranslation+"\r");

 

 

<変形の手順>

 

以下の例は、選択されているオブジェクトに回転を適用するものです。

//PageItemの変形
var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
//transformationMatricesを作成(回転)
var xMatrix= app.transformationMatrices.add({counterclockwiseRotationAngle:45});
//変形を適用
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
AnchorPoint.CENTER_ANCHOR,
xMatrix
);

 

変形の基本的な手順を文書化すると、以下のようになります。

  • どのように変形するか(変形マトリクス)を、アプリケーションクラスのtransformationMatricesに追加・取得
  • 取得した変形マトリクスを対象のPageItemにtransform関数を使って適用

 

 

< 変形の種類 >

 

transformationMatricesに追加できる変形の種類には以下のようなものがあります。

  • verticalScaleFactor(垂直方向への拡大・縮小)
  • horizontalScaleFactor(水平方向への拡大・縮小)
  • counterclockwiseRotationAngle(回転)
  • clockwiseShearAngle(傾斜)
  • verticalTranslation(垂直方向への移動)
  • horizontalTranslation(水平方向への移動)


horizontalScaleFactorverticalScaleFactorでは拡大率を百分率で指定します(1%=0.01)。ここにマイナスの値を設定すると、PageItemを反転することができます。これはInDesignにおいて、反転オブジェクトの拡大率がマイナスで表示されるのと同じことです。

//transformationMatricesを作成(垂直50%縮小)
var xMatrix= app.transformationMatrices.add({verticalScaleFactor:.5});
//transformationMatricesを作成(水平50%縮小)
var xMatrix= app.transformationMatrices.add({horizontalScaleFactor:.5});
//transformationMatricesを作成(垂直方向反転・マイナス100%=-1)
var xMatrix= app.transformationMatrices.add({verticalScaleFactor:-1});
//transformationMatricesを作成(水平方向反転・マイナス100%=-1)
var xMatrix= app.transformationMatrices.add({horizontalScaleFactor:-1});

 

counterclockwiseRotationAngleclockwiseShearAngleでは角度を指定します。

//transformationMatricesを作成(回転)
var xMatrix= app.transformationMatrices.add({counterclockwiseRotationAngle:30});
//transformationMatricesを作成(傾斜)
var xMatrix= app.transformationMatrices.add({clockwiseShearAngle:15});

 

horizontalTranslationverticalTranslationには移動距離を指定します。ただし、移動距離はポイントで表さなければならないので、状況に応じて現在のルーラー単位の把握と、単位変換が必要になります(参照:単位付き数値の演算、および単位の変換)。

var num= parseFloat(UnitValue(10, 'mm').as('pt'));
var xMatrix= app.transformationMatrices.add({verticalTranslation:num});
//もしくは
var xMatrix= app.transformationMatrices.add({horizontalTranslation:num});

 なお、ドキュメントのルーラ単位に従ってPageItemを移動させるだけであれば、move関数を使う方法があります(参照:PageItemの移動・複製)。

 

これらの変形は複数同時に実行することができます。

var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
//transformationMatricesを作成(垂直50%縮小+回転45°)
var xMatrix= app.transformationMatrices.add({
    verticalScaleFactor:0.5,
    counterclockwiseRotationAngle:45
});
//変形を適用
obj.transform (
    CoordinateSpaces.PASTEBOARD_COORDINATES,
    AnchorPoint.CENTER_ANCHOR,
    xMatrix
);

 

 

< PageItemへの適用 >

 

取得した変形マトリクスはtransform関数でオブジェクトに適用します。引数は以下のとおりです(第4、5引数については後述)。

  • 第1引数:座標軸
  • 第2引数:基準点
  • 第3引数:変形マトリクス

 

座標軸は変形する際の座標軸のことで、以下の定数(CoordinateSpaces.any)を指定します。

  • PASTEBOARD_COORDINATES(ドキュメントの垂直・水平)
  • INNER_COORDINATES(オブジェクトの垂直・水平)
  • PARENT_COORDINATES(親オブジェクトの垂直・水平)
  • SPREAD_COORDINATES(スプレッドの垂直・水平/CS4以降)

 

座標軸の違いによって、同じ変形を適用しても結果が違うことを表したのが下の図でです。それぞれ「verticalScaleFactor=0.5(50%)」を適用しています。なお、赤の線は変形する際の座標軸を表しています。また、一番右側のオブジェクトは、黒の正方形が白の正方形の入れ子になっていて、内包されているオブジェクト(黒)に対して変形を適用しています。

 

基準点は変形する際の基準で、変形との関係はInDesignのツールバーにあるそれと同じです。定数は以下のとおりです(AnchorPoint.any)。

  • TOP_LEFT_ANCHOR(左上)
  • TOP_CENTER_ANCHOR(上辺の中央)
  • TOP_RIGHT_ANCHOR(右上)
  • LEFT_CENTER_ANCHOR(左辺の中央)
  • CENTER_ANCHOR(中心)
  • RIGHT_CENTER_ANCHOR(右辺の中央)
  • BOTTOM_LEFT_ANCHOR(左下)
  • BOTTOM_CENTER_ANCHOR(下辺の中央)
  • BOTTOM_RIGHT_ANCHOR(右下)

 

この引数はさらに、基準点がオブジェクトのパスなのか、外形なのかを指定することができます。その場合は、基準点に加えて以下の値を配列化して渡します(BoundingBoxLimits.any)。

  • geometricPathBounds(パス)
  • outerStrokeBounds(外形)

 

var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
//transformationMatricesを作成(回転)
var xMatrix= app.transformationMatrices.add({counterclockwiseRotationAngle:45});
//変形を適用
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
[AnchorPoint.BOTTOM_LEFT_ANCHOR, BoundingBoxLimits.geometricPathBounds],
//または[AnchorPoint.BOTTOM_LEFT_ANCHOR, BoundingBoxLimits.outerStrokeBounds],
xMatrix
);

 

この値による結果(45度回転)の違いは、以下のとおりです。

 

 

< transform関数のオプション >

 

transform関数の第4引数に以下の定数(MatrixContent.any)を指定すると、変形マトリクスは現在値への追加ではなく「置き換え」で実行されます。

  • ROTATION_VALUE
  • SCALE_VALUES
  • SHEAR_VALUE
  • TRANSLATION_VALUES

 

ただし、複数の変形が混在するマトリクスの場合は、定数で指定された変形しか置き換えることができません(値がひとつしか指定できないので)。

var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
//transformationMatricesを作成(垂直50%縮小+回転20°)
var xMatrix= app.transformationMatrices.add({
verticalScaleFactor:0.5,
counterclockwiseRotationAngle:10
});
//変形を適用
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
AnchorPoint.CENTER_ANCHOR,
xMatrix
);
//transformationMatricesを作成(垂直50%縮小+回転45°)
xMatrix= app.transformationMatrices.add({
verticalScaleFactor:0.5, //次のtransform()で無視される(検証のためにあえて)
counterclockwiseRotationAngle:45
});
//変形を適用(結果:垂直スケール=50%のまま、回転=45°)
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
AnchorPoint.CENTER_ANCHOR,
xMatrix,
MatrixContent.ROTATION_VALUE
);

 

transform関数の第5引数は「ルーラの単位を使うか否か」という値で、Boolean型を指定します。ただし、これは変形マトリクスの単位を指しているわけではありません。

先の説明では省きましたが、第2引数「基準点」は定数のほかに[10,10]といった座標点を指定することもできます。第5引数は、このときの距離単位が「pt(デフォルト)なのか、ルーラの単位なのか」を指定するオプションです。

「変形マトリクスの距離指定にはptしか使えないが、ここだけドキュメントのルーラ単位が使える」というのは、いかにも半端な仕様です。なので、ここでは基準点のことも含め、距離に関わる変形の説明は割愛します(詳細はInDesign Scripting Guideを参照)。

 

 

<三角関数を使って回転させる>

 

PageItemの回転は、sin値、またはcos値で実行する方法があります。

 

xMatrix= app.transformationMatrices.add();//変形マトリクス生成
//角度で指定
xMatrix= xMatrix.rotateMatrix (30);
//cos値で指定
xMatrix= xMatrix.rotateMatrix (undefined, 0.5);
//sin値で指定
xMatrix= xMatrix.rotateMatrix (undefined, undefined, 0.5);

rotateMatrix関数の引数は、第1引数に数値を指定した場合は回転角度、第1引数を無視して第2引数に数値を指定した場合はcos値、第1、2引数を無視して第3引数に値を指定した場合はsin値とみなされるようになっています。

 

三角関数による変形は次のような場合に有用です。

例えば、下の図のように底辺が10mmのオブジェクトがあり、点aを基準として点bが5mm上がるように回転させたいとします。

この時の回転角度は下の図のように考えれば、sinθとして表すことができます。sinθは公式によりy/rで求められるので、この場合は「0.5」ということになります。

 

以下の例で、底辺が10mmのオブジェクトなら右下の座標が5mm上がるのが確認できます。

//三角関数で回転(sin値使用例)
var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
xMatrix= app.transformationMatrices.add();//変形マトリクス生成
xMatrix= xMatrix.rotateMatrix (undefined, undefined, 0.5);//sin値で指定
//変形を適用
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
AnchorPoint.BOTTOM_LEFT_ANCHOR,
xMatrix
); //変形を適用

 

cos値による指定も似たような場面で有用です。以下の例は、底辺10mmのオブジェクトであれば回転後の左下と右下の幅が8mmになります。

//三角関数で回転(cos値使用例)
var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
xMatrix= app.transformationMatrices.add();//変形マトリクス生成
xMatrix= xMatrix.rotateMatrix (undefined, 0.8);//cos値で指定
//変形を適用
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
AnchorPoint.BOTTOM_LEFT_ANCHOR,
xMatrix
); //変形を適用

 

 

< 三角関数を使って傾斜させる >

 

回転と同様に傾斜の変形でも三角関数を使うことができます。

xMatrix= app.transformationMatrices.add();//変形マトリクス生成
//角度で指定
xMatrix= xMatrix.shearMatrix (30);
//tan値で指定
xMatrix= xMatrix.shearMatrix (undefined, 0.5);

 

shearMatrix関数の引数は、第1引数に数値を指定した場合は傾斜角度、第1引数を無視して第2引数に数値を指定した場合はtan値とみなされます。

例えば、下の図のように高さがが10mmのオブジェクトがあり、点aを基準として点bが5mm右に移動するように傾斜させたいとします。

InDesignの場合、オブジェクトの傾斜角度は外側の角θを表しています。shearMatrix関数にはこのtan値を指定します。tanθは公式によりy/xで求められるので、この場合は「0.5」ということになります。

 

以下の例で、高さが10mmのオブジェクトなら左上の座標が5mm右に移動する傾斜が確認できます。

 

//三角関数で傾斜(tan値使用例)
var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
xMatrix= app.transformationMatrices.add();//変形マトリクス生成
xMatrix= xMatrix.shearMatrix (undefined, 0.5);//tan値で指定
//変形を適用
obj.transform (
CoordinateSpaces.PASTEBOARD_COORDINATES,
AnchorPoint.BOTTOM_LEFT_ANCHOR,
xMatrix
); //変形を適用

 

< 変形の消去 >

 

PageItemに適用されている変形はclearTransformations関数で消去することができます。

var obj= app.activeDocument.selection[0]; //選択されているオブジェクト
obj.clearTransformations();

 

 

Joomla templates by a4joomla