Serg-Norseman / GEDKeeper

GEDKeeper - program for work with personal genealogical database
https://gedkeeper.net/
GNU General Public License v3.0
149 stars 44 forks source link

More convenient output of Relationship calculator. #475

Closed se-sss closed 1 year ago

se-sss commented 1 year ago

Assume user selected 2 persons: Person 1 Person 2

Now order of output is more natural: Person1 is somebody for PersonA, PersonA is somebody for personB, PersonB is somebody for Person2.

se-sss commented 1 year ago

Was: image

Now convenient straight order: image

se-sss commented 1 year ago

Difference in choice fields is due to old version used (2.22) for the 1st screenshot.

Serg-Norseman commented 1 year ago

I can't accept this PR any time soon, because there is a branch feature/compex-kinship, where I worked on the issue of strengthening the some kinships analysis. Improvements in this branch intersect with yours, the code will become completely incompatible for automatic merging.

Serg-Norseman commented 1 year ago

But it's a cool improvement idea.

se-sss commented 1 year ago

Also I have proposal of adding "Swap" button to that window to see backward route. Code working but not prepared for commit yet.

se-sss commented 1 year ago

Something got broken. Initial selection is not correct image

After swap seems to be correct: image

se-sss commented 1 year ago

I shall look later

se-sss commented 1 year ago

Withou my pull request image

Serg-Norseman commented 1 year ago

Приведите здесь без PR ваш код для свопа. Я у себя протестировал - в дереве отношения выводятся корректно, в этом модуле - тоже. Есть подозрение, что нужно посмотреть на реализацию свопа. Если вы есть в телеграмме - можете выйти на меня через канал программы и скинуть код в личку напрямую.

Serg-Norseman commented 1 year ago

Для быстрого прототипа я сделал следующее в RelationshipCalculatorDlg:

        public RelationshipCalculatorDlg(IBaseWindow baseWin)
        {
            ....
            fController.SetRec2(null);
            this.KeyDown += RelationshipCalculatorDlg_KeyDown;
        }

        private void RelationshipCalculatorDlg_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if (e.KeyCode == System.Windows.Forms.Keys.F11) {
                fController.Swap();
            }
        }

И в RelationshipCalculatorDlgController:

        public void Swap()
        {
            var rec1 = fRec1;
            var rec2 = fRec2;
            fRec1 = rec2;
            fRec2 = rec1;
            Solve();
        }

На выбранном примере в своём дереве - всё работает корректно.

se-sss commented 1 year ago

А проблема не со свапом. Первая картинка, где правнуком назван, получена без его применения. А после свапа - похоже на правду. Это после Merge branch 'master' into feature/complex-kinship

se-sss commented 1 year ago

Есть мой прадед, у него сестра, у неё есть муж. Почему-то пишется, что я внук этого мужа сестры. В обратную нормально.

Serg-Norseman commented 1 year ago

А в прежнем варианте тоже было неправильно? Или так стало после моих последних изменений?

Serg-Norseman commented 1 year ago

Есть предположение, в чем может быть дело. У меня набор правил для определения родственных связей не обратно совместим (не помню подходящий термин). Т.е. когда идет обход цепочки графа в одном направлении - нужные связи отрабатываются правильно, а в обратном направлении, срабатывает какое-то неправильное правило, вместо отсутствующего.

Serg-Norseman commented 1 year ago

Странно: нашел у себя в точности описанный паттерн, прогнал тест - в обоих направлениях всё определяется правильно.

se-sss commented 1 year ago

Brother_in_law неожиданно появляется image

se-sss commented 1 year ago

Комментирование правила под этим индексом помогает //RegisterKinship( // RelationSet.Create(), // RelationSet.Create(RelationKind.rkWifeFather, RelationKind.rkWifeMother), // RelationSet.Create(RelationKind.rkSon), // RelationKind.rkBrotherInLaw_W, 0, 0);

Serg-Norseman commented 1 year ago

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