リンクをクリップボードにコピー
コピー完了
平面レイヤーを生成して、ドロップダウンメニューで比率を選択したら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();
})();
リンクをクリップボードにコピー
コピー完了
エフェクトを追加したり削除したりすると参照が無くなるみたいなので、エフェクトを全部追加してエクスプレッションを適用するのではなく、順次エフェクトを追加してはそのエフェクトにエクスプレッションを適用して、次のエフェクトを適用して...といったようにするとよいかと思います。
もう一つは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の参照を再度取得する
リンクをクリップボードにコピー
コピー完了
回答ありがとうございます。再度参照して取得するのは目から鱗でした。。。
実行することでうまくエクスプレッションが追加できたのですが、シンプルに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();
})();
リンクをクリップボードにコピー
コピー完了
単純にエクスプレッションエラーになっているみたいでしたので見てみたところ
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をエクスプレッションで求めるよりは他のエフェクトを組み合わせてレターボックスのエッジがシャープになるようにしてあげるほうが簡単だと思いますので、要求される内容に応じて調整するのが良いかなと思います。
リンクをクリップボードにコピー
コピー完了
毎回回答ありがとうございます。下記のように実装してみましたが想定しない動作をし始めました。おそらくエクスプレッションをいじってしまったのが原因だと思うんですが、、、
(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さんがおっしゃるように違うエフェクト使ったほうが安定しそうですね...自分にもっと技術があったらエフェクトにして、平面に適応したら全部実現できるようにとかしたいんですよね。
リンクをクリップボードにコピー
コピー完了
CC JawsのDirectionにはCompletionのエクスプレッションはつけなくていいと思います。
// if (jawsEffect.property("Direction").canSetExpression) {
// jawsEffect.property("Direction").expression = jawsExpression;
// }
とりあえずはこれで一般的なレターボックスの挙動は満たせそうだと思います。1:3のような右側が大きいレターボックス(縦長のレターボックス)にも対応させたい場合はDirectionに、右側が大きい場合90度にするというエクスプレッションを適用すればよいと思いますが、現状では上記該当部分のコメントアウトで良いのかなと思います。
リンクをクリップボードにコピー
コピー完了
ありがとうございました