終了

スクリプトでエフェクトにエクスプレッションを適応したい。

エクスプローラー ,
Oct 13, 2024 Oct 13, 2024

リンクをクリップボードにコピー

コピー完了

平面レイヤーを生成して、ドロップダウンメニューで比率を選択したらCC Jawsの割合を調整してくれるスクリプトを制作しています。レイヤーを生成し、エフェクトを適応するとこまではできましたが、エクスプレッションが適応できません。たすけてください。。。

 

(function() {
    app.beginUndoGroup("Create Aspect Ratio Limiter");
    
    var comp = app.project.activeItem;
    if (!comp || !(comp instanceof CompItem)) {
        alert("Please select a composition.");
        return;
    }
    
    var letterBoxLayer = comp.layers.addSolid([0, 0, 0], "LetterBox", comp.width, comp.height, 1);
    
    // Add DropDownMenu Control
    var dropdownEffect = letterBoxLayer.Effects.addProperty("ADBE Dropdown Control");
    dropdownEffect.name = "Dropdown Menu Control";
    var dropdownMenu = dropdownEffect(1);
    dropdownMenu.setPropertyParameters(["16:9", "2.35:1", "2.39:1", "1.85:1", "1.66:1", "1.37:1", "1.33:1", "1:1", "Free Adjust"]);
    
    // Add Slider Controls
    var widthSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    widthSlider.name = "Ratio of Width";
    var heightSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    heightSlider.name = "Ratio of Height";
    
    // Add CC JAWS effect
    var jawsEffect = letterBoxLayer.Effects.addProperty("CC JAWS");
    
    // Set expressions
    var widthExpression = 'a=effect("Dropdown Menu Control")(1);\n' +
        'if(a==1){\n' +
        '    16;\n' +
        '}else if(a==2){\n' +
        '    2.35\n' +
        '}else if(a==3){\n' +
        '    2.39\n' +
        '}else if(a==4){\n' +
        '    1.85\n' +
        '}else if(a==5){\n' +
        '    1.66\n' +
        '}else if(a==6){\n' +
        '    1.37\n' +
        '}else if(a==7){\n' +
        '    1.33\n' +
        '}else if(a==8){\n' +
        '    1\n' +
        '}else if(a==9){\n' +
        '    value\n' +
        '}';
    
    if (widthSlider(1).canSetExpression) {
        widthSlider(1).expression = widthExpression;
    }
    
    var heightExpression = 'a=effect("Dropdown Menu Control")(1);\n' +
        'if(a==1){\n' +
        '    9\n' +
        '}else if(a==9){\n' +
        '    value\n' +
        '}else{\n' +
        '    1\n' +
        '}';
    
    if (heightSlider(1).canSetExpression) {
        heightSlider(1).expression = heightExpression;
    }
    
    var jawsExpression = 'w=thisComp.width;\n' +
        'h=thisComp.height;\n' +
        'rw=effect("Ratio of Width")(1);\n' +
        'rh=effect("Ratio of Height")(1);\n' +
        'a=w*rh/(h*rw);\n' +
        'b=h*rw/(w*rh);\n' +
        'if(a<1){\n' +
        '    a*100;\n' +
        '}else{\n' +
        '    b*100;\n' +
        '}';
    
    // Set expressions for CC JAWS effect
    if (jawsEffect.property("Completion").canSetExpression) {
        jawsEffect.property("Completion").expression = jawsExpression;
    }
    
    if (jawsEffect.property("Direction").canSetExpression) {
        jawsEffect.property("Direction").expression = jawsExpression;
    }
    
    app.endUndoGroup();
})();

 

キーワード
エクスプレッション , エラーまたは問題 , スクリプティング

表示

124

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Oct 13, 2024 Oct 13, 2024

リンクをクリップボードにコピー

コピー完了

エフェクトを追加したり削除したりすると参照が無くなるみたいなので、エフェクトを全部追加してエクスプレッションを適用するのではなく、順次エフェクトを追加してはそのエフェクトにエクスプレッションを適用して、次のエフェクトを適用して...といったようにするとよいかと思います。

もう一つはwidthSlider = letterBoxLayer.effect(2);のようにして再度エフェクトへの参照を取得するのもよいと思います。

 

順次エフェクトを追加しながらエクスプレッションを適用していく場合、すでに適用しているエフェクトをエクスプレッションが参照する場合はいいのですが、そうでない場合はエクスプレッションエラーが出ると思うので、上述のどちらかよい方を選ぶとよいと思います。

 

順次処理していく

    // Add Slider Controls
    var widthSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    widthSlider.name = "Ratio of Width";

    //ここでwidthSliderにエクスプレッションを適用する

    var heightSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    heightSlider.name = "Ratio of Height";

 

再度参照を得る

    // Add Slider Controls
    var widthSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control"); // dropdownEffectの参照が無効になる
    widthSlider.name = "Ratio of Width";

    var heightSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control"); // widthSliderの参照が無効になる
    heightSlider.name = "Ratio of Height";

    // Add CC JAWS effect
    var jawsEffect = letterBoxLayer.Effects.addProperty("CC JAWS"); // heightSliderの参照が無効になる

    dropdownEffect = letterBoxLayer.effect(1); //dropdownEffectrの参照を再度取得する
    widthSlider = letterBoxLayer.effect(2); //widthSliderの参照を再度取得する
    heightSlider = letterBoxLayer.effect(3); //heightSliderの参照を再度取得する

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
エクスプローラー ,
Oct 15, 2024 Oct 15, 2024

リンクをクリップボードにコピー

コピー完了

回答ありがとうございます。再度参照して取得するのは目から鱗でした。。。
実行することでうまくエクスプレッションが追加できたのですが、シンプルにLetterBoxの機能が破綻していました...
どう修正したらいいですかね。ドロップダウンで比率を選択してもJawsのCompletionが反映されないのです...

(function() {
    app.beginUndoGroup("Create Aspect Ratio Limiter");
    
    var comp = app.project.activeItem;
    if (!comp || !(comp instanceof CompItem)) {
        alert("Please select a composition.");
        return;
    }
    
    var letterBoxLayer = comp.layers.addSolid([0, 0, 0], "LetterBox", comp.width, comp.height, 1);
    
    //Add DropDownMenu Control
    var dropdownEffect = letterBoxLayer.Effects.addProperty("ADBE Dropdown Control");
    dropdownEffect.name = "Dropdown Menu Control";
    var dropdownMenu = dropdownEffect(1);
    dropdownMenu.setPropertyParameters(["16:9", "2.35:1", "2.39:1", "1.85:1", "1.66:1", "1.37:1", "1.33:1", "1:1", "Free Adjust"]);
    
    //Add Slider Controls and set expressions in sequence
    var widthSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    widthSlider.name = "Ratio of Width";
    
    var widthExpression = 'a=effect("Dropdown Menu Control")(1);\n' +
        'if(a==1){\n' +
        '    16;\n' +
        '}else if(a==2){\n' +
        '    2.35\n' +
        '}else if(a==3){\n' +
        '    2.39\n' +
        '}else if(a==4){\n' +
        '    1.85\n' +
        '}else if(a==5){\n' +
        '    1.66\n' +
        '}else if(a==6){\n' +
        '    1.37\n' +
        '}else if(a==7){\n' +
        '    1.33\n' +
        '}else if(a==8){\n' +
        '    1\n' +
        '}else if(a==9){\n' +
        '    value\n' +
        '}';
    
    if (widthSlider(1).canSetExpression) {
        widthSlider(1).expression = widthExpression;
    }
    
    var heightSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    heightSlider.name = "Ratio of Height";
    
    var heightExpression = 'a=effect("Dropdown Menu Control")(1);\n' +
        'if(a==1){\n' +
        '    9\n' +
        '}else if(a==9){\n' +
        '    value\n' +
        '}else{\n' +
        '    1\n' +
        '}';
    
    if (heightSlider(1).canSetExpression) {
        heightSlider(1).expression = heightExpression;
    }
    
    //Add CC JAWS effect
    var jawsEffect = letterBoxLayer.Effects.addProperty("CC JAWS");
    
    //Re acquire references
    dropdownEffect = letterBoxLayer.effect(1); 
    widthSlider = letterBoxLayer.effect(2); 
    heightSlider = letterBoxLayer.effect(3); 
    
    var jawsExpression = 'w=thisComp.width;\n' +
        'h=thisComp.height;\n' +
        'rw=effect("Ratio of Width")(1);\n' +
        'rh=effect("Ratio of Height")(1);\n' +
        'a=w*rh/(h*rw);\n' +
        'b=h*rw/(w*rh);\n' +
        'if(a<1){\n' +
        '    a*100;\n' +
        '}else{\n' +
        '    b*100;\n' +
        '}';
    
    //Set expression CC JAWS effect
    if (jawsEffect.property("Completion").canSetExpression) {
        jawsEffect.property("Completion").expression = jawsExpression;
    }
    
    if (jawsEffect.property("Direction").canSetExpression) {
        jawsEffect.property("Direction").expression = jawsExpression;
    }
    
    app.endUndoGroup();
})();

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Oct 16, 2024 Oct 16, 2024

リンクをクリップボードにコピー

コピー完了

単純にエクスプレッションエラーになっているみたいでしたので見てみたところ

dropdownEffect.name = "Dropdown Menu Control";

のはずが、"ドロップダウンメニュー制御"という名前のままになっているのを修正するとエクスプレッションは動作しているようでした。どうもドロップダウンメニューにsetPropertyParametersしてもエフェクトの参照が無くなるみたいです。

 

以下のように修正してもよいと思いますし、エクスプレッション自体を"ドロップダウンメニュー制御"という名前を使うようにしてもよいと思います。

    //Re acquire references
    dropdownEffect = letterBoxLayer.effect(1); 
    dropdownEffect.name = "Dropdown Menu Control";

 

気になる点としてはレターボックスをCC Jawsで表現したいようですのでCC JawsのHeightを0にしてあげるのと、Directionのエクスプレッションがおそらく間違っていて、比率の左側が右側を超えている場合は0、比率の左側と右側が同じ、または右が大きい場合は90にしてあげなくてはいけないのではないかなと思います。

 

また、CC JawsのCompletionでレターボックスを表現すると数値によっては半透明なエッジになることがあるので、レターボックスとしてそれでよいのかという疑問が残ります。

半透明ならないようなCompletionをエクスプレッションで求めるよりは他のエフェクトを組み合わせてレターボックスのエッジがシャープになるようにしてあげるほうが簡単だと思いますので、要求される内容に応じて調整するのが良いかなと思います。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
エクスプローラー ,
Oct 19, 2024 Oct 19, 2024

リンクをクリップボードにコピー

コピー完了

毎回回答ありがとうございます。下記のように実装してみましたが想定しない動作をし始めました。おそらくエクスプレッションをいじってしまったのが原因だと思うんですが、、、

(function () {
    app.beginUndoGroup("Create Aspect Ratio Limiter");

    var comp = app.project.activeItem;
    if (!comp || !(comp instanceof CompItem)) {
        alert("Please select a composition.");
        return;
    }

    var letterBoxLayer = comp.layers.addSolid([0, 0, 0], "LetterBox", comp.width, comp.height, 1);

    //Add DropDownMenu Control
    var dropdownEffect = letterBoxLayer.Effects.addProperty("ADBE Dropdown Control");
    dropdownEffect.name = "Dropdown Menu Control";
    var dropdownMenu = dropdownEffect(1);
    dropdownMenu.setPropertyParameters(["16:9", "2.35:1", "2.39:1", "1.85:1", "1.66:1", "1.37:1", "1.33:1", "1:1", "Free Adjust"]);

    //Add Slider Controls and set expressions in sequence
    var widthSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    widthSlider.name = "Ratio of Width";

    var widthExpression = 'a=effect("Dropdown Menu Control")(1);\n' +
        'if(a==1){\n' +
        '    16;\n' +
        '}else if(a==2){\n' +
        '    2.35\n' +
        '}else if(a==3){\n' +
        '    2.39\n' +
        '}else if(a==4){\n' +
        '    1.85\n' +
        '}else if(a==5){\n' +
        '    1.66\n' +
        '}else if(a==6){\n' +
        '    1.37\n' +
        '}else if(a==7){\n' +
        '    1.33\n' +
        '}else if(a==8){\n' +
        '    1\n' +
        '}else if(a==9){\n' +
        '    value\n' +
        '}';

    if (widthSlider(1).canSetExpression) {
        widthSlider(1).expression = widthExpression;
    }

    var heightSlider = letterBoxLayer.Effects.addProperty("ADBE Slider Control");
    heightSlider.name = "Ratio of Height";

    var heightExpression = 'a=effect("Dropdown Menu Control")(1);\n' +
        'if(a==1){\n' +
        '    9\n' +
        '}else if(a==9){\n' +
        '    value\n' +
        '}else{\n' +
        '    1\n' +
        '}';

    if (heightSlider(1).canSetExpression) {
        heightSlider(1).expression = heightExpression;
    }

    //Add CC JAWS effect
    var jawsEffect = letterBoxLayer.Effects.addProperty("CC JAWS");

    //Re acquire references
    dropdownEffect = letterBoxLayer.effect(1);
    dropdownEffect.name = "Dropdown Menu Control";
    widthSlider = letterBoxLayer.effect(2);

    heightSlider = letterBoxLayer.effect(3);

    var jawsExpression = 'w=thisComp.width;\n' +
        'h=thisComp.height;\n' +
        'rw=effect("Ratio of Width")(1);\n' +
        'rh=effect("Ratio of Height")(1);\n' +
        'a=w*rh/(h*rw);\n' +
        'b=h*rw/(w*rh);\n' +
        'if(a<1){\n' +
        '    a*100;\n' +
        '}else{\n' +
        '    b*100;\n' +
        '}';

    //Set expression CC JAWS effect
    if (jawsEffect.property("Completion").canSetExpression) {
        jawsEffect.property("Completion").expression = jawsExpression;
    }

    if (jawsEffect.property("Direction").canSetExpression) {
        jawsEffect.property("Direction").expression = jawsExpression;
    }

    //Set CC jaws Height 0
        if (jawsEffect.property("Height").canSetExpression) {
            jawsEffect.property("Height").setValue(0);
    }

    app.endUndoGroup();
})();


何度も質問して申し訳ないです。これ、tetsuohさんがおっしゃるように違うエフェクト使ったほうが安定しそうですね...自分にもっと技術があったらエフェクトにして、平面に適応したら全部実現できるようにとかしたいんですよね。
 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Oct 20, 2024 Oct 20, 2024

リンクをクリップボードにコピー

コピー完了

CC JawsのDirectionにはCompletionのエクスプレッションはつけなくていいと思います。

    // if (jawsEffect.property("Direction").canSetExpression) {
    //     jawsEffect.property("Direction").expression = jawsExpression;
    // }

 とりあえずはこれで一般的なレターボックスの挙動は満たせそうだと思います。1:3のような右側が大きいレターボックス(縦長のレターボックス)にも対応させたい場合はDirectionに、右側が大きい場合90度にするというエクスプレッションを適用すればよいと思いますが、現状では上記該当部分のコメントアウトで良いのかなと思います。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
エクスプローラー ,
Oct 24, 2024 Oct 24, 2024

リンクをクリップボードにコピー

コピー完了

最新

ありがとうございました

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines