スクリプト作成補佐スクリプト 或いはPropery/PropertyGroup objectについて
Pen_Dacoさん主催の第2回AEスクリプト飲み会が先日行われました。
色々な業種のAE使いの方々が集まってスクリプトをネタに酒を飲むって会ですが、色々刺激がありモチベーションが上がります。毎回恒例のPen_Dacoさんの味のあるスクリプト紹介とか面白かったです(^_^)/
で、今回のテーマはスクリプト飲み会で僕が発表した「スクリプト作成補佐スクリプト」の補足説明というか AfterEffectsのProperty/PropertyGroup objectについてです。
After EffectsのProperty/PropertyGroup objectは、通常のJavaScriptのObjectのpropertyとは扱いが違うので、その説明も行います。
発表したスクリプトは以下からダウンロードできます。
ScriptingAssistant.zip
!2013/01/07追記
このスクリプトをCS6で動作確認しました。
スクリプト自体は動きましたが、ランチャーが動かなかったので修正しました。
どんなスクリプト?
スクリプト作成補佐スクリプトは、複数の小さめなスクリプト集になります。目的は文字通りスクリプト作成の補佐。具体的には、After Effectsのトランスフォーム・Effectのパラメータ等へスクリプトからアクセスするコードを楽に作成する為のスクリプトになります。あと、エフェクトとかシェイプレイヤとかを作成するスクリプトの自動作成とか。
なんだかこれだけではわからないのでさっさと説明します。
使い方
アーカイブ内に以下のフォルダとファイルがあります。スクリプト作成補佐.jsx
(スクリプト作成補佐)フォルダ
上記のフォルダファイルをそのままScripts/ScriptUI Panelsフォルダにコピーすれば使えるようになります。
ウィンドウ(W)メニューから「スクリプト作成補佐.jsx」を選べば(スクリプト作成補佐)フォルダ内のスクリプトを実行できるメニューパレットが表示されます。CS4 Windows版でのみ動作確認してあります(CS3でも動くはずです)
スクリプト作成補佐.jsxは単純に(スクリプト作成補佐)フォルダ内のスクリプトを実行する為のランチャーになり、(スクリプト作成補佐)フォルダのスクリプトは単独で実行しても問題ありません。
(スクリプト作成補佐)フォルダ内のスクリプトは以下の機能を持っています。
01-プロパティへのアクセス.jsx | 選択したプロパティのアクセスコードを表示 |
02-プロパティパスの情報.jsx | プロパティの親プロパティグループの情報を表示 |
03-プロパティグループ情報.jsx | 選択したプロパティと同じグループにある全てのプロパティの情報の表示 |
04-キーフレーム情報.jsx | 選択したキーフレームの情報を表示 |
05-エフェクトをScriptへ.jsx | 選択したレイヤにあるEffectを再現するスクリプトを作成。 |
06-トランスフォームをScriptへ.jsx | 選択したレイヤのトランスフォームを再現するスクリプトを作成 |
07-マスクパスをScriptへ.jsx | 選択したマスクパスを再現するスクリプトを作成 |
08-コンポをScriptへ(レイヤは除く).jsx | 選択したCompItemと同じものを作成するスクリプトを作成(但し、レイヤは作成しない) |
09-シェイプコンテンツをScriptへ.jsx | 選択したShapeLayerを再現するスクリプトを作成 |
10-シェイプレイヤをJsonへ.jsx | ShapeLayerをJSONに変換。 |
11-getItemP_forin.jsx | プロジェクトで選択したItemのプロパティをすべて表示 |
11-getPropertyP_forin.jsx | 選択したプロパティが持つプロパティを全て表示 |
12-getApp_forin.jsx | Applicationオブジェクトが持つ全てのプロパティを表示 |
13-getLayerP_forin.jsx | Layerが持つ全てのプロパティを表示。 |
03-プロパティグループ情報.jsx
04-キーフレーム情報.jsx
全てのスクリプトで、プロパティのアクセスはmatchNameを、プロパティグループはmatchName或いはnameを自動判別してアクセスするコードを自動作成します。
01-プロパティへのアクセス.jsx (Propertyへのアクセス)
適当なプロパティを選択しこのスクリプトを実行すると以下のようなダイアログが表示されます。これは選択したプロパティを変数pへ代入するコードになります。
プロパティへのアクセスは
親プロパティグループ名.propety(プロパティ名)
或いは、
親プロパティグループ名.プロパティ名(プロパティ名)(プロパティ名)
親プロパティグループ名.プロパティ名.プロパティ名.プロパティ名
といった構文になります。
プロパティ名にはname(画面に表示されるもの)とmatchName(内部的にそのプロパティを意味するもの)と二つ指定できます。通常ならname使用しても問題ないのですが、日本語英語でnameが変わってしまったりとかバージョンが変わると変更されてしまうとかあり、なるべくmatchNameを使うほうがトラブルが減ります。
ただPropertyはmatchNameを気軽に使えますが、PropertyGroupでは事情が違います。PropertyGroupは同じ種類のものが複数存在できる為、matchNameではアクセスできませんので注意が必要です。
PropertyGroupについては後で書きます。
このスクリプトは、layerオブジェクトのselectedPropertiesから対象のプロパティを獲得し、parentPropartyプロパティを繰り返すことで親プロパティをすべて配列に獲得しています。
proPath()関数で得たプロパティの配列を適当に文字列に変換することでアクセスコードを作成しています。
PropertyGroup
PropertyGroupとは簡単に言うとAfterEttectのマスクパスやシェイプレイヤで左側に三角の表示がついているもので、Property/PropertyGroupを一まとめにグループ化したフォルダみたいなobjectです(エフェクト関係は除く)根底objectとしてPropertyBase objectがあり、それから派生してPropertyGroupとMaskPropertyGroupとあります。
PropertyGroupは名前が変更可能なものと不可のものとおおさっぱにニ種類あります。、その区別はpropertyTypeプロパティで獲得でき、PropertyTypeで定義された値となります
実際にはPropertyType.PROPERTYも存在しますが通常では気にしなくてもいいです。
- PropertyType.PROPERTY
- PropertyType.INDEXED_GROUP
- PropertyType.NAMED_GROUP
名称変更不可(PropertyType.INDEXED_GROUP)は特に問題なくmatchNameを使えますが、名称変更可(PropertyType.NAMED_GROUP)はmatchNameではそのプロパティの獲得が出来ません。nameでアクセスする必要があります(その為、ローカライズ等問題に対処できない)
あと面倒なことに”ADBE Transform Group“(位置とかスケールのあるpropertyGroup)は本来はpropertyTypeはPropertyType.PROPERTYを返すべきなのにPropertyType.NAMED_GROUPになっています。このスクリプトでは適当に対処して”ADBE Transform Group“を表示させるようにしています。
PropertyGroupの追加・作成
PropertyGroupをスクリプトで作成する方法は、PropertyのaddProperty()を使用します。(良く勘違いすることですが、addProperty()はPropertyBaseを追加作成する関数です。Propertyはスクリプトから作成できません)例えばEffectsプラグインをレイヤに登録する方法はLayer objectが持つ”ADBE Effect Parade“プロジェクトグループへaddProperty()を使い行います。
上記の例のように必ずcanAddPropertyで追加可能か判別した後に追加します。
変数fxにはエフェクトのPropertyGroupが返ります。
ここで面倒なのがaddProperty()で指定するプロパティ名にはかなり癖があり、基本的にmatchNameを指定した方が変なトラブルを避けられます。ただ、それで作成された時、nameが嫌な感じに(複数作ると全部同じ名前とか、番号が変に並んでないとか)なるので、スクリプトでnameを設定したほうが気分的に安心できます。
PropertyGroupから子プロパティへのアクセス
PropertyGroupはpropertyプロパティがあり子プロパティをまるで配列のように収納しています。numPropertiesはそのプロパティの数でproperty.lengthと同じ値になります。基本的に先に説明した、Propatyへのアクセス出来ます。更に、Index番号指定でもアクセスが可能です(インデックスのスタートは1になります)
PropertyGroupを理解すれば、以下のスクリプトはコードを読んだほうがわかりやすいと思います。
- 02-プロパティパスの情報.jsx
- 03-プロパティグループ情報.jsx
- 04-キーフレーム情報.jsx
05-エフェクトをScriptへ.jsx Property object
このスクリプトを適当なエフェクトがあるレイヤを選択して実行すると、以下のダイアログが表示されます。これは保存するとそのまま対象レイヤにエフェクトを追加するスクリプトになっています。自動にエフェクト適応のスクリプトが作成されます。
キーフレームが複数あってもちゃんとすべて再現されます。
このスクリプトのキモは二つ。listupEffects()とvalueTo()関数の二つになります。
エフェクトコントロールに表示される三角印の項目は、PropertyGroupでは無く普通のPropertyです。ただしnumPropertiesでもカウントされずpopertyからもアクセスできません。単純に表示トピックスです。
“ADBE Effect Parade“プロパティグループから引き出した各エフェクトのobjectをlistupEffects()へ渡してスクリプトへ変換を行っています。
listupEffects()は、そのProperty objectのpropertyValueTypeプロパティでそのパラメータの種類を識別しそれに合わせて値の変換を行っています。
valueTo()関数が実際に変換を行う関数です。
あと、キーフレームが存在する場合はそのキーフレームの数分処理を繰り返しを行っています。ただキーフレームのカーブの値には対応させていません。
04-キーフレーム情報.jsxで表示されるobjectを変換するだけですが、そこまで対応させる必要がないと判断して省略しています。
propertyValueTypeプロパティの値には以下のものがあります。
PropertyValueType.NO_VALUE | 値が無い |
PropertyValueType.CUSTOM_VALUE | エフェクト独自のデータ |
PropertyValueType.ThreeD_SPATIAL | 基本的な数値、或いは数値の配列 |
PropertyValueType.ThreeD | |
PropertyValueType.TwoD_SPATIAL | |
PropertyValueType.TwoD | |
PropertyValueType.OneD | |
PropertyValueType.LAYER_INDEX | |
PropertyValueType.MASK_INDEX | |
PropertyValueType.COLOR | 色。単純な数値の配列 [1,1,1]で白 |
PropertyValueType.MARKER_MarkerValue | AE固有のデータ。スクリプトから扱える |
PropertyValueType.SHAPE | |
PropertyValueType.TEXT_DOCUMENT |
新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30
第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs
これは非常に分かりやすい QT @bryful: 第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs
新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30
第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs
第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs
第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs
第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs
新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30
ふもっふ!RT @AEUSERS: 新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30
新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30
ふむ:RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/rsCIF1
After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて | AEP Project スクリプト作成補佐スクリプト 或いはPrope…http://bit.ly/nIQmYK
「After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて」AEP Project http://t.co/A8NYGP8 #CS5_jp
「After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて」AEP Project http://t.co/A8NYGP8 #CS5_jp
後で見るメモ RT After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://t.co/Qt6ZF3m
スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第7回です。http://t.co/A8NYGP8 #CS5_jp
スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第7回です。http://t.co/A8NYGP8 #CS5_jp
もう7回かぁ。"@AdobeCS_jp: スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第7回です。http://t.co/Uf9JSk6 #CS5_jp"
cs5.5ダメか…http://t.co/8NAvvFt3
AEPProjectに投稿したスクリプト作成補佐スクリプトをCS6で動作確認した。ランチャーが動かなかったので修正。http://t.co/yvTv8HwV
CS6で動作確認したらプラグイン自体は問題なかったがランチャーがNGだった^^;
とりあえず作ってあった汎用ランチャーにすげ替えました。