スクラッチ&スクラップ

簡単なプログラミングや電子工作など。しょうもない工作の記録。

イラレで特定の破線パターンだけ選択するスクリプト

[2018.06.08 追記]
ここに書いてあることはスクリプトを使わなくても、パスを1本選択してから 選択共通塗りと線 でほぼ同じことが実現できます。

以前、Adobe Illustrator で破線だけ選択するスクリプトの記事を書きました。

macrochelys99.hatenablog.jp

機械系の図面では、
* 外形線は太く (0.5mm)
* 隠れ線は破線で細く (0.25mm)
* 中心線は一点鎖線で細く (0.25mm)
* 想像線は二点鎖線で細く (0.25mm)

というようなルールがあったりするのですが、DXFからイラレインポートするとそんなルールおかまいなしで取り込まれますので、破線だけセレクトして太さや色を設定しようという内容でした。

「全ての破線を選択」を「指定したパターンの破線だけ選択」するようにスクリプトを書き換える

とりあえず完成したものを動かしてみます。
f:id:macrochelys99:20180604225613p:plain

破線を1本選択して。
f:id:macrochelys99:20180604225641p:plain

スクリプトを実行します。4220本のパスから3313本選択するのに1分20秒ほどかかりました。CPU は Xeon E5-1660 3.0GHz なのでそこそこ良いPCなのですが、激遅です。
f:id:macrochelys99:20180604225719p:plain

選択状態になるので、色を変えるなりレイヤーを分けるなり自由にできます。
f:id:macrochelys99:20180604230557p:plain

次は、二点鎖線を1本、選択します。
f:id:macrochelys99:20180604230725p:plain

スクリプトを実行します。4220本のパスから 147本を選択するのは 3秒ほどでした。
f:id:macrochelys99:20180604230823p:plain

色をつけると、正接エッジの二点鎖線だけ選択できたことがわかります。
f:id:macrochelys99:20180604231017p:plain

スクリプト

#target "illustrator"

(function(){
    function selectDash(dashprop, obj){
        for(var i=0; i<obj.length; i++){
            if (obj[i].locked || obj[i].hidden) continue;
            switch(obj[i].typename){
                case "GroupItem":
                    selectDash(dashprop, obj[i].pageItems);
                    break;
                case "PathItem":
                    if(dashprop.toString() == obj[i].strokeDashes.toString()){
                        obj[i].selected = true;
                    }
                    break;
            }
        }
    }
    
    try {
        if (app.documents.length > 0 ) {
            var doc = app.activeDocument;
            /*
               選択したパスが以下の条件に当てはまる場合はエラーを表示して終了
               ・パスを選択してない、または2本以上選択している。
               ・選択したパスが破線でない
               ・選択した要素がパスでない
           */
            if(doc.selection.length !== 1 || doc.selection[0].strokeDashes.length === 0 || doc.selection[0].typename != "PathItem") {
                alert("破線のパスを1本だけ選択してください");
                return;
            }

            /* メニューからスクリプト選択時、間違えて違うものを実行してしまうことがあるので念のため確認 */
            if(confirm("選択中の破線パスと同じ破線を選択状態にするスクリプト。\n非表示やロック設定されたレイヤーやオブジェクトは無視します。\n\n続行しますか?") == false) return;
            var dashprop = doc.selection[0].strokeDashes;

            /* レイヤーごとに処理したほうが速いらしい(?) */
            for(var lay=0; lay < doc.layers.length; lay++){
                if(doc.layers[lay].visible && doc.layers[lay].locked===false){
                    selectDash(dashprop, doc.layers[lay].pageItems);
                }
            }
            alert("パスを選択しました : " + doc.selection.length + "/" + doc.pathItems.length);
        } else {
            throw new Error('ドキュメントが開かれていません。');
        }
    }
    catch(e) {
        alert( e.message, "スクリプト警告", true);
    }
})()

解説するほどでもないよね

二点鎖線の選択はすぐ終わるところをみると比較よりもセレクトに時間がかかりobj[i].selected = true; でパス1本拾うのに 20ms ほどかかっているようです。だから、多くの要素の中から少数のパスを拾うのには良さそうです。

レイヤーの非表示プロパティは visible ですが、レイヤーの下にある各図形要素の非表示プロパティは hidden なんですね。