スクリプト

H型の定規シェイプを作成するスクリプト「Shape-RulerH_V2.jsx」

Hの形の定規、欲しいですよね。ラベルも追従してくれるといいですよね。線は矢印になってたら嬉しいですよね。

H型の定規シェイプを作成するスクリプト「Shape-RulerH.jsx」のバージョンアップ版。

[概要]

H型の定規シェイプと追従するラベルを作成するスクリプト。

[使い方]

  1. スクリプトを実行
  2. シェイプのエフェクトにあるポイントのAとBを定規の両端としてセット
  3. ラベルのソーステキストを打ち替える
  4. テキストレイヤーの1つ下がシェイプレイヤーという並びだけ崩さず使う
  5. ラベルのスケールは触らない。フォントサイズで変更する。

[オプション]

  • [離す距離]でポイントを移動せずに上下にスライド可能
  • [タテ線の長さ]一括変更可能
  • [ヨコ線-Y%]で横棒をタテ線の範囲で上下可能
  • [矢の長さ]、[矢の太さ]、[矢の角度]調整可能
  • [タテ線の太さ]変更可能で矢印はタテ線の内側に追従
  • [線の太さ]、[線の色]、[境界線の太さ]、[境界線の色]は一括変更可能

[解説]

//////////////////////////////////////////////////
// H型の定規シェイプとテキストを生成するスクリプトVer.2
//////////////////////////////////////////////////

var actCmp=app.project.activeItem;

function f_Shape_RulerH_V2(){
    var shapeLyr = actCmp.layers.addShape();// 空のシェイプレイヤーが作られる
        shapeLyr.name="Shape-RulerH";
        shapeLyr.label=2;

    // セットするエフェクト準備
    var efAry=["ポイントA","ポイントB","離す距離","タテ線の長さ","ヨコ線-Y%","矢の長さ","矢の太さ","矢の角度","タテ線の太さ","線の色","境界線の太さ","境界線の色"];
    var efAry2=["ADBE Point Control","ADBE Point Control","ADBE Slider Control","ADBE Slider Control","ADBE Slider Control","ADBE Slider Control","ADBE Slider Control","ADBE Angle Control","ADBE Slider Control","ADBE Color Control","ADBE Slider Control","ADBE Color Control"];
    var addAry=[];

    //エフェクトを次々適用
    for(i=0;i<efAry.length;i++){
        addAry[i]=shapeLyr.property("ADBE Effect Parade").addProperty(efAry2[i]);
        addAry[i].enabled=false;
        addAry[i].name=efAry[i];
    }//for

    //エフェクトに初期値セット
    var pointA=shapeLyr.property("ADBE Effect Parade")(efAry[0])(1);
    pointA.setValue(pointA.value-[100,0]);
    var pointB=shapeLyr.property("ADBE Effect Parade")(efAry[1])(1);
    pointB.setValue(pointB.value+[100,0]);
    shapeLyr.property("ADBE Effect Parade")(efAry[3])(1).setValue(50);
    shapeLyr.property("ADBE Effect Parade")(efAry[4])(1).expression=
        'if(value<-100){\r'+
        '	-100;\r'+
        '}else if(value>100){\r'+
        '	100;\r'+
        '}else{\r'+
        '	value;\r'+
        '}';
    shapeLyr.property("ADBE Effect Parade")(efAry[5])(1).setValue(30);
    shapeLyr.property("ADBE Effect Parade")(efAry[6])(1).setValue(3);
    shapeLyr.property("ADBE Effect Parade")(efAry[7])(1).setValue(30);
    shapeLyr.property("ADBE Effect Parade")(efAry[8])(1).setValue(2);
    shapeLyr.property("ADBE Effect Parade")(efAry[9])(1).setValue([255,0,0,255]/255);//赤
    shapeLyr.property("ADBE Effect Parade")(efAry[11])(1).setValue([255,255,255,255]/255);//白
        
    var shapeProperty = shapeLyr.property("ADBE Root Vectors Group"); // これにシェイプを追加していく
    var shapeGroup1 = shapeProperty.addProperty("ADBE Vector Group");
        shapeGroup1.name="ヨコ線";

    /* 長方形パスを3つ準備+エクスプレッションもセットしていく */
    var shapePath1 = shapeGroup1.addProperty("ADBE Vectors Group").addProperty("ADBE Vector Shape - Rect");
        //サイズ
        shapePath1(2).expression=
            'var p1=effect("'+efAry[0]+'")(1);\r'+
            'var p2=effect("'+efAry[1]+'")(1);\r\r\r'+
            '[length(p1,p2),effect("'+efAry[6]+'")(1)];'
        //位置
        shapePath1(3).expression=
            'var sclLength=(effect("'+efAry[3]+'")(1)-effect("'+efAry[6]+'")(1))/200;\r\r\r'+
            '[0,effect("'+efAry[8]+'")(1)%2/2+(effect("'+efAry[4]+'")(1)*sclLength)-effect("'+efAry[2]+'")(1)-effect("'+efAry[3]+'")(1)/2];';
        shapeGroup1.property("ADBE Vector Transform Group").property("ADBE Vector Position").expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'var p1=effect("'+efAry[0]+'")(1)-anchor;\r'+
            'var p2=effect("'+efAry[1]+'")(1)-anchor;\r\r\r'+
            '[(p1[0]+p2[0])/2,(p1[1]+p2[1])/2];';
        shapeGroup1.property("ADBE Vector Transform Group").property("ADBE Vector Rotation").expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'var p1=effect("'+efAry[0]+'")(1)-anchor;\r'+
            'var p2=effect("'+efAry[1]+'")(1)-anchor;\r'+
            'var a=(p2-p1);\r'+
            'var angle=Math.atan2(a[1],a[0]);\r\r\r'+
            'radiansToDegrees(angle)';

    var shapeGroup2 = shapeProperty.addProperty("ADBE Vector Group");
        shapeGroup2.name="タテ線A";
    var shapePath2 = shapeGroup2.addProperty("ADBE Vectors Group").addProperty("ADBE Vector Shape - Rect");
        //サイズ
        shapePath2(2).expression=
            '[effect("'+efAry[8]+'")(1),effect("'+efAry[3]+'")(1)];'
        //位置
        shapePath2(3).expression=
            '[0,-content("タテ線A").content("長方形パス 1").size[1]/2-effect("'+efAry[2]+'")(1)];';
        shapeGroup2.property("ADBE Vector Transform Group").property("ADBE Vector Position").expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r\r'+
            'effect("'+efAry[0]+'")(1)-anchor;';
        shapeGroup2.property("ADBE Vector Transform Group").property("ADBE Vector Rotation").expression=
            'content("ヨコ線").transform.rotation';

    var shapeGroup3 = shapeProperty.addProperty("ADBE Vector Group");
        shapeGroup3.name="タテ線B";
    var shapePath3 = shapeGroup3.addProperty("ADBE Vectors Group").addProperty("ADBE Vector Shape - Rect");
        //サイズ
        shapePath3(2).expression=
            '[effect("'+efAry[8]+'")(1),effect("'+efAry[3]+'")(1)];'
        //位置
        shapePath3(3).expression=
            '[0,-content("タテ線A").content("長方形パス 1").size[1]/2-effect("'+efAry[2]+'")(1)];';
        shapeGroup3.property("ADBE Vector Transform Group").property("ADBE Vector Position").expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'effect("'+efAry[1]+'")(1)-anchor;';
        shapeGroup3.property("ADBE Vector Transform Group").property("ADBE Vector Rotation").expression=
            'content("ヨコ線").transform.rotation';

    var shapeGroup4 = shapeProperty.addProperty("ADBE Vector Group");
        shapeGroup4.name="矢印A";
    var shapePath4 = shapeGroup4.addProperty("ADBE Vectors Group").addProperty("ADBE Vector Shape - Group");
        //パス
        shapePath4(2).expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'var arWidth=effect("'+efAry[6]+'")(1);\r'+
            'var arAngle=effect("'+efAry[7]+'")(1);\r'+
            'var arHeight=effect("'+efAry[5]+'")(1);\r\r\r'+

            'var angle2a=degreesToRadians(arAngle);\r'+
            'var x2a=Math.cos(angle2a);\r'+
            'var y2a=-Math.sin(angle2a);\r'+
            'var angle2b=degreesToRadians(arAngle+90);\r'+
            'var x2b=Math.cos(angle2b);\r'+
            'var y2b=-Math.sin(angle2b);\r'+
            'var angle3a=degreesToRadians(-arAngle);\r'+
            'var x3a=Math.cos(angle3a);\r'+
            'var y3a=-Math.sin(angle3a);\r'+
            'var angle3b=degreesToRadians(-arAngle+90);\r'+
            'var x3b=Math.cos(angle3b);\r'+
            'var y3b=-Math.sin(angle3b);\r\r\r'+

            'var p1=[effect("'+efAry[8]+'")(1)/2,0];\r'+
            'var p1a=p1-([0,arWidth]/2);\r'+
            'var p1b=p1+([0,arWidth]/2);\r'+
            'var p2a=[x2a,y2a]*arHeight;\r'+
            'var p2b=p2a+[x2b,y2b]*-arWidth;\r'+
            'var p1c=p1a+[length(p2a,p2b)+arWidth,0];\r'+
            'var p1d=p1b+[length(p2a,p2b)+arWidth,0];\r'+
            'var p3a=[x3a,y3a]*arHeight;\r'+
            'var p3b=p3a+[x3b,y3b]*arWidth;\r\r\r'+

            'createPath(points=[p1a,p2a,p2b,p1c,p1d,p3b,p3a,p1b],[],[],true);';

        shapeGroup4.property("ADBE Vector Transform Group").property("ADBE Vector Anchor").expression=
            'var a=(effect("'+efAry[3]+'")(1)-effect("'+efAry[6]+'")(1))/200;\r'+
            '[0,effect("'+efAry[2]+'")(1)+(effect("'+efAry[4]+'")(1)*-a)+effect("'+efAry[3]+'")(1)/2];';
        shapeGroup4.property("ADBE Vector Transform Group").property("ADBE Vector Position").expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'effect("'+efAry[0]+'")(1)-anchor;';
        shapeGroup4.property("ADBE Vector Transform Group").property("ADBE Vector Rotation").expression=
            'content("ヨコ線").transform.rotation';

    var shapeGroup5 = shapeProperty.addProperty("ADBE Vector Group");
        shapeGroup5.name="矢印B";
    var shapePath5 = shapeGroup5.addProperty("ADBE Vectors Group").addProperty("ADBE Vector Shape - Group");
        //パス
        shapePath5(2).expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'var arWidth=effect("矢の太さ")(1);\r'+
            'var arAngle=effect("矢の角度")(1);\r'+
            'var arHeight=effect("矢の長さ")(1);\r\r\r'+

            'var angle2a=degreesToRadians(-arAngle);\r'+
            'var x2a=Math.cos(-angle2a);\r'+
            'var y2a=-Math.sin(-angle2a);\r'+
            'var angle2b=degreesToRadians(-arAngle+90);\r'+
            'var x2b=Math.cos(-angle2b);\r'+
            'var y2b=-Math.sin(-angle2b);\r'+
            'var angle3a=degreesToRadians(arAngle);\r'+
            'var x3a=Math.cos(-angle3a);\r'+
            'var y3a=-Math.sin(-angle3a);\r'+
            'var angle3b=degreesToRadians(arAngle+90);\r'+
            'var x3b=Math.cos(-angle3b);\r'+
            'var y3b=-Math.sin(-angle3b);\r\r\r'+

            'var p1=[effect("タテ線の太さ")(1)/2,0];\r'+
            'var p1a=-p1+([0,arWidth]/2);\r'+
            'var p1b=-p1-([0,arWidth]/2);\r'+
            'var p2a=-[x2a,y2a]*arHeight;\r'+
            'var p2b=p2a-[x2b,y2b]*arWidth;\r'+
            'var p1c=p1a-[length(p2a,p2b)+arWidth,0];\r'+
            'var p1d=p1b-[length(p2a,p2b)+arWidth,0];\r'+
            'var p3a=-[x3a,y3a]*arHeight;\r'+
            'var p3b=p3a-[x3b,y3b]*-arWidth;\r\r\r'+

            'createPath(points=[p1a,p2a,p2b,p1c,p1d,p3b,p3a,p1b],[],[],true);';

        shapeGroup5.property("ADBE Vector Transform Group").property("ADBE Vector Anchor").expression=
            'var a=(effect("'+efAry[3]+'")(1)-effect("'+efAry[6]+'")(1))/200;\r'+
            '[0,effect("'+efAry[2]+'")(1)+(effect("'+efAry[4]+'")(1)*-a)+effect("'+efAry[3]+'")(1)/2];';
        shapeGroup5.property("ADBE Vector Transform Group").property("ADBE Vector Position").expression=
            'var anchor=[thisComp.width/2,thisComp.height/2];\r'+
            'effect("'+efAry[1]+'")(1)-anchor;';
        shapeGroup5.property("ADBE Vector Transform Group").property("ADBE Vector Rotation").expression=
            'content("ヨコ線").transform.rotation';

        // 塗り
        shapeProperty.addProperty("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color").expression=
                'effect("'+efAry[9]+'")(1);';
        // 線
        var stroke=shapeProperty.addProperty("ADBE Vector Graphic - Stroke");
            stroke.property("ADBE Vector Stroke Width").expression=
                'effect("'+efAry[10]+'")(1);';
            stroke.property("ADBE Vector Stroke Color").expression=
                'effect("'+efAry[11]+'")(1);';

    /* 定規に追従するテキストレイヤーを作成 */
    var textLyr=actCmp.layers.addText("100");
        // 中央揃えにしておく
        var txPrp=textLyr.property("Source Text");
        var txSTS=txPrp.value;
            txSTS.justification=ParagraphJustification.CENTER_JUSTIFY;
            txPrp.setValue(txSTS);

        // エクスプレッションも適用していく
        textLyr.property("ADBE Transform Group").property("ADBE Anchor Point").expression=
            'var ruler=thisComp.layer(index+1);\r'+
            'var a=ruler.effect("'+efAry[3]+'")(1)/200;\r\r\r'+
            '[0,(-ruler.effect("'+efAry[4]+'")(1)*a)+ruler.effect("'+efAry[2]+'")(1)+ruler.effect("'+efAry[3]+'")(1)/2]+value;';
        // アンカーポイントのvalueは少し上に
        textLyr.property("ADBE Transform Group").property("ADBE Anchor Point").setValue([0,20]);
        textLyr.property("ADBE Transform Group").property("ADBE Position").expression=
            'var ruler=thisComp.layer(index+1);\r'+
            'var p1=ruler.effect("'+efAry[0]+'")(1);\r'+
            'var p2=ruler.effect("'+efAry[1]+'")(1);\r\r\r'+

            '[(p1[0]+p2[0])/2,(p1[1]+p2[1])/2]+value;';
        // 位置のvalueは0に
        textLyr.property("ADBE Transform Group").property("ADBE Position").setValue([0,0]);
        // スケールは100%固定に
        textLyr.property("ADBE Transform Group").property("ADBE Scale").expression=
            '[100,100]';
        // 回転はヨコ線追従
        textLyr.property("ADBE Transform Group").property("ADBE Rotate Z").expression=
            'thisComp.layer(index+1).content("ヨコ線").transform.rotation';

    textLyr.selected=false;
    shapeLyr.selected=true;// シェイプレイヤーを選択状態にして締め
}

app.beginUndoGroup("Shape-RulerH");
    f_Shape_RulerH_V2();
app.endUndoGroup();

まずはシェイプレイヤーを準備します。スクリプトでシェイプを作ると記述が面倒ですが、仕方ありません。

まずは8行目、addShape()します。ただの空のシェイプレイヤーを準備し、パスや塗りなどプロパティはいちいち指定してぶち込んでいきます。一応、リネームとラベルを黄色に設定させます。

13行目からでエクスプレッション制御エフェクトをそこそこ追加するので、処理をまとめてあります。任意のエフェクト名と、対応する型のエクスプレッション制御をマッチネームで配列に入れます。

18行目からこれらをfor文で回しながら連続で追加→リネームさせます。また、メモリ?キャッシュ?を汚さない?というおまじないのfxオフ化しておきます。エクスプレッション制御はvalueをエクスプレッションで持ち出して使うので、エフェクト自体はオフ状態で構いません。

25行目から、追加したエフェクトの初期値と、必要ならエクスプレッションをセットしていきます。

45行目でシェイプレイヤー内のグループを取得しておいて、変数で使い回せるようにします。

46行目はこれも空のグループを作ります。この辺の構造がややこしいです。普段、シェイプツールで作られるシェイプレイヤーには、グループやトランスフォームが自動で追加されますが、スクリプトからは明示的に追加してやらなくてはなりません。シェイプはヨコ線が1つ、両端用のタテ線が2つと長方形シェイプを3つと、両端の矢印になるフリーハンドパスを2つ作るため、識別しやすいように一応リネームしておきます。処理上は使いません。整理のためだけですので、47行目と、その後の同じ処理の74行目、89行目はなくてもOKです。

50行目が長方形パスを追加する部分です。サイズはエクスプレッションでエフェクトのポイントABの長さに連動するようにします。ヨコ線>長方形パス 1>サイズにエクスプレッションを追加です。

var p1=effect("ポイントA")("ポイント");
var p2=effect("ポイントB")("ポイント");
[length(p1,p2),effect("矢の太さ")(1)];

ちょうどエクスプレッションに2点間の長さを取得するlength([x1,y1],[x2,y2])があるので、使います。

57行目、ヨコ線>長方形パス 1>位置にエクスプレッションを追加。

var sclLength=(effect("タテ線の長さ")(1)-effect("矢の太さ")(1))/200;

[0,effect("タテ線の太さ")(1)%2/2+(effect("ヨコ線-Y%")(1)*sclLength)-effect("離す距離")(1)-effect("タテ線の長さ")(1)/2];

タテ線の太さに応じて、タテ線の内側に追従したいので、effect(“タテ線の太さ”)(1)%2/2。
これにヨコ線のスライド調整した高さと、矢の太さ分内側に食い込ませないと、ヨコ線がタテ線を越えてしまうのでeffect(“ヨコ線-Y%”)(1)*sclLengthを考慮し、ポイントから真上に離す距離に追従するマイナス分と、タテ線の長さの中心部分に追従するマイナス分を計算します。

60行目はヨコ線>トランスフォーム:位置用のエクスプレッションをセットします。ヨコ線>長方形パス 1>位置ではなく、長方形パス 1の下のトランスフォームの位置です。これで、ポイントABの中間地点に長方形のセンターが来るように調整します。

var anchor=[thisComp.width/2,thisComp.height/2];
var p1=effect("ポイントA")(1)-anchor;
var p2=effect("ポイントB")(1)-anchor;

[(p1[0]+p2[0])/2,(p1[1]+p2[1])/2];

シェイプレイヤーはコンポジション中央が[0,0]です。なんでや。なのでコンポジションの座標とシェイプの座標を噛み合わせるための処理です。[0,0]がど真ん中ということは、コンポジションの幅と高さの半分をマイナスしてやれば合います。ここから、2点間の中央を計算する、[x1+x2/2,y1+y2/2]の公式に当てはめて完了です。

65行目、ヨコ線>トランスフォーム:回転用のエクスプレッションをセットします。座標は今やったあれこれをコピペして使い、

var anchor=[thisComp.width/2,thisComp.height/2];
var p1=effect("ポイントA")("ポイント")-anchor;
var p2=effect("ポイントB")("ポイント")-anchor;
var a=(p2-p1);
var angle=Math.atan2(a[1],a[0]);
radiansToDegrees(angle)

アークタンジェントでラジアンを導いて、角度に変換します。

73行目から2つめのシェイプ、タテ線の1個目です。大体ヨコ線の応用でいけます。

77行目でタテ線A>長方形パス 1>サイズにエクスプレッション。ヨコ線と同じくeffect(“離す距離”)分スライドさせます。

[0,-effect("離す距離")(1)];

80行目、タテ線A>トランスフォーム:位置にエクスプレッション。ヨコ線と同じくタテ線A>長方形パス 1>トランスフォームでないことに注意。

[0,-content("タテ線A").content("長方形パス 1").size[1]/2-effect("離す距離")(1)];

これでポイントAの位置に持ってきます。ちょうどヨコ線の端になります。

88行目でタテ線A>トランスフォーム:回転にエクスプレッション。ヨコ線の傾きと一緒でいいので引っ張るだけです。

content("ヨコ線").transform.rotation

88行目からタテ線のBです。違うところはポイントのBに追従する部分だけ。あとはタテ線Aと一緒なのでここだけ解説です。

97行目、タテ線B>トランスフォーム:位置にエクスプレッション。

var anchor=[thisComp.width/2,thisComp.height/2];
effect("ポイントB")(1)-anchor;

これでポイントBの位置に持ってこれます。あとのタテ線Bの説明は飛ばします。

107行目でポイントA側の矢印の設定です。シェイプで描画します。

var anchor=[thisComp.width/2,thisComp.height/2];
var arWidth=effect("矢の太さ")(1);
var arAngle=effect("矢の角度")(1);
var arHeight=effect("矢の長さ")(1);

var angle2a=degreesToRadians(arAngle);
var x2a=Math.cos(angle2a);
var y2a=-Math.sin(angle2a);
var angle2b=degreesToRadians(arAngle+90);
var x2b=Math.cos(angle2b);
var y2b=-Math.sin(angle2b);
var angle3a=degreesToRadians(-arAngle);
var x3a=Math.cos(angle3a);
var y3a=-Math.sin(angle3a);
var angle3b=degreesToRadians(-arAngle+90);
var x3b=Math.cos(angle3b);
var y3b=-Math.sin(angle3b);

var p1=[effect("タテ線の太さ")(1)/2,0];
var p1a=p1-([0,arWidth]/2);
var p1b=p1+([0,arWidth]/2);
var p2a=[x2a,y2a]*arHeight;
var p2b=p2a+[x2b,y2b]*-arWidth;
var p1c=p1a+[length(p2a,p2b)+arWidth,0];
var p1d=p1b+[length(p2a,p2b)+arWidth,0];
var p3a=[x3a,y3a]*arHeight;
var p3b=p3a+[x3b,y3b]*arWidth;

createPath(points=[p1a,p2a,p2b,p1c,p1d,p3b,p3a,p1b],[],[],true);

“<“を頂点が8つのパスで表現するため、それぞれの座標を計算しています。”<“の左側から時計回りにp1a,p2a,p2b,p1c,p1d,p3b,p3a,p1bとしました。真ん中が左(外側)がp1a,p1bで、右(内側)がp1c,p1dです。上がp2a,p2b、下がp3a,p3bです。

[矢の太さ]分、太らせるためパスの位置を求めます。太くなるにつれて傾きを考慮してp1a,p1cは上に、p2aとp3aは左に、p2bとp3bは右に、p1b,p1dは下にズレます。[矢の角度]分、矢部分を開く処理をarAngle界隈で、[矢の長さ]分、矢部分がそのままの角度で延長された位置を求める処理をarHeight界隈で、タテ線の太さ分内側に食い込ませる処理をp1の行で行いました。

138行目で矢印A>トランスフォームのアンカーポイントで[離す距離]、[ヨコ線-Y%]の位置微調整の処理、
141行目で矢印A>トランスフォームの位置をコンポジション中央からの数値に変換、
144行目で傾きを考慮します。これはわざわざ計算せずヨコ線の角度を持ってくるだけです。

147行目から矢印のBです。Aと原理は同じため省略します。

192行目から塗りの設定です。[線の色]を引っ張ります。

effect("線の色")(1);

121行目で結合したパス用の塗りを追加し、エクスプレッションでeffect(“線の色”)を引っ張ります。

195行目で境界線の色です。

effect("境界線の色")(1);

198行目で境界線の太さです。

effect("境界線の太さ")(1);

シェイプレイヤーはこれで終わりです。202行目で定規のラベルとして使うテキストレイヤーを作り、定規に追従する仕掛けをしていきます。デフォルトのソーステキストに適当な”100″を入れておきます。

204行目からテキストは中央揃えが使いやすいので、段落を中央に設定します。これも面倒な仕様で簡単にセットできず、ソーステキストのvalueという親扱いのプロパティに段落の中央揃えを入れた箱をsetValueする必要があります。おそらく誰しもひっかかります。

210行目からトランスフォームにエクスプレッションを仕込んでいきます。もう一息です。

アンカーポイントに

var ruler=thisComp.layer(index+1);
var a=ruler.effect("タテ線の長さ")(1)/200;

[0,(-ruler.effect("ヨコ線-Y%")(1)*a)+ruler.effect("離す距離")(1)+ruler.effect("タテ線の長さ")(1)/2]+value;

とし、シェイプレイヤーのエフェクトにアクセスします。タイムライン上で1つ下のレイヤーがシェイプレイヤーと仮定し、index+1にしているので、必ずテキストレイヤーの直下に定規のシェイプのレイヤーがある状態を保ってください。レイヤー順を変更したい場合は、2つのレイヤーをまとめて移動してください。effect(“タテ線の長さ”)を200等分し、-100~+100で位置決めします。effect(“離す距離”)も追従したいので組み込みます。場合によってテキストだけ位置を微調整したいこともあるので、valueを残しておきます。

215行目はヨコ線のちょっと上にラベルが欲しいので、角度が変わってもいい感じにヨコ線の12時方向に移動したいので、アンカーポイントのvalue自体を[0,20]しておきます。

216行目がラベルをヨコ線と同じくポイントABの中間に持ってくるエクスプレッションです。テキストレイヤー>位置に

var ruler=thisComp.layer(index+1);
var p1=ruler.effect("ポイントA")(1);
var p2=ruler.effect("ポイントB")(1);

[(p1[0]+p2[0])/2,(p1[1]+p2[1])/2]+value;

これを仕込みます。

テキストレイヤーはコンポジションの左上が[0,0]なのでこの処理でズレますので、223行目でテキストのvalueは[0,0]にして位置を合わせます。

225行目ではテキストのスケールが変更できないよう固定します。アンカーポイントを位置調整に使用したため、スケールを変えるとズレます。仕様です。

228行目、ヨコ線と同じ傾きに調整するエクスプレッションを仕込みます。

thisComp.layer(index+1).content("ヨコ線").transform.rotation

最後に、スクリプト実行後にはすぐにエフェクトのポイントA、ポイントBを触れるように、231行目から最後の処理をしているテキストレイヤーの選択を解除し、シェイプレイヤーを選択状態にしてQ.E.D.V2!

ダウンロード

06.カメラ周辺機器1/3;撮影ワークフロー前のページ

07.カメラ周辺機器2/3;撮影ワークフロー次のページ

ピックアップ記事

  1. amazonのスポンサー商品(広告)を非表示にするブックマークレット「amazO…
  2. なぜ?After Effectsのレイヤーをエクスプレッションで効率化
  3. フリーランスの開業届提出は開業freeeでとにかく簡単に
  4. なぜ?After Effectsの操作を「スクリプト」で効率化
  5. YouTubeで一時停止中のコントローラーを非表示にするブックマークレット

関連記事

  1. スクリプト

    なぜ?After Effectsの操作を「スクリプト」で効率化

    出来る範囲はマウスやキーボードで編集者が直接できる操作に限られますが、…

  2. スクリプト

    放射状に配置するスクリプト「posCircleAlign.jsx」

    複数のレイヤーを放射状に整列させるエクスプレッションを仕込むスクリプト…

  3. スクリプト

    現在時間のレイヤーを選択するスクリプト「selectCurrent.jsx」

    「AEでも前方選択するスクリプト「selectForword.jsx」…

  4. スクリプト

    全選択レイヤーのデュレーションを一致させるスクリプト「durationMatcher.jsx」

    全選択レイヤーを1つめに選択したレイヤーのデュレーションと一致させるス…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA