【エクスプレッション】レイヤーやプロパティの種類を判別する

スクリプトにはレイヤーやプロパティの種類を判別する方法がいくつか用意されているのですが、エクスプレッションにはほぼないので、方法を色々と調べてみました。
関数にして使うものでもないので、if文の例文にしてあります。if()のカッコ内の記述を判別にお使いください。
また、後述『解説』に書いた判別の見つけ方もなかなか興味深い内容だと思いますので、是非ともご覧ください。

*ヌル、調整レイヤー、トラックマットの判別方法は見つかっておりません…。

シェイプレイヤーか否か

mLyr = thisComp.layer(1);
if( mLyr.hasOwnProperty("content") ){ true; }
else{ false; }

シェイプレイヤーの直下には必ず”コンテンツ”という要素があり、他レイヤーにはないのでxx.hasOwnProperty()で「xxは()内の要素を持っているか」を調べて判別できます。

テキストレイヤーか否か

mLyr = thisComp.layer(1);
if( mLyr.hasOwnProperty("text") ){ true; }
else{ false; }

テキストレイヤーの直下には必ず”テキスト”という要素があり、他レイヤーにはないのでこれで判別できます。

シェイプかテキスト以外か否か

mLyr = thisComp.layer(1);
if( mLyr.hasOwnProperty("motionTracker") ){ true; }
else{ false; }

シェイプやテキスト以外のレイヤーの直下には(隠れていますが)必ず”モーショントラッカー”という要素があり、シェイプやテキストにはないのでこれで判別できます。 シェイプやテキスト以外という範疇もでかすぎるのであんまり使い道はないですけども…。

3Dレイヤーか否か

mLyr = thisComp.layer(1);
if( mLyr.position.value.length !== 2 ){ true; }
else{ false; }

スクリプトでposition配列の長さを得ると、2Dレイヤーであっても(Zは隠れているだけ、という扱いで)3次元配列が返ってくるのですが、エクスプレッションで配列を調べると2Dと3Dで長さが違います。なので長さが2なら2Dレイヤー、3なら3Dレイヤーだと判別できるということです。

コンポレイヤーか否か

mLyr = thisComp.layer(1);
if( mLyr.hasOwnProperty("motionTracker") ){
	if( mLyr.source.className === "Comp" ){ true; }
	else{ false; }
}else{
	false;
}

コンポ内に入っているコンポレイヤーは、扱い上はただのレイヤーなので『mLyr.className』と入れても『Layer』となってしまいます。が、プロジェクトパネル内ではコンポ扱いなので『mLyr.source.className』は『Comp』となります。これを使って判別しますが、ソースが無いレイヤー(テキストやシェイプ)に対して『 mLyr.source.className 』を使うとエラーが出てしまうので、事前にmLyr.hasOwnProperty(“motionTracker”)で判別対象からテキストやシェイプを外している、というわけです。

マスクパスか否か

mObj = thisComp.layer(1).mask("マスク 1").maskPath;
if( mObj.className === "PathProperty" && mObj.propertyGroup(1).className === "Mask" ){ true; }
else{ false; }

マスクパスもシェイプパスもclassNameは『PathProperty』なので、まずはパスか否かを判別します。そして、マスクかシェイプかは判別対象プロパティの一個上のプロパティが何かで決まります。
マスクだと『Mask』シェイプだと『Group』なので、『xx.propertyGroup(何個上か)』というメソッドを使ってxxの一個上のプロパティを指定、判別しているということです。

シェイプパスか否か

mObj = thisComp.layer(1).content("シェイプ 1").content("パス 1").path;
if( mObj.className === "PathProperty" && mObj.propertyGroup(1).className === "Group" ){ true; }
else{ false; }

上記『マスクパスか否か』のシェイプ版です。違いは『Mask』か『Group』かですね。

おまけ 断念したもの

■positionが次元に分割しているか否か
mLyr.transform.hasOwnProperty( “xPosition” )でいけるかと思ったんですが、いったん次元分割すると元に戻しても xPosition は“ある”と判定されるようなので、この方法では不可能でした。

■ヌル、調整レイヤー、トラックマット
これがほしいときもけっこうあるんですが、mLyr.hasOwnProperty(“motionTracker”)でシェイプとテキストを外した以降、他との違いがとくに見当たらなかったので断念です…。

方法がないと決まったわけではないので、もしも「方法を見つけた!」という方がいらっしゃいましたら、よろしければ是非ともご教授頂ければ幸いです…!

使いどころ

例えば『3Dレイヤーか否か』だと、2点間をつなぐ線のエクスプレッションを作ったとして、2Dと3Dで処理を変えねばならなかったとします。その場合、判定によって分岐させれば両方に対応したエクスプレッションを作れる、といった感じですね!

解説

判別の見つけ方ですが、テキストレイヤーのソーステキストにエクスプレッションで
mProp = レイヤーや各種プロパティ;
Object.getOwnPropertyNames( mProp );
と入れれば、そのレイヤーや各種プロパティがどんな子プロパティを持つのかがわかります。

もしも他種類のものと比較して、そのレイヤーやプロパティだけが持っている子プロパティがあればhasOwnProperty()を使って判別可能です。

また、 getOwnPropertyNames を使って見ていくと、各プロパティはほぼ全て『className』という名前を持っていることがわかり、『className』で(大まかな)種類がわかります。

判別したいレイヤーやプロパティが他と違う 『className』 を持っていればしめたもので、そうであればif(xx. className === ○○)で判別可能です。

また Object.getOwnPropertyNames() を使うと、UI上に表示されていないプロパティを取得できることがあります。そこでさらに『 Object.getOwnPropertyNames(その見つけたプロパティ)』といった具合に深堀りしていけば他との違いが見つかったりします。

もしも将来的にエクスプレッションで判別方法メソッドが実装されたならば、なかなかの徒労となりますが、階層構造の理解はデザイン作業でも案外役に立つ場面がありますので、興味があれば試してみて下さい!

よかったらシェアしてね!
  • URLをコピーしました!