Commit 66bf6b9c authored by Peter Zhigalov's avatar Peter Zhigalov

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

parent c00165d3
......@@ -4,7 +4,10 @@
#include <QVector>
#include <QSvgGenerator>
#include <QPrinter>
#include <QColorDialog>
#include <QInputDialog>
#include <algorithm>
#include <cmath>
#include "libs/jo_images.h"
// Конструктор
......@@ -46,6 +49,8 @@ MainWindow::MainWindow(QWidget *parent) :
ui->spinBox_Vectors->setMinimum(1);
ui->spinBox_Vectors->setMaximum(10000);
ui->spinBox_Vectors->setValue(1);
ui->actionShow_Isolines->setChecked(ui->checkBox_Isolines->isChecked());
ui->actionShow_Vectors->setChecked(ui->checkBox_Vectors->isChecked());
// Немного эстетства
this->setWindowTitle("FEM Draw");
......@@ -416,6 +421,92 @@ void MainWindow::on_actionDecrease_Interpolation_triggered()
}
}
// Событие при переключении рисования изолиний из меню
void MainWindow::on_actionShow_Isolines_triggered()
{
ui->checkBox_Isolines->click();
}
// Событие при запросе конфигурации цвета изолиний
void MainWindow::on_actionIsolines_Color_triggered()
{
QColor color = QColorDialog::getColor(ui->widget->isolines_config.color, this, trUtf8("Select Isolines Color"));
if(color != ui->widget->isolines_config.color)
{
ui->widget->isolines_config.color = color;
ui->widget->invalidate();
}
}
// Событие при запросе конфигурации толщины изолиний
void MainWindow::on_actionIsolines_Width_triggered()
{
bool ok = false;
float width = (float)QInputDialog::getDouble(this, trUtf8("Width"), trUtf8("Select Isolines Width:"),
(double)ui->widget->isolines_config.width, 1.0, 10.0, 1, &ok);
if(ok && fabs(width - ui->widget->isolines_config.width) > 1e-5)
{
ui->widget->isolines_config.width = width;
ui->widget->invalidate();
}
}
// Событие при переключении рисования векторов из меню
void MainWindow::on_actionShow_Vectors_triggered()
{
ui->checkBox_Vectors->click();
}
// Событие при запросе конфигурации цвета векторов
void MainWindow::on_actionVectors_Color_triggered()
{
QColor color = QColorDialog::getColor(ui->widget->vectors_config.color, this, trUtf8("Select Vectors Color"));
if(color != ui->widget->vectors_config.color)
{
ui->widget->vectors_config.color = color;
ui->widget->invalidate();
}
}
// Событие при запросе конфигурации толщины векторов
void MainWindow::on_actionVectors_Width_triggered()
{
bool ok = false;
float width = (float)QInputDialog::getDouble(this, trUtf8("Width"), trUtf8("Select Vectors Width:"),
(double)ui->widget->vectors_config.width, 1.0, 10.0, 1, &ok);
if(ok && fabs(width - ui->widget->vectors_config.width) > 1e-5)
{
ui->widget->vectors_config.width = width;
ui->widget->invalidate();
}
}
// Событие при запросе конфигурации длины векторов
void MainWindow::on_actionVectors_Length_triggered()
{
bool ok = false;
float length = (float)QInputDialog::getDouble(this, trUtf8("Length"), trUtf8("Select Vectors Length:"),
(double)ui->widget->vectors_config.length, 1.0, 100.0, 1, &ok);
if(ok && fabs(length - ui->widget->vectors_config.length) > 1e-5)
{
ui->widget->vectors_config.length = length;
ui->widget->invalidate();
}
}
// Событие при запросе конфигурации размера стрелок векторов
void MainWindow::on_actionArrowSize_triggered()
{
bool ok = false;
float arrow_size = (float)QInputDialog::getDouble(this, trUtf8("Arrow Size"), trUtf8("Select Arrow Size:"),
(double)ui->widget->vectors_config.arrow_size, 1.0, 25.0, 1, &ok);
if(ok && fabs(arrow_size - ui->widget->vectors_config.arrow_size) > 1e-5)
{
ui->widget->vectors_config.arrow_size = arrow_size;
ui->widget->invalidate();
}
}
// Событие при переключении рисования легенды
void MainWindow::on_actionShow_Legend_triggered()
{
......@@ -456,7 +547,7 @@ void MainWindow::on_actionAbout_FEM_Draw_triggered()
msgBox.setText("<b>FEM Draw v1.5 (Qt)</b><br><br>"
"<a href=\"https://fami.codefreak.ru/osp/fem_draw/\">https://fami.codefreak.ru/osp/fem_draw/</a><br>"
"License: <a href=\"http://www.gnu.org/copyleft/gpl.html\">GNU GPL v3</a><br><br>"
"Copyright &copy; 2014-2015<br>"
"Copyright &copy; 2014-2016<br>"
"Peter Zhigalov &lt;<a href=\"mailto:peter.zhigalov@gmail.com\">peter.zhigalov@gmail.com</a>&gt;");
msgBox.setIconPixmap(QPixmap::fromImage(QImage(":/resources/icon_64.png")));
msgBox.setWindowIcon(QIcon(":/resources/icon.ico"));
......@@ -513,7 +604,9 @@ void MainWindow::on_comboBox_Color_currentIndexChanged(int index)
// Событие при переключении рисования изолиний
void MainWindow::on_checkBox_Isolines_clicked()
{
ui->widget->draw_isolines = ui->checkBox_Isolines->isChecked();
bool status = ui->checkBox_Isolines->isChecked();
ui->actionShow_Isolines->setChecked(status);
ui->widget->draw_isolines = status;
ui->widget->invalidate();
}
......@@ -534,7 +627,9 @@ void MainWindow::on_spinBox_Isolines_valueChanged(int arg1)
// Переключение рисовки векторов
void MainWindow::on_checkBox_Vectors_clicked()
{
ui->widget->draw_vectors = ui->checkBox_Vectors->isChecked();
bool status = ui->checkBox_Vectors->isChecked();
ui->actionShow_Vectors->setChecked(status);
ui->widget->draw_vectors = status;
ui->widget->invalidate();
}
......
......@@ -47,6 +47,22 @@ private slots:
// Событие при изменении уровня интерполяции
void on_actionIncrease_Interpolation_triggered();
void on_actionDecrease_Interpolation_triggered();
// Событие при переключении рисования изолиний из меню
void on_actionShow_Isolines_triggered();
// Событие при запросе конфигурации цвета изолиний
void on_actionIsolines_Color_triggered();
// Событие при запросе конфигурации толщины изолиний
void on_actionIsolines_Width_triggered();
// Событие при переключении рисования векторов из меню
void on_actionShow_Vectors_triggered();
// Событие при запросе конфигурации цвета векторов
void on_actionVectors_Color_triggered();
// Событие при запросе конфигурации толщины векторов
void on_actionVectors_Width_triggered();
// Событие при запросе конфигурации длины векторов
void on_actionVectors_Length_triggered();
// Событие при запросе конфигурации размера стрелок векторов
void on_actionArrowSize_triggered();
// Событие при переключении рисования легенды
void on_actionShow_Legend_triggered();
// Событие при переключении использования светлых цветов
......
......@@ -212,17 +212,37 @@
<addaction name="actionUse_Purple_Colors"/>
<addaction name="actionMemory_Limit"/>
</widget>
<widget class="QMenu" name="menuIsolines">
<property name="title">
<string>Isolines</string>
</property>
<addaction name="actionShow_Isolines"/>
<addaction name="actionIsolines_Color"/>
<addaction name="actionIsolines_Width"/>
</widget>
<widget class="QMenu" name="menuVectors">
<property name="title">
<string>Vectors</string>
</property>
<addaction name="actionShow_Vectors"/>
<addaction name="actionVectors_Color"/>
<addaction name="actionVectors_Width"/>
<addaction name="actionVectors_Length"/>
<addaction name="actionArrowSize"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuInterpolation"/>
<addaction name="menuIsolines"/>
<addaction name="menuVectors"/>
<addaction name="menuConfiguration"/>
<addaction name="menuAbout"/>
</widget>
<action name="actionOpen_Tecplot_File">
<property name="text">
<string>Open Tecplot File</string>
<string>Open Tecplot File...</string>
</property>
<property name="toolTip">
<string>Open Tecplot file</string>
<string>Open Tecplot File...</string>
</property>
<property name="shortcut">
<string>Ctrl+O</string>
......@@ -230,10 +250,10 @@
</action>
<action name="actionSave_Image_File">
<property name="text">
<string>Save Image File</string>
<string>Save Image File...</string>
</property>
<property name="toolTip">
<string>Save Image File</string>
<string>Save Image File...</string>
</property>
<property name="shortcut">
<string>Ctrl+S</string>
......@@ -271,17 +291,17 @@
</action>
<action name="actionAbout_FEM_Draw">
<property name="text">
<string>About FEM Draw</string>
<string>About FEM Draw...</string>
</property>
</action>
<action name="actionAbout_Third_Party_Libraries">
<property name="text">
<string>About Third Party Libraries</string>
<string>About Third Party Libraries...</string>
</property>
</action>
<action name="actionAbout_Qt">
<property name="text">
<string>About Qt</string>
<string>About Qt...</string>
</property>
</action>
<action name="actionTransparent_Image">
......@@ -292,6 +312,52 @@
<string>Transparent Image</string>
</property>
</action>
<action name="actionShow_Isolines">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Show Isolines</string>
</property>
</action>
<action name="actionIsolines_Color">
<property name="text">
<string>Isolines Color...</string>
</property>
</action>
<action name="actionIsolines_Width">
<property name="text">
<string>Isolines Width...</string>
</property>
</action>
<action name="actionShow_Vectors">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Show Vectors</string>
</property>
</action>
<action name="actionVectors_Color">
<property name="text">
<string>Vectors Color...</string>
</property>
</action>
<action name="actionVectors_Width">
<property name="text">
<string>Vectors Width...</string>
</property>
</action>
<action name="actionVectors_Length">
<property name="text">
<string>Vectors Length...</string>
</property>
</action>
<action name="actionArrowSize">
<property name="text">
<string>Vectors Arrow Size...</string>
</property>
</action>
<action name="actionShow_Legend">
<property name="checkable">
<bool>true</bool>
......
......@@ -737,6 +737,8 @@ paintwidget::paintwidget(QWidget * parent) : QWidget(parent)
div_num = 2;
vect_value = 1;
isolines_config = lines_config(Qt::black, 1.0f);
vectors_config = lines_config(Qt::black, 1.0f, 10.0f, 5.0f);
use_purple = false;
use_legend = true;
use_light_colors = true;
......@@ -1086,10 +1088,10 @@ void paintwidget::draw(QPaintDevice * device, bool transparency, bool is_svg)
}
}
painter.setPen(QPen(Qt::black, 1.0f));
// Изолинии рисуем только если оно нам надо
if(draw_isolines)
{
painter.setPen(QPen(isolines_config.color, isolines_config.width));
// Узлы изолиний с номерами (нужно для графов для SVG)
QList<QPointN> isol_nodes_l;
// Списки смежности узлов изолиний (нужно для графов для SVG)
......@@ -1320,10 +1322,9 @@ void paintwidget::draw(QPaintDevice * device, bool transparency, bool is_svg)
if(draw_vectors)
{
painter.setPen(QPen(Qt::black, 1.0f));
painter.setBrush(QBrush(Qt::black));
painter.setPen(QPen(vectors_config.color, vectors_config.width));
float vec_len = 10.0f, arrow_len = 5.0f;
float vec_len = vectors_config.length, arrow_len = vectors_config.arrow_size;
float angle = 38.0f * 3.14159265358979323846f / 180.0f;
float sin_angle = std::sin(angle), cos_angle = std::cos(angle);
......
......@@ -99,6 +99,18 @@ public:
}
};
// Класс конфигурация для объектов-линий (изолиний, векторов)
class lines_config
{
public:
QColor color;
float width;
float length;
float arrow_size;
lines_config(QColor n_color = Qt::black, float n_width = 1.0f, float n_length = 10.0f, float n_arrow_size = 5.0f)
: color(n_color), width(n_width), length(n_length), arrow_size(n_arrow_size) {}
};
// Класс виджет для рисования на QPaintDevice
class paintwidget : public QWidget
{
......@@ -158,6 +170,10 @@ public:
// Перерисовать, сбросив валидность буфера
void invalidate();
// Конфигурация изолиний
lines_config isolines_config;
// Конфигурация векторов
lines_config vectors_config;
// Использовать ли фиолетовые оттенки цвета
// Дает большую комбинацию оттенков, но приводит к
// некоторому дисбалансу между красным и синим
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment