終了

AEで自作したフォルダー整理スクリプトでの、平面レイヤーの管理のバグ

エクスプローラー ,
Nov 14, 2024 Nov 14, 2024

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

コピー完了

私が作ったフォルダー整理スクリプトです。ファイルの種類、拡張子に合わせてフォルダーに自動で収納されます。平面にも対応させました。
が、このスクリプトを実行したら生成される「00_SOLID」というフォルダー。
あとからAeで平面レイヤーを生成すると同じ「00_SOLID」という名前のフォルダーが生成され、平面レイヤーはこちらに入ってしまいます。これは私が環境設定で「00_SOLID」を平面フォルダーに指定しているからなのですが、どうしてすでにある方を使ってくれないのでしょうか。
改善が出来ない場合、どうしたらいいかアイデアを教えてください。

//わたしが使ってるファイル整理をワンクリックで実現できます。
//すでにフォルダがある場合、拡張子に応じてフォルダーに収納されます。

function main() {
    // エラーチェックで、プロジェクトが開かれているか確認
    if (!app.project) {
        alert("プロジェクトが開かれていません。\nプロジェクトを開いてから実行してください。");
        return;
    }

    try {
        app.beginUndoGroup("Create and Organize Project Folders");

        // フォルダー名の配列
        var folderNames = [
            "00_SOLID",
            "01_COMP",
            "02_IMAGE",
            "03_AUDIO",
            "04_VIDEO",
            "05_IMAGE_SEQ",
            "06_OTHER",
            "07_RENDER"
        ];

        
        var folders = {};

        // 既存のフォルダーを確認し、なければ新しいフォルダーを作成
        for (var i = 0; i < folderNames.length; i++) {
            var existingFolder = null;
            for (var j = 1; j <= app.project.items.length; j++) {
                var item = app.project.items[j];
                if (item instanceof FolderItem && item.name === folderNames[i]) {
                    existingFolder = item;
                    break;
                }
            }

            if (existingFolder) {
                folders[folderNames[i]] = existingFolder;
            } else {
                var newFolder = app.project.items.addFolder(folderNames[i]);
                newFolder.label = 0;
                folders[folderNames[i]] = newFolder;
            }
        }

        // 既存のファイルをフォルダーに振り分け
        for (var k = 1; k <= app.project.items.length; k++) {
            var item = app.project.items[k];
            // 各ファイルのタイプに応じてフォルダーに移動
            if (item instanceof CompItem) {
                item.parentFolder = folders["01_COMP"];
            } else if (item instanceof FootageItem && item.mainSource instanceof SolidSource) {
                // 平面レイヤーとヌルレイヤーを00_SOLIDに分類
                item.parentFolder = folders["00_SOLID"];
            } else if (item instanceof FootageItem && item.mainSource instanceof FileSource) {
                var fileExtension = item.mainSource.file.name.split('.').pop().toLowerCase();
                // シーケンス画像かどうかの判定する!!
                if (item.mainSource.isStill == false && (fileExtension === 'png' || fileExtension === 'jpg' || fileExtension === 'jpeg')) {
                    item.parentFolder = folders["05_IMAGE_SEQ"];
                } else {
                    switch (fileExtension) {
                        case 'jpg':
                        case 'jpeg':
                        case 'png':
                        case 'gif':
                        case 'bmp':
                        case 'tiff':
                            item.parentFolder = folders["02_IMAGE"];
                            break;
                        case 'wav':
                        case 'mp3':
                        case 'aif':
                        case 'aac':
                        case 'ogg':
                            item.parentFolder = folders["03_AUDIO"];
                            break;
                        case 'mp4':
                        case 'mov':
                        case 'avi':
                        case 'mkv':
                        case 'flv':
                        case 'wmv':
                            item.parentFolder = folders["04_VIDEO"];
                            break;
                        default:
                            item.parentFolder = folders["06_OTHER"];
                            break;
                    }
                }
            }
        }
    } catch (error) {
        alert("エラーが発生しました:\n" + error.toString());
    } finally {
        app.endUndoGroup();
    }
}


main();
キーワード
エクスプレッション , エラーまたは問題 , クラッシュ , スクリプティング , ユーザーインターフェイスまたはワークスペース

表示

113

翻訳

翻訳

レポート

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

correct answers 1 件の正解

エクスプローラー , Nov 14, 2024 Nov 14, 2024
var solidSource = dummySolid.source; if (solidSource) { solidSource.remove(); // ソースアイテムを削除 }
で削除できました。ありがとうございました!

投票

翻訳

翻訳
参加者 ,
Nov 14, 2024 Nov 14, 2024

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

コピー完了

1. 仮のコンポを作成し、仮の平面を作成する
2. 仮の平面の親フォルダ(parent)を取得して期待する動作に修正する
3. 仮のコンポと仮の平面を削除する

 

のような感じにするとよいのではないかと思います。

投票

翻訳

翻訳

レポート

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

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

コピー完了

スクリプトで00_SOLIDの生成を行わず、仮のコンポと仮の平面を作成するようにする。これによってAe側が00_SOLIDを作ってくれる。その後に仮の平面の親フォルダー(Parent)を取得。
その後に仮のコンポと仮の平面を削除、ということでしょうか?
仮の平面の親フォルダー(Parent)を取得するのはどのような意味があるのでしょうか?

投票

翻訳

翻訳

レポート

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

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

コピー完了

以下で実装が実現しました。が、仮のレイヤーの作成のあと、削除がうまくいきません。。。どこで詰まっているのか教えていただけませんか?

function main() {
    // エラーチェック
    if (!app.project) {
        alert("プロジェクトが開かれていません。プロジェクトを開いてから実行してください。");
        return;
    }

    try {
        app.beginUndoGroup("Create and Organize Project Folders");

        // 仮のコンポーネントを作成
        var dummyComp = app.project.items.addComp("Dummy", 1920, 1080, 1.0, 10, 30);

        // 仮の平面レイヤーを作成
        var dummySolid = dummyComp.layers.addSolid([1, 1, 1], "Dummy Solid", 1920, 1080, 1);

        // 仮の平面レイヤーの親フォルダを取得
        var solidFolder = dummySolid.parentFolder;

        // 仮のコンポーネントと平面レイヤーを削除
        dummyComp.remove();

        // フォルダー名の配列
        var folderNames = [
            solidFolder ? solidFolder.name : "00_SOLID", // 仮の平面レイヤーの親フォルダ名
            "01_COMP",
            "02_IMAGE",
            "03_AUDIO",
            "04_VIDEO",
            "05_IMAGE_SEQ",
            "06_OTHER",
            "07_RENDER"
        ];

        // 既存のフォルダーを確認し、なければ新しいフォルダーを作成
        var folders = {};
        for (var i = 0; i < folderNames.length; i++) {
            var existingFolder = null;
            for (var j = 1; j <= app.project.items.length; j++) {
                var item = app.project.items[j];
                if (item instanceof FolderItem && item.name === folderNames[i]) {
                    existingFolder = item;
                    break;
                }
            }

            if (existingFolder) {
                folders[folderNames[i]] = existingFolder;
            } else {
                var newFolder = app.project.items.addFolder(folderNames[i]);
                newFolder.label = 0;
                folders[folderNames[i]] = newFolder;
            }
        }

        // 既存のファイルをフォルダーに振り分け
        for (var k = 1; k <= app.project.items.length; k++) {
            var item = app.project.items[k];
            // 各ファイルのタイプに応じてフォルダーに移動
            if (item instanceof CompItem) {
                item.parentFolder = folders["01_COMP"];
            } else if (item instanceof FootageItem && item.mainSource instanceof SolidSource) {
                // 平面レイヤーはSOLIDフォルダーに
                item.parentFolder = folders[solidFolder ? solidFolder.name : "00_SOLID"];
            } else if (item instanceof FootageItem && item.mainSource instanceof FileSource) {
                var fileExtension = item.mainSource.file.name.split('.').pop().toLowerCase();
                // シーケンス画像かどうかの判定
                if (item.mainSource.isStill == false && (fileExtension === 'png' || fileExtension === 'jpg' || fileExtension === 'jpeg')) {
                    item.parentFolder = folders["05_IMAGE_SEQ"];
                } else {
                    switch (fileExtension) {
                        case 'jpg':
                        case 'jpeg':
                        case 'png':
                        case 'gif':
                        case 'bmp':
                        case 'tiff':
                            item.parentFolder = folders["02_IMAGE"];
                            break;
                        case 'wav':
                        case 'mp3':
                        case 'aif':
                        case 'aac':
                        case 'ogg':
                            item.parentFolder = folders["03_AUDIO"];
                            break;
                        case 'mp4':
                        case 'mov':
                        case 'avi':
                        case 'mkv':
                        case 'flv':
                        case 'wmv':
                            item.parentFolder = folders["04_VIDEO"];
                            break;
                        default:
                            item.parentFolder = folders["06_OTHER"];
                            break;
                    }
                }
            }
        }
    } catch (error) {
        alert("エラーが発生しました:\n" + error.toString());
    } finally {
        app.endUndoGroup();
    }
}

main();

投票

翻訳

翻訳

レポート

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

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

コピー完了

var solidSource = dummySolid.source; if (solidSource) { solidSource.remove(); // ソースアイテムを削除 }
で削除できました。ありがとうございました!

投票

翻訳

翻訳

レポート

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

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

コピー完了

00_SOLIDとの名前を比較したり、仮の平面を削除した際に親フォルダが空になったら
親フォルダを削除するかとかしたい時に利用できるかなとおもうので
平面フォルダを取得しておくと便利かなと思います。
 
欲しいのは平面フォルダだけなので、仮の平面とコンポは作成したら即削除してよいと思います(サイズは小さくてもよいかも)
 

 

var dummyComp = app.project.items.addComp("Dummy", 10, 10, 1.0, 1, 30);
var dummySolid = dummyComp.layers.addSolid([1, 1, 1], "Dummy Solid", 10, 10, 1);
var solidFolder = dummySolid.parentFolder;
dummySolid.source.remove()
dummyComp.remove()

 

 

投票

翻訳

翻訳

レポート

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

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

コピー完了

最新
quote
00_SOLIDとの名前を比較したり、仮の平面を削除した際に親フォルダが空になったら
親フォルダを削除するかとかしたい時に利用できるかなとおもうので
平面フォルダを取得しておくと便利かなと思います。
 
欲しいのは平面フォルダだけなので、仮の平面とコンポは作成したら即削除してよいと思います(サイズは小さくてもよいかも)
 

 

 

var dummyComp = app.project.items.addComp("Dummy", 10, 10, 1.0, 1, 30);
var dummySolid = dummyComp.layers.addSolid([1, 1, 1], "Dummy Solid", 10, 10, 1);
var solidFolder = dummySolid.parentFolder;
dummySolid.source.remove()
dummyComp.remove()

 

 

 


By @tetsuoh

発展的なアドバイスまでありがとうございます。環境設定で使用する平面レイヤーが00_SOLID、としている人しか使えないスクリプトなので、そこだけ困ったものですが、かなり便利な物が出来ました。ありがとうございます。

投票

翻訳

翻訳

レポート

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