/**
 * Рисование линий между центрами всех выделенных объектов
 * Drawing lines between the centers of all selected objects
 *
 * @copyright Sergey Turulin
 *
 * https://adobescript.ru
 * https://adobescript.com
 * sergey@adobescript.ru
 * telegram: @adobescript
 * twitter: @adobescript
 */

/**
 * Настройки скрипта: можно менять
 */

// Имя слоя, в который будут создаваться линии
const LAYER_NAME = 'lineBetweenObjects'

// Имя графического стиля, который будет применяться, если он найден
const GRAPHIC_STYLE_NAME = 'lineBetweenObjects'

// Максимальное число линий
const LIMIT = 500

// Максимальное расстояние в пунктах между объектами
const LENGTH_MAXIMUM = 1000

/** Конец настроек скрипта */


/** Дисклеймер */
const MESSAGE = '\n----------\nСкрипт рисует в слой «' + LAYER_NAME.toString() + '» линии между выделенными объектами, '
    + 'расстояние между которыми меньше ' + LENGTH_MAXIMUM + ' пунктов, '
    + ((!isNaN(LIMIT) && LIMIT > 0) ? ' (максимум ' + LIMIT + ' шт.)' : '') + ', '
    + (GRAPHIC_STYLE_NAME ? '; и применяет к ним графический стиль «' + GRAPHIC_STYLE_NAME + '», если он есть' : '')
    + '.\nИмя слоя и стиля, максимум линий и расстояние можно поменять в скрипте, открыв его в текстовом редакторе.'

function run() {
    if (0 === app.documents.length) {
        alert('Скрипт можно запустить только в открытом документе' + MESSAGE)

        return
    }

    const DOCUMENT = app.activeDocument
    if (0 === DOCUMENT.selection.length) {
        alert('Нужно выделить объекты' + MESSAGE)

        return
    }

    var layer, newLayer = false, graphicStyle = null
    try {
        layer = DOCUMENT.layers.getByName(LAYER_NAME.toString())
    } catch (e) {
        layer = DOCUMENT.layers.add()
        layer.name = LAYER_NAME
        newLayer = true
    }
    try {
        graphicStyle = DOCUMENT.graphicStyles.getByName(GRAPHIC_STYLE_NAME.toString())
    } catch (e) {
    }

    var count = 0, i, j, stop1, stop2, point1, point2, pathItem, length
    for (i = 0; i < DOCUMENT.selection.length; i++) {
        stop1 = DOCUMENT.selection[i]
        point1 = [stop1.left + (stop1.width / 2), stop1.top - (stop1.height / 2)]
        for (j = i + 1; j < DOCUMENT.selection.length; j++) {
            stop2 = DOCUMENT.selection[j]
            point2 = [stop2.left + (stop2.width / 2), stop2.top - (stop2.height / 2)]

            // Проверим расстояние между объектами
            length = Math.sqrt(Math.pow(point2[0] - point1[0], 2) + Math.pow(point2[1] - point1[1], 2))
            if (length > LENGTH_MAXIMUM) {
                continue
            }

            count++
            pathItem = layer.pathItems.add()
            pathItem.setEntirePath([point1, point2])
            if (null !== graphicStyle) {
                graphicStyle.applyTo(pathItem)
            }

            if (count >= LIMIT) {
                return
            }
        }
    }

    redraw()
    alert('На слое «' + LAYER_NAME + '»' + (newLayer ? ' (создан)' : '') + ' нарисовано линий: ' + count + MESSAGE)
}

try {
    run()
} catch (e) {
    alert('Ошибка: ' + e.message + MESSAGE)
}
