Skript zum automatischen Einrasten aller Punkte am Raster in Adobe Illustrator?

8

Wie würden Sie ein Skript schreiben, um alle Punkte aller ausgewählten Pfade zum nächsten Gitterpunkt (ohne Pixelraster) zu verschieben?

Probe vor und nach dem Ausrichten

Ich möchte beispielsweise, dass alle Punkte jedes Polygons / Pfads am nächsten Punkt in einem benutzerdefinierten Raster ausgerichtet werden. Meins ist als 1 Gittereinheit = 11.338px oder 4 mm eingerichtet, aber im Idealfall würde sich das Skript auf jeden Einheitswert erstrecken

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

Macht das Sinn? Es ist schon eine Weile her, seit ich programmiert habe. Ich habe auch noch nie ein Skript für Illustrator erstellt, daher bin ich mir nicht ganz sicher, wie ich das implementieren soll.

LINK: Ich habe mir den Beitrag von @KromStern angesehen, bin mir aber nicht sicher, wie ich ihn basierend auf diesem Thread implementieren soll. Wie richte ich alle ausgewählten Punkte an einem Raster aus?

Johnnystackexchange
quelle

Antworten:

4

Stellen Sie sicher, dass die Pfade ausgewählt sind, die Sie fangen möchten:

  // 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
quelle
Das ist großartig, @joojaa! Danke für den Code! Ich habe Ihr Skript an einigen Polygonen als Auswahl getestet und es funktioniert einwandfrei und richtet Punkte am Raster aus. Leider erhalte ich bei der Auswahl meiner Hunderte von Polygonen eine Fehlermeldung (Fehler: 21: undefiniert ist kein Objekt, Zeile 15) >> Ich vermute, dass bei meiner Auswahl ein Problem vorliegen muss (z. B. ein nicht geschlossener Pfad) oder ein Objekt ohne Pfad, das ich nicht auf meiner Zeichenfläche sehe und das kein gültiges Objekt für Ihr Skript ist. Ich muss es mir genauer ansehen.
Nochmals vielen
@ Johnnystackexchange Ja, ich überprüfe nicht, ob Objekttypen vorhanden sind. Sie sollten eine Überprüfung hinzufügen, um festzustellen, ob das ausgewählte Objekt ein Pfadelement ist, oder einen Try-Catch-Block um die Schleife wickeln.
Joojaa
@ Johnnystackexchange versuchen Sie jetzt keine Tests darauf
joojaa