Commit 66bf6b9ceaa37963f008f3e420786fbb0327bebc

Authored by Peter Zhigalov
1 parent c00165d3

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

src_qt/mainwindow.cpp
... ... @@ -4,7 +4,10 @@
4 4 #include <QVector>
5 5 #include <QSvgGenerator>
6 6 #include <QPrinter>
  7 +#include <QColorDialog>
  8 +#include <QInputDialog>
7 9 #include <algorithm>
  10 +#include <cmath>
8 11 #include "libs/jo_images.h"
9 12  
10 13 // Конструктор
... ... @@ -46,6 +49,8 @@ MainWindow::MainWindow(QWidget *parent) :
46 49 ui->spinBox_Vectors->setMinimum(1);
47 50 ui->spinBox_Vectors->setMaximum(10000);
48 51 ui->spinBox_Vectors->setValue(1);
  52 + ui->actionShow_Isolines->setChecked(ui->checkBox_Isolines->isChecked());
  53 + ui->actionShow_Vectors->setChecked(ui->checkBox_Vectors->isChecked());
49 54  
50 55 // Немного эстетства
51 56 this->setWindowTitle("FEM Draw");
... ... @@ -416,6 +421,92 @@ void MainWindow::on_actionDecrease_Interpolation_triggered()
416 421 }
417 422 }
418 423  
  424 +// Событие при переключении рисования изолиний из меню
  425 +void MainWindow::on_actionShow_Isolines_triggered()
  426 +{
  427 + ui->checkBox_Isolines->click();
  428 +}
  429 +
  430 +// Событие при запросе конфигурации цвета изолиний
  431 +void MainWindow::on_actionIsolines_Color_triggered()
  432 +{
  433 + QColor color = QColorDialog::getColor(ui->widget->isolines_config.color, this, trUtf8("Select Isolines Color"));
  434 + if(color != ui->widget->isolines_config.color)
  435 + {
  436 + ui->widget->isolines_config.color = color;
  437 + ui->widget->invalidate();
  438 + }
  439 +}
  440 +
  441 +// Событие при запросе конфигурации толщины изолиний
  442 +void MainWindow::on_actionIsolines_Width_triggered()
  443 +{
  444 + bool ok = false;
  445 + float width = (float)QInputDialog::getDouble(this, trUtf8("Width"), trUtf8("Select Isolines Width:"),
  446 + (double)ui->widget->isolines_config.width, 1.0, 10.0, 1, &ok);
  447 + if(ok && fabs(width - ui->widget->isolines_config.width) > 1e-5)
  448 + {
  449 + ui->widget->isolines_config.width = width;
  450 + ui->widget->invalidate();
  451 + }
  452 +}
  453 +
  454 +// Событие при переключении рисования векторов из меню
  455 +void MainWindow::on_actionShow_Vectors_triggered()
  456 +{
  457 + ui->checkBox_Vectors->click();
  458 +}
  459 +
  460 +// Событие при запросе конфигурации цвета векторов
  461 +void MainWindow::on_actionVectors_Color_triggered()
  462 +{
  463 + QColor color = QColorDialog::getColor(ui->widget->vectors_config.color, this, trUtf8("Select Vectors Color"));
  464 + if(color != ui->widget->vectors_config.color)
  465 + {
  466 + ui->widget->vectors_config.color = color;
  467 + ui->widget->invalidate();
  468 + }
  469 +}
  470 +
  471 +// Событие при запросе конфигурации толщины векторов
  472 +void MainWindow::on_actionVectors_Width_triggered()
  473 +{
  474 + bool ok = false;
  475 + float width = (float)QInputDialog::getDouble(this, trUtf8("Width"), trUtf8("Select Vectors Width:"),
  476 + (double)ui->widget->vectors_config.width, 1.0, 10.0, 1, &ok);
  477 + if(ok && fabs(width - ui->widget->vectors_config.width) > 1e-5)
  478 + {
  479 + ui->widget->vectors_config.width = width;
  480 + ui->widget->invalidate();
  481 + }
  482 +}
  483 +
  484 +// Событие при запросе конфигурации длины векторов
  485 +void MainWindow::on_actionVectors_Length_triggered()
  486 +{
  487 + bool ok = false;
  488 + float length = (float)QInputDialog::getDouble(this, trUtf8("Length"), trUtf8("Select Vectors Length:"),
  489 + (double)ui->widget->vectors_config.length, 1.0, 100.0, 1, &ok);
  490 + if(ok && fabs(length - ui->widget->vectors_config.length) > 1e-5)
  491 + {
  492 + ui->widget->vectors_config.length = length;
  493 + ui->widget->invalidate();
  494 + }
  495 +}
  496 +
  497 +// Событие при запросе конфигурации размера стрелок векторов
  498 +void MainWindow::on_actionArrowSize_triggered()
  499 +{
  500 + bool ok = false;
  501 + float arrow_size = (float)QInputDialog::getDouble(this, trUtf8("Arrow Size"), trUtf8("Select Arrow Size:"),
  502 + (double)ui->widget->vectors_config.arrow_size, 1.0, 25.0, 1, &ok);
  503 + if(ok && fabs(arrow_size - ui->widget->vectors_config.arrow_size) > 1e-5)
  504 + {
  505 + ui->widget->vectors_config.arrow_size = arrow_size;
  506 + ui->widget->invalidate();
  507 + }
  508 +}
  509 +
419 510 // Событие при переключении рисования легенды
420 511 void MainWindow::on_actionShow_Legend_triggered()
421 512 {
... ... @@ -456,7 +547,7 @@ void MainWindow::on_actionAbout_FEM_Draw_triggered()
456 547 msgBox.setText("<b>FEM Draw v1.5 (Qt)</b><br><br>"
457 548 "<a href=\"https://fami.codefreak.ru/osp/fem_draw/\">https://fami.codefreak.ru/osp/fem_draw/</a><br>"
458 549 "License: <a href=\"http://www.gnu.org/copyleft/gpl.html\">GNU GPL v3</a><br><br>"
459   - "Copyright &copy; 2014-2015<br>"
  550 + "Copyright &copy; 2014-2016<br>"
460 551 "Peter Zhigalov &lt;<a href=\"mailto:peter.zhigalov@gmail.com\">peter.zhigalov@gmail.com</a>&gt;");
461 552 msgBox.setIconPixmap(QPixmap::fromImage(QImage(":/resources/icon_64.png")));
462 553 msgBox.setWindowIcon(QIcon(":/resources/icon.ico"));
... ... @@ -513,7 +604,9 @@ void MainWindow::on_comboBox_Color_currentIndexChanged(int index)
513 604 // Событие при переключении рисования изолиний
514 605 void MainWindow::on_checkBox_Isolines_clicked()
515 606 {
516   - ui->widget->draw_isolines = ui->checkBox_Isolines->isChecked();
  607 + bool status = ui->checkBox_Isolines->isChecked();
  608 + ui->actionShow_Isolines->setChecked(status);
  609 + ui->widget->draw_isolines = status;
517 610 ui->widget->invalidate();
518 611 }
519 612  
... ... @@ -534,7 +627,9 @@ void MainWindow::on_spinBox_Isolines_valueChanged(int arg1)
534 627 // Переключение рисовки векторов
535 628 void MainWindow::on_checkBox_Vectors_clicked()
536 629 {
537   - ui->widget->draw_vectors = ui->checkBox_Vectors->isChecked();
  630 + bool status = ui->checkBox_Vectors->isChecked();
  631 + ui->actionShow_Vectors->setChecked(status);
  632 + ui->widget->draw_vectors = status;
538 633 ui->widget->invalidate();
539 634 }
540 635  
... ...
src_qt/mainwindow.h
... ... @@ -47,6 +47,22 @@ private slots:
47 47 // Событие при изменении уровня интерполяции
48 48 void on_actionIncrease_Interpolation_triggered();
49 49 void on_actionDecrease_Interpolation_triggered();
  50 + // Событие при переключении рисования изолиний из меню
  51 + void on_actionShow_Isolines_triggered();
  52 + // Событие при запросе конфигурации цвета изолиний
  53 + void on_actionIsolines_Color_triggered();
  54 + // Событие при запросе конфигурации толщины изолиний
  55 + void on_actionIsolines_Width_triggered();
  56 + // Событие при переключении рисования векторов из меню
  57 + void on_actionShow_Vectors_triggered();
  58 + // Событие при запросе конфигурации цвета векторов
  59 + void on_actionVectors_Color_triggered();
  60 + // Событие при запросе конфигурации толщины векторов
  61 + void on_actionVectors_Width_triggered();
  62 + // Событие при запросе конфигурации длины векторов
  63 + void on_actionVectors_Length_triggered();
  64 + // Событие при запросе конфигурации размера стрелок векторов
  65 + void on_actionArrowSize_triggered();
50 66 // Событие при переключении рисования легенды
51 67 void on_actionShow_Legend_triggered();
52 68 // Событие при переключении использования светлых цветов
... ...
src_qt/mainwindow.ui
... ... @@ -212,17 +212,37 @@
212 212 <addaction name="actionUse_Purple_Colors"/>
213 213 <addaction name="actionMemory_Limit"/>
214 214 </widget>
  215 + <widget class="QMenu" name="menuIsolines">
  216 + <property name="title">
  217 + <string>Isolines</string>
  218 + </property>
  219 + <addaction name="actionShow_Isolines"/>
  220 + <addaction name="actionIsolines_Color"/>
  221 + <addaction name="actionIsolines_Width"/>
  222 + </widget>
  223 + <widget class="QMenu" name="menuVectors">
  224 + <property name="title">
  225 + <string>Vectors</string>
  226 + </property>
  227 + <addaction name="actionShow_Vectors"/>
  228 + <addaction name="actionVectors_Color"/>
  229 + <addaction name="actionVectors_Width"/>
  230 + <addaction name="actionVectors_Length"/>
  231 + <addaction name="actionArrowSize"/>
  232 + </widget>
215 233 <addaction name="menuFile"/>
216 234 <addaction name="menuInterpolation"/>
  235 + <addaction name="menuIsolines"/>
  236 + <addaction name="menuVectors"/>
217 237 <addaction name="menuConfiguration"/>
218 238 <addaction name="menuAbout"/>
219 239 </widget>
220 240 <action name="actionOpen_Tecplot_File">
221 241 <property name="text">
222   - <string>Open Tecplot File</string>
  242 + <string>Open Tecplot File...</string>
223 243 </property>
224 244 <property name="toolTip">
225   - <string>Open Tecplot file</string>
  245 + <string>Open Tecplot File...</string>
226 246 </property>
227 247 <property name="shortcut">
228 248 <string>Ctrl+O</string>
... ... @@ -230,10 +250,10 @@
230 250 </action>
231 251 <action name="actionSave_Image_File">
232 252 <property name="text">
233   - <string>Save Image File</string>
  253 + <string>Save Image File...</string>
234 254 </property>
235 255 <property name="toolTip">
236   - <string>Save Image File</string>
  256 + <string>Save Image File...</string>
237 257 </property>
238 258 <property name="shortcut">
239 259 <string>Ctrl+S</string>
... ... @@ -271,17 +291,17 @@
271 291 </action>
272 292 <action name="actionAbout_FEM_Draw">
273 293 <property name="text">
274   - <string>About FEM Draw</string>
  294 + <string>About FEM Draw...</string>
275 295 </property>
276 296 </action>
277 297 <action name="actionAbout_Third_Party_Libraries">
278 298 <property name="text">
279   - <string>About Third Party Libraries</string>
  299 + <string>About Third Party Libraries...</string>
280 300 </property>
281 301 </action>
282 302 <action name="actionAbout_Qt">
283 303 <property name="text">
284   - <string>About Qt</string>
  304 + <string>About Qt...</string>
285 305 </property>
286 306 </action>
287 307 <action name="actionTransparent_Image">
... ... @@ -292,6 +312,52 @@
292 312 <string>Transparent Image</string>
293 313 </property>
294 314 </action>
  315 + <action name="actionShow_Isolines">
  316 + <property name="checkable">
  317 + <bool>true</bool>
  318 + </property>
  319 + <property name="text">
  320 + <string>Show Isolines</string>
  321 + </property>
  322 + </action>
  323 + <action name="actionIsolines_Color">
  324 + <property name="text">
  325 + <string>Isolines Color...</string>
  326 + </property>
  327 + </action>
  328 + <action name="actionIsolines_Width">
  329 + <property name="text">
  330 + <string>Isolines Width...</string>
  331 + </property>
  332 + </action>
  333 + <action name="actionShow_Vectors">
  334 + <property name="checkable">
  335 + <bool>true</bool>
  336 + </property>
  337 + <property name="text">
  338 + <string>Show Vectors</string>
  339 + </property>
  340 + </action>
  341 + <action name="actionVectors_Color">
  342 + <property name="text">
  343 + <string>Vectors Color...</string>
  344 + </property>
  345 + </action>
  346 + <action name="actionVectors_Width">
  347 + <property name="text">
  348 + <string>Vectors Width...</string>
  349 + </property>
  350 + </action>
  351 + <action name="actionVectors_Length">
  352 + <property name="text">
  353 + <string>Vectors Length...</string>
  354 + </property>
  355 + </action>
  356 + <action name="actionArrowSize">
  357 + <property name="text">
  358 + <string>Vectors Arrow Size...</string>
  359 + </property>
  360 + </action>
295 361 <action name="actionShow_Legend">
296 362 <property name="checkable">
297 363 <bool>true</bool>
... ...
src_qt/paintwidget.cpp
... ... @@ -737,6 +737,8 @@ paintwidget::paintwidget(QWidget * parent) : QWidget(parent)
737 737 div_num = 2;
738 738 vect_value = 1;
739 739  
  740 + isolines_config = lines_config(Qt::black, 1.0f);
  741 + vectors_config = lines_config(Qt::black, 1.0f, 10.0f, 5.0f);
740 742 use_purple = false;
741 743 use_legend = true;
742 744 use_light_colors = true;
... ... @@ -1086,10 +1088,10 @@ void paintwidget::draw(QPaintDevice * device, bool transparency, bool is_svg)
1086 1088 }
1087 1089 }
1088 1090  
1089   - painter.setPen(QPen(Qt::black, 1.0f));
1090 1091 // Изолинии рисуем только если оно нам надо
1091 1092 if(draw_isolines)
1092 1093 {
  1094 + painter.setPen(QPen(isolines_config.color, isolines_config.width));
1093 1095 // Узлы изолиний с номерами (нужно для графов для SVG)
1094 1096 QList<QPointN> isol_nodes_l;
1095 1097 // Списки смежности узлов изолиний (нужно для графов для SVG)
... ... @@ -1320,10 +1322,9 @@ void paintwidget::draw(QPaintDevice * device, bool transparency, bool is_svg)
1320 1322  
1321 1323 if(draw_vectors)
1322 1324 {
1323   - painter.setPen(QPen(Qt::black, 1.0f));
1324   - painter.setBrush(QBrush(Qt::black));
  1325 + painter.setPen(QPen(vectors_config.color, vectors_config.width));
1325 1326  
1326   - float vec_len = 10.0f, arrow_len = 5.0f;
  1327 + float vec_len = vectors_config.length, arrow_len = vectors_config.arrow_size;
1327 1328 float angle = 38.0f * 3.14159265358979323846f / 180.0f;
1328 1329 float sin_angle = std::sin(angle), cos_angle = std::cos(angle);
1329 1330  
... ...
src_qt/paintwidget.h
... ... @@ -99,6 +99,18 @@ public:
99 99 }
100 100 };
101 101  
  102 +// Класс конфигурация для объектов-линий (изолиний, векторов)
  103 +class lines_config
  104 +{
  105 +public:
  106 + QColor color;
  107 + float width;
  108 + float length;
  109 + float arrow_size;
  110 + lines_config(QColor n_color = Qt::black, float n_width = 1.0f, float n_length = 10.0f, float n_arrow_size = 5.0f)
  111 + : color(n_color), width(n_width), length(n_length), arrow_size(n_arrow_size) {}
  112 +};
  113 +
102 114 // Класс виджет для рисования на QPaintDevice
103 115 class paintwidget : public QWidget
104 116 {
... ... @@ -158,6 +170,10 @@ public:
158 170 // Перерисовать, сбросив валидность буфера
159 171 void invalidate();
160 172  
  173 + // Конфигурация изолиний
  174 + lines_config isolines_config;
  175 + // Конфигурация векторов
  176 + lines_config vectors_config;
161 177 // Использовать ли фиолетовые оттенки цвета
162 178 // Дает большую комбинацию оттенков, но приводит к
163 179 // некоторому дисбалансу между красным и синим
... ...