Skip to main content
Inspiring
February 27, 2024
Answered

選択した複数のレイヤーの塗りの色を変更するスクリプトを作りたい

  • February 27, 2024
  • 1 reply
  • 628 views

初めまして。AEスクリプト初学者です。
選択した複数のレイヤーの塗りの色を変更するスクリプトを作りたいです。

var lyrs = app.project.activeItem.selectedLayers;
for (i = 0; i < lyrs.length; i++) {
    var ctts = lyrs[i].property("Contents");
    for (j = 1; j < ctts.numProperties; j++) {
        ctts.property(j).property("Contents").property(“Fill 1”).property("Color").setValue(1,1,1,1);
    }
}

このスクリプトはforでそれぞれのproperty("Color”)までのパスを指定してsetValueで色を変えるという考え方です。
この場合Merge Pathsを使った時に外側にFill 1ができてしまい指定できません。

 

property(“Fill 1”)を探してそこまでのパスを出して以下のようにするのが正解だと思っております。

var p = パス;
p.property("Color").setValue(1,1,1,1);

 

しかしproperty(“Fill 1”)を探す方法とそこまでのパスを出す方法がわかりません。

どうかご教授いただけますと幸いです。
何卒宜しくお願い致します。

This topic has been closed for replies.
Correct answer stunning_Sunflower16B7

シェイプレイヤーのコンテンツ直下にある塗りの色を変える場合は下記のようにするとうまくいくと思います。

(function() {
    var selectedLayers = app.project.activeItem.selectedLayers;
    for (i = 0; i < selectedLayers.length; i++) {
        var root_vector_group = selectedLayers[i].property("Contents");

        for (var j = 1; j <= root_vector_group.numProperties; j++) {
            var child_property = root_vector_group.property(j)
            if (child_property.matchName !== 'ADBE Vector Graphic - Fill') {
                continue;
            }
            child_property.property('ADBE Vector Fill Color').setValue([1, 0, 1, 1]);
        }
    }
}());

selectedLayersは[]でアクセスする場合は添え字が0から始まるので
for(var i=0;i<~)でよいのですが
プロパティは1から開始してその数までいくので
for(var j=1;j<=~のように'<='としないと最後のプロパティを見にいってくれません。
また、setValueは[1,1,1,1]のように配列で渡す必要があります。


シェイプレイヤーのコンテンツ直下に塗りがある場合は上記のような形でよいのですが
シェイプはグループ化が可能なため、どの階層に目的の値があるかが一定ではない為、このスクリプトは楕円形シェイプ等のグループ内にある塗りの色は変えてくれません。
その場合は再帰処理を用いて目的の値を探し出す方法をとるのが一般的だと思います。

1 reply

Participating Frequently
February 27, 2024

シェイプレイヤーのコンテンツ直下にある塗りの色を変える場合は下記のようにするとうまくいくと思います。

(function() {
    var selectedLayers = app.project.activeItem.selectedLayers;
    for (i = 0; i < selectedLayers.length; i++) {
        var root_vector_group = selectedLayers[i].property("Contents");

        for (var j = 1; j <= root_vector_group.numProperties; j++) {
            var child_property = root_vector_group.property(j)
            if (child_property.matchName !== 'ADBE Vector Graphic - Fill') {
                continue;
            }
            child_property.property('ADBE Vector Fill Color').setValue([1, 0, 1, 1]);
        }
    }
}());

selectedLayersは[]でアクセスする場合は添え字が0から始まるので
for(var i=0;i<~)でよいのですが
プロパティは1から開始してその数までいくので
for(var j=1;j<=~のように'<='としないと最後のプロパティを見にいってくれません。
また、setValueは[1,1,1,1]のように配列で渡す必要があります。


シェイプレイヤーのコンテンツ直下に塗りがある場合は上記のような形でよいのですが
シェイプはグループ化が可能なため、どの階層に目的の値があるかが一定ではない為、このスクリプトは楕円形シェイプ等のグループ内にある塗りの色は変えてくれません。
その場合は再帰処理を用いて目的の値を探し出す方法をとるのが一般的だと思います。

Inspiring
February 27, 2024

再帰処理という言葉すら知らなかったのでとても助かりました!
早速調べてみようと思います。
ご返信ありがとうございました。