///////////////////////////////////////////////////////////////////////////////////////////////////
// lens.h
// Пример диалогового окна для задания конструктивных параметров и отображения оптической системы.
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// Университет ИТМО
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef _DQTOPTICALSYSTEM
#define _DQTOPTICALSYSTEM
#include "ui_lens.h"
#include <QAction>
//-------------------------------------------------------------------------------------------------
// структура конструктивных параметров одной поверхности
// (упрощенная форма хранения оптической системы - при создании вычислительных классов подлежит замене!)
struct OSurface
{
OSurface()
: r(0.), d(0.), h(0.), n(1.)
{};
double r;
double d;
double h;
double n;
};
//-------------------------------------------------------------------------------------------------
class DQtOpticalSystem : public QDialog
{
Q_OBJECT
public:
/// @brief Constructor
DQtOpticalSystem(QWidget* parent = 0, Qt::WindowFlags f = 0);
/// @brief Destructor
~DQtOpticalSystem();
// обработка событий
public slots:
// обработка смены закладки
void OnTabChange();
// обработка добавления новой поверхности в таблицу
void OnAddSurface();
// обработка удаления поверхности из таблицы
void OnDeleteSurface();
// обработка всех событий на диалоговом окне (перегруженная функция)
// перехватывается ТОЛЬКО событие рисования на закладке с рисованием)
bool eventFilter(QObject *obj, QEvent *evt);
// Attributes
private:
/// ресурсы деалога
Ui::DQtOpticalSystem m_ui;
// указатель на пункт меню добавления поверхности в таблицу
QAction *m_pqAddSurface;
// указатель на пункт меню удаления поверхности из таблицы
QAction *m_pqDeleteSurface;
// конструктивные параметры оптической системы
// (упрощенная форма хранения оптической системы - при создании вычислительных классов подлежит замене!)
std::vector<OSurface> m_oSystem;
// добавляет одну поверхность в таблицу с конструктивными параметрами
// oSurf_p - параметры поверхности, которая будет добавлена
// iRow_p - номер, под которым будет добавлена поверхность
void AddOSParamRow(const OSurface& oSurf_p, int iRow_p);
// создает одну ячейку таблицы с double значением dValue_p
QTableWidgetItem* CreateTableItem(double dValue_p) const;
// записать параметры О.С. из таблицы в m_oSystem
void GetOSParams();
// записать параметры О.С. из m_oSystem в таблицу
void SetOSParam();
// рисование О.С. в QPainter
void DrawOs(QPainter& p);
// создание замкнутого контура одной линзы
// qPath_p - контур линзы
// dX_p - реальная координата X линзы (точка пересечения 1й поверхности и оси)
// iIndex_p - номер первой поверхности линзы в m_oSystem
void DrawLens(QPainterPath& qPath_p, double dX_p, int iIndex_p);
};
//-------------------------------------------------------------------------------------------------
#endif // _DQTOPTICALSYSTEM