Adobe Illustratorのグリッドにすべてのポイントを自動的にスナップするスクリプトですか?


8

選択したすべてのパスのすべてのポイントを最も近い(ピクセルグリッドではない)グリッドポイントに移動するスクリプトをどのように記述しますか?

アライメント前後のサンプル

たとえば、各ポリゴン/パスのすべてのポイントがカスタムグリッド上の最も近いポイントにスナップするようにします。鉱山は1グリッド単位= 11.338pxまたは4mmとしてセットアップされていますが、理想的にはスクリプトは任意の単位値に拡張されます

私の疑似コード、v0.1:

// set grid units as pixels - in my case 11.338px = 8mm = 1 grid unit

units = 11.338 


// Nested loop through all polygons/paths, then all points in each polygon

For each Polygon {

    For each Point P in Polygon {

    // move the Point x, y to the nearest grid point in units
        P.x = units * Round(P.x/units) 
        P.y = units * Round(P.y/units)
    }
}

これは理にかなっていますか?私がプログラミングをしてから久しぶりです。私もIllustratorのスクリプトを作成したことがないので、これを実装する方法が正確にわかりません。

リンク: @KromSternによる投稿を見てきましたが、そのスレッドに基づいて実装する方法がわかりません。選択したすべてのポイントをグリッドに揃える方法は?

回答:


4

ここで、スナップするパスが選択されていることを確認します。

  // jooSnapToDocumentGrid.jsx

#target illustrator

main();

function main(){
    var grid = getDocumentGrid();
    snapSelectedPathToDocumentGrid(activeDocument.selection, grid); 
}

function snapSelectedPathToDocumentGrid(sel, grid){
    for(var i = 0; i < sel.length; i++){
        try {
            var pp = sel[i].pathPoints;
            for(var j = 0; j < pp.length; j++){
                var p = pp[j];
                p.leftDirection = nearestGrid(p.leftDirection, grid);
                p.rightDirection = nearestGrid(p.rightDirection, grid);
                p.anchor = nearestGrid(p.anchor, grid);       
            }
        } catch(err) { }
    }
}

function getDocumentGrid(){
    var prf = app.preferences;
    var ticks = prf.getIntegerPreference('Grid/Horizontal/Ticks');
    var spacing = prf.getRealPreference('Grid/Horizontal/Spacing');
    return spacing/ticks;    
}

function nearestGrid(anchor, grid) {
    return [Math.round(anchor[0] / grid) * grid, 
            Math.round(anchor[1] / grid) * grid ];
}

@joojaa、これは素晴らしい!コードをありがとう!いくつかのポリゴンを選択範囲としてスクリプトをテストしましたが、ポイントはグリッドに合わせて完璧に機能します。残念ながら、何百ものポリゴンを選択すると、エラーメッセージが表示されます(Error:21:undefined is not a object、Line 15)>> 選択に問題があると思います(例:閉じていないパス) 。。または私はあなたのスクリプトのための有効なオブジェクトではありません私のアートボード上で見ておりませんことを、いくつかの非パスオブジェクト詳しく見ていくために感謝を再び持つことになります、あなたは岩!
Johnnystackexchange

@Johnnystackexchangeええ、オブジェクトタイプをチェックしないでください。選択したオブジェクトがパスアイテムであるかどうかを確認するためのチェックを追加するか、try catchブロックをループで囲んでください。
joojaa

@Johnnystackexchangeの試行では、テストは行われませんでした
joojaa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.