GEDKeeper icon indicating copy to clipboard operation
GEDKeeper copied to clipboard

Full Family Tree

Open KarenArzumanyan opened this issue 6 years ago • 18 comments

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

  1. В текущей реализации, путём выбора персоны и вывода для него полного дерева, как предков так и потомков, а также братьев и сестёр.
  2. Выбор семей, для которых отображается дерева с теми же характеристиками, что описаны в пункте 1. И ещё при наличии общего потомка в двух ветвях в четвёртом или ином поколении он рисуется дважды, прошу поправить (на примерах ниже видно).

Пример -1: Сейчас так: gedkeeper v2 12 0-familyfulltree-ivanov s i Хотелось бы так: gedkeeper v2 12 0-familyfulltree-ivanov s i-asneed

Пример -2: Сейчас так: gedkeeper v2 12 0-familyfulltree-sidorov d a Хотелось бы так: gedkeeper v2 12 0-familyfulltree-sidorov d a-asneed

Файл проекта прилагаю: GEDKeeper v2.12.0-FamilyForTest.ged.zip

Заранее спасибо.

KarenArzumanyan avatar Jul 20 '17 10:07 KarenArzumanyan

Я пересмотрел множество программ по данной теме, из них наиболее достойными видеться Agelong Tree, GenoPro, Gramps ну и GEDKeeper. Более всех близко к нужной мне картинке дерева рисует Agelong Tree. GenoPro - не может делать удобного графика, при том что имеет множество отчётов, и в остальном самая функциональная, но при этом платная. Gramps - тоже не может делать нужного графика. Agelong Tree - платный, но график рисует почти идеально (небольшие есть замечания по расположению персон в дереве но это не критично). Примеры ниже.

В архиве все примеры проектов по всем упомянутым программам и изображения дерева в них: Agelong Tree, GenoPro, Gramps, GEDKeeper.zip

И пример на мой взгляд удачного графика от Agelong Tree : agelong tree-v5-familyfortest-extended

KarenArzumanyan avatar Jul 20 '17 11:07 KarenArzumanyan

Это сложная тема. Вы - примерно 11-12-й пользователь, кто обращается к этой теме :)

Начну со случая, когда совпадающие в разных ветвях предки или потомки выводятся дважды и подкрашены серым цветом. Вывод дважды сделан специально, чтобы разрешить трудноразрешимый конфликт. А серый цвет – для индикации, что такая пара предков или потомков уже присутствуют в древе.

В чем конфликт. Давайте представим, что выводим не просто такое древо как у вас, сделанное в упрощенном виде, а реальное большое дерево. Какие у нас могут быть проблемы. Допустим, что Петров Николай Денисович, в первом представленном примере имеет своих предков – тогда его можно развернуть вправо, чтобы его предки могли отобразиться. Это еще возможно сделать. Теперь допустим: кто-то из пользователей пытается построить древо, как например, династическое древо Габсбургов, или я попытаюсь по своему вторичному хобби вывести древо Селевкидов, или Птолемеев, или других древних династий. Там такие пересечения и повторы – на всех уровнях во всех возможных комбинациях (полная узаконенная возможность крайне близкородственных браков). И мой алгоритм сойдет с ума, от невозможности построить настоящее полное древо – на каждом уровне будет пересечение, а также между поколениями, между ветвями и между родителями-детьми, и будут люди, которых просто некуда развернуть, чтобы построить их предков. Придется тогда пойти на допустимость пересечения линий между узлами персон. И строить дерево как получается.

Тоже самое всё актуально и для потомков. Предположим, что во втором вашем примере для потомков, у пары Иванов С.И. и Иванова Е.И. – длинные ветви потомков. Причем у их родителей с обеих сторон есть другие дети, потомки которых также пересекаются много ниже. Т.е. разные ветви потомков много раз в различных вариантах пересекутся. Это вполне реальный пример, хоть и не относящийся к обычным родословным.

Из описанных ситуаций единственный приличный выход, чтобы не терять обозримость результата и обойти коллизии – это при неразрешимости пересечений, прерывать отображение ветви с пометкой что дальше она продолжается. Тогда пользователю придется просто переместиться на нужную центральную персону, чтобы увидеть людей дальше.

В приведенном у вас примере, Agelong пошла как раз тем путём, что если программа не может решить коллизию непротиворечивого размещения персон – линии пересекаются с разрывом. Но если я попытаюсь вывести в ней любую древнюю династию из своих любительских исследований – уверен, что в лучшем случае будет месиво.

Самое для меня некомфортное в этой задаче, это то, что даже если сделать такой режим в программе – он имеет низкую практическую ценность. Это будет много усилий, выброшенных просто на ветер, простите. Объясню почему: в моих личных базах данных, где я занимаюсь именно генеалогией меня и моей семьи – порядка 10.5 тыс. человек. Из них 3.5 тыс. – это «ядро» поисков. В последние годы для меня любые формы деревьев имеют очень низкую ценность, т.к. на экране можно видеть лишь ограниченный объем данных. Если я в настоящий момент занимаюсь вводом данных – то мне нужно видеть как можно меньше информации, это аксиома обработки данных – ничего лишнего и отвлекающего. А если хочу полюбоваться общим результатом для красоты, то необходимость листать древо, в котором одномоментно около тысячи человек – утомительно, либо это и на десяток мониторов не влезет, либо в уменьшенном виде превращается в мелкую мозаику. И при распечатке требует 27x5 листов A4 в альбомном развороте… Причем из-за обычного количества детей в семьях 2-3 века назад, ветви братьев скажем второго-третьего поколения от общего предка – находятся на немыслимом расстоянии друг от друга в таком древе.

Сложная тема, над которой я много раз думал и так и не пришел к определенному решению. До вас я отвечал на этот вопрос буквально три дня назад, у того пользователя – порядка 150 человек в базе. Когда я описал реальную ситуацию применительно к себе – он сразу снял свой вопрос :) Хочется ведь, чтобы решение было и практичным, и наглядным, и удобным. Но придумать, чтобы это всё выполнялось одновременно – пока не получается...

Serg-Norseman avatar Jul 20 '17 11:07 Serg-Norseman

Примеры по теме. 01 02

Serg-Norseman avatar Jul 20 '17 12:07 Serg-Norseman

Это конечно не самые удачные примеры, т.к. древняя история, которая мало соотносится с действительностью России или ближних стран последних веков. Но подойдет в качестве примера крайности, которую нужно держать в уме. Обратите внимание на количество серых предков в первой диаграмме. Соотнесите их между собой, переложите на реальные случаи даже для самой обычной генеалогии, но успешной в пределах 5-6 веков. У меня один коллега, занявшись родословной жены, нашел два пересечения её ветвей со своими. Не считая нескольких пересечений между собственными...

Serg-Norseman avatar Jul 20 '17 12:07 Serg-Norseman

Понимаю и согласен, что в случаях действительно больших родословных и тем более c разными пересечениями, будет "месиво". В моём случае пока видается объём в 200-300 персон, и таких пересечений не более двух, потому и возник вопрос. Но перед началом формирования базы хочется выбрать такой инструмент, которого не было бы нужды менять по какой-либо причине впоследствии. И при этом иметь возможность получить на выходе не только базу в виде стандарта, и хороший инструмент для работы с ней но и наглядное желательно красиво оформленное дерево для возможности распечатки например.

GEDKeeper понравился тем, что в качестве формата проекта использует GEDCOM, тогда как остальные создали свои форматы либо SQLite, либо запакованный XML, да кто-то может делать импорт/экспорт но всё же. И имеет хороший функционал по ведению базы, удобен.

Возможно есть другие проекты, которые специализируются на формировании "красивых" деревьев на основе GEDCOM, для вывода на печать, если что-то можете порекомендовать буду очень признателен.

KarenArzumanyan avatar Jul 20 '17 12:07 KarenArzumanyan

Спасибо за добрую оценку :) Я еще буду думать над этой темой, оставим её открытой, может что-то и придумается со временем... Если придумать набор граничных условий, при которых прерывать размещение персон, чтобы диаграмма оставалась эстетичного вида...

Недавно нашел вот такой проект нашего соотечественника, посмотрите, может подойдет в какой-то мере: https://github.com/ligurio/ged2dot

Вы по-видимому тоже программист? Будет желание и идеи – присоединяйтесь :)

Serg-Norseman avatar Jul 20 '17 12:07 Serg-Norseman

Вам спасибо. Буду смотреть варианты, и искать как сделать нужное мне. Да я тоже программист. Если будут идеи и возможность постараюсь.

KarenArzumanyan avatar Jul 20 '17 13:07 KarenArzumanyan

I have no Russian, my apologies.

Thank you for the sample file - it makes the reproduction much easier! This is a difficult problem, as Sergey pointed out. Other programs which I checked were unable to do the job as well.

But I do know this particular case is possible to solve. A different project I was once involved with, Family.Show / Family.Lines, is able to lay out the tree as you desire. As you can see below, the drawing leaves much to be desired. Note though that Ivanov Ivan Romanovich(1980) and Ivanova Svetlana Nikolaevna(1983) are shown as a pair only once:

family lines capture

I cannot recommend the project for many reasons. I will try to investigate further and attempt to provide a solution for GedKeeper. (The Family.Lines code is available in my repository FamilyLines]).

If you have other tree 'challenges', sample GEDCOMs would be helpful for me to insure those cases are indeed working in Family.Show ...

Note that Chronoplex Software's My Family Tree is free, based on Family.Show, and appears to have improved the tree drawing. You might give it a try, with the caveat it will not provide some of the other features you were seeking.

Kevin

fire-eggs avatar Aug 16 '17 14:08 fire-eggs

Слежу за проектом постоянно, вижу 2.13 к релизу созревает. Нет ли планов/возможности таки успеть сделать, пусть опционально (выключено по умолчанию), исключение дублей на графике? На первый взгляд технически не должно быть проблемой.

KarenArzumanyan avatar Jun 08 '18 06:06 KarenArzumanyan

Релиз будет скорее всего уже сегодня вечером или завтра. Я вынужден торопиться, сегодня крайний срок, иначе он не выйдет еще несколько месяцев.

Над исключением дублей по вашему сценарию работали и я, и @fire-eggs. У нас ничего не вышло. Точнее само исключение дублей и только оно реализуется не слишком сложным изменением. Но на текущем движке, если есть любая длинная ветвь между объединяемыми общими - алгоритм дает наложение, или искажение, или порчу диаграммы.

Еще хуже, если мы пытаемся объединить дубликаты, дети которых из-за временных интервалов находятся в различных поколениях. Скажем, есть моё личное древо предков, и есть пара, дети которой в дереве присутствуют в двух ветвях (пример из моего древа), самый старший сын образовал одну ветвь и младшая дочь другую. Из-за большой разницы между годами их рождения - они находятся в древе в разных поколениях. В данном случае, помимо простого объединения данного дубликата, соединительную линию одной из этих ветвей нужно еще и удлинить по вертикали. И это не всё. У меня в древе между этими объединяемыми "дублями", присутствует 3 ветви, одна короткая и она может вмещается под объединением, а две другие - на 3 и 4 поколения длиннее. Я не могу придумать алгоритм, который бы выполнил горизонтальную ротацию ветвей так, чтобы длинные вышли из-под "дуги" объединяемых и были сбоку, где-нибудь в стороне.

Я бы и рад сделать и объединение дублей, и режим "полного древа". Да вот не получается. Возможно нужно вообще сделать новый движок вывода деревьев. Но во-первых, не дает острая нехватка свободного времени последние три года, а уже завтра его не будет совсем ))) минимум на полгода-год, пока маленькая причина не будет давать спать по ночам )))

Serg-Norseman avatar Jun 08 '18 07:06 Serg-Norseman

The current solution I have in my own test project looks like: update1

I find it to be a reasonably easy compromise: each person appears in their own box, and that box also is the anchor for their union/children. [I.e. in the above image, the left "duplicate" is for Ivan, and the right "duplicate" for Svetlana. Same marriage, different persons.] The 'trick' here is to work with marriages rather than individuals.

In all but the simplest of trees, it is not really feasible to merge marriages. Dealing with cases where marriages were across generations and spanning trees would be difficult. An example is the following image using the GedKeeper sample tree:

drawtree

If you zoom in far enough, you can see [via the dotted blue lines] that people I217 and I246 were both married to (5th cousins?). The marriages cross branches and each other; attempting to combine them would require drawing the tree in a non-traditional fashion. (Note that any dotted red lines that are visible indicate multiple marriages. This means a person can appear in multiple boxes, one for each marriage).

I gave up on the FamilyLines / My Family Tree solution because of the complexity reason. Once the tree gets complex, the lines start crossing all over, making viewing difficult.

Any feedback appreciated.

fire-eggs avatar Jul 09 '18 17:07 fire-eggs

Good research and visualization option, to partially solve the issue!

I also experimented on this issue, as there will be time - I'll try to publish my options to ensure the depth and complexity of the tree. I did not like the result, so I did not show anything ...

Serg-Norseman avatar Jul 09 '18 17:07 Serg-Norseman

I like it better as it is now done in My Family Tree. With dotted lines, of course, partial solution. If possible, please make an optional so that the suggested variant also remains.

my family tree-v 8 0 7 0-familyfortest

KarenArzumanyan avatar Jul 10 '18 07:07 KarenArzumanyan

I like it better as it is now done in My Family Tree.

Wow - looks like I'm not up to date on the latest features of that program! I'll take a look - thanks for the pointer!

fire-eggs avatar Jul 10 '18 14:07 fire-eggs

The issue is closed due to the futility of the discussion and the impossibility of implementation.

Serg-Norseman avatar Apr 10 '19 21:04 Serg-Norseman

There is still hope!

KarenArzumanyan avatar Nov 06 '20 09:11 KarenArzumanyan