Photoshopブラシサイズをズームレベルに関わらず①一定の大きさにリセットする②デフォルトブラシに戻す

ブラシを使用する全てのツールで、ブラシサイズをズームレベルに関わらず画面上の特定のサイズにリセットします。

control+option+上下左右ドラッグ（Win:Alt+右ドラッグ）でのブラシコントロールは便利ですが、いきなり大きくor小さくするには不便。右クリックでのブラシパネルで直接直径等を指定するのではなく、スクリプトで一気に「画面上での一定の大きさに」変更します。

変更する際に、カスタムブラシを使用している場合に普通にスクリプトで変えるとカスタムブラシがカスタマイズされた状態になってしまうため、フライアウトメニュー経由での動作をScriptingListenerで記録して調査し、ChatGPTo3miniに整えさせました。

ふたつあります。
- 1：ブラシサイズのみを変更する
- 2：1に加えて、初期ブラシ（ブラシパネルの一番上に登録されているブラシ。自分で移動して登録してください）に変更する

2が必要な理由は、レタッチでは通常の円形ブラシをよく使用するためです。
このふたつをPhotoshopアプリケーションフォルダ内のPresetsに入れ（スクリプトが入ったフォルダをエイリアスとして入れ）、Keyboard Maestroからメニュー内項目を実行させています。

:::note
MacではApplication/Photoshopフォルダ内のPresetにエイリアスを入れる
Winではシンボリックリンクを入れる
と、Photoshopファイルメニュー＞スクリプト内に出てきます。ショートカット設定で自由にキーを当てられます
:::

```javascript:ブラシサイズのみ変更
#target photoshop
/*
<javascriptresource>
<name>ブラシサイズを画面上の指定pxに変更</name>
<category>YPresets</category>
</javascriptresource>
*/

(function () {
    // 画面上で見えるブラシサイズ(px)
    var TARGET_SCREEN_SIZE = 150;

    // ブラシ未対応ツールの場合は終了
    if (!app.toolSupportsBrushes(app.currentTool)) return;

    // ズームレベルを取得し、直径を計算（最大5000pxに制限）
    var zoom = getZoomLevel();
    var newDiameter = Math.min(5000, Math.round(TARGET_SCREEN_SIZE / (zoom / 100)));

    // 計算したサイズを、ブラシの masterDiameter に直接設定
    setBrushDiameter(newDiameter);

    // ズームレベルを取得
    function getZoomLevel() {
        var ref = new ActionReference();
        ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("zoom"));
        ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var desc = executeActionGet(ref);
        return desc.getDouble(stringIDToTypeID("zoom")) * 100;
    }

    // masterDiameter を直接設定（他のブラシ設定は変更しない）
    function setBrushDiameter(diameter) {
        var idSet = stringIDToTypeID("set");
        var desc = new ActionDescriptor();
        var ref = new ActionReference();
        var idBrush = stringIDToTypeID("brush");
        var idOrdinal = stringIDToTypeID("ordinal");
        var idTargetEnum = stringIDToTypeID("targetEnum");
        ref.putEnumerated(idBrush, idOrdinal, idTargetEnum);
        desc.putReference(stringIDToTypeID("null"), ref);

        var brushDesc = new ActionDescriptor();
        brushDesc.putUnitDouble(stringIDToTypeID("masterDiameter"), stringIDToTypeID("pixelsUnit"), diameter);

        desc.putObject(stringIDToTypeID("to"), idBrush, brushDesc);
        executeAction(idSet, desc, DialogModes.NO);
    }
})();
```

```javascript:サイズとブラシを初期ブラシに
#target photoshop
/*
<javascriptresource>
<name>ブラシサイズ変更と初期ブラシに戻す</name>
<category>YPresets</category>
</javascriptresource>
*/

(function () {
    // 画面上で見えるブラシサイズ(px)
    var TARGET_SCREEN_SIZE = 150;
    
    // ブラシ未対応ツールの場合は終了
    if (!app.toolSupportsBrushes(app.currentTool)) return;
    
    // 最初のブラシプリセットに戻す
    selectFirstBrush();
    
    // ズームレベルを取得し、直径を計算（最大5000pxに制限）
    var zoom = getZoomLevel();
    var newDiameter = Math.min(5000, Math.round(TARGET_SCREEN_SIZE / (zoom / 100)));
    
    // masterDiameter を直接設定（他のブラシ設定は変更しない）
    setBrushDiameter(newDiameter);
    
    // --- 関数定義 ---
    
    // ズームレベル取得関数
    function getZoomLevel() {
        var ref = new ActionReference();
        ref.putProperty(stringIDToTypeID("property"), stringIDToTypeID("zoom"));
        ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var desc = executeActionGet(ref);
        return desc.getDouble(stringIDToTypeID("zoom")) * 100;
    }
    
    // masterDiameter を直接設定する関数
    function setBrushDiameter(diameter) {
        var idSet = stringIDToTypeID("set");
        var desc = new ActionDescriptor();
        var ref = new ActionReference();
        var idBrush = stringIDToTypeID("brush");
        var idOrdinal = stringIDToTypeID("ordinal");
        var idTargetEnum = stringIDToTypeID("targetEnum");
        ref.putEnumerated(idBrush, idOrdinal, idTargetEnum);
        desc.putReference(stringIDToTypeID("null"), ref);

        var brushDesc = new ActionDescriptor();
        brushDesc.putUnitDouble(stringIDToTypeID("masterDiameter"), stringIDToTypeID("pixelsUnit"), diameter);

        desc.putObject(stringIDToTypeID("to"), idBrush, brushDesc);
        executeAction(idSet, desc, DialogModes.NO);
    }
    
    // 最初のブラシプリセットを選択する関数
    function selectFirstBrush() {
        var ref = new ActionReference();
        ref.putIndex(stringIDToTypeID("brush"), 1);
        var desc = new ActionDescriptor();
        desc.putReference(charIDToTypeID("null"), ref);
        executeAction(stringIDToTypeID("select"), desc, DialogModes.NO);
    }
})();
```