2013-01-13

Flash ProでJSFLを使って指定フォルダ以下のファイルをライブラリにimport

Flash Pro CS6に、音声ファイルを数百ファイル、ライブラリに読み込みたいんだけど、手で1ファイルずつ取り込みなんてしたくないよね。

そこでJSFL (PhotoshopやIllustratorでのjsx) を使うよ。

ググったら同じことをしている人がいた。 http://stackoverflow.com/questions/12199900/how-to-use-jsfl-to-import-lot-of-bitmaps-from-different-folder-to-library-and-ke 以下は、そこのコードほぼそのまま。 ライブラリに階層フォルダを作るやりかたを少し変えている。

import-files-to-lib.jsfl

// http://stackoverflow.com/questions/12199900/how-to-use-jsfl-to-import-lot-of-bitmaps-from-different-folder-to-library-and-ke

var dom = fl.getDocumentDOM(); 
fl.outputPanel.clear()
var fileList = new Array();

function listFile(filepath){
  var files=FLfile.listFolder(filepath,"files"); 
  for(i=0;i<files.length;i++){
    if(filepath.lastIndexOf("/") != filepath.length -1 ){
      filepath+="/";
    }
    fileList.push(filepath + files[i]);
  }

  var folders = FLfile.listFolder(filepath , "directories");
  for(var j=0;j<folders.length;j++) {
    var subPath = filepath + folders[j] + "/";
    listFile(subPath);

    //make sure that this stops at a reasonable point.
    if (fileList.length > 1000)
      return;
  }
}


function importFile(URI){
  var filename = URI.slice(URI.lastIndexOf("/")+1);
  if(dom.importFile(URI)) {
    var subFolder = URI.slice(URI.slice(0,URI.lastIndexOf("/")).lastIndexOf('/')+1, URI.lastIndexOf('/'));
    if(subFolder){
      dom.library.newFolder(subFolder);
      dom.library.moveToFolder(subFolder, filename, true);
    }
  }
  return;
}


var folder = fl.browseForFolderURL("Select a folder.")
if(folder) listFile(folder);

for(i=0; i<fileList.length; i++){
  importFile(fileList[i])
}

これを import-files-to-lib.jsfl とかのファイル名で保存(UTF-8でBOMつける必要あり)して、FlashProの[コマンド - コマンドを実行]で実行。

フォルダを指定すると、そのフォルダ以下にある150ファイルも10秒でライブラリ読み込み完了。

ライブラリのフォルダは、R:\a\b\voice_gack\あO2E.wav の場合 voice_gack という最下層フォルダ名だけ使う。

リンケージを追加

ただ、こうやって読み込んだファイルはリンケージがついてないので、ActionScriptから制御できない。リンケージもつける。

add-linkage-all.jsfl

fl.outputPanel.clear();
var items = fl.getDocumentDOM().library.items;
//var items = fl.getDocumentDOM().library.getSelectedItems();
for(var i=0; i<items.length; i++){
  if(items[i].itemType == 'folder') continue;

  //名前から拡張子を除く
  if(items[i].name.match(/\./)){
    fl.trace(items[i].name + ' -> ' + items[i].name.slice(items[i].name.indexOf('/')+1, items[i].name.lastIndexOf('.')));
    //items[i].name = items[i].name.slice(items[i].name.indexOf('/')+1, items[i].name.lastIndexOf('.'));
  }
  //リンケージ「ActionScript用に書きだし」「最初のフレームに書き出し」
  items[i].linkageExportForRS = false;
  items[i].linkageExportForAS = true;
  items[i].linkageExportInFirstFrame = true;
  items[i].linkageClassName = items[i].name.slice(items[i].name.indexOf('/')+1, items[i].name.lastIndexOf('.'));
}

このスクリプトは「ライブラリ」にあるすべてのアイテムのリンケージを変えてしまう。選択したアイテムのみリンケージを変えるには、var items = fl.getDocumentDOM().library.getSelectedItems();の行のコメントを外してその前の行をコメント化する。

このスクリプトを[コマンド - コマンドを実行]で実行。すると元のファイル名から拡張子外した名前をリンケージの「クラス名」に設定してくれる。

環境

  • Windows7 64bit
  • FlashPro CS6

0 件のコメント:

コメントを投稿

人気記事