Script para ajustar automaticamente todos os pontos à grade no Adobe Illustrator?

8

Como você escreveria um script para mover todos os pontos de todos os caminhos selecionados para o ponto de grade mais próximo (sem grade de pixels)?

Amostra antes e depois do alinhamento

Por exemplo, eu quero que todos os pontos de cada polígono / caminho sejam ajustados ao ponto mais próximo em uma grade personalizada. O meu é configurado como 1 unidade de grade = 11.338px ou 4mm, mas, idealmente, o script se estenderia a qualquer valor de unidade

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

Isso faz sentido? Já faz um tempo desde que eu fiz qualquer programação. Também nunca escrevi scripts para o Illustrator, portanto não sei exatamente como implementá-lo.

LINK: Examinei o post do @KromStern, mas não sei como implementá-lo com base nesse segmento. Como alinhar todos os pontos selecionados a uma grade?

Johnnystackexchange
fonte

Respostas:

4

Aqui está, verifique se os caminhos que você deseja alterar estão selecionados:

  // 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
fonte
Isso é ótimo, @joojaa! Obrigado pelo código! Testei seu script em alguns polígonos como uma seleção e ele funciona perfeitamente , alinhando pontos à grade. Infelizmente, quando seleciono centenas de polígonos, recebo uma mensagem de erro (Erro: 21: indefinido não é um objeto, Linha 15) >> Acho que deve haver um problema com minha seleção (por exemplo, um caminho não fechado) .. ou algum objeto não caminho que eu não estou vendo no meu prancheta que não é um objeto válido para o seu script vai ter que dar uma olhada Obrigado mais uma vez, você balança!
Johnnystackexchange
@Johnnystackexchange Sim, bem, eu não verifico os tipos de objeto, você deve adicionar uma verificação para ver se o objeto selecionado é um item de caminho ou quebrar um bloco catch try ao redor do loop.
joojaa
@Johnnystackexchange try now não fez nenhum teste nele #
joojaa