Генеалогическое дерево в Calc

Автор celler, 28 декабря 2013, 16:18

0 Пользователи и 1 гость просматривают эту тему.

celler

Необходимо соединить середины сторон некоторых ячеек с таковыми же других ячеек стрелками. Соединить не проблема, но при экспорте в pdf стрелки оказываются смещены по вертикали. То есть в Calc одно, а в pdf получается совсем другое. Много экспериментировал, в результате оказалось, что с этими векторными объектами просто катастрофа. Если привязать стрелки к ряду ячеек, расположенных вертикально, и экспортировать в pdf, то в нём хорошо видно постепенное смещение стрелок относительно ячеек. Если закрыть документ и открыть вновь, то иногда все стрелки в нём оказываются смещёнными как и в pdf. Но это происходит не всегда, иногда это наблюдается при создании копии документа и последующем её открытии. Иногда после нового открытия стрелки оказываются сильно растянуты по вертикали. К тому же зачастую не удаётся изменить положение стрелок, задавая их точное положение по осям - значения сами принимают какие-то другие значения. В общем, как гарантированно соединить середины сторон определённых ячеек стрелками?

JohnSUN

Это что-то вроде блок-схемы? И выходной документ должен быть именно PDF?
Так, может, вместо Calc'а использовать Draw? Там среди фигур есть и Схемы, и Основные фигуры, и Стрелки, и Соединительные линии...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

celler

Я сделал в Calc фактически генеалогическую программу, на одном из листов которой строится автоматически генеалогическое древо. Я сделал для восьми поколений, поэтому в нижнем ряду там 128 ячеек с выводимыми данными, между которыми ещё по ячейке. Получается очень большая ширина, но необходимо всё это получить на одном листе, поэтому я выбрал максимально возможную ширину печати 300 см и уменьшение печатаемой области под этот размер. Всё получается отлично, только нет стрелок.

JohnSUN

Что, правда? Класс!!! Покажешь?
А "инцестные петли" тоже обрабатываешь?
Ну, я имею в виду женитьбу на внучатой племяннице или что-то вроде этой жути:
"Мне 22 года, я женат на вдове 44 года, которая имеет 25-летнюю дочь. Мой отец женился на этой девушке и таким
образом стал моим зятем, поскольку он муж моей дочери. Таким образом, моя падчерица стала моей мачехой, раз уж она жена моего отца. У нас с женой родился сын. Он стал братом жены моего отца и двоюродным братом моего отца. И, соответственно, моим дядей, поскольку он брат моей
мачехи. Таким образом, мой сын теперь. мой дядя. Жена моего отца тоже родила ребенка, который стал одновременно моим братом, раз уж он сын моего отца, и моим внуком, поскольку он сын дочери моей жены. Так как муж матери кого-либо является его отцом, получается, что я отец своей жены, раз я брат своего сына.
Таким образом, я стал своим собственным дедом."

А что касается разметки дерева, есть дурацкая идея, но она может сработать.
Скопируй получившийся результат на ещё один лист удваивая количество ячеек по горизонтали и учетверяя по вертикали.
Через слияние ячеек увеличиваешь ячейки персонажей.
Соединительные линии рисуешь за счет границ промежуточных ячеек




[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

celler

Спасибо, я тоже уже допёр,- несколько часов двоил столбцы и строки и делал рамки.
Про всякие сложные случаи родства у меня всё будет в базе данных, а графически будет в виде дерева, где просто будут повторяться одни и те же лица, хотя такого варианта ещё не испытывал,- надо будет попробовать.
В образце вместо фамилий просто буквы.

[вложение удалено Администратором]

JohnSUN

Вот блин, PDF! Я рассчитывал на ODS...

Цитата: celler от 28 декабря 2013, 21:31
несколько часов двоил столбцы и строки и делал рамки.
Я имел в виду не совсем это - результат оставить "как есть", просто продублировать его на следующем листе с помощью чего-то вроде
=IF(MOD(ROW();2)=0;IF(MOD(COLUMN();2)=0;INDIRECT(ADDRESS(ROW()/2;COLUMN()/2;4;1;"Лист1"));"");"")Там, конечно, лишние нули выскочат, но они потом удалятся, после вставки значений вместо формул.
А границы рисовать можно было бы попробовать через условное форматирование... Хотя вот так вот сходу не скажу, как это сделать.
Цитата: celler от 28 декабря 2013, 21:31
Про всякие сложные случаи родства у меня всё будет в базе данных, а графически будет в виде дерева, где просто будут повторяться одни и те же лица, хотя такого варианта ещё не испытывал,- надо будет попробовать.
Резонно, я о дубле объекта в дереве как-то не подумал. То есть отображается в древе не сам объект, а его роль по отношению к соседним квадратикам... Изящно!
Я с этой задачей сталкивался лет двадцать назад. Один эндокринолог писал работу о наследственных патологиях среди, кажется, гагаузов... или какого-то другого горного населения... Они довольно прочно и долгое время отрезаны от остального мира горами и бездорожьем. Поэтому внутрисемейные связи там очень распространены. Соответственно, наследственные заболевания сплетены в очень плотные клубки - богатый материал для докторской диссертации. Данные исследований были на рукописных карточках. Нужна была база для упрощения обработки... Посмотрел я на эти карточки, на рисунки от руки "кто кому двоюродный дядя"...
Развёл руками и отказался (побоялся крышей поехать)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

celler

ODS ещё не совсем готов, в нём мои предки и родственники и я его делаю для сайта, поэтому пока не хотел бы его светить.
Я всё сделал на листе где сам результат,- лишние строки и столбцы собственно не мешают. Условным форматированием я начал делать, но потом сообразил, что если какая-то ветка будет пустой, то она и не отобразится, а стрелки останутся видны. Теперь вот с соединениями в виде рамок ячеек можно конечно так сделать, но мне кажется всё дерево ячеек иметь всё же лучше. В любом случае при печати просто выбирается зона с заполненными ячейками и печатается.
Про дубли объектов в дереве вроде бы должно по всем алгоритмам так и быть, но я уже не могу нормально соображать после нескольких дней работы над этим файлом и проверять тоже уже нет сил.
По родственным связям есть специализированные генеалогические программы, в которых просчитываются самые замысловатые родственные отношения и выдаются их названия.
Вообще принцип очень простой. У любого ребёнка есть два кровных родителя, поэтому для него достаточно указать id семьи этих родителей и именно они и будут отображаться в дереве под ним. Причём не важно была ли эта семья в реальности, приёмный он, от первого брака одного из партнёров или от десятого. Принципиально только действительно ли ребёнок родной родителям, а не приёмный. Поэтому в основной таблице есть две соответствующие графы. Если хочется, чтобы ребёнок несмотря на то, что является приёмным всё равно отображался в дереве, достаточно просто заполнить обе графы. А все прочие хитрости родственных отношений можно восстанавливать отдельными подпрограммками. Я, например, сделал отдельный лист, на котором отображаются все дети выбранной персоны отдельно по всем бракам.

JohnSUN

Круто! Честно, круто!
Есть, конечно, несколько сложных моментов. Например, Mater semper est certa - Мать всегда достоверно известна. Про отца, соответственно, это скажешь не всегда, иногда приходится рисовать просто квадратик с вопросительным знаком. А иногда, увы, и вместо обоих родителей.
Но не стану сейчас этим грузить - по себе знаю, что означают слова "уже не могу нормально соображать после нескольких дней работы над этим файлом"  :beer:

Насчет условного форматирования - вот чего надумал. Готовим несколько стилей - для всех шрифт белый на белом. И для каждого отдельно рамки - черная рамка сверху, справа, сверху и справа, снизу, справа и снизу, вокруг... Имена для стилей - самые примитивные, однобуквенные (или "одноцифренные"). В условное форматирование просто пишем в условие функцию STYLE() с параметром "содержимое текущей ячейки". Применяем это форматирование ко всем-всем ячейкам.
А потом просто вписываем в нужные ячейки 1,2,3 или буквы... Ну, имена стилей... И сразу же получаем соответствующие рамки и "затираем" вводимые значения
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

celler

По достоверности добытых генеалогических данных это тема отдельная и не для этого форума.
По условному форматированию,- можно так сделать, но постоянные рамки всё-таки лучше. Во-первых, все эти стили и дополнительные расчёты требуют ресурсов. В файле две основных таблицы - для персон и для семей. В каждую можно вносить хоть миллион строк, но в формулах используются данные из этих таблиц и одну формулу Calc может считать очень долго, поэтому я ограничил количество строк, используемых для построения дерева и прочих функций. Доступно для обработки сейчас 50000 персон и 20000 семей. В этом случае тормоза на моём компьютере почти не заметны. Поэтому не хочется грузить Calc ещё и другими расчётами. Во-вторых, условное форматирование мне не нравится тем, что при прокрутке листа множество ячеек оказывается визуально без рамок с некоторых сторон, т.е. всё это выглядит неполноценно в сравнении с постоянным форматированием. Ну и в третьих,- все эти дополнительные невидимые символы в ячейках всё-таки замусоривают документ и иногда могут помешать.


JohnSUN

celler, ты видишь, что твориться?!! Некуда от пиратов и плагиаторов податься!
Только придумаешь суперлучи, с помощь которых можно смотреть сквозь предметы - шар-р-рах! - какой-то Рентген уже публикует от своего имени...
Задумаешь написать триллер про братоубийство, тени предков, предательства, ну, что-нибудь такое, чтобы море крови и в конце все умерли - хлоп! - а Принца Датского уже в театрах ставят и кино снимают...
Про построение генеалогического древа - вообще молчу...  ;D

frob, КАК ты его отыскал?!! Может, напишешь краткую инструкцию "Не изобретайте велосипед - возьмите готовый"? Этакий мастер-класс по поисковым запросам и способам распространения полезных новостей.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

celler

JohnSUN, так Сноуден же всё раскрыл как это делается :)
А формат gedcom специально придуман мормонами, чтобы можно было на законных основаниях воровать чужие генеалогические данные. Ведь для представления таких данных достаточно всего двух таблиц - одна для персон и одна для семей, но они изобрели свой gedcom, который многократно всё усложняет, у которого постоянно появляются новые версии, несовместимые с предыдущими и для представления которого необходимы специализированные генеалогические программы, которых огромное множество и нет ни одной нормальной. Поэтому если ты в какой-то программе "растил" своё генеалогическое древо, а потом программу забросили, то ты потом будешь долго мучиться, чтобы перенести свои данные в какую-нибудь другую программу. Да даже не забросили, а просто обновили, что часто приводит к головным болям при решении возникаюших при этом проблем. Поэтому многие переходят на web-программы. А они являются очень продвинутыми, таким образом ты добровольно экспортируешь свой gedcom-файл со всей приватной информацией на чей-то сервер. Там конечно никто не может посмотреть то, что ты не разрешил, кроме тебя самого, ну и конечно тех, кто всё это организовал...
Вот проблемы с gedcom и побудили меня сделать базу на основе таблиц, т.е. для всей базы достаточно всего лишь csv. Это открывает такие возможности, какие гедкому и не снились.
frob, большое спасибо за ссылку, очень интересная работа. Однако я не смог открыть в LO свой gedcom, а только некоторые другие такие же файлы. А оказалось всё в том, что это расширение понимает только одну кодировку - ANSI, а для представления кириллицы необходим уникод. Вот если бы разработчик добавил туда такую возможность, было бы замечательно.

celler

Цитата: JohnSUN от 28 декабря 2013, 19:42"Мне 22 года, я женат на вдове 44 года, которая имеет 25-летнюю дочь. Мой отец женился на этой девушке и таким
образом стал моим зятем, поскольку он муж моей дочери. Таким образом, моя падчерица стала моей мачехой, раз уж она жена моего отца. У нас с женой родился сын. Он стал братом жены моего отца и двоюродным братом моего отца. И, соответственно, моим дядей, поскольку он брат моей
мачехи. Таким образом, мой сын теперь. мой дядя. Жена моего отца тоже родила ребенка, который стал одновременно моим братом, раз уж он сын моего отца, и моим внуком, поскольку он сын дочери моей жены. Так как муж матери кого-либо является его отцом, получается, что я отец своей жены, раз я брат своего сына.
Таким образом, я стал своим собственным дедом."
Ради интереса ввёл эту задачку в программу и она без проблем начала строить для всех персонажей деревья. Самые большие из деревьев прикладываю. Никаких повторов персон в данном случае не возникло.

[вложение удалено Администратором]

frob

Цитата: JohnSUN от 29 декабря 2013, 13:01КАК ты его отыскал?

"Вы будете смеяться..."

но Я вообще ничего не искал =)
Миклош у меня в g+, т.ч. его сообщение в блоге удачно совпало с вашим обсуждением.

frob

Цитата: celler от 29 декабря 2013, 14:29А оказалось всё в том, что это расширение понимает только одну кодировку - ANSI, а для представления кириллицы необходим уникод. Вот если бы разработчик добавил туда такую возможность, было бы замечательно.

Можете сделать файл с каким-нибудь "деревом" из пары-тройки человек с кириллическими идентификаторами?