Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: deMax от Июнь 20, 2017, 14:57



Название: циклограмма
Отправлено: deMax от Июнь 20, 2017, 14:57
Собственно есть ли готовое решение?
В принципе в старой программе у меня был собственный виджет который реализовывал циклограмму. Вот думаю может есть готовые решения?


Название: Re: циклограмма
Отправлено: __Heaven__ от Июнь 20, 2017, 17:43
QwtPolar для этого не предназначен?


Название: Re: циклограмма
Отправлено: deMax от Июнь 21, 2017, 12:37
QwtPolar для этого не предназначен?
Полярная система координат не требуется.

По сути циклограмма это таблица с масштабированием и прокруткой (масштаб - показывать на экране от часа до недели из нескольких лет), и блоками которые говорят что объект из соответствующей строки в это время что то делает.


Название: Re: циклограмма
Отправлено: Igors от Июнь 21, 2017, 13:15
Типичный процесс поиска заканчивающийся банальным "ото брать QPainter и делать" - вряд ли увидим что-то новое, скорее сколько времени пройдет пока "созреет". Ладно, посмотрим


Название: Re: циклограмма
Отправлено: deMax от Июнь 21, 2017, 13:46
Ну задача относительно типовая, в принципе то что у меня есть на QPainter и так хорошо работает. Поиск альтернатив чтобы найти интересные идеи или полностью взять.


Название: Re: циклограмма
Отправлено: __Heaven__ от Июнь 21, 2017, 14:20
Можно глянуть пример вашей циклограммы?


Название: Re: циклограмма
Отправлено: deMax от Июнь 28, 2017, 10:41
как то так


Название: Re: циклограмма
Отправлено: __Heaven__ от Июнь 29, 2017, 10:06
Посмотрел Qwt на этот счёт. Единственное, что из него мне удалось выжать это модификация barchart.
Код
C++ (Qt)
   QwtPlotMultiBarChart *chart = new QwtPlotMultiBarChart("test chart");
   chart->setStyle(QwtPlotMultiBarChart::Stacked);
   chart->setOrientation(Qt::Horizontal);
 
   for (int i: {0, 2}) {
       QwtColumnSymbol *symbol = new QwtColumnSymbol( QwtColumnSymbol::Box );
       symbol->setPalette( QPalette( Qt::transparent ) );
       chart->setSymbol(i, symbol);
   }
 
   chart->setSamples({{1, 2, 3, 4}, {5, 6, 7, 8}});
   chart->attach(plot_);


Название: Re: циклограмма
Отправлено: Racheengel от Июнь 29, 2017, 10:37
а просто таблицу взять чем не вариант?
ну зум придется "ручками" сделать - но думаю, что не особо проблемно это,не?


Название: Re: циклограмма
Отправлено: deMax от Июль 03, 2017, 09:32
В принципе меня таблица устроит, только ширина ячеек вариативная, от секунд до года. Ну и в масштабе 1 секунда, ячеек будет очень много - не начнет ли эта штука тормозить?


Название: Re: циклограмма
Отправлено: Igors от Июль 03, 2017, 10:02
Анекдот времен военной кафедры
Цитировать
Одну и ту же работу дали семи солдатам и семи инженерам. Семеро солдат взяли и до обеда сделали. А семь инженеров до вечера обсуждали как сделать лучше - но работа даже не была начата


Название: Re: циклограмма
Отправлено: gil9red от Июль 03, 2017, 10:26
Анекдот времен военной кафедры
Цитировать
Одну и ту же работу дали семи солдатам и семи инженерам. Семеро солдат взяли и до обеда сделали. А семь инженеров до вечера обсуждали как сделать лучше - но работа даже не была начата

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


Название: Re: циклограмма
Отправлено: Igors от Июль 03, 2017, 12:39
...хоть будет костыль на костыле из говна и палок...
Почему любой самостоятельный код обязательно плох? Что за постыдная философия офисного планктона?  :)


Название: Re: циклограмма
Отправлено: gil9red от Июль 03, 2017, 13:59
...хоть будет костыль на костыле из говна и палок...
Почему любой самостоятельный код обязательно плох? Что за постыдная философия офисного планктона?  :)

Потому что в вашем примере солдаты сделают на отъебись (костыль на костыле из ...), а инженеры так что было на века, с расширяемое архитектурой и прочее, прочее
И то, и другое не лучшее решение, нужно искать золотую середину :)


Название: Re: циклограмма
Отправлено: deMax от Июль 07, 2017, 11:40
Свою старую взял, думаю оптимальнее будет, таблица не совсем удовлетворяет.
собственно, есть строки(с названиями объектов и прочими атрибутами), а есть блоки на циклограмме, допустим каждый блок имеет следующие данные: номер строки, время начала, время конца, цвет(или другие атрибуты).
Циклограмма умеет перемещаться в текущее время(и показывать новые данные) или перемещаться в заданное время. Вся циклограмма в памяти не поместиться(достаточно хранить то что на экране и за краями, максимум месяц).
Как оптимальнее хранить блоки? Имхо отсортировать QList и рисуем начиная от блока у которого конец левее левой части виджета, до блока у которого начало правее. Но поиск по QList не особо быстр, QMap хранит в красно-черном дереве и вставки не особо быстрые. С другой стороны данных за месяц вряд ли будет больше миллиона, и все это не такое и узкое место.

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