2011-08-02

After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて

スクリプト作成補佐スクリプト 或いはPropery/PropertyGroup objectについて


Pen_Dacoさん主催の第2回AEスクリプト飲み会が先日行われました。
色々な業種のAE使いの方々が集まってスクリプトをネタに酒を飲むって会ですが、色々刺激がありモチベーションが上がります。毎回恒例のPen_Dacoさんの味のあるスクリプト紹介とか面白かったです(^_^)/

で、今回のテーマはスクリプト飲み会で僕が発表した「スクリプト作成補佐スクリプト」の補足説明というか AfterEffectsProperty/PropertyGroup objectについてです。

After EffectsProperty/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へ.jsxShapeLayerをJSONに変換。
11-getItemP_forin.jsxプロジェクトで選択したItemのプロパティをすべて表示
11-getPropertyP_forin.jsx選択したプロパティが持つプロパティを全て表示
12-getApp_forin.jsxApplicationオブジェクトが持つ全てのプロパティを表示
13-getLayerP_forin.jsxLayerが持つ全てのプロパティを表示。

03-プロパティグループ情報.jsx

04-キーフレーム情報.jsx

全てのスクリプトで、プロパティのアクセスはmatchNameを、プロパティグループはmatchName或いはnameを自動判別してアクセスするコードを自動作成します。

01-プロパティへのアクセス.jsx (Propertyへのアクセス)

適当なプロパティを選択しこのスクリプトを実行すると以下のようなダイアログが表示されます。



これは選択したプロパティを変数pへ代入するコードになります。

プロパティへのアクセスは
 親プロパティグループ名.propety(プロパティ名)

或いは、
 親プロパティグループ名.プロパティ名(プロパティ名)(プロパティ名)
 親プロパティグループ名.プロパティ名.プロパティ名.プロパティ名

といった構文になります。
プロパティ名にはname(画面に表示されるもの)とmatchName(内部的にそのプロパティを意味するもの)と二つ指定できます。通常ならname使用しても問題ないのですが、日本語英語でnameが変わってしまったりとかバージョンが変わると変更されてしまうとかあり、なるべくmatchNameを使うほうがトラブルが減ります。

ただPropertymatchNameを気軽に使えますが、PropertyGroupでは事情が違います。PropertyGroupは同じ種類のものが複数存在できる為、matchNameではアクセスできませんので注意が必要です。
PropertyGroupについては後で書きます。

このスクリプトは、layerオブジェクトのselectedPropertiesから対象のプロパティを獲得し、parentPropartyプロパティを繰り返すことで親プロパティをすべて配列に獲得しています。


proPath()関数で得たプロパティの配列を適当に文字列に変換することでアクセスコードを作成しています。

PropertyGroup

PropertyGroupとは簡単に言うとAfterEttectのマスクパスやシェイプレイヤで左側に三角の表示がついているもので、Property/PropertyGroupを一まとめにグループ化したフォルダみたいなobjectです(エフェクト関係は除く)

根底objectとしてPropertyBase objectがあり、それから派生してPropertyGroupMaskPropertyGroupとあります。

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)は本来はpropertyTypePropertyType.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から子プロパティへのアクセス

PropertyGrouppropertyプロパティがあり子プロパティをまるで配列のように収納しています。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_MarkerValueAE固有のデータ。スクリプトから扱える
PropertyValueType.SHAPE
PropertyValueType.TEXT_DOCUMENT

今回のスクリプトではこの値で条件分岐を行いPropertyValueType毎にvalueTo()関数で変換を行っています。

PropertyValueType.CUSTOM_VALUEを返すプロパティは現在のところスクリプトからその値を獲得することが出来ません。

標準プラグインでは「レベル」の「ヒストグラム」がそれに相当します。
Adobeもそこら辺は考慮してまったく同じ効果のエフェクト「レベル(個々の制御)」でスクリプトから扱えるパラメータを用意していてスクリプトからの制御が可能です。

ただ、サードパーティのプラグインのほとんどが対処されていないので困り者です。

以下のスクリプトは、同様のことを行って変換を行っています。
  1. 06-トランスフォームをScriptへ.jsx
  2. 07-マスクパスをScriptへ.jsx
  3. 08-コンポをScriptへ(レイヤは除く).jsx

09-シェイプコンテンツをScriptへ.jsx ShapeLayer

このスクリプトは、シェイプレイヤのコンテンツ以下のプロパティをスクリプト化しています。
技術的に上記のものと変わりありませんが、名前変更可能なプロパティグループが無規則に配置されているのでやや面倒なコーディングになっています。

メインとなるgetShapePrms(pg,pgName)関数でその変換を行っています。
引数のpgは、PropertyGroupのobject、pgNameはそのobject名の文字列になります。

まず、pg内のPropertyの変換を行った後にPropertyGroupの処理を行います。作成するスクリプト名はmatchNameから作成していていますが、先にPropaertyの変換を終わらせて名前が重複してしまっても問題ないようにしてあります。

makeP()関数でPropertyの処理、makeG()関数でPropertyGroupの処理を行っています。

Propertyの処理で「」の「破線」の有効・無効の識別をエクスプレッションが使えるかどうかで判別しているので、そこでエラーがでる可能性がありますので注意です。

PropertyGroupの作成では”ADBE Vector Transform Group”のpropertyTypeが違うので別に処理して在ります。

他にもいろいろありますが、コードを読んでもらったほうが速いと思います。

10-シェイプレイヤをJsonへ.jsx JSONのすすめ

10-シェイプレイヤをJsonへ.jsxは、JSONを使ったサンプルです。

スクリプト作成補佐の原型を作っていてPropertyの獲得の目処がついたけどそれの保存と読み出しをどうするか悩んでいた時、ねこまたやさんに教えてもらったのがJSONです。

なんとなくxmlファイルかなとか調べてたんですが、AEスクリプトのxmlオブジェクトの扱いが面倒すぎて困ってたのですが、JSONならほぼ何のコーディングもなしにobjectをテキストファイルに変換できてびっくりです。

使い方は簡単。適当なobjectにデータを集めてtoSource()で一発変換です。後はeval()で元のobjectに戻せます。お気楽です。

具体的に例を挙げると

って感じです。

プロパティの表示 for in文

以下のスクリプトは、ターゲットの持つプロパティをfor in文で獲得して表示しているだけです。
  1. 11-getItemP_forin.jsx
  2. 11-getPropertyP_forin.jsx
  3. 12-getApp_forin.jsx
  4. 13-getLayerP_forin.jsx

簡単なヘルプ代わりに使えます。

特に12-getApp_forin.jsx$.globalオブジェクトからAfterEffectsに現在ロードされている関数変数オブジェクトの名前が獲得できます。
いままで変数名の衝突を無名関数とかで消極的な方法で回避してましたが、これを使えば余計なオブジェクトは削除するとか攻的な対処が可能です。

免責

このスクリプトの著作権は僕にありますが、使用・改造・解析・譲渡・配布はフリーです。
個人・商業利用ともに特に許諾無く使用可能です。このスクリプトがメインでなければ他のスクリプトと同梱して販売も自由です。

ただし、このスクリプトの使用によって起きた損害・トラブルおよびバグフィックス・バージョンアップ等の責任・義務は僕(bry-ful)にはないと同意された方のみです。

まぁ俗に言うフリーソフトって扱いでいいです(^_^)/
ちなみにPati-Toolsさんで僕の作ったスクリプトを改良して配布されています。

http://www.pati-tool.com/aftereffects/renderset.html

最後に

今回は第2回AE飲み会で発表したものの追加説明でした。

飲み会自体は今回の投稿みたいにアカデミックなものじゃなくて、本当にただの飲み会でスクリプトをネタに楽しく酒を飲もうって会です。

多分第3回も行うはずなんで、興味のある方はプログラミングの事は気にしなくていいので気軽に参加してください。学生さんとかAEユーザーなら誰でもOKです。

恒例のPen_Dacoさんのスクリプト発表はとても面白くてモチベーションが上がります。
特に今回はTeraonさんのスクリプトで遊ぼうってコンセプトが面白かったです。

あと、プログレスバーがトレンドでびっくり。僕は一回も使った事無かったので勉強しなくちゃとか思いました。

予告

昔作った画面切抜きスクリプトの解説を近日中に投稿しようと考えています。



タグ : , , [タグを追加する]


この記事の投稿者について:bryful

フィードバック

1 Star2 Stars3 Stars4 Stars5 Stars
(評価回数:3 , 平均:5.00)
Loading...Loading...

この記事に対する 24 の反応があります


  1. 1 AEUSERS(AEP Project) 8月 1st, 2011 at 15:20

    新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30

  2. 2 古橋宏 8月 1st, 2011 at 15:23

    第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs

  3. 3 てんどろん 8月 1st, 2011 at 15:25

    これは非常に分かりやすい QT @bryful: 第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs

  4. 4 影鞍十三 8月 1st, 2011 at 15:26

    新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30

  5. 5 スイカ係 8月 1st, 2011 at 15:27

    第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs

  6. 6 rlldi 8月 1st, 2011 at 15:28

    第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs

  7. 7 ちぇすたぁ 8月 1st, 2011 at 15:32

    第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs

  8. 8 ペンだこ 8月 1st, 2011 at 15:41

    第2回スクリプト飲み会で発表した「スクリプト作成補佐スクリプト」の解説をAEPprojectに投稿しました。http://t.co/Tqk0MJs

  9. 9 Daisuke Yagi / 八木 大輔 8月 1st, 2011 at 15:55

    新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30

  10. 10 Yukinori Nakamura 8月 1st, 2011 at 16:01

    ふもっふ!RT @AEUSERS: 新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30

  11. 11 se_tech 8月 1st, 2011 at 16:02

    新着記事 : After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/n7cH30

  12. 12 しゅがぴ 8月 1st, 2011 at 16:20

    ふむ:RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://bit.ly/rsCIF1

  13. 13 webdesignStatio 8月 2nd, 2011 at 03:50

    After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて | AEP Project スクリプト作成補佐スクリプト 或いはPrope…http://bit.ly/nIQmYK

  14. 14 Adobe Creative Suite 9月 5th, 2011 at 07:01

    「After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて」AEP Project http://t.co/A8NYGP8 #CS5_jp

  15. 15 丸山真貴子 9月 5th, 2011 at 07:01

    「After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて」AEP Project http://t.co/A8NYGP8 #CS5_jp

  16. 16 nashu 9月 5th, 2011 at 07:02

    後で見るメモ RT After Effectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプト Property/PropertyGroupについて http://t.co/Qt6ZF3m

  17. 17 Adobe Creative Suite 9月 5th, 2011 at 07:15

    スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第7回です。http://t.co/A8NYGP8 #CS5_jp

  18. 18 古籏一浩 9月 5th, 2011 at 07:49

    スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第7回です。http://t.co/A8NYGP8 #CS5_jp

  19. 19 ミレーヴァ 9月 5th, 2011 at 09:40

    もう7回かぁ。"@AdobeCS_jp: スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第7回です。http://t.co/Uf9JSk6 #CS5_jp"

  20. 20 player2 12月 16th, 2012 at 04:57

    cs5.5ダメか…http://t.co/8NAvvFt3

  21. 21 古橋宏 1月 7th, 2013 at 12:44

    AEPProjectに投稿したスクリプト作成補佐スクリプトをCS6で動作確認した。ランチャーが動かなかったので修正。http://t.co/yvTv8HwV

  22. 22 bry-ful 1月 7th, 2013 at 20:43
    bry-ful

    CS6で動作確認したらプラグイン自体は問題なかったがランチャーがNGだった^^;

    とりあえず作ってあった汎用ランチャーにすげ替えました。

  1. 1 AfterEffectsユーザーのための、プログラミング入門 その7 スクリプト作成補佐スクリプトProperty/PropertyGroupについて | スクリプト - After Effects - 動画編集ソフト - アプリケーション | Jishuu.net Pingback on 4月 17th, 2012 at 02:31
  2. 2 モーションUI | sleepingrabbit Pingback on 10月 11th, 2016 at 15:24

コメントをどうぞ!




特集