Script per agganciare automaticamente tutti i punti alla griglia in Adobe Illustrator?


8

Come scriveresti uno script per spostare tutti i punti di tutti i percorsi selezionati sul punto della griglia più vicino (griglia non pixel)?

Campione prima e dopo l'allineamento

ad es. voglio che tutti i punti di ciascun poligono / tracciato si aggancino al punto più vicino su una griglia personalizzata. Il mio è impostato come 1 unità di griglia = 11.338 px o 4 mm, ma idealmente lo script si estenderebbe a qualsiasi valore di unità

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

ha senso? È passato un po 'di tempo da quando ho fatto qualsiasi programmazione. Inoltre non ho mai scritto script per Illustrator, quindi non sono sicuro di come implementarlo.

LINK: Ho guardato il post di @KromStern ma non sono sicuro di come implementarlo in base a quel thread. Come allineare tutti i punti selezionati su una griglia?

Risposte:


4

Ecco qua, assicurati che i percorsi che vuoi catturare siano selezionati:

  // 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 ];
}

È fantastico, @joojaa! Grazie per il codice! Ho testato la tua sceneggiatura su alcuni poligoni come una selezione e funziona perfettamente , allineando i punti alla griglia. Sfortunatamente, quando seleziono le mie centinaia di poligoni, ricevo un messaggio di errore (Errore: 21: undefined non è un oggetto, Riga 15) >> Immagino che ci debba essere un problema con la mia selezione (ad esempio un percorso non chiuso o qualche oggetto non tracciato che non vedo sulla mia tavola da disegno che non sia un oggetto valido per la tua sceneggiatura.
Dovremo

@Johnnystackexchange Sì, non controllo i tipi di oggetti che dovresti aggiungere, controlla se l'oggetto selezionato è un oggetto Path o avvolgi un blocco catch try nel loop.
joojaa,

@Johnnystackexchange provare ora non ha fatto alcun test su di esso
joojaa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.