リンクをクリップボードにコピー
コピー完了
私が作ったフォルダー整理スクリプトです。ファイルの種類、拡張子に合わせてフォルダーに自動で収納されます。平面にも対応させました。
が、このスクリプトを実行したら生成される「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();
リンクをクリップボードにコピー
コピー完了
1. 仮のコンポを作成し、仮の平面を作成する
2. 仮の平面の親フォルダ(parent)を取得して期待する動作に修正する
3. 仮のコンポと仮の平面を削除する
のような感じにするとよいのではないかと思います。
リンクをクリップボードにコピー
コピー完了
スクリプトで00_SOLIDの生成を行わず、仮のコンポと仮の平面を作成するようにする。これによってAe側が00_SOLIDを作ってくれる。その後に仮の平面の親フォルダー(Parent)を取得。
その後に仮のコンポと仮の平面を削除、ということでしょうか?
仮の平面の親フォルダー(Parent)を取得するのはどのような意味があるのでしょうか?
リンクをクリップボードにコピー
コピー完了
以下で実装が実現しました。が、仮のレイヤーの作成のあと、削除がうまくいきません。。。どこで詰まっているのか教えていただけませんか?
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();
リンクをクリップボードにコピー
コピー完了
リンクをクリップボードにコピー
コピー完了
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()
リンクをクリップボードにコピー
コピー完了
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、としている人しか使えないスクリプトなので、そこだけ困ったものですが、かなり便利な物が出来ました。ありがとうございます。