kstrizhov / rdo-xtext

RDO modelling language written in Xtext
0 stars 0 forks source link

Привязать построения графа к трассировке #4

Closed aurusov closed 9 years ago

aurusov commented 9 years ago

Построение графа должно запускаться по клику на строку трассироки. Убрать запуск из пункта меню. В идеале, клик по любой строке трассировке должен приводить к поиску рутовой вершине и запускать отрисовку всего графа. При повторном клике на трассироку надо открывать уже созданный граф. Нужна помощь Паши @bogachev-pa.

bogachev-pa commented 9 years ago

По идее реализовать довольно просто, тебе нужно просто добавить листенер на двойной клик мыши в RDOTraceView, например, сюда.

Код будет выглядеть примерно так:

viewer.addDoubleClickListener(
    new IDoubleClickListener()
    {
        @Override
        public void doubleClick(DoubleClickEvent event)
        {
            TraceOutput traceOutput =
                (TraceOutput) viewer.getTable().getSelection()[0].getData();
            if (traceOutput.type() == TraceType.SEARCH_BEGIN)
            {
                System.out.println("calling tree grapher now");
            }
        }
    }
);

Проблемы могут возникнуть, когда у нас будет несколько точек принятия решений в модели. Как тогда понять, к какой относится та строчка, по которой мы кликнули? С текущей реализацией трассировщика никак. Если сейчас эта проблема остро не стоит (я вообще не тестировал трассировку на модели с несколькими точками принятия решений), то можно пока забить.

Возможно, придется расширить TraceOutput и хранить там помимо типа записи и непосредственно строки трассировки еще какую-то информацию.

В будущем, наверное, стоит сделать контекстное меню с пунктом "построить граф" по нажатию правой кнопки мыши.

aurusov commented 9 years ago

Почему могут быть проблемы ?

bogachev-pa commented 9 years ago

Номер текущей точки принятия решения выводится только в SB, т.е. в начале трассировки. Т.к. вся информация, что у нас есть в гуи это тип трассировки (для цветного вывода) и строка, то понять по полю, например, STN, на которое мы кликнули, к какой точке принятия решения оно относится, невозможно. Какой тогда нам граф строить?

Решается проблема просто - добавлением в TraceOutput еще одного поля, например, с номером точки принятия решения.

Правда текущий построитель графов вообще не умеет работать более чем с одной точкой принятия решения, он, скорее всего, начнет перезаписывать старые данные, когда встретит второй SB. Исправить это может быть чуть сложнее.

aurusov commented 9 years ago

то понять по полю, например, STN, на которое мы кликнули, к какой точке принятия решения оно относится, невозможно. Какой тогда нам граф строить?

Думал бежать на верх до тех пор пока не будет понятно

Правда текущий построитель графов вообще не умеет работать более чем с одной точкой принятия решения, он, скорее всего, начнет перезаписывать старые данные, когда встретит второй SB. Исправить это может быть чуть сложнее.

Много окошек с графами только сегодня обсуждали с Кириллом. Можно вынести в отдельную задачу (#5)

bogachev-pa commented 9 years ago

Думал бежать на верх до тех пор пока не будет понятно

Ну можно и так. Хотя в задачах побольше пятнашек 3x2, это может оказаться очень неэффективным.

aurusov commented 9 years ago

Вот когда в них упремся, тогда и будем рефакторить

kstrizhov commented 9 years ago

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

aurusov commented 9 years ago

Теперь есть возможность вызывать нужный граф по двойному клику по строке начала поиска для соответствующей точки принятия решений.

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

Но пока каждый вызов открывает новое окно

Уже было написано в требованиях у #5, что повторный клик на той же точке должен показывать ранее открытое окно, а не создавать новое.

Как и куда его запихнуть, чтобы мапа с деревьями формировалась один раз после прогона модели, и в последствии построитель только обращался к ней при необходимости, пока не придумал.

Думаю, что заранее не обязательно.

kstrizhov commented 9 years ago

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

Нет, постараюсь решить на днях, примерно представляю как.

Уже было написано в требованиях у #5, что повторный клик на той же точке должен показывать ранее открытое окно, а не создавать новое.

Да, я помню. Тут пока идей меньше.

Думаю, что заранее не обязательно.

Подумал, что если реализовать формирование деревьев при прогоне модели, будет быстрее открываться окно с графом. Но в целом согласен, и так все работает более-менее.

bogachev-pa commented 9 years ago

Уже было написано в требованиях у #5, что повторный клик на той же точке должен показывать ранее открытое окно, а не создавать новое.

Да, я помню. Тут пока идей меньше.

Как вариант в TreeGrapher можно добавить поле HashSet<Integer> openedGraphs. На клике по трассировке при отсутствии в нем номера точки принятия решения, для которой хотим построить граф, добавляем её туда и выводим граф. При закрытии окна, удаляем оттуда номер соответствующей дпт. На клике по трассировке и присутствии номера точки принятия решения в HashSet, выводим старое окно.

Возможно, будет удобнее (а может и единственно реализуемо) иметь не HashSet, а HashMap<Integer, mxGraph> или HashMap<Integer, mxFrame> ну или что-то в этом духе, чтобы связать номер дпт и окно с графом для неё.

Подумал, что если реализовать формирование деревьев при прогоне модели, будет быстрее открываться окно с графом. Но в целом согласен, и так все работает более-менее.

Тут надо проверить, на что уходит больше времени, на построение графа в либе или на его отрисовку. Если первое, то можно что-то соптимизировать в коде, например, не по всем записям бежать, а получать от базы данных сразу только записи с dpt-search. Но сначала надо проверить.

aurusov commented 9 years ago

Давай забудем о предварительной оптимизации. Жмакнули по трассировке - построили граф. Никаких подготовительных операций. Они уж точно сожрут скорость, а граф может не понадобиться. Наверное, уже в третий раз про пишу. Если тема непонятна, то дальше голосом. Писать про это уже надоело.

aurusov commented 9 years ago

Изменились хранимые в трассировке данные. Надо пересмотреть подход. Предложение: в трассировке выбираем строчку с трассировкой вершины, получаем указатель на неё в бинарной сериализации и бежим вверх до начала DPT. Получаем индекс DPT и начинаем строить граф.

kstrizhov commented 9 years ago

Сделано. https://github.com/kstrizhov/rdo-xtext/commit/de90d7c98808ae067c7f97afb7c7d74862bdfdc5

aurusov commented 9 years ago

Тогда закрывай таску.