終了

高度なレイヤー生成支援ツール開発で起きた、カメラレイヤー作成のトラブル。

エクスプローラー ,
Feb 09, 2025 Feb 09, 2025

このスクリプトは、After Effectsでレイヤーを作成する作業を効率化するためのツールです。ユーザーはパネル上のボタンをクリックするだけで、様々な種類のレイヤーを簡単に作成できます。作成されたレイヤーは、ユーザーが選択しているレイヤーのタイミングに自動的に合わせられ、また選択レイヤーの上に配置されます。

現在、ヌルレイヤー、シェイプレイヤー、調整レイヤー、ソリッドレイヤー、テキストレイヤー、カメラレイヤー、そしてライトレイヤーの作成に対応しています。特にヌルレイヤーとシェイプレイヤーには右クリックでモードを切り替える機能があり、ユーザーの用途に応じて柔軟に対応できるようにしています。

現在問題が発生しているのはカメラレイヤーの作成機能です。カメラレイヤーには通常カメラとヌル付きカメラの2つのモードがありますが、その切り替えと作成の両方に問題が生じています。。。

具体的には、カメラ作成ダイアログを使用してユーザーにカメラの設定を行ってもらい、その後に、スクリプト側で適切なタイミング設定(自動でデュレーションを合わせる機能)と位置設定を適用する必要があります。

さらにヌル付きモードの場合は、カメラレイヤーの上にヌルを配置して親子つけする必要があります。これらの処理を実現したいのですが、うまくいっていません。

このスクリプトではAtarabiさんのライブラリを使用しており、レイヤーを作成するときに、もし同じ大きさの平面がすでにあったらそれで代用する、という処理や、アイコンの管理やレイヤーの作成、設定の永続化などの機能を作成しています。
https://atarabi.hateblo.jp/entry/2023/09/02/211426
https://github.com/atarabi/at_script

現状の実装では、`app.executeCommand(2645)`でカメラ作成ダイアログを開き、ユーザーに設定を行ってもらっています。しかし、カメラ作成後の処理タイミングが適切に制御できておらず、「元に戻す(Undo)」機能を使用するとAfter Effectsが強制終了してしまいます。

また、スクリプトウィンドウに表示されているカメラ生成のモードと実際に生成されるカメラの種類(カメラ単体生成か、カメラとヌルを一緒に生成するのか)が、初回のみずれることがあります。

これらの問題を解決して、スクリプトを使用できる実装方法についてアドバイスをいただけないでしょうか。よろしくおねがいします。

スクリプトUIパネルに入れて使用可能です。
https://46.gigafile.nu/0520-cec9991736454d436d144bd8a6ba289e8

スクリプト導入にあたって、Atarabiさんのブログにある、必須StartUpファイル(jsx)と、必須プラグインをそれぞれ導入してください。すいません。

キーワード
エクスプレッション , スクリプティング , フリーズまたはハング , ユーザーインターフェイスまたはワークスペース
82
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 2 件の正解

参加者 , Feb 09, 2025 Feb 09, 2025

アップロードされているものが違うのかもしれませんが、atarabiさんのライブラリがどこで使用されているのかが
ちょっとわからなかったので何とも言えないのですが、ライブラリが無くても動作するのでAE2025で動かしてみた感じでは
カメラ作成のコマンドIDが違っているのと、カメラを作るボタンを押した部分でも、カメラを作成する部分でも
undoGroupが入っているのでどちらかにした方がいいかもしれないです。
あとは全てを試したわけではないですが、executeComamndIdは例外を吐かないはずなのでtry-catchしなくてもいいかな?
と思います。 

翻訳
エクスプローラー , Feb 09, 2025 Feb 09, 2025

tetsuohさんいつもほんとうにありがとうございます...自分では迷宮入りして気が付けないことをいつも教えてくださってほんとうに感謝してもしきれません...

IDの変更とUndoGroup,Try-Catchの修正と、あとカメラボタンのクリックイベントも修正して、無事に動作しました...

 

// カメラレイヤーの作成
        createCamera: function (comp, withNull) {
            var storedSelection = Utils.storeSelectedLayers(comp);

            // 現在のアクティブカメラを保存
            var activeCamera = comp.activeCamera;

            // カメラ作成ダイアログを開く
            app.executeCommand(2564);

            // 新しく作成されたカメラを探す
            var newCamera = null;
          
...
翻訳
参加者 ,
Feb 09, 2025 Feb 09, 2025

アップロードされているものが違うのかもしれませんが、atarabiさんのライブラリがどこで使用されているのかが
ちょっとわからなかったので何とも言えないのですが、ライブラリが無くても動作するのでAE2025で動かしてみた感じでは
カメラ作成のコマンドIDが違っているのと、カメラを作るボタンを押した部分でも、カメラを作成する部分でも
undoGroupが入っているのでどちらかにした方がいいかもしれないです。
あとは全てを試したわけではないですが、executeComamndIdは例外を吐かないはずなのでtry-catchしなくてもいいかな?
と思います。 

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

tetsuohさんいつもほんとうにありがとうございます...自分では迷宮入りして気が付けないことをいつも教えてくださってほんとうに感謝してもしきれません...

IDの変更とUndoGroup,Try-Catchの修正と、あとカメラボタンのクリックイベントも修正して、無事に動作しました...

 

// カメラレイヤーの作成
        createCamera: function (comp, withNull) {
            var storedSelection = Utils.storeSelectedLayers(comp);

            // 現在のアクティブカメラを保存
            var activeCamera = comp.activeCamera;

            // カメラ作成ダイアログを開く
            app.executeCommand(2564);

            // 新しく作成されたカメラを探す
            var newCamera = null;
            for (var i = 1; i <= comp.numLayers; i++) {
                var layer = comp.layer(i);
                if (layer instanceof CameraLayer && layer !== activeCamera) {
                    newCamera = layer;
                    break;
                }
            }

            if (newCamera) {
                // カメラが見つかった場合の処理
                newCamera.name = "Camera (" + comp.width + "x" + comp.height + ")";

                Utils.applyTimingToLayer(newCamera, comp, storedSelection);
                Utils.moveLayerAboveSelection(newCamera, comp, storedSelection);

                // ヌル付きカメラモードの場合
                if (withNull) {
                    var nullLayer = this.createNullShape(comp, [comp.width / 2, comp.height / 2]);
                    nullLayer.name = "Null (Camera Linked)";
                    nullLayer.guideLayer = true;

                    // カメラをヌルの子に設定
                    newCamera.parent = nullLayer;
                }
            }
        },


// カメラボタンのクリックイベント
cameraBtn.onClick = function () {
    var comp = app.project.activeItem;
    if (!(comp instanceof CompItem)) return;

    app.beginUndoGroup("Create Camera");
    var withNull = settings.current.cameraMode === 'cameraWithNull';
    LayerFactory.createCamera(comp, withNull);
    app.endUndoGroup();
};

 

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