Script để tự động chụp tất cả các điểm vào lưới trong Adobe Illustrator?


8

Làm thế nào bạn có thể viết một tập lệnh để di chuyển tất cả các điểm của tất cả các đường dẫn đã chọn đến điểm lưới (lưới không pixel) gần nhất?

Mẫu trước và sau khi căn chỉnh

ví dụ: tôi muốn tất cả các điểm của mỗi đa giác / đường dẫn đến điểm gần nhất trên lưới tùy chỉnh. Của tôi được thiết lập là 1 đơn vị lưới = 11.338px hoặc 4mm, nhưng lý tưởng là tập lệnh sẽ mở rộng đến bất kỳ giá trị đơn vị nào

PSEUDOCODE CỦA TÔI, 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)
    }
}

Điều này có nghĩa không? Đã được một thời gian kể từ khi tôi thực hiện bất kỳ chương trình. Tôi cũng chưa bao giờ viết kịch bản cho Illustrator, vì vậy không chắc chắn chính xác cách thực hiện điều này.

LIÊN KẾT: Tôi đã xem bài đăng của @KromStern nhưng không chắc cách triển khai dựa trên chủ đề đó. Làm thế nào để căn chỉnh tất cả các điểm được chọn vào một lưới?

Câu trả lời:


4

Ở đây bạn đi, đảm bảo các đường dẫn mà bạn muốn chụp được chọn:

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

Điều này thật tuyệt, @joojaa! Cảm ơn bạn vì mật mã! Tôi đã kiểm tra tập lệnh của bạn trên một vài đa giác như một lựa chọn và nó hoạt động hoàn hảo , sắp xếp các điểm vào lưới. Thật không may, khi tôi chọn hàng trăm đa giác, tôi nhận được thông báo lỗi (Lỗi: 21: không xác định không phải là một đối tượng, Dòng 15) >> Tôi đoán rằng phải có vấn đề với lựa chọn của tôi (ví dụ: đường dẫn không được tiết lộ hoặc một số đối tượng không phải là đường dẫn mà tôi không thấy trên bản vẽ của mình không phải là đối tượng hợp lệ cho tập lệnh của bạn. Sẽ phải xem xét kỹ hơn. Cảm ơn một lần nữa, bạn rock!
Johnnystackexchange

@ John
joojaa

@Johnnystackexchange thử ngay bây giờ không thực hiện bất kỳ thử nghiệm nào trên đó
joojaa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.