Объединение пересекающихся путей в иллюстраторе - PullRequest
0 голосов
/ 27 сентября 2019

Краткосрочная проблема: у меня есть три дорожки на артборде.Конец одного пути имеет точку в той же позиции, что и начало другого.Другой путь отдельный.Все они сгруппированы.У меня есть некоторый код, который проходит через пути в группе, и если один путь заканчивается там, где начинается другой, он пытается соединить их вместе.Группа должна быть выделена.Для начала мой артборд выглядит следующим образом (верхняя строка состоит из двух путей): enter image description here

А после запуска скрипта это выглядит так:

enter image description here

С большим количеством точек, добавленных в конец линии внизу.Может ли кто-нибудь помочь мне с этим, в идеале, я бы хотел, чтобы это выглядело так: enter image description here

Код выглядит так:

var doc = activeDocument;//Gets the active document
var numArtboards = doc.artboards.length;//returns the number of artboards in the document
var intersections = true
var group = doc.selection[0]
var paths = []
var intersecttions = 0

// Builds an array of all the paths in the grouped object
if (group !== undefined && group.pageItems.length >= 2) {
    for (var i = 0; i < group.pageItems.length; i++) {
        var item = group.pageItems[i];
        if (item instanceof PathItem) {
            item.id = 'Path No' + i;
            paths.push(item)
        }
    }
}

//Sets the first path that will be added to
$.write('paths length ', paths.length,'\n')
var chain = paths[0]
var chainPoints = chain.pathPoints
var chainLength = chainPoints.length - 1
var c1 = chainPoints[0]
var c2 = chainPoints[chainLength]
$.write('c ', c1.anchor,':::', c2.anchor,'\n')

//loops through the paths in the group to see if any overlap the first past
for (var i = 1; i < paths.length-1; i++) {
var link = paths[i]
$.write(link, '\n')
var linkPoints = link.pathPoints
var linkLength = linkPoints.length - 1
$.write('l ', l1.anchor, ':::', l2.anchor, '\n')

if (toString(c1.anchor) === toString(l2.anchor)) {
    $.write('inttersection', '\n')
    $.write('link', link.id, '\n')
    for (var j = 0; j < linkLength; ++j) {
        chain.pathPoints.add(linkPoints[j])
        $.write (linkPoints[j], '\n')
    }
}
}

1 Ответ

0 голосов
/ 30 сентября 2019

Первая проблема заключается в том, что он неправильно обнаруживает случай перекрытия.Строка:

if (toString(c1.anchor) === toString(l2.anchor)) {

не сравнивает одну строку с другой, а сравнивает истинный ответ с другим истинным ответом.Это должно быть:

if (String(c1.anchor) === String(l2.anchor)) {

вы также должны передать атрибуты каждой точки, которую вы добавляете в линию, и удалить старую линию, поэтому в цикле j вам нужно добавить следующее

for (var j = 0; j < linkLength; ++j) {
        var pp1 = chainPoints.add()
        var p2i = linkPoints[j];
        pp1.anchor = p2i.anchor;
        pp1.rightDirection = p2i.rightDirection;
        pp1.leftDirection = p2i.leftDirection;
        pp1.pointType = p2i.pointType;
        pp1.handle = p2i.handle;
    }
link.remove();

Кажется, это работает, за исключением того, что он не добавляет последнюю точку второй строки.Я предполагаю, что длина цикла может быть установлена ​​неправильно. Если я решу это, я обновлю сообщение.Я нашел это в коде Хироюки Сато для его сценариев JoinReasonable http://shspage.com/aijs/en/

...