Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


Пример 1.
Задание конструктивных параметов и отображение оптической системы

Описание диалога (файл lens.h)

///////////////////////////////////////////////////////////////////////////////////////////////////
// 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