Closed aurusov closed 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
и хранить там помимо типа записи и непосредственно строки трассировки еще какую-то информацию.
В будущем, наверное, стоит сделать контекстное меню с пунктом "построить граф" по нажатию правой кнопки мыши.
Почему могут быть проблемы ?
Номер текущей точки принятия решения выводится только в SB
, т.е. в начале трассировки.
Т.к. вся информация, что у нас есть в гуи это тип трассировки (для цветного вывода) и строка, то понять по полю, например, STN
, на которое мы кликнули, к какой точке принятия решения оно относится, невозможно. Какой тогда нам граф строить?
Решается проблема просто - добавлением в TraceOutput еще одного поля, например, с номером точки принятия решения.
Правда текущий построитель графов вообще не умеет работать более чем с одной точкой принятия решения, он, скорее всего, начнет перезаписывать старые данные, когда встретит второй SB
. Исправить это может быть чуть сложнее.
то понять по полю, например, STN, на которое мы кликнули, к какой точке принятия решения оно относится, невозможно. Какой тогда нам граф строить?
Думал бежать на верх до тех пор пока не будет понятно
Правда текущий построитель графов вообще не умеет работать более чем с одной точкой принятия решения, он, скорее всего, начнет перезаписывать старые данные, когда встретит второй SB. Исправить это может быть чуть сложнее.
Много окошек с графами только сегодня обсуждали с Кириллом. Можно вынести в отдельную задачу (#5)
Думал бежать на верх до тех пор пока не будет понятно
Ну можно и так. Хотя в задачах побольше пятнашек 3x2, это может оказаться очень неэффективным.
Вот когда в них упремся, тогда и будем рефакторить
Теперь есть возможность вызывать нужный граф по двойному клику по строке начала поиска для соответствующей точки принятия решений. Но пока каждый вызов открывает новое окно, и в самом коде метод, формирующий дерево, вызывается каждый раз перед построением графа. Как и куда его запихнуть, чтобы мапа с деревьями формировалась один раз после прогона модели, и в последствии построитель только обращался к ней при необходимости, пока не придумал.
Теперь есть возможность вызывать нужный граф по двойному клику по строке начала поиска для соответствующей точки принятия решений.
Это уже хорошо, для курсача сойдёт. Но для продуктового решения надо открывать по любой строчке трассировке. Это еще не сделано ?
Но пока каждый вызов открывает новое окно
Уже было написано в требованиях у #5, что повторный клик на той же точке должен показывать ранее открытое окно, а не создавать новое.
Как и куда его запихнуть, чтобы мапа с деревьями формировалась один раз после прогона модели, и в последствии построитель только обращался к ней при необходимости, пока не придумал.
Думаю, что заранее не обязательно.
Это уже хорошо, для курсача сойдёт. Но для продуктового решения надо открывать по любой строчке трассировке. Это еще не сделано ?
Нет, постараюсь решить на днях, примерно представляю как.
Уже было написано в требованиях у #5, что повторный клик на той же точке должен показывать ранее открытое окно, а не создавать новое.
Да, я помню. Тут пока идей меньше.
Думаю, что заранее не обязательно.
Подумал, что если реализовать формирование деревьев при прогоне модели, будет быстрее открываться окно с графом. Но в целом согласен, и так все работает более-менее.
Уже было написано в требованиях у #5, что повторный клик на той же точке должен показывать ранее открытое окно, а не создавать новое.
Да, я помню. Тут пока идей меньше.
Как вариант в TreeGrapher
можно добавить поле HashSet<Integer> openedGraphs
.
На клике по трассировке при отсутствии в нем номера точки принятия решения, для которой хотим построить граф, добавляем её туда и выводим граф. При закрытии окна, удаляем оттуда номер соответствующей дпт.
На клике по трассировке и присутствии номера точки принятия решения в HashSet
, выводим старое окно.
Возможно, будет удобнее (а может и единственно реализуемо) иметь не HashSet
, а HashMap<Integer, mxGraph>
или HashMap<Integer, mxFrame>
ну или что-то в этом духе, чтобы связать номер дпт и окно с графом для неё.
Подумал, что если реализовать формирование деревьев при прогоне модели, будет быстрее открываться окно с графом. Но в целом согласен, и так все работает более-менее.
Тут надо проверить, на что уходит больше времени, на построение графа в либе или на его отрисовку. Если первое, то можно что-то соптимизировать в коде, например, не по всем записям бежать, а получать от базы данных сразу только записи с dpt-search. Но сначала надо проверить.
Давай забудем о предварительной оптимизации. Жмакнули по трассировке - построили граф. Никаких подготовительных операций. Они уж точно сожрут скорость, а граф может не понадобиться. Наверное, уже в третий раз про пишу. Если тема непонятна, то дальше голосом. Писать про это уже надоело.
Изменились хранимые в трассировке данные. Надо пересмотреть подход. Предложение: в трассировке выбираем строчку с трассировкой вершины, получаем указатель на неё в бинарной сериализации и бежим вверх до начала DPT. Получаем индекс DPT и начинаем строить граф.
Тогда закрывай таску.
Построение графа должно запускаться по клику на строку трассироки. Убрать запуск из пункта меню. В идеале, клик по любой строке трассировке должен приводить к поиску рутовой вершине и запускать отрисовку всего графа. При повторном клике на трассироку надо открывать уже созданный граф. Нужна помощь Паши @bogachev-pa.