¿Script para ajustar automáticamente todos los puntos a la cuadrícula en Adobe Illustrator?

8

¿Cómo escribiría una secuencia de comandos para mover todos los puntos de todas las rutas seleccionadas al punto de cuadrícula más cercano (cuadrícula sin píxeles)?

Muestra antes y después de la alineación

por ejemplo, quiero que todos los puntos de cada polígono / ruta se ajusten al punto más cercano en una cuadrícula personalizada. El mío está configurado como 1 unidad de cuadrícula = 11.338 px o 4 mm, pero idealmente el script se extendería a cualquier valor unitario

MI 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)
    }
}

¿Esto tiene sentido? Ha pasado un tiempo desde que hice cualquier programación. Tampoco he escrito para Illustrator, así que no estoy seguro de cómo implementar esto.

ENLACE: He visto la publicación de @KromStern pero no estoy seguro de cómo implementarla en función de ese hilo. ¿Cómo alinear todos los puntos seleccionados a una cuadrícula?

Johnnystackexchange
fuente

Respuestas:

4

Aquí tienes, asegúrate de que las rutas que deseas ajustar estén seleccionadas:

  // 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
fuente
¡Esto es genial, @joojaa! ¡Gracias por el codigo! He probado su secuencia de comandos en algunos polígonos como una selección y funciona sin problemas , alineando puntos a la cuadrícula. Desafortunadamente, cuando selecciono mis cientos de polígonos, recibo un mensaje de error (Error: 21: indefinido no es un objeto, Línea 15) >> Supongo que debe haber un problema con mi selección (por ejemplo, una ruta no cerrada .. o algún objeto no camino que no estoy viendo en mi mesa de trabajo que no es un objeto válido para la secuencia de comandos tendrá que tomar una mirada más cercana Gracias de nuevo, que el rock!
Johnnystackexchange
@Johnnystackexchange Sí, bueno, no verifico los tipos de objetos, debe agregar un cheque para ver si el objeto seleccionado es un elemento de ruta o envolver un bloque de captura de prueba alrededor del bucle.
joojaa
@Johnnystackexchange intente ahora no hizo ninguna prueba al respecto
joojaa