編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴
== o ==
ねこまたや web出張所
INDEX

トップページ
お知らせ
twitter
お道具箱
技術資料と雑談
ライブラリ
雑貨や(ダウンロード)
最近の更新
ねこまたやについて

twitter

ねこまたやのついった

企画モノ

psAxe情報ページ
自主制作アニメ
ぽこあぽこ られんたんど


あやかしあやし
エフェクトネタ帳



りまぴん
AE エクスプレッション
レンダー乙女とか
簡易版XPSリンカ
おまけギャラリ

BBS

ねこまたやBBS
開発室BBS

Language



開発室みたいなものでしたが
spamアクセスがはげしいのでページは凍結中です。
書き換えは管理人のみが可能です。
Nekomataya/2024

PsAnimation - [[PS_Script]]


目次

PS_Script

フォトショップでアニメするときの便利スクリプト

っぽいものを書いてみる

とりあえずの目標はりまぴんのタイムシートを再生できるようになること

そのいち レイヤをアニメーフレームに

現在のファイルのレイヤーをアニメフレームに展開します。

/*
		Photoshop レイヤぱらぱら
	アクティブレイヤのあるレイヤコレクションをパラパラできるようにするよ
	簡易アニメチェックにどうぞ。色塗りのパカ探しとか。指パラみたいなもんです。
	photoshopのアニメ機能を使うのでCS2以上が必要です
*/
	var exFlag=true;
//そもそもドキュメントがなければ終了
	if(app.documents.length==0){
		exFlag=false;
	}else{
//起動時にレイヤコレクションの状態を確認 フリップアイテム数が1以下なら終了
		if(activeDocument.activeLayer.parent.layers.length<=1){exFlag=false;};
	}
	if(exFlag){

//アニメウインドウ操作関数 現状取得ができないのはヘボいが今のトコはカンベン 後で整理する
/*
	復帰は不要でトレーラー内部の表示状態だけセットするスクリプトをまず作る
	フレームは初期化!
*/
setDly=function(myTime){
// =======================================================アニメーションウィンドウの最初のフレームの遅延を設定
var idsetd = charIDToTypeID( "setd" );
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref = new ActionReference();
        var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref.putEnumerated( idanimationFrameClass, idOrdn, idTrgt );
    desc.putReference( idnull, ref );
	
    var idT = charIDToTypeID( "T   " );
        var desc2 = new ActionDescriptor();
        var idanimationFrameDelay = stringIDToTypeID( "animationFrameDelay" );
        desc2.putDouble( idanimationFrameDelay, myTime );
    var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" );
    desc.putObject( idT, idanimationFrameClass, desc2 );
executeAction( idsetd, desc, DialogModes.NO );
}
dupulicateFrame=function(){
// =======================================================フレーム複製
var idDplc = charIDToTypeID( "Dplc" );
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref = new ActionReference();
        var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref.putEnumerated( idanimationFrameClass, idOrdn, idTrgt );
    desc.putReference( idnull, ref );
executeAction( idDplc, desc, DialogModes.NO );
}
selectFrame=function(idx){
// =======================================================フレーム選択(1/6)
var idslct = charIDToTypeID( "slct" );
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref = new ActionReference();
        var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" );
        ref.putIndex( idanimationFrameClass, idx );
    desc.putReference( idnull, ref );
var M=executeAction( idslct, desc, DialogModes.NO );
}
selectFramesAll=function(){
// =======================================================フレーム全選択
var idanimationSelectAll = stringIDToTypeID( "animationSelectAll" );
    var desc = new ActionDescriptor();
executeAction( idanimationSelectAll, desc, DialogModes.NO );
}
removeSelection=function(){
// =======================================================選択フレーム削除
var idDlt = charIDToTypeID( "Dlt " );
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref = new ActionReference();
        var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref.putEnumerated( idanimationFrameClass, idOrdn, idTrgt );
    desc.putReference( idnull, ref );
executeAction( idDlt, desc, DialogModes.NO );
}
//アニメーションフレームをアクティブにする(正逆順送り)セレクトとアクティブが別概念のようなので注意だ
activateFrame=function(kwd){
//kwd = Nxt ,Prevs,Frst(各4バイト)
var idanimationFrameActivate = stringIDToTypeID( "animationFrameActivate" );
    var desc = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref = new ActionReference();
        var idanimationFrameClass = stringIDToTypeID( "animationFrameClass" );
        var idOrdn = charIDToTypeID( "Ordn" );
		var idX = charIDToTypeID( kwd );
        ref.putEnumerated( idanimationFrameClass, idOrdn, idX );
    desc.putReference( idnull, ref );
executeAction( idanimationFrameActivate, desc, DialogModes.NO );
}


//オプションで背景レイヤをパラパラに混ぜるぜるか否かを調整
//最下層レイヤではなく、「背景レイヤ」限定? 考慮中

var myEasyFlip=new Object();
//properties
	myEasyFlip.targetLayers=activeDocument.activeLayer.parent.layers;
	myEasyFlip.wait=3*1000/24;
	myEasyFlip.bgFix=false;
	myEasyFlip.onLoop=true;
	myEasyFlip.playStatus="stop";
	myEasyFlip.previewLayer=null;

	myEasyFlip.playList=new Array();
	myEasyFlip.backupView=new Array();

	myEasyFlip.tableInit=function(){

//メソッド
		for(idx=0;idx<myEasyFlip.targetLayers.length;idx++){
			if((myEasyFlip.bgFix)&&(idx==myEasyFlip.targetLayers.length-1)){
				continue;
			}else{
				myEasyFlip.playList.push(idx);
			}
		}
		myEasyFlip.playList.active=myEasyFlip.playList.length-1;
//
		for(idx=0;idx<myEasyFlip.targetLayers.length;idx++){
			myEasyFlip.backupView.push(myEasyFlip.targetLayers[idx].visible);
		}
		myEasyFlip.backupView.active=activeDocument.activeLayer;
	}

	myEasyFlip.tableInit();

	myEasyFlip.viewRestore=function(){
		for(idx=0;idx<this.backupView.length;idx++){
			this.targetLayers[idx].visible=this.backupView[idx];
		}
		activeDocument.activeLayer=myEasyFlip.backupView.active;//これは要らんかも
	}

	myEasyFlip.viewInit=function(){
		//表示初期化
		//アニメーションテーブル初期化
		//アニメウィンドウを初期化する>要するに全て消す
		dupulicateFrame();//一個複製して最低2個のフレームにする(エラー回避)
		selectFramesAll();//全選択
		removeSelection();//削除
//==============================================================
		for(idx=0;idx<this.backupView.length;idx++){
			if(!this.targetLayers[idx].visible){this.targetLayers[idx].visible=true}
		};//all visible
		for(idx=0;idx<this.playList.length;idx++){
			if(this.targetLayers[this.playList[idx]].visible){this.targetLayers[this.playList[idx]].visible=false}
		};//playList unvisible
		this.targetLayers[this.playList[this.playList.length-1]].visible=true;//第一フレーム表示
		//第二フレーム以降を表示を切り替えつつアニメフレームに登録
		for(var idx=this.playList.length-1;idx>0;idx--){
			dupulicateFrame();//作る(フォーカス移動)
//			alert(this.playList[idx]);
			this.targetLayers[this.playList[idx]].visible=false;
			this.targetLayers[this.playList[idx-1]].visible=true;
		}
		//表示終了配置初期化
		activateFrame ("Frst");//最後に第一フレームにフォーカスしておく
//		myEasyFlip.playList[0].visible=true;//第一フレーム表示
		//setStart
		this.playStatus="stop";
		this.previewLayer=this.targetLayers[this.playList.active];
		activeDocument.activeLayer=myEasyFlip.previewLayer;
//		this.previewLayer.visible=true;//previewLayerはオブジェクト(アクセスターゲット)で
	}

	myEasyFlip.flip=function(WD){
		var myOffset=(WD=="BWD")?-1:1;
		if((false)&&(w.namePad.text!=myEasyFlip.previewLayer.name)&&(w.namePad.text!="")){
			myEasyFlip.previewLayer.name=w.namePad.text;
		}
		this.previewLayer.visible=false;

		if(this.onLoop){
			this.playList.active=(this.playList.active+this.playList.length-myOffset)%this.playList.length;//ループ
		}else{
			this.playList.active=(this.playList.active>0)?this.playList.active-myOffset:0;//stop
		}
		this.previewLayer=this.targetLayers[this.playList.active];
		this.previewLayer.active=true;
		activeDocument.activeLayer=this.previewLayer;
//		w.nameView.text=this.previewLayer.name;
//		w.namePad.text="";

//		alert(w.namePad.textselection);
//		return "OK!";
	}

//初期化
myEasyFlip.viewInit();
//==============================================================
selectFrame(1);//最後に第一フレームにフォーカスしておく


	}else{alert("なんだかパタパタするものが無いみたい");}
なんだか妙に長いけど、あり物コードを組み合わせたのでカンベンだ。

微妙にコードを整理しました。(動作は同じです)

ファイルのどれかのレイヤを選択した状態でこのスクリプトを実行すると 一連のレイヤを「下から順」に1フレームづつアニメーションウインドウに並べます。

レイヤを並べ替えて再実行すると以前のフレームを全部消して再度並べなおします。

まだセル重ねはサポートしてません。

今までアニメ機能を使っていなかったので、しばらくはこれでイロイロと動作を試して、Photoshopのアニメ機能の探索を行なう予定。

そのに β版お試しです

プロジェクトに名前をつけて、書きためた便利スクリプトをツールパレットから使用できるようにしてみました。

名前は PsAxe (Photoshop Animation Xps Extention) です。 「アックス」とか「斧(おの)」とか呼んで下さると良いと思います。

PsAxe-Betaダウンロード 最終更新 2011.05.24

こちらのリンクからダウンロードできますので、興味のある方はどぞお試し下さい。

ご意見・ご感想などいただけると作者が喜びます。こうすると便利だとか、バグ報告とか歓迎ちゅー

このサイトのBBSとか twitterなどでぼちぼちと店開きしてますので、気が向いたら声かけて下さいね。

動作報告も歓迎(特にCS5)

対応環境

Photoshop CS2 以降 (CS5は動作未確認 …持ってないから) Windows & Mac

あると便利なもの

りまぴん

タイムシート適用のためにタイムシートを編集するソフトが必要です。WEB上でも良いですが、ローカルファイルが扱えるので、AIR版がおすすめです。

インストール

CS3以降の方は、ダウンロードしたアーカイブをお好きな場所に解凍して下さい。

ツールパレットアプリケーション nasPsAxe をダブルクリックで起動して下さい。 各種機能を使用可能です。

 Mac > nasPsAxe.app / Win > nasPsAxe.hta

CS2の方は同様の起動では、一部の機能のみが使用できます。フル機能をご使用になるにはインストール操作が必要です。 ツールパレットの左肩の斧アイコンがインストールボタンです。 クリックするとインストールを開始しますので、指示に従ってインストールを進めてください。

PhotoshopがCS3以上のバージョンの場合は、インストールをしなくてもスクリプトを使用できますが、インストールを行うと動作が軽快になる場合がありますので、このツールを継続的にご使用になる場合はインストールしたほうがよいでしょう。

PhotoshopがCS4以降の場合は、同梱のAdobeConfiguratorPanel?を追加インストールすることで、先にインストールしてあるnasPsAxeのスクリプトをドッキングパネルから利用することができます。

詳しくは同梱のテキストを読むか、BBS twitter などでお問い合わせ下さいな。

イロイロ