Возможно вывести дерево вертикально?
Чтоб сохранились пропорции и т.д.
Грубо говоря, как вычислить координаты каждого элемента (на макете), если считать с 1.
Неделю бьюсь над формулой - 0.
Может кто идею подкинет.
Прикрепил excel в архиве - с визуальным примером и таблицой (деревом) данных.
За рабочую идею готов отблагодарить.
---
Для мозголомства задача интересна. Думаю, решаема.
Мои соображения:
* По внешнему виду:
- верхний вариант более легкий. Я бы назвал его "развернуть вправо". Второй вариант "влево-вправо" (как крылья наседки) можно сделать вторым шагом.
- линии, соединительные, получится только "горизонтально" и "вертикально". Мне так и красивше кажется.
- никакой сортировки делать не требуется. Да она и исказит расположение элементов
* Сначала с терминологией (она нужна и для изложения, и для прояснения мозгов:
- брат - элемент одного уровня с текущим.
- брат Старший (Бс) - с меньшим индексом. Для 1.3 это 1.1 и 1.2. Младший - наоборот.
- дети (Д) - подчиненные элементы на один уровень ниже
- потомки - подчиненные все элементы нижнего уровня
* По алгоритму. Тута все просто:
- до вывода обойти все элементы и каждому присвоить его горизонтальную позицию (ГП). Отсчет лучше брать с 0.
- ГП определяется так: "а сколько есть у меня старших братьев и у них всех потомков".
- кое-где поотнимать по единичке. Т.к. наличие у меня каждого Бс прибавляет 1. Его каждый Д тоже. Но кроме первого из Д. Т.к. он расположен под Бс. Т.е. первых учитывать особым образом.
* Потом вывод легче легкого.
- цикл по номеру уровня (вот тут может сложновато) Это строки отчета
- на каждом уровне цикл по братьям. Это колонки. Между братьями вывод линий циклом от позиции Бс до позиции Тек элемента. Потом квадрат.
- повторить алгоритм для вывода вертикальных линий.

В путь, коллега!
---
Для мозголомства задача интересна. Думаю, решаема.
Мои соображения:
* По внешнему виду:
- верхний вариант более легкий. Я бы назвал его "развернуть вправо". Второй вариант "влево-вправо" (как крылья наседки) можно сделать вторым шагом.
- линии, соединительные, получится только "горизонтально" и "вертикально". Мне так и красивше кажется.
- никакой сортировки делать не требуется. Да она и исказит расположение элементов
* Сначала с терминологией (она нужна и для изложения, и для прояснения мозгов:
- брат - элемент одного уровня с текущим.
- брат Старший (Бс) - с меньшим индексом. Для 1.3 это 1.1 и 1.2. Младший - наоборот.
- дети (Д) - подчиненные элементы на один уровень ниже
- потомки - подчиненные все элементы нижнего уровня
* По алгоритму. Тута все просто:
- до вывода обойти все элементы и каждому присвоить его горизонтальную позицию (ГП). Отсчет лучше брать с 0.
- ГП определяется так: "а сколько есть у меня старших братьев и у них всех потомков".
- кое-где поотнимать по единичке. Т.к. наличие у меня каждого Бс прибавляет 1. Его каждый Д тоже. Но кроме первого из Д. Т.к. он расположен под Бс. Т.е. первых учитывать особым образом.
* Потом вывод легче легкого.
- цикл по номеру уровня (вот тут может сложновато) Это строки отчета
- на каждом уровне цикл по братьям. Это колонки. Между братьями вывод линий циклом от позиции Бс до позиции Тек элемента. Потом квадрат.
- повторить алгоритм для вывода вертикальных линий.

В путь, коллега!
---
Предлагаю ознакомиться https://infostart.ru/public/196899/
---
- верхний вариант более легкий. Я бы назвал его "развернуть вправо". Второй вариант "влево-вправо" (как крылья наседки) можно сделать вторым шагом.

Верхний - да, проще. Его для образца накидал, чтоб из него 2й сделать)

- линии, соединительные, получится только "горизонтально" и "вертикально". Мне так и красивше кажется.

Линии, да, только прямые - горизонт. и верт. Это в excel стрелок наделал - там проще (ручками рисовал)\

- брат - элемент одного уровня с текущим.
У тут вопрос: В рамках родителя? Или все же в рамках всего уровня?
Думаю, что в рамках родителя, но все же, решил уточнить.

- ГП определяется так: "а сколько есть у меня старших братьев и у них всех потомков".
Имеете ввиду: Сумма всех Бс + Сумма все их потомков?!
---
В рамках родителя? Или все же в рамках всего уровня?
Я писал: "одного уровня с текущим". Т.е. равные Родитель и Уровень
Г-г-ым! А с точки зрения людской генеалогии ты бы сам как ответил на определение "брат"?

Почти "Сумма всех Бс + их потомков". Я именно та и писал. Разве что, полагал что "и" тождественно "+"
"Почти", т.к. нужно не учитывать первый элемент в каждом поколении (что бы не переспрашивали "уровне"). Ибо он стоит под своим родителем.
---
Спасибо. Получилось. Правда, периодически через одно место (или букву Г).

Входящее:
1. У меня иерархический справочник (иерархия элементов). До 500 элементов (пока быстродействие не критично)
2. Нужно чтоб строилось в виде нисходящего вертикального дерева. Вывод решил в макет на форме.
3. Это для себя, лично (хочу строить в 1С генеалогическое древо). Приходится заниматься в основном в свободное время по вечерам.

На выходе:
Очень помог совет Dnki!

1. Получаю запросом весь справочник с УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ. Выгружаю ПоГруппировкамСИерархией.
2. Поэтому работаю только с деревом
3. Обхожу дерево:
- считаю сколько детей (строк) у каждого элемента минус 1й "ребенок"
- считаю сколько всего потомков (до самого нижнего уровня) - из рассчитанных ранее детей
4. 2й раз обхожу дерево. Для расчета позиции (ГП):
- рассчитываю Старших - как писал выше Dnki, старшие братья текущего элемента - индекс строки.
- считаю сколько ВсегоПотомков у Старших, исходя из данных, рассчитанных в 1м цикле.
- ГП = Старших+ВсегоПотомков
- Если ГП < Родитель.ГП Тогда ГП = Родитель.ГП + Старших+ВсегоПотомков
5. Дальше вывод + вывод соединяющих линий. (пока через одно место)

По итогу: Получился 1й вариант вертикального дерева, когда оно рисуется от края.

Проблемы:
- немного кривовато написано, на скорую руку
- соединяющие стрелки (наконечник) не нравятся... слепил

Дальше: хочется полноценное дерево с "центрированием"- "наседку"

Кому интересно, приложил обработку
---
Предлагаю ознакомиться https://infostart.ru/public/196899/
Спасибо. Видел эту статью, разбирал обработку. Но как прикрутить этот "искусственный интеллект" к своей задаче так и не понял(
---
Ставим задачу: для каждого узла с подчиненными надо, чтобы крайние (первый и последний) подчиненные узлы располагались на одинаковом расстоянии влево и вправо от него. "Ширина" такого узла будет равна сумме ширин его детей, учитывая подчиненные им узлы. Теперь рекурсивно обходим дерево (думаю, проще и удобней "в глубину"): ширина листа дерева, наверное, равна некоторой константе - это размер картинки плюс минимальный промежуток между ними. Или единице, которую потом посчитаем, хотя, можно и разную ширину, главное - знать ее на момент обхода. Ширина родителя равна сумме ширин его детей (в которой также учтены ширины всех потомков). А если ширина картинок узлов разная, то ширину узла надо брать как максимум от суммы ширин потомков и шириной самого узла. Параллельно записываем ширину каждого узла в ТЗ в формате уровень - ширина. Свернув ее по ("Уровень", "Ширина"), получим сумму ширин каждого уровня.
   Кажется очевидным, что танцевать надо от уровня с максимальной суммой ширин узлов (!!! А по способу вычисления этих ширин получается, что этот уровень будет корнем!!!)
   Смещения потомков, наоборот, надо выстроить так, чтобы крайние левый и правый разместились симметрично относительно родителей. Левый узел расположен на половину своей ширины вправо от края, правый - аналогично влево. То есть, расстояние между ними - ширина родителя минус полусумма их ширин. Левый должен быть сдвинуть влево от родителя на половину этого расстояния, а правый - настолько же вправо.
   Попутно надо запоминать положение самого левого и самого правого краев каждого уровня, чтобы получить габариты всего дерева и правильно расположить его в результирующей картинке.
И так до полного удовлетворения :)