Script untuk mengambil semua titik ke kotak secara otomatis di Adobe Illustrator?

8

Bagaimana Anda menulis skrip untuk memindahkan semua titik dari semua jalur yang dipilih ke titik grid terdekat (non-pixel grid)?

Sampel sebelum dan setelah perataan

misalnya saya ingin semua titik dari setiap poligon / jalur untuk snap ke titik terdekat di kisi kustom. Milik saya disetel sebagai 1 unit grid = 11.338px atau 4mm, tetapi idealnya skrip akan diperluas ke nilai unit apa pun

PSEUDOCODE SAYA, 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)
    }
}

Apakah ini masuk akal? Sudah lama sejak saya melakukan pemrograman apa pun. Saya juga tidak pernah menulis skrip untuk Illustrator, jadi tidak yakin bagaimana menerapkannya.

LINK: Saya sudah melihat posting oleh @KromStern tetapi tidak yakin bagaimana menerapkan berdasarkan utas itu. Bagaimana cara menyelaraskan semua titik yang dipilih ke kotak?

Johnnystackexchange
sumber

Jawaban:

4

Ini dia, pastikan jalur yang ingin Anda jepitkan dipilih:

  // 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
sumber
Ini bagus, @joojaa! Terima kasih untuk kodenya! Saya telah menguji skrip Anda pada beberapa poligon sebagai pilihan dan berfungsi dengan sempurna , meluruskan poin ke grid. Sayangnya, ketika saya memilih ratusan poligon, saya mendapatkan pesan kesalahan (Galat: 21: tidak terdefinisi bukan objek, Baris 15) >> Saya menduga pasti ada masalah dengan pilihan saya (mis. Jalur tidak tertutup atau beberapa objek non path yang tidak saya lihat di artboard saya yang bukan objek yang valid untuk skrip Anda.
Harus
@Johnnystackexchange Ya baik saya tidak memeriksa untuk jenis objek Anda harus menambahkan cek untuk melihat apakah objek yang dipilih adalah Item jalur atau bungkus blok coba tangkap di sekitar loop.
joojaa
@ Johnnystackexchange coba sekarang tidak melakukan pengujian apa pun di atasnya
joojaa