AE用JavaScripts

ポートフォリオ用に。

フッテージ探索スクリプト

var allItem = app.project.items;

var lostItem = new Array;	//フッテージのリンク切れ判別用フラグを格納 リンク切れ:ture 切れてない:false
var lostItemObject = new Array;	//リンク切れのフッテージのみを格納
var lostItemName = new Array;	//フッテージのリンクが切れたフッテージファイル名(ソース)
var lostItempath = new Array;	//リンクが切れたフッテージのファイルパス
var myItem = new Array;	//リストに表示されるアイテム
var fneList =[".rm3",".png"] ;	// 拡張子は小文字で
var rootFolderObj;
var fList = new Array;	//指定したフォルダ内にある全ファイルを格納
var myItemObject = new Array;	//aep内の全フッテージを格納
var lostItemNum = 0;
var rootFolderObjDec;
var rootFolderObjEnc;
var CB1value = true;
var checkListItemIndex;
var listOrder;
var lostItemOrder = new Array;
var rootPassStr = new Array;

var res = 
	"""group { 
		orientation:'column', alignment:['fill','fill'],
		lb1: Group { 
			myListbox: ListBox { alignment:['fill','fill'], size:[800, 600], properties:{multiselect:true, numberOfColumns:2, showHeaders:true, columnTitles: ['ファイル名', 'ファイルパス']}}
		},
		fpass: Group { alignment:['fill','fill'],
			PassTitle:StaticText{text:'ファイルを探す場所',alignment:['left','fill'] },
			PassText:EditText{text:'', size:[500,20],alignment:['left','fill'] },
			PassBtn: Button { text:'...', alignment:['right','fill'], maximumSize:[50,20] }, 
		},
		cond: Group { alignment:['fill','fill'],
			myCBox1: Checkbox { text:'不明な素材のみを対象とする', alignment:['fill','fill'] }, 
		},
		cmds: Group { 
			alignment:['fill','bottom'], 
			
			ReloadBtn: Button { text:'リストを更新', alignment:['right','bottom'], maximumSize:[100,20] }, 
			ReplaceBtn: Button { text:'置き換え', alignment:['right','bottom'], maximumSize:[100,20] }, 
			CancelBtn: Button { text:'閉じる', alignment:['right','bottom'], maximumSize:[100,20] }, 
		}, 
	}""";
	
String.prototype.replaceRoot = function (rootStr){  
	return this.replace(/[\/].[\/]/,rootStr.toUpperCase()+":\\").replace(/[\/]/g,"\\");
}  

//alert(fList);
//alert(selectedItem[0].name);
// サブフォルダも含めたファイル一覧を取得する関数
//今回はPC上のファイル探索に使用
function getAllFile(folderObj, ext){
	if (!folderObj) return; // キャンセルされたら処理しない
		var list = [];
		getFolder(folderObj);
		return list;
		// フォルダ内の一覧を取得
		function getFolder(folderObj){
			var fileList = folderObj.getFiles();
			//alert("ここまで動いた");
			for (var i=0; i<fileList.length; i++){
				if (fileList[i].getFiles) {
					getFolder(fileList[i]); // サブフォルダがある限り繰り返す
					//ここでフォルダを配列に突っ込んでいく 別の変数を用意してカウントを上げていく
				}else{
					var f = fileList[i].name.toLowerCase();
					//検索する拡張子が設定されている場合はその拡張子のファイルだけ、設定されていない場合は全ファイル
					if(ext.length > 0){
						for(var j=0; j<ext.length; j++){
							if (f.indexOf(ext[j]) > -1){
								list.push(fileList[i]);
							}
						}
					}else{
						list.push(fileList[i]);
					}
				}
			}
		}
}

//行方不明のアイテムがないか探す
function findItem(){

	var j = 0;
	var lostItemNum = 0;	//行方不明アイテム専用のカウンター
	for(var i = 1; i <= app.project.numItems; i++){

		if(allItem[i] instanceof FootageItem){
			myItemObject[j] = allItem[i];
			lostItem[j] = true;	//アイテムのファイルパスのリンクが切れていないかのフラグ true:切れていない
			//リンクが切れていた時はフラグを false:切れている に書き換える
			if(allItem[i].footageMissing == true){
				lostItem[j] = false;
				lostItemObject[lostItemNum] = allItem[i];	//行方不明アイテム用の配列に入れる
				//alert(myItemObject[j].name);
				lostItemOrder[lostItemNum]  = j
				lostItemNum += 1;
			}
			j+=1
		}
	}
//alert(lostItemOrder[74]);
}

//リンクの張り替え
function linkReprace(){
	//myPanel.grp.m1.myListbox.items[i-1].selected == true
	var tryCount = 0;
	var sucCount = 0;
try{

	for(j=0;j<myPanel.grp.lb1.myListbox.items.length;j++){
		//alert("ここまで動いた");


		if(myPanel.grp.lb1.myListbox.items[j].selected == true){	//リスト上で選択されているものについて処理を行う
			tryCount ++;
				//alert(myPanel.grp.lb1.myListbox.items[j],j);
			if(myPanel.grp.cond.myCBox1.value == true){
				listOrder = lostItemOrder[j];
				//var still = lostItemObject[j].mainSource.isStill;	//フッテージが静止画かどうかの判別
				//var fne = lostItemObject[j].name.split(".");	//拡張子の判別用にファイル名を . で区切る 配列の一番最後に拡張子が入る
				
			}else{
				listOrder = j;
				//var still = myItemObject[j].mainSource.isStill;	//フッテージが静止画かどうかの判別
				//var fne = myItemObject[j].name.split(".");	//拡張子の判別用にファイル名を . で区切る 配列の一番最後に拡張子が入る
				
			}
		//アイテム関連を全部 myItemObject[listOrder] にして共通化する
			var still = myItemObject[listOrder].mainSource.isStill;	//フッテージが静止画かどうかの判別
			
			
			for(i = 0;i  < fList.length; i++){
				//alert(fList[i],i);
				var filePassStr = fList[i].name.split("/");	//ファイル名の一致の判別用にファイルパスを / で区切って配列に 配列の一番最後にファイル名が入る
				var fne = myItemObject[j].name.split(".");	//拡張子の判別用にファイル名を . で区切る 配列の一番最後に拡張子が入る
				if(still == true || fne[fne.length -1] == "rm3"){
					//alert("静止画");
					if(myItemObject[listOrder].name == filePassStr[filePassStr.length-1]){
						//alert(myItemObject[listOrder].name+">>>>"+filePassStr[filePassStr.length-1],"MATCH!!");
						myItemObject[listOrder].replace(fList[i]);
						sucCount ++;
						break;
					}else{
						//alert(myItemObject[listOrder].name+">>>>"+filePassStr[filePassStr.length-1],"MISS...");
					}
				}else{
					//alert("動画");
					//alert(myItemObject[listOrder]);
					var strEnd = myItemObject[listOrder].name.indexOf( "0000-" );
					var strRes = myItemObject[listOrder].name.slice(0, strEnd - 1);
					//alert(strEnd);
					//alert(strRes);
					//alert(strRes+"0000.png"  + "/" +filePassStr[filePassStr.length-1]);
					if(strRes+"0000.png" == filePassStr[filePassStr.length-1]){
						//alert(fList[0].name);
						//alert(myItemObject[listOrder].name+">>>>"+filePassStr[filePassStr.length-1],"MATCH!!");
						myItemObject[listOrder].replaceWithSequence(File(fList[i]),false);//連番のどれか一つを読み込めばシーケンスとして認識してくれるみたい
						sucCount ++;
					}else{
						//alert(myItemObject[listOrder].name+">>>>"+filePassStr[filePassStr.length-1],"MISS...");
					}
				}
			}
		}
	}
	alert(tryCount + "個中" + sucCount + "個のフッテージのリンクを置き換えました。");
}catch(e){alert(e);}

}

//マウスダウン時のイベント処理
function dc(e){
}

//リストボックスへのアイテムの追加
function datacheck(){
	listItemNum = 0;
	for(var i = 0; i < myItemObject.length; i++){
		if(myPanel.grp.cond.myCBox1.value == true){
			if(lostItem[i] == false){

				myItem[i] = myPanel.grp.lb1.myListbox.add ("item", myItemObject[i].name);
				//alert(myItem[i]);
				myItem[i].subItems[0].text = myItemObject[i].mainSource.missingFootagePath;
				listItemNum += 1
			}
		}else{
			myItem[i] = myPanel.grp.lb1.myListbox.add ("item", myItemObject[i].name);
			if(lostItem[i] == false){

				myItem[i].subItems[0].text = myItemObject[i].mainSource.missingFootagePath;
			}else{
				
				rootPassStr = decodeURI(myItemObject[i].mainSource.file).split("/");
				myItem[i].subItems[0].text = decodeURI(myItemObject[i].mainSource.file).replaceRoot(rootPassStr[1]);
				
			}
		}
	}
}

//リスト表示、ボタン割り当て
function panelAdd(){
	try{
	findItem();
	myPanel.grp = myPanel.add(res);
	myPanel.grp.cond.myCBox1.value = CB1value;
	datacheck();
	//alert(lostItem.length);
	listItemNum = 0;
	/*
	for(var i = 0; i < myItemObject.length; i++){
			if(lostItem[i] == false){

				myItem[i] = myPanel.grp.lb1.myListbox.add ("item", myItemObject[i].name);
				//alert(myItem[i]);
				myItem[i].subItems[0].text = myItemObject[i].mainSource.missingFootagePath;
				listItemNum += 1
			}
	}
	*/
	myPanel.layout.layout(true);	//よくわからんけど必須っぽい レイアウトの調整をしてるみたい リロードを組み込む場合はこれを記述してないとリロード時にパネルの中身が表示されなかった
	
	myPanel.grp.lb1.myListbox.addEventListener("mousedown", dc);	//マウスダウン時のイベントを追加

	//...ボタン(置き換えフォルダ選択)を押したときの処理
	myPanel.grp.fpass.PassBtn.onClick = function (){
		rootFolderObj = Folder.selectDialog("フォルダを選択してください","./");
		//alert(decodeURI(rootFolderObj.name));
		rootFolderObjDec = decodeURI(rootFolderObj.path) + "/" + decodeURI(rootFolderObj.name); 	//ダイアログで選択したフォルダパスをテキストにデコードする
		rootPassStr = rootFolderObjDec.split("/");	//ファイル名の一致の判別用にファイルパスを / で区切って配列に 配列の一番最後にファイル名が入る

		//rootFolderObjDec = rootFolderObjDec.replace(/[\/].[\/]/,rootPassStr[1].toUpperCase()+":\\");
		myPanel.grp.fpass.PassText.text = rootFolderObjDec.replaceRoot(rootPassStr[1]);
		//myPanel.grp.fpass.PassText.text = rootFolderObjDec
	}

	//リストを更新ボタンを押したときの処理
	myPanel.grp.cmds.ReloadBtn.onClick = function (){
		CB1value = myPanel.grp.cond.myCBox1.value;
		myPanel.remove(0);
		panelAdd();
	}

	//置き換えボタンを押したときの処理
	myPanel.grp.cmds.ReplaceBtn.onClick = function (){
		try{
		rootFolderObjEnc = Folder(encodeURI(myPanel.grp.fpass.PassText.text)); 	//テキストボックスに表示されているフォルダパスのテキストをパスとして認識できるURIにエンコードする
		
		fList = getAllFile(rootFolderObjEnc, fneList);	//指定したフォルダパス内(ウィンドウズ上)にあるファイルを探して配列にする
		
		//fList = getAllFile(rootFolderObj, fneList);
		//alert(fList.length);
		}catch(e){alert(e);}
		linkReprace();
	}

	//閉じるボタンを押したときの処理
	myPanel.grp.cmds.CancelBtn.onClick = function (){
		myPanel.close();
	}

	}catch(e){alert(e);}
}

//UI描画メイン
function createUI(thisObj){

	myPanel = (thisObj instanceof Panel) ? thisObj : new Window("palette","フッテージ探索", undefined, { resizeable:true } );	//「thisObj」 のオブジェクトが、 「Panel」 のクラスのインスタンスかどうかを調べ真偽で振り分け
	
	panelAdd();
	return myPanel;
}

//UI表示呼び出し
myToolsPanel = createUI(this);
if (myToolsPanel instanceof Window){	//親がWindowかどうか判別して処理を分けてるらしい
	
   myToolsPanel.show();
}

アイテム名リストアップスクリプト

var allItem = app.project.items;

var myListItemR = new Array;	//ListBox表示用

var listUpItems = new Array;	//フォルダ以外の全アイテムをリストアップしたもの
var listUpItemRLU = new Array;	//IDからの逆引き用の配列番号

var itemNumList = new Array;//一時記憶用
var itemAddFlug = new Array;	//アイテムがリストに表示されているかのフラグを入れる

var viewText = "";

//パネルへの表示物を設定
var res = 
	"""group { 
		orientation:'row', alignment:['fill','fill'],

		cmds: Group { 
			orientation:'column', 
			alignment:['fill','center'], 
			AddBtn: Button { text:'追加>>', alignment:['fill','fill'], size:[60,80] }, 
			DeleteBtn: Button { text:'<<削除', alignment:['fill','fill'], size:[60,80] }, 
			ClearBtn: Button { text:'クリア', alignment:['fill','fill'], size:[60,40] }, 
			ViewBtn: Button { text:'表示', alignment:['fill','bottom'], size:[60,40] },
		}, 
		m2: Group { 
			alignment:['fill','fill'], 
			myListbox: ListBox { alignment:['fill','top'], size:[300, 500], properties:{ multiselect:true, numberOfColumns:2, showHeaders:true, columnTitles:['No.', 'コンポジション/フッテージ']}}
		},
	}""";
	
	
var resView = 
	"""group { 
		orientation:'column', alignment:['fill','fill'],
		vm1: Group { 
			myStaticText: EditText{text:'',alignment:['fill','top'], size:[300, 500], properties:{ multiline:true}},
		},
		vcmds: Group { 
			orientation:'row', alignment:['fill','fill'],
			CsvBtn: Button { text:'csvファイルに書き出し', alignment:['fill','fill'], maximumSize:[200,20] }, 
			TxtBtn: Button { text:'テキストファイルに書き出し', alignment:['fill','fill'], maximumSize:[200,20] },
		}, 
	}""";

///////////////////////////////////////////////////////////
// フォルダ以外の全アイテムを配列に
///////////////////////////////////////////////////////////
function itemListUp(){
	var checkItemList = new Array;
	for(var i = 1; i <= app.project.numItems; i++){
		if(allItem[i] instanceof FolderItem){
		}else{
			checkItemList.push(allItem[i]);//配列に追加
		}
	}

	return checkItemList;
}

///////////////////////////////////////////////////////////
// IDからアイテムの配列番号を逆引きできるようにリストを作成
///////////////////////////////////////////////////////////
function itemNumListRLU(){
	//リストアップされたアイテムの配列の順番: i をそのアイテムのIDを配列番号にした配列の中に入れていく
	//アイテムのIDからそのアイテムが 配列: listUpItems のどこに入っているか調べられる
	for(var i = 0; i < listUpItems.length; i++){
		itemNumList[listUpItems[i].id] = i;
		itemAddFlug[listUpItems[i].id] = false;	//同じ要領でリストに表示されているかどうかのフラグも入れていく
	}
	return itemNumList;
}

///////////////////////////////////////////////////////////
// UI描画メイン
///////////////////////////////////////////////////////////
function createUI(thisObj){
	myPanel = (thisObj instanceof Panel) ? thisObj : new Window("palette","アイテム名リスト", undefined, { resizeable:true } );	//「thisObj」 のオブジェクトが、 「Panel」 のクラスのインスタンスかどうかを調べるらしい。真偽で振り分けてるらしいがよくわからん
	listup();
	return myPanel;
}

///////////////////////////////////////////////////////////
// テキスト表示UI描画メイン
///////////////////////////////////////////////////////////
function createViewUI(thisObj){
	myViewTextPanel = (thisObj instanceof Panel) ? thisObj : new Window("dialog","テキスト表示", undefined, { resizeable:true } );	//「thisObj」 のオブジェクトが、 「Panel」 のクラスのインスタンスかどうかを調べるらしい。真偽で振り分けてるらしいがよくわからん
	viewList();
	return myViewTextPanel;
}

////////////////////////////////////////////////////////////////////////////////
//データチェック及びリスト表示
////////////////////////////////////////////////////////////////////////////////
function listup(){
	myPanel.grp = myPanel.add(res);
	var selectedFolder  = app.project.selection;
	var listItemNum = 0;

	try{
	listUpItems = itemListUp();
	listUpItemRLU = itemNumListRLU();
	}catch(e){alert(e);}

	myPanel.layout.layout(true);	//よくわからんけど必須っぽい レイアウトの調整をしてるみたい
	
	myPanel.grp.cmds.AddBtn.onClick = function (){addList();}	//追加ボタンを押したときの処理
	myPanel.grp.cmds.DeleteBtn.onClick = function (){deleteList();}	//削除ボタンを押したときの処理
	myPanel.grp.cmds.ClearBtn.onClick = function (){clearList();}	//クリアボタンを押したときの処理
	myPanel.grp.cmds.ViewBtn.onClick = function (){viewListPanel();}	//クリアボタンを押したときの処理
}

///////////////////////////////////////////////////////////
// 追加
///////////////////////////////////////////////////////////
function addList(){
	myPanel.grp.m2.myListbox.removeAll();	//一旦リスト表示を全削除する
	var selectedItem  = app.project.selection;
	
	//リスト上に無いアイテム(フラグがfalse)を選択していた場合、追加用フラグをtrueに変更
	for(var i = 0; i < selectedItem.length; i++){

		if(itemAddFlug[selectedItem[i].id] == false){
			itemAddFlug[selectedItem[i].id] = true;
		}
	}

	//追加用フラグがtrueになっているアイテムだけをリストに表示していく(二重に表示されるのを防ぐ)
	for(var i = 0; i < listUpItems.length; i++){

		if(itemAddFlug[listUpItems[i].id] == true){
			myListItemR[i] = myPanel.grp.m2.myListbox.add ("item", i);
			myListItemR[i].subItems[0].text = listUpItems[i].name;
		}
	}

}

///////////////////////////////////////////////////////////
// 消去
///////////////////////////////////////////////////////////
function deleteList(){
	
	for(var i = myPanel.grp.m2.myListbox.items.length -1; i >= 0 ; i--){
		if(myPanel.grp.m2.myListbox.items[i].selected == true ){

			itemAddFlug[ listUpItems[ myPanel.grp.m2.myListbox.items[i].text ].id ] = false;	//リストへの追加用フラグをfalseに変更
			myPanel.grp.m2.myListbox.remove(i);	//選択しているアイテムをリストから削除

		}
	}
}

///////////////////////////////////////////////////////////
// クリア
///////////////////////////////////////////////////////////
function clearList(){
	for(var i = 0; i < myPanel.grp.m2.myListbox.items.length; i++){
		myPanel.grp.m2.myListbox.items[i].selected = true;
	}
	deleteList();
}
///////////////////////////////////////////////////////////
// テキスト表示のパネル呼び出し
///////////////////////////////////////////////////////////
function viewListPanel(){
	myViewPanel = createViewUI(this);
	if (myViewPanel instanceof Window){	//親がWindowかどうか判別して処理を分けてるらしい
		myViewPanel.show();
	}
}

///////////////////////////////////////////////////////////
// 一覧をコピペできる状態で表示
///////////////////////////////////////////////////////////
function viewList(){
	viewText = "";	//表示するテキストを一旦クリア
	myViewTextPanel.grp = myViewTextPanel.add(resView);
	for(var i = 0 ; i < myPanel.grp.m2.myListbox.items.length ; i++){
		viewText += myPanel.grp.m2.myListbox.items[i].subItems[0].text + "\n";
	}
	myViewTextPanel.grp.vm1.myStaticText.text = viewText;
	
	myViewTextPanel.grp.vcmds.CsvBtn.onClick = function (){csvExp(viewText);}	//csvで書き出しボタンを押したときの処理
	myViewTextPanel.grp.vcmds.TxtBtn.onClick = function (){txtExp(viewText);}	//テキストで書き出しボタンを押したときの処理
}

///////////////////////////////////////////////////////////
// csvで書き出し
///////////////////////////////////////////////////////////
function csvExp(expcsv){
	var csvFilenName = File.saveDialog("FileName...","*.csv");
	
	if (csvFilenName){

		fileObj = new File(csvFilenName);
		fileObj.open("w");
		fileObj.write(expcsv);
		fileObj.close();
		alert("以下のCSVファイルを書き出しました\n" +  decodeURI(csvFilenName.name));
	}
}

///////////////////////////////////////////////////////////
// テキストで書き出し
///////////////////////////////////////////////////////////
function txtExp(exptxt){
	var txtFilenName = File.saveDialog("FileName...","*.txt");
	
	if (txtFilenName){

		fileObj = new File(txtFilenName);
		fileObj.open("w");
		fileObj.write(exptxt);
		fileObj.close();
		alert("以下のテキストファイルを書き出しました\n" +  decodeURI(txtFilenName.name));
	}
}
///////////////////////////////////////////////////////////
// UI表示呼び出し
///////////////////////////////////////////////////////////

myToolsPanel = createUI(this);
if (myToolsPanel instanceof Window){	//親がWindowかどうか判別して処理を分けてるらしい
   myToolsPanel.show();
}

文字列置換スクリプト

// プロジェクト内で選択しているアイテムを配列で取得
var selectedComp = app.project.selection;

//とりあえず一通りグローバル変数で。
var bef;
var aft;
var btnOK;
var btnCancel;
var result = new Array;
var myPanel;
var befDef = "";	//デフォルトでテキストを表示させたいときに記入する

var resReName = 
	"""group { 
		orientation:'column', alignment:['fill','fill'],
		gr1:  Group { 
			orientation:'row', alignment:['fill','fill'],
			befTitle:StaticText{text:'検索文字列:',alignment:['left','fill'] },
			befText:EditText{text:'', size:[120,20],alignment:['left','fill'] },
		},
		
		gr2:  Group { 
			orientation:'row', alignment:['fill','fill'],
			aftTitle:StaticText{text:'置換文字列:',alignment:['left','fill'] },
			aftText:EditText{text:'', size:[120,20],alignment:['left','fill'] },
		},
		
		cmds: Group { 
			orientation:'row', alignment:['fill','fill'],
			okBtn: Button { text:'置換する', alignment:['fill','fill'], size:[80,40] }, 
			cancelBtn: Button { text:'閉じる', alignment:['fill','fill'], size:[80,40] }, 		
		}, 
	}""";

// 全置換:全ての文字列 org を dest に置き換える関数を定義
String.prototype.replaceAll = function (org, dest){  
	return this.split(org).join(dest);  
}  

//選択しているアイテムすべてに対してリネームを行う
function rename(org,dest){
	for(i=0; i<selectedComp.length; i++){
		var befName = selectedComp[i].name;
		var aftName = befName.replaceAll(org,dest);
		selectedComp[i].name = aftName;
	}
	alert("「" + org + "」 を 「" + dest + "」 に置換しました");
}

//UI表示物、内容
function createUI(thisObj){	
	myReNamePanel = (thisObj instanceof Panel) ? thisObj : new Window("palette","文字列置換",undefined, { resizeable:true });	//「thisObj」 のオブジェクトが、 「Panel」 のクラスのインスタンスかどうかを調べるらしい。真偽で振り分けてるらしいがよくわからん[0,0,250,140]
	myReNamePanel.grp = myReNamePanel.add(resReName);

	myReNamePanel.grp.gr1.befText.text = befDef;
	
	myReNamePanel.grp.cmds.okBtn.onClick = function (){
		// プロジェクト内で選択しているアイテムを配列で取得 :再取得
		selectedComp = app.project.selection;

		bef = myReNamePanel.grp.gr1.befText.text;
		aft = myReNamePanel.grp.gr2.aftText.text;
		if (bef !=""){
			rename(bef, aft);
		}else{
			alert("変換する字列を入力して下さい");
		}
	}

	myReNamePanel.grp.cmds.cancelBtn.onClick = function (){
		myReNamePanel.close();
		//alert("キャンセルしました");
	}
	return myReNamePanel;
}

//ウィンドウを表示する メイン実行部分
myToolsPanel = createUI(this);
if (myToolsPanel instanceof Window){	//親がWindowかどうか判別して処理を分けてる
   myToolsPanel.show();
   }

素材リサイズスクリプト

var compWidth;
var compHeight;
var magX;
var magY;
var distTrX;
var distTrY;
var multiTr;

var res = 
	"""group { 
		orientation:'row', alignment:['fill','fill'],
		pnl1:Group {
			orientation:'column', alignment:['fill','fill'],
			gr1: Group { 
				orientation:'column', alignment:['fill','fill'],
				gr11: Group { 
					myCBox1: Checkbox { text:'', alignment:['fill','fill'] }, 
				},
				gr12: Group { 
					myCBox2: Checkbox { text:'', alignment:['fill','fill'] }, 
				},
			},
			cmds1: Group { 
				changeBtn: Button { text:'リサイズ', alignment:['fill','fill'], size:[80,40] }, 
			},
		},
		pnl3:Panel {alignment:['fill','fill'],size:[0,50]},
		pnl2:Group {
			orientation:'column', alignment:['fill','fill'],
			gr2: Group { 
				orientation:'column', alignment:['fill','fill'],
				gr21: Group { 
					myStaticText1: StaticText{text:'',alignment:['left','fill']},
					myEditText1: EditText{text:'', size:[50,16],alignment:['left','fill'] },
				},
				gr22: Group { 
					myStaticText2: StaticText{text:'',alignment:['left','fill']},
					myEditText2: EditText{text:'', size:[50,16],alignment:['left','fill'] },
				},
			}, 
			cmds2: Group { 
				orientation:'column', alignment:['fill','fill'],
				gr31: Group { 
					orientation:'row', alignment:['fill','fill'],
					myStaticText3: StaticText{text:'',alignment:['left','fill']},
					myEditText3: EditText{text:'', size:[40,16],alignment:['left','fill'] },
				}
				trimBtn: Button { text:'トリミング', alignment:['fill','fill'], size:[80,20] }, 
			}, 
		},

	}""";
	
///////////////////////////////////////////////////////////
// リサイズ
///////////////////////////////////////////////////////////
function compResize(magW,magH){
	// プロジェクト内で選択しているアイテムを取得
	var selectedResizeComp = app.project.selection;
	if(selectedResizeComp.length == 0){
		alert("リサイズするコンポを選択してください。");
	}else{
		for(var i = 0; i < selectedResizeComp.length; i++){
			
			if(selectedResizeComp[i] instanceof CompItem){
				
				compWidth = selectedResizeComp[i].width;
				if(compWidth/magW%8 == 0){
					selectedResizeComp[i].width = compWidth/magW;
				}else{
					var remW = 8 - compWidth/magW%8;
					selectedResizeComp[i].width = compWidth/magW + remW;
				}

				compHeight = selectedResizeComp[i].height;
				if(compHeight/magH%8 == 0){
					selectedResizeComp[i].height = compHeight/magH;
				}else{
					var remH = 8 - compHeight/magH%8;
					selectedResizeComp[i].height = compHeight/magH + remH;
				}
				selectedResizeComp[i].layer(1).scale.setValue([selectedResizeComp[i].layer(1).scale.value[0]/magW, selectedResizeComp[i].layer(1).scale.value[1]/magH]);
				selectedResizeComp[i].layer(1).position.setValue([selectedResizeComp[i].width/2, selectedResizeComp[i].height/2]);
			}//End_if
		}//End_for
	}//End_if
}

///////////////////////////////////////////////////////////
// トリミング
///////////////////////////////////////////////////////////
function compTrimming(distW,distH,multiple){
	// プロジェクト内で選択しているアイテムを取得
	var selectedTrimmingComp = app.project.selection;
	if(selectedTrimmingComp.length == 0){
		alert("トリミングするコンポを選択してください。");
	}else{
		//alert(distW+"/"+distH+"/"+multiple);
		for(var i = 0; i < selectedTrimmingComp.length; i++){
			if(selectedTrimmingComp[i] instanceof CompItem){
				//Xの値が指定されていない場合は元のコンポサイズを使用する
				if(distW == -1){
					compWidth = selectedTrimmingComp[i].width
				}else{
					compWidth = distW;
				}
				//Yの値が指定されていない場合は元のコンポサイズを使用する
				if(distH == -1){
					compHeight = selectedTrimmingComp[i].height;
				}else{
					compHeight = distH;
				}
			
				//指定された倍数になっていない場合は倍数になるように補正をかける
				if(compWidth%multiple == 0){
					selectedTrimmingComp[i].width = compWidth;
				}else{
					var remW = multiple - compWidth%multiple;
					selectedTrimmingComp[i].width = compWidth + remW;
				}
			
				if(compHeight%multiple == 0){
					selectedTrimmingComp[i].height = compHeight;
				}else{
					var remH = multiple - compHeight%multiple;
					//alert(compHeight + remH,remH)
					selectedTrimmingComp[i].height = compHeight + remH;
				}
				selectedTrimmingComp[i].layer(1).position.setValue([selectedTrimmingComp[i].width/2, selectedTrimmingComp[i].height/2]);

			}//End_if
		}//End_for
	}//End_if
}

///////////////////////////////////////////////////////////
// UI描画メイン
///////////////////////////////////////////////////////////
function createResCompUI(thisObj){
try{
	myResizeCompPanel = (thisObj instanceof Panel) ? thisObj : new Window("palette","リサイズ", undefined, { resizeable:false } );	//「thisObj」 のオブジェクトが、 「Panel」 のクラスのインスタンスかどうかを調べるらしい。真偽で振り分けてるらしいがよくわからん
	myResizeCompPanel.grp = myResizeCompPanel.add(res);
	
	myResizeCompPanel.grp.pnl1.gr1.gr11.myCBox1.text = " ↕  縦ハーフ化";
	myResizeCompPanel.grp.pnl1.gr1.gr12.myCBox2.text = " ↔ 横ハーフ化";
	myResizeCompPanel.grp.pnl1.gr1.gr11.myCBox1.value = true;
	myResizeCompPanel.grp.pnl1.gr1.gr12.myCBox2.value = true;
	
	myResizeCompPanel.grp.pnl2.gr2.gr21.myStaticText1.text = " X:";
	myResizeCompPanel.grp.pnl2.gr2.gr22.myStaticText2.text = " Y:";
	myResizeCompPanel.grp.pnl2.cmds2.gr31.myStaticText3.text = " 倍数:";
	myResizeCompPanel.layout.layout(true);

	myResizeCompPanel.grp.pnl1.cmds1.changeBtn.onClick = function (){
		
		if(myResizeCompPanel.grp.pnl1.gr1.gr11.myCBox1.value == true){
			magY = 2;
		}else{
			magY = 1;
		}

		if(myResizeCompPanel.grp.pnl1.gr1.gr12.myCBox2.value == true){
			magX = 2;
		}else{
			magX = 1;
		}
		compResize(magX,magY);
	}

	myResizeCompPanel.grp.pnl2.cmds2.trimBtn.onClick = function (){
		
		distTrX = myResizeCompPanel.grp.pnl2.gr2.gr21.myEditText1.text;
		distTrY = myResizeCompPanel.grp.pnl2.gr2.gr22.myEditText2.text;
		multiTr = myResizeCompPanel.grp.pnl2.cmds2.gr31.myEditText3.text;
		if(distTrX == ""){
			distTrX = -1;
		}
		if(distTrY == ""){
			distTrY = -1;
		}
		if(multiTr == ""){
			multiTr =1;
		}
		//alert(distTrX+"/"+distTrY+"/"+multiTr);
		compTrimming(Number(distTrX),Number(distTrY),Number(multiTr));
	}
	return myResizeCompPanel;
}catch(e){alert(e)}
}

///////////////////////////////////////////////////////////
// UI表示呼び出し
///////////////////////////////////////////////////////////
myResCMainPanel = createResCompUI(this);
if (myResCMainPanel instanceof Window){	//親がWindowかどうか判別して処理を分けてる
   myResCMainPanel.show();
}

この記事が気に入ったらサポートをしてみませんか?