Skip to main content
Participant
May 2, 2023
Answered

パターン名を指定して新規レイヤー塗りつぶしをしたいと考えております

  • May 2, 2023
  • 1 reply
  • 623 views

いつもお世話になっております。

 

表題の通り、新規レイヤー塗りつぶしのコマンドにて"パターン名を指定して"パターン塗りつぶしを行いたいと考えております。

アクションの中にこの動作を組み込みたいのですが、普通に手順をアクションに記録するやり方では、

パターン番号を記録されてしまい、パターンで塗りつぶしする際にも記録した時のパターンの番号で塗りつぶしが行われてしまいます。プリセット内にてパターンの追加や削除をよく行うので番号は頻繁に前後する為、パターン名を指定して塗りつぶしをしたいという状況です。

 

スクリプトでやる方法も試してみました。下記の様なスクリプトを走らせてみたのですが…

 

// アクティブなドキュメントを取得
var docRef = app.activeDocument;

// 新しい塗りつぶしレイヤーを作成
var fillLayerRef = docRef.artLayers.add();
fillLayerRef.name = "フローラルパターン";

// パターンを選択
var patternRef = app.getCustomFillPatternByName("フローラルパターン");

// パターンをレイヤーに適用
fillLayerRef.applyCustomPattern(patternRef);

 

"フローラルパターン"というパターン名のパターンをあらかじめ登録しておくことが前提で

このスクリプトを走らせて塗りつぶしを行う予定だったのですが、

  エラー24:app.getCustomFillPatternByNameは関数ではありません。ライン9:var patternRef = app.getCustomFillPatternByName("フローラルパターン");

というエラーが出てどうなおせばスクリプトが正常に動くのか分からずじまいです。

 

スクリプトを使用する方法でも、別の方法でも構わないのですが

新規レイヤーの塗りつぶしでパターン名を指定してパターン塗りつぶしを行う方法はありますでしょうか?ご教授頂けると幸いです。

 

また、当方が使用しているAdobe Photoshop CCは、バージョン : 24.4.1を使用しています。

OSはWindows 10 64ビット となります。

 

宜しくお願い致します。

This topic has been closed for replies.
Correct answer ajabon grinsmith

ScriptingListenerで記録してみました。

引数はパターン名だけ、通常、100% の最小限の内容ですけど。

対象のパターンがグループ(フォルダ)に入っているとだめかもです。

 

fillPattern("hoge");

function fillPattern(patternName){
    var idfill = stringIDToTypeID( "fill" );
        var desc8 = new ActionDescriptor();
        var idusing = stringIDToTypeID( "using" );
        var idfillContents = stringIDToTypeID( "fillContents" );
        var idpattern = stringIDToTypeID( "pattern" );
        desc8.putEnumerated( idusing, idfillContents, idpattern );
        var idpattern = stringIDToTypeID( "pattern" );
            var desc9 = new ActionDescriptor();
            var idname = stringIDToTypeID( "name" );
            desc9.putString( idname, patternName ); //ここ
            var idID = stringIDToTypeID( "ID" );
            desc9.putString( idID, """112dfbf6-1946-2e47-be4b-ec9235382261""" );
        var idpattern = stringIDToTypeID( "pattern" );
        desc8.putObject( idpattern, idpattern, desc9 );
        var idopacity = stringIDToTypeID( "opacity" );
        var idpercentUnit = stringIDToTypeID( "percentUnit" );
        desc8.putUnitDouble( idopacity, idpercentUnit, 100.000000 );
        var idmode = stringIDToTypeID( "mode" );
        var idblendMode = stringIDToTypeID( "blendMode" );
        var idnormal = stringIDToTypeID( "normal" );
        desc8.putEnumerated( idmode, idblendMode, idnormal );
    executeAction( idfill, desc8, DialogModes.NO );
}

 

 

1 reply

ajabon grinsmith
Community Expert
ajabon grinsmithCommunity ExpertCorrect answer
Community Expert
May 2, 2023

ScriptingListenerで記録してみました。

引数はパターン名だけ、通常、100% の最小限の内容ですけど。

対象のパターンがグループ(フォルダ)に入っているとだめかもです。

 

fillPattern("hoge");

function fillPattern(patternName){
    var idfill = stringIDToTypeID( "fill" );
        var desc8 = new ActionDescriptor();
        var idusing = stringIDToTypeID( "using" );
        var idfillContents = stringIDToTypeID( "fillContents" );
        var idpattern = stringIDToTypeID( "pattern" );
        desc8.putEnumerated( idusing, idfillContents, idpattern );
        var idpattern = stringIDToTypeID( "pattern" );
            var desc9 = new ActionDescriptor();
            var idname = stringIDToTypeID( "name" );
            desc9.putString( idname, patternName ); //ここ
            var idID = stringIDToTypeID( "ID" );
            desc9.putString( idID, """112dfbf6-1946-2e47-be4b-ec9235382261""" );
        var idpattern = stringIDToTypeID( "pattern" );
        desc8.putObject( idpattern, idpattern, desc9 );
        var idopacity = stringIDToTypeID( "opacity" );
        var idpercentUnit = stringIDToTypeID( "percentUnit" );
        desc8.putUnitDouble( idopacity, idpercentUnit, 100.000000 );
        var idmode = stringIDToTypeID( "mode" );
        var idblendMode = stringIDToTypeID( "blendMode" );
        var idnormal = stringIDToTypeID( "normal" );
        desc8.putEnumerated( idmode, idblendMode, idnormal );
    executeAction( idfill, desc8, DialogModes.NO );
}

 

 

Participant
May 2, 2023

ajabon grinsmith様

 

ご返答頂き有難うございます。

頂きましたスクリプトにて通常のパターン塗りつぶしはパターン名を指定して塗りつぶす事が出来ました。有難うございます。

 

後は新規レイヤーで塗りつぶしにてパターン名を指定して塗りつぶし→塗りつぶし後に登録したパターンをパターン名を指定して削除するスクリプトを組む事が出来れば、目的の物は完成しそうです。

当方スクリプトの知識はなくAIを使ってトライしていたのですが、いき詰っており、ご返答いただいた内容でやっと1歩前進出来ました。あとは何とかやってみたいと思います。

 

本当に有難うございました。

ajabon grinsmith
Community Expert
Community Expert
May 2, 2023

>後は新規レイヤーで塗りつぶしにてパターン名を指定して塗りつぶし→塗りつぶし後に登録したパターンをパターン名を指定して削除する

 

ちょっと整理していいですかね…(自分用に)いや、やりませんがw

・新規レイヤー作成

・塗りつぶし(任意のパターンAとする:名前で指定)

・パターンAを削除

でしょうか。

今回の「パターン名を指定して塗りつぶし」に利用したScriptingListenerというプラグインはアドビから提供されているもので、手作業をスクリプトとして記録してデスクトップにログファイルを残すものです。

これも使い慣れると強力です。ふつうスクリプトでできないことでも、これならできたりします。

「photoshop script listener」などでweb検索してみるといいです。

 

>当方スクリプトの知識はなくAIを使ってトライしていた

ええとそれは最初に書きましょうw

スクリプトの質問に協力してくれる人は目的を果たすものをタダで書いてくれるだけではなく、書きかけの今一歩のコードを添削してくれたり、成長を見守ってくれる性格の人が多いです。

次から、最初に書いてもらえると、自分としても吠え面かかずに済みます。。