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

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

twitter

ねこまたやのついった

企画モノ

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


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



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

BBS

ねこまたやBBS
開発室BBS

Language



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

ScriptLibrary - AdobeAfterEffects


目次

AdobeAfterEffects

Script(AE)のライブラリを

ツールや、アプリを作るのに先行して ライブラリを作っておくことにする。

内容は

nas.GUI

まずは、GUI周りの整備をする。

AEスクリプトのGUI仕様は、「すごくプリミティブ」でウィンドウ配置の指定なんて、「絶対座標で左上、右下」 の指定「のみ」なんですよ先生!  どうなのよそれ。

ボタン一つ書くのにピクセルでサイズ計算やってたらすぐ日が暮れちゃうよ。

てなわけで、昔懐かしいカンジの「グリッド配置しかできないけどぱっと部品がかける」ライブラリを作ることにしました。

以下、仕様 決定にあらず。きっと変わります。… でもそれほど変わらないかな? もう半分ぐらい書いちゃったし。

ライブラリ使用方法。

このライブラリは主にグリッド配置で指定します。自由度はありませんが、比較的カンタンな記述でかけます。 指定はグリッドサイズ(小数点指定一部可能)

 現在の	横1ブロックは 60px : 縦1ブロックは 24px

設定ファイルで変更可能です。(予定、今はライブラリを直に書き換えないとダメ)

…使ってゆくうちに MacとWinで値を共有するのは良くないような気がしてきた。 どうも、日本語以外の環境でも条件が違うらしい。何か仕組みを考えたほうが良いが、しばらくはこのままゴマかそう…

/*
 *	TEST nas.GUI ライブラリ
 *		nas GUI-Library test script
 *	このファイルは、「レンダー乙女」GUIライブラリの使用サンプルです。
 *	Adobe AE 環境でのグリッド指定による GUI部品へのアクセス方法と
 *	何種類かの複合コントロールを提供します。
 *	詳しい使用方法は、以下のURLを参照してください。

	http://www.nekomataya.info/nekojyarashi/wiki.cgi?ScriptLibrary

 *	なおこのライブラリは、開発中の暫定版です。
 *	細部は変更になる可能性が有りますので、サイトの情報をご確認ください。
 */
//			newWindow(WindowType,WindowName,Width,Height)
//	ウインドウ初期化 戻り値:ウィンドウオブジェクト
//
	var w= nas.GUI.newWindow       ("palette" ,"テスト ウインドウ" ,7 ,25);

//	ウインドウ配下にコントロールを置く詳細はドキュメントを読んでね。
	w.btn  =nas.GUI.addButton      (w ,"ボタン" ,0 ,1 ,3 ,1);
	w.etx  =nas.GUI.addEditText    (w ,"編集可能テキスト" ,0 ,2 ,6 ,2);
	w.stx  =nas.GUI.addStaticText  (w ,"テキスト" ,0 ,4 ,6 ,1);
	w.cbx  =nas.GUI.addCheckBox    (w ,"チェックボックス" ,0 ,5 ,3 ,1);
	w.rbt0 =nas.GUI.addRadioButton (w ,"ラジオボタン0" ,0 ,6 ,3 ,1);
	w.rbt1 =nas.GUI.addRadioButton (w ,"ラジオボタン1" ,0 ,7 ,3 ,1);
	w.sld  =nas.GUI.addSlider      (w ,0 ,0 ,10 ,0 ,8 ,6 ,"top");
	w.srb  =nas.GUI.addScrollBar   (w ,0 ,0 ,10 ,6 ,1 ,8);

//			addSelecteButton(Parent,)
//	複合コントロール・セレクトボタン
//配列で
	myOptions=["<セレクトボタン>","その1","その2","その3","その4"];

	w.sbt  =nas.GUI.addSelectButton(w ,myOptions ,1 ,3 ,1 ,3 ,1);


//	リストボックス シングルセレクト
/*
 初期化
	addListBox(親オブジェクト,[オプションリスト],[セレクト初期値],左位置,上位置,幅,高さ,オプション)
	または
	addListBox(親オブジェクト,[オプションリスト],セレクトID,左位置,上位置,幅,高さ,オプション)
 戻り値
	アクセスベース
 プロパティ
	value 選択された値・または選択された値の配列(マルチセレクト時)
	options 選択可能な値のリスト
	selected 
	selects 
	選択された値を取得する時は、リストボックスオブジェクトの
	 value プロパティを参照してください。
 */
	w.lbx0 =nas.GUI.addListBox (w ,
["いか","たこ","たい","ひらめ","くらげ","かつお","まぐろ"] ,1 ,0 ,9 ,3 ,5);

//	リストボックス マルチセレクト
	w.lbx1 =nas.GUI.addListBox (w ,
["りんご","みかん","いちご","にんじん","きゃべつ","しいたけ","しょうが"] ,[true,false,true,false,true,false,true] ,3 ,9 ,3 ,5 ,"multiSelect");


//	パネルを置いてさらにその配下にコントロールを置く

	w.pnl  =nas.GUI.addPanel       (w ,"PANEL" ,0 ,14 ,7 ,10);

//	パネル配下のコントロールは、パネルのローカル座標下に入る。

	w.pnl.btn  =nas.GUI.addButton      (w.pnl ,"BUTTON" ,0 ,1 ,3 ,1);
	w.pnl.etx  =nas.GUI.addEditText    (w.pnl ,"EDIT TEXT" ,0 ,2 ,6 ,2);
	w.pnl.stx  =nas.GUI.addStaticText  (w.pnl ,"STATIC TEXT" ,0 ,4 ,6 ,1);
	w.pnl.cbx  =nas.GUI.addCheckBox	   (w.pnl ,"CHECKBOX" ,0 ,5 ,3 ,1);
	w.pnl.rbt0 =nas.GUI.addRadioButton (w.pnl ,"RADIOBUTTON0" ,0 ,6 ,3 ,1);
	w.pnl.rbt1 =nas.GUI.addRadioButton (w.pnl ,"RADIOBUTTON1" ,0 ,7 ,3 ,1);
	w.pnl.sld  =nas.GUI.addSlider      (w.pnl ,0 ,0 ,10 ,0 ,8 ,6 ,"bottom");	w.pnl.srb  =nas.GUI.addScrollBar   (w.pnl ,0 ,0 ,10 ,6 ,1 ,8);
//セレクトボタンは、以下のような初期化も可能です

w.pnl.sbt  =nas.GUI.addSelectButton(w.pnl ,"<SelectBUTTON>" ,0 ,3 ,1 ,3 ,1);
	w.pnl.sbt.options.push("1st");
	w.pnl.sbt.options.push("2nd");
	w.pnl.sbt.options.push("3rd");
	w.pnl.sbt.options.push("4th");


//	最後に表示を忘れないように

	w.show();



こんな風に書くことができます。

書式としてさほど単純になるわけではありませんが、指定単位がブロックになって、細かい計算をライブラリで引き受けます。

単純なので、もともとの指定と混在もできます。微妙な位置のコントロールは元来の書式で設定してください。

Window の初期化

ブロック単位で指定

あらかじめ設定したマージンをのせて初期化したウインドウオブジェクトを返すメソッド。

nas.GUI.newWindow(ウィンドウタイプ,ウインドウ名,横幅,高さ[,初期位置X,初期位置Y]) //returns window object

初期位置は省略可能。

var myWindow = nas.GUI.newWindow("palette","myWin",8,16,240,0);//8列16行分のウィンドウを初期化してmyWindow に代入する

staticText / editText / button

指定のサイズで初期化してアクセスベースを戻す。
 nas.GUI.addStaticText(	親オブジェクト,テキスト,横配置,縦配置,幅,高さ);
 nas.GUI.addEditText(	親オブジェクト,テキスト,横配置,縦配置,幅,高さ);
 nas.GUI.addButton(	親オブジェクト,テキスト,横配置,縦配置,幅,高さ);

チェックボックス/ラジオボタン

縦 横サイズ指定
 nas.GUI.addCheckBox(	親オブジェクト,テキスト,横配置,縦配置,幅,高さ);
 nas.GUI.addRadioButton(親オブジェクト,テキスト,横配置,縦配置,幅,高さ);

ラジオボタンは、連続して作成したボタンが(内部idが連続している場合)自動的にヒトクミになるらしい。

スクロールバー

縦1ユニット分の横幅で右寄せと左寄せを指定

 nas.GUI.addScrollBar(親オブジェクト,初期値,最小値,最大値,横配置,縦配置,高さ[,配置]);//returns object

配置は、文字列で "left"/"center"/"right" 1ブロック内で寄せます。

myScroll=nas.GUI.addScrollBar(myWindow,0,0,100,7,9,6,"left");

スライダ

縦1ユニット分の高さで配置します。
 nas.GUI.addSlider親オブジェクト,初期値,最小値,最大値,横配置,縦配置,幅[,配置]);//returns object

 myScroll=nas.GUI.addSlider(myWindow,0,0,100,0,15,7,"top");

配置は、文字列で "top"/"middle"/"bottom" 1ブロック内で寄せます。

セレクトボタン

ドロップダウンリストのかわりに使えます。

 nas.GUI.addSelectButton(親オブジェクト,初期値,初期選択ID,横配置,縦配置,幅,高さ) 
   または
 nas.GUI.addSelectButton(親オブジェクト,[オプションリスト],初期選択ID,横配置,縦配置,幅,高さ)

値をひとつだけ与えた場合は、選択機能が働きません。 その場合は、初期化した後にオプションを設定してやる必要があります。

例:

 mySelectButton=addSelectButton(myWindow,"<no-select>",0 ,0 ,1 ,3,1);
//オプション設定
  mySelectButton.options.push("Value1");
  mySelectButton.options.push("Value2");
  mySelectButton.options.push("Value3");
  mySelectButton.options.push("Value4");
//またはまとめて書き換えでも可
  mySelectButton.options=["<default>","value1","value2","value3","value4"];
こんなカンジで初期化します。

または 第二の書式のようにオプションを配列にして纏めて初期化してください。

例:

 mySelectButton=addSelectButton(myWindow,["<default>","value1","value2","value3","value4"],0 ,0 ,1 ,3,1);

クリックするとプロパティと表示テキストが変化するので、必要なルーチンから読み出してください。

プロパティ

selected現在設定されているID値 0〜(オプション数-1)整数
valueIDに関連づけた値(ボタンラベルになる)文字列

メソッド

select([id or key-word])idを直接変更 またはキーワード "next"/"prev"
onChange()変更のあったときに実行されるメソッド
 var mySelectedValue = mySlelctButton.value;//オプションの値が出てくる
 var mySelectedID    = mySlelctButton.selected;//オプションのIDが出てくる
プログラムからの書き換えはメソッド経由でおねがいします。
 Result=mySelecyButton.select();//引数ナシはクリックと同じ
引数は、オプションID または キーワード / 戻り値は選択されたID

オプションIDがオプションの範囲を超えた場合は剰余の絶対値で置き換え(12/05現在)

キーワードは、

next次のオプションになる = ID++
prev前のオプションになる = ID--
enableボタンを有効に
disableボタンを無効に

引数の判定に失敗したバアイは、"next"(ボタンクリック)に同じ

リストボックス

選択候補がある程度増えると、セレクトボタンの「順次切り替え」では扱いにくくなります。

その場合、(UIのスペースはかなり消費しますが)このリストボックスが使えます。

 nas.GUI.addListBox(親オブジェクト,[オプションリスト],初期選択ID,横配置,縦配置,幅,高さ,マルチセレクト)
  または
 nas.GUI.addListBox(親オブジェクト,[オプションリスト],[初期選択ID],横配置,縦配置,幅,高さ,マルチセレクト)

扱いは、セレクトボタンに準じます。

表示用のボックスを直接書き換えると、一時的にその値が"value"として読み出しで来ます。その時の選択IDは"null(否選択状態)"です。

マルチセレクトオプションを true にすると、複数エレメントの選択ができます。 "value"には、選択されたオプションが配列で入ります。また、"selected"には、選択されたオプションの配列が入ります。

プロパティ

selected現在選択されているオプションのidまたはidの配列 もしくは null
value現在選択されているオプションまたはオプションの配列 もしくは null

メソッド

onChange()選択の変更があったときに実行されるメソッド

パネル

パネルは、ウインドウの配下に入ってボタンその他のコントロールの親になることができます。部品を階層化する必要がある場合に使用します。

nas.GUI.addPanel(親オブジェクト,ラベル,横配置,縦配置,幅,高さ);

myPanel=nas.GUI.addPanel(myParent,"myパネル",0,3,4,3);

パネルの配置はなるべくグリッドの隙間に入るように計算してあります。

タブ

ウィンドウを有効に使うためにタブを設定します。 現在の仕様では、独立のオブジェクトではなく、指定された親オブジェクトにTAB機能を付加します。

nas.GUI.addTabPanel(親オブジェクト,[タブ名,タブ名..],X,Y,幅,高さ)

タブパネルにアクセスする際は

	Parent["tabPanel"][id].<property or method> こんな感じで 

id は、0から 配列id です。

アニメとかの関数やらライブラリ

基本的には、お道具箱の移植。同じjavascriptなので結構早そう。

ただし、AEはスクリプトのメモリ空間が app. の直下にあって、WEBブラウザのようなドキュメントごとの独立空間ではないので、その辺に注意。

ブラウザだと (app.)window. の下で、ウインドウごとに別の空間がもてるので 日頃はあまり気にしていないが、AEのやり方だと、簡単に変数名とかが衝突しそうである。 いちいち変数名の調査や変更は、やりたくないので「名前空間」とか使えないかと思ったが…まだみたい?

うちのツール群はかなり数がふえそうなのでコワイ

Javascriptらしく オブジェクトで囲うことにする。

ライブラリ名称は nas とします。ベースオブジェクトは nas です。

すでにあるメソッドをオーバーライドする場合を除いてうちで設定するプロパティやメソッドは、この配下に置きます。以下そのマップ(の予定)

nas
トレーラーオブジェクト
プロパティ
 Version バージョン オブジェクト 読み込んだモジュールのバージョンをプロパティで

ツール標準仕様

あー、メモです。

そのうちライブラリが公開になったら使うヒトはこんなふうに使ってくれると良いかもです。

 ファイル名

ファイル名を小文字の"nas"で始めると、専用ランチャーが勝手に読み出してボタンパレットに登録します。

 ファイルヘッダ

ファイルの冒頭こんなカンジで、書いといて後で使用

/*(ラベル名)
 ツール名:ファイル名
メモ等
*/
第一行目のコメント内に括弧でくくってラベルを入れておくと、ランチャーがボタン名に使用します。無ければファイル名を使用

開始処理

基本的には、すべての変数をツール(モジュール)と同名のオブジェクトの配下のプロパティとメソッドで作る。 初期化時点で、ベースオブジェクトの有無を確認して、ベースオブジェクトが初期化されていない場合の処置を盛り込むこと。(停止なり、別に初期化するなり)
if(! nas){
	var nas=new Object();nas.Version="GUI-Lib:$Id$";
}else{
	nas.Version+="?nGUI-Lib:$Id$";
}
むむん!このコードはダメじゃん!

未定義のオブジェクトを評価したら即エラーだ。 オブジェクトのあるナシを判定する演算子とかなかったかと思ったが、無いみたい?

try catch で書くことにする。

var myFilename=("$RCSfile: nas_GUIlib.js,v $").split(":")[1].split(",")[0];
var myFilerevision=("$Revision: 1.1 $").split(":")[1].split("$")[0];
var myEx=true;
// 

try {
	nas.Version["GUI-lib"]="GUI-lib:"+myFilename+" :"+myFilerevision;
}catch(err){
	alert("nasツールの読み込みに失敗しました。");
	myEx=false;
}

if (myEx){}
結局こうかな? ちなみにAEのデバッガを有効にすると try/chatch は無効になるのだ。

うー、デバッグしづらい


これは、GUIモジュールの初期化チェック

GUIライブラリのくらい基本的だとチョト意味が違うような気もするが

ファイル一覧

ファイルリストだよ。

nasStartup?.jsx

スタートアップ処理スクリプト。

ベースオブジェクトの初期化 ライブラリのロード、ランチャの起動などの初期化処理担当。require XX とか use XX とか、使えたらうれしいけどダメっぽい?

nasConsole?.jsx

JSXコマンドコンソール

ファイル読み出しサポート・書き込みは…要るかな?

easyXPSLink.js

簡易XPSリンカ

一番先に作る予定。XPSを読み込んで(またはペーストして)コンポのレイヤに一気に適用するツール。簡易版

nasImporter?.jsx

スマートインポーターよりはアニメ向きなやつ。

フォルダ名を2〜3段上まで読んで、コンポ名をつけたり、レイヤ名を付けたり、シートがあればシートの長さでコンポを作ったりできる程度のツール。

NasMenu.jsx

ツールランチャ

nasモジュールで"nas"で始まるモジュールを自動登録。

他のツールなども登録しておける。設定ファイル+モジュールフォルダじか読みで。

自分自身を登録しないために、このファイルだけ"Nas"で始まっている。


うーむ、先長そう。

突っ込み歓迎なのでなにか気になることがあったら突っ込んでね。このページに直接書いてOKです。