Skip to main content
Inspiring
December 6, 2022
Answered

【Javascript】コピー元のレイヤーにペーストのオンとオフをスイッチさせる

  • December 6, 2022
  • 4 replies
  • 1622 views

お世話になります。

 

コピー元のレイヤーにペーストを確認する手間が嫌で、スイッチさせるようにしました。

 

var pref = app.preferences ;
var keyName = 'layers/pastePreserve' ;

var originalLayerPreserve = pref.getBooleanPreference(keyName) ;

if(!originalLayerPreserve) { //コピー元のレイヤーにペーストになっていなかったら、チェックする
    pref.setBooleanPreference(keyName, true) ;
    customAlert('コピー元のレイヤーにペーストON', 1);
} else { //コピー元のレイヤーにペーストになっていたら、外す
    pref.setBooleanPreference(keyName,false) ;
    customAlert('コピー元のレイヤーにペーストOFF', 1);
}

function customAlert(message, delaySeconds){
    var alertWindow = new Window('palette');
    var control_text = alertWindow.add('statictext', [0, 0, 250, 30], message, {multiline: true});

    if(delaySeconds == 0){
        var control_close = alertWindow.add('button', undefined, 'Close');       
        control_close.onClick = function(){
            if(alertWindow){
                alertWindow.hide();
            }
        };
    }

    alertWindow.show();
    alertWindow.update();

    if(delaySeconds > 0){
        $.sleep(delaySeconds * 1000);
        alertWindow.hide();
        alertWindow = null;
    }  
}

 

ちょっと重いのと、これだと現在の状態自体は確認できません。

オンとオフをスイッチさせつつ常に状態を見られるようにしたいのですが、どうしたらいいと思いますか?

This topic has been closed for replies.
Correct answer monokano

手鞠先生のは2クリックなので、1クリック版を作ってみましたよ。

Illustratorの「コピー元のレーヤーにペースト」をモーダルウィンドウ上でON/OFFするJavaScript

 

4 replies

Ten A
Community Expert
Community Expert
December 6, 2022

ロジックはともかく、ScriptUIは邪魔ですね。やはり、CEPのドッキング可能なパネルの方が使い勝手は良さそうです。

nekkonekoAuthor
Inspiring
December 7, 2022

めちゃくちゃ苦戦しながら作成中です。。笑

Ten A
Community Expert
Community Expert
December 7, 2022

ドキュメントのスイッチに追随させるにはイベントを捉えるためのプラグインが必要です。

ajabon grinsmith
Community Expert
Community Expert
December 6, 2022

実は過去にまったく同じものを作ってみたことがありますw

結果、複数ドキュメントを開いてアクティブドキュメントをとっかえひっかえしていると全くだめでした。

CEPならドキュメントのアクティベートにイベントハンドラ仕込めるので確かに可能性あるかも。

 

ちなみに、プロパティのBoolean値をトグルするには、^=1 でいけますよ。

var bool = true;
bool ^= 1;
alert(bool);

 If文なしですっきり書けます。

nekkonekoAuthor
Inspiring
December 6, 2022

同じこと考えてる人は意外といらっしゃるんですね〜

それこそ、複数ドキュメントでやってたらめちゃくちゃでした・・。

ありがとうございます!

Ten A
Community Expert
Community Expert
December 6, 2022

こんなかんじですね

var st = app.preferences.getBooleanPreference('layers/pastePreserve');
var w = new Window ('palette', 'panel', undefined);
var rd = [];
rd[0] =w.add('radiobutton', undefined, "ON");
rd[1] =w.add('radiobutton', undefined, "OFF");

if (st) rd[0].value = true;
else rd[1].value = true;
rd[0] .onClick = function(){app.preferences.setBooleanPreference('layers/pastePreserve',true);}
rd[1] .onClick = function(){app.preferences.setBooleanPreference('layers/pastePreserve',false);}
var cl = w.add("button",undefined, "close")
cl.onClick = function(){w.close();}

w.show();
nekkonekoAuthor
Inspiring
December 6, 2022

わざわざ試してもらってありがとうございます!

Illustrator本体のプロセスを消費するとのことでしたので、オンとオフの切り替えがかなり必要な作業の時だけ使ってみようと思います。

本当にありがとうございました!

Ten A
Community Expert
Community Expert
December 6, 2022

コレぐらいならそんなに負荷はかからないんですけど、スクリプトエンジンって本体に比べると脆弱なんで別プロセスで、動くCEPにした方が安定します。

拡張機能はいくつかの手段が存在しますが、適切に使い分けるのが安定性の向上につながります。

単純にオン/オフそれぞれのスクリプトを作成してショートカットで実行するようにしても効率は良いのではないかと思います。

Ten A
Community Expert
Community Expert
December 6, 2022

ScriptUIはIllustrator本体のプロセスを消費するのでのパレットはあんまりお奨めではありませんが、やるとしたら、チェックボックスのステートで表示させて単位時間ごとにステートをチェックさせるようなことはやめた方がが良いでしょう。
わたしがやるとしたらCEPパネルを作ってトグルスイッチ表示にします。

nekkonekoAuthor
Inspiring
December 6, 2022

illustratorに負担かけてるだろうなとは思ってました(汗)

今回作ったのはやめておきます。

CEPパネルというのは知らなかったので調べてみますが、面倒くさがらずに普通にレイヤーパネルから見た方が一番いい気もします。。

貴重な意見ありがとうございました!