在 Adob​​e Illustrator 中自动将所有点捕捉到网格的脚本?

平面设计 cs6 网格 插画脚本 javascript
2022-01-26 10:15:58

您将如何编写脚本将所有选定路径的所有点移动到最近的(非像素网格)网格点?

对齐前后的样本

例如,我希望每个多边形/路径的所有点都捕捉到自定义网格上最近的点。我的设置为 1 个网格单位 = 11.338 像素或 4 毫米,但理想情况下,脚本将扩展到任何单位值

我的伪代码,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)
    }
}

这有意义吗?我已经有一段时间没有做任何编程了。我也从未为 Illustrator 编写过脚本,所以不确定如何实现。

链接:我查看了@KromStern 的帖子,但不确定如何基于该线程实现。如何将所有选定的点对齐到网格?

1个回答

在这里,确保选择了要捕捉的路径:

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