Script pour accrocher automatiquement tous les points à la grille dans Adobe Illustrator?

8

Comment écririez-vous un script pour déplacer tous les points de tous les chemins sélectionnés vers le point de grille le plus proche (grille non pixelisée)?

Échantillon avant et après l'alignement

par exemple, je veux que tous les points de chaque polygone / chemin soient alignés sur le point le plus proche sur une grille personnalisée. Le mien est configuré en 1 unité de grille = 11,338 pixels ou 4 mm, mais idéalement, le script s'étendrait à n'importe quelle valeur unitaire

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

Est-ce que ça a du sens? Cela fait un moment que je n'ai fait aucune programmation. Je n'ai également jamais scripté pour Illustrator, donc je ne sais pas exactement comment l'implémenter.

LINK: J'ai regardé le message de @KromStern mais je ne sais pas comment l'implémenter en fonction de ce fil. Comment aligner tous les points sélectionnés sur une grille?

Johnnystackexchange
la source

Réponses:

4

Voilà, assurez-vous que les chemins que vous souhaitez capturer sont sélectionnés:

  // 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
la source
C'est super, @joojaa! Merci pour le code! J'ai testé votre script sur quelques polygones en tant que sélection et cela fonctionne parfaitement , en alignant les points sur la grille. Malheureusement, lorsque je sélectionne mes centaines de polygones, je reçois un message d'erreur (Erreur: 21: undefined n'est pas un objet, ligne 15) >> Je suppose qu'il doit y avoir un problème avec ma sélection (par exemple un chemin non fermé ou un objet non chemin que je ne vois pas sur mon plan de travail qui n'est pas un objet valide pour votre script. Il faudra y regarder de plus près. Merci encore, vous
basculez
@Johnnystackexchange Oui, eh bien, je ne vérifie pas les types d'objets, vous devez ajouter une vérification pour voir si l'objet sélectionné est un élément de chemin ou enrouler un bloc try catch autour de la boucle.
joojaa
@Johnnystackexchange essayer maintenant n'a fait aucun test dessus
joojaa