閉じる
閉じる
グループ分けの話です。
パスをどうやって構造ごとのグループに分けて、分割させてるの?
という話ですが、至極簡単、コンテンツのグループを構造ごとに作っています。
別の言い方をすれば「塗りパスの数だけグループを作り、その中にそれぞれ塗りパスを入れ、穴パスはどのグループに入るのかを、面積小さい順に調べて移動させる」というやり方です。
グループを追加する時は、何処に追加するのかもきちんと指定する必要があるので、一つ前の記事のように
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).addProperty("ADBE Vector Group").moveTo(パスの数);
みたいな書き方をします。
moveTo(パスの数)っていうのは、言葉で説明すると「シェイプのグループの中の、パスプロパティ達のすぐ下にグループを設置」という事です。
何がお得かと言うと、こうして塗りパスをグループ内に入れてあげると、全部の塗りパスがグループに入ったあと穴パスは必ず文字グループ内の一番上にあるという状況を作れるところです。グループ内の最初のコンテンツを雑に参照してれば穴パスはどんどん繰り上がって判定されていくので、インデックスの参照がめんどくさくなくなるわけです。
あ、そうそう。スクリプトでグループを追加した際はproperty(1)であるマテリアルが居て邪魔くさいので、
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(パスの数).property("ADBE Vector Materials Group").remove();
って書いて、追加したグループからマテリアル項目を削除して起きましょう。欲しいならしなくてよいですけど。(moveTo(N)に追加と同時に移動させているのでその直後ならproperty(N)で追加したグループを参照できます)
そして、パスプロパティの移動なのですが、実はこの移動、階層を潜ったりすることが出来ません。moveToで移動出来るのは同じ階層の中のみです。なので、
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(N).property(2).addProperty("ADBE Vector Shape - Group");
で追加したグループの中にパスプロパティを追加し、
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(N).property(2).property(1).property(2).setValue( comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(今参照している塗りパスのインデックス).property(2).value );
とかいう地獄のような一文を書くわけです。
あ、N.value = P.valueではだめですよ。パスプロパティの値はN.setValue(P.value)という書き方でしか代入が出来ません。
そんな感じでパスをグループに入れたりするプログラムをひたすらループと組み合わせて構築して、構造ごとの分解が完了するわけです。
きましたね~。
では3番目の処理、レイヤーずつに分離するの項目に行きましょう。
パスをどうやって構造ごとのグループに分けて、分割させてるの?
という話ですが、至極簡単、コンテンツのグループを構造ごとに作っています。
別の言い方をすれば「塗りパスの数だけグループを作り、その中にそれぞれ塗りパスを入れ、穴パスはどのグループに入るのかを、面積小さい順に調べて移動させる」というやり方です。
グループを追加する時は、何処に追加するのかもきちんと指定する必要があるので、一つ前の記事のように
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).addProperty("ADBE Vector Group").moveTo(パスの数);
みたいな書き方をします。
moveTo(パスの数)っていうのは、言葉で説明すると「シェイプのグループの中の、パスプロパティ達のすぐ下にグループを設置」という事です。
何がお得かと言うと、こうして塗りパスをグループ内に入れてあげると、全部の塗りパスがグループに入ったあと穴パスは必ず文字グループ内の一番上にあるという状況を作れるところです。グループ内の最初のコンテンツを雑に参照してれば穴パスはどんどん繰り上がって判定されていくので、インデックスの参照がめんどくさくなくなるわけです。
あ、そうそう。スクリプトでグループを追加した際はproperty(1)であるマテリアルが居て邪魔くさいので、
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(パスの数).property("ADBE Vector Materials Group").remove();
って書いて、追加したグループからマテリアル項目を削除して起きましょう。欲しいならしなくてよいですけど。(moveTo(N)に追加と同時に移動させているのでその直後ならproperty(N)で追加したグループを参照できます)
そして、パスプロパティの移動なのですが、実はこの移動、階層を潜ったりすることが出来ません。moveToで移動出来るのは同じ階層の中のみです。なので、
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(N).property(2).addProperty("ADBE Vector Shape - Group");
で追加したグループの中にパスプロパティを追加し、
comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(N).property(2).property(1).property(2).setValue( comp.selectedLayers[0].property("ADBE Root Vectors Group").property(N文字目).property(2).property(今参照している塗りパスのインデックス).property(2).value );
とかいう地獄のような一文を書くわけです。
あ、N.value = P.valueではだめですよ。パスプロパティの値はN.setValue(P.value)という書き方でしか代入が出来ません。
そんな感じでパスをグループに入れたりするプログラムをひたすらループと組み合わせて構築して、構造ごとの分解が完了するわけです。
きましたね~。
では3番目の処理、レイヤーずつに分離するの項目に行きましょう。
広告