МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Кафедра Прикладой математики ОТЧЕТ ПО ПРЕДДИПЛОМАНОЙ ПРАКТИКЕ СТУДЕНТА Голубевой Владиславы Владимировны (фамилия, имя, отчество автора) Разработка программной системы хранения и визуализации геофизических данных Направление подготовки 010500 - «Прикладная математика и информатика» Руководитель Автор Чернышев А.В. Голубева В.В. (фамилия, И.О.) (фамилия, И.О.) к.т.н. ФПМИ, ПМ-71 (уч. степень, уч. звание) (факультет, группа) (подпись, дата) (подпись, дата) Новосибирск, 2012 г. 1 Оглавление Введение............................................................................................................... 3 1. Анализ требований к продукту .................................................................. 5 2. Требования к программе ............................................................................. 7 2.1. Требования к данным ........................................................................... 7 2.2. Требования к интерфейсу..................................................................... 7 2.3. Требования к реализации ..................................................................... 7 3. Выбор средств реализации ......................................................................... 8 4. Проектирование системы ........................................................................... 9 4.1. Прецеденты ............................................................................................ 9 4.2. Проектирование базы данных............................................................ 12 4.2.1. Набор сущностей ......................................................................... 12 4.2.2. Набор атрибутов ........................................................................... 12 4.2.3. Связи между сущностями ............................................................ 13 4.2.4. Множественность и условность связей ...................................... 14 4.2.5. ER-диаграмма ................................................................................ 14 4.2.6. Создание спроектированной базы данных ................................. 15 4.3. Проектирование программного комплекса ...................................... 17 4.3.1. Выделенные подсистемы ............................................................. 18 4.3.1. Описание классов.......................................................................... 19 4.3.2. UML-диаграмма классов .............................................................. 37 5. Результаты работы программы ................................................................ 44 Заключение ........................................................................................................ 47 Список использованных источников .............................................................. 49 2 Введение Распространенной задачей в области компьютерной графики является задача визуализация данных, полученных в результате некоторых вычислений. Данная задача является естественной для компьютера, так как он умеет обрабатывать числа быстро и в больших количествах. С точки зрения пользователя визуальное восприятие данных гораздо проще, чем какие бы то ни было другие представления – например, таблицы. Хотя оно может оказаться менее точным. Одной из областей человеческой деятельности, порождающей огромное количество данных, требующих визуального представления, является геофизическая разведка. Данная работа посвящена разработке программного обеспечения для визуализации геофизических данных. Важной задачей при разработке программного обеспечения является написание легко расширяемого и поддерживаемого программного кода. В течение нескольких десятков лет разработчики решали основную проблему создания программного обеспечения: снижение сложности программного кода [4]. Для этого было выработано множество методик: последовательные и итеративные способы разработки [4], применение шаблонов проектирования[2] и т.д. Цикл разработки программного обеспечения призван стандартизировать этапы создания программного продукта. Он включает следующие этапы: Анализ требований к продукту Разработка спецификации Проектирование архитектуры Реализация и тестирование Внедрение, распространение и поддержка Каждый из этих шагов важен, поскольку позволяет значительно сократить количество ошибок на последующих этапах. Обратно, исправление ошибки, допущенной на раннем этапе, в поздней стадии развития продукта может 3 обернуться очень серьезными накладными расходами. Так, исправление ошибки на этапе тестирования, допущенной в анализе требований, обходится в 15 раз дороже, чем исправление этой же ошибки на этапе формирования требований[4]. Один из этапов цикла разработки - этап проектирования, значительно облегчается при использовании шаблонов проектирования. Шаблоны проектирования позволяют повторно использовать удачное архитектурное решение, найденное другими разработчиками. Библиотека шаблонов используется также как и библиотека алгоритмов, но применяется гораздо раньше – на этапе проектирования системы. В данной работе были выполнены все подготовительные этапы и применены некоторые шаблоны проектирования. 4 1. Анализ требований к продукту Спроектировать и реализовать модуль, отвечающий за обработку и представление геофизических данных. Данные представляют собой измерения, собранные на какой-либо местности с помощью «петель» и «пикетов». В каждом пикете, соответствующем одной петле, замеряется ЭДС как табличная функция времени. Петля: генераторный контур, имеет форму квадрата или круга. Квадрат задается центром и стороной. Круг задается центром и радиусом. Характеристики петли: Форма Угол поворота Размер (сторона или радиус) Ток Количество витков Фронт спада Центр X Центр Y Пикет: точка, в которой делаются измерения Характеристики пикета Координаты X, Y, Z Высота Оборудование (петля) ЭДС: табличная функция ЭДС(t) Характеристики ЭДС значение в вольтах время в секундах 5 К одной петле привязано много пикетов, одному пикету соответствует только одна ЭДС и только одна петля. 6 2. Требования к программе 2.1. Требования к данным Данные должны храниться в базе данных на удаленном сервере. Возможность импортировать данные из внешнего формата. 2.2. Требования к интерфейсу Необходимо реализовать удобное представление иерархии входных данных. Визуализировать петли, пикеты, ЭДС и их параметры. Необходимо иметь возможность конфигурировать подключение к базе данных. Необходимо иметь возможность выбора набора данных (местности) для визуализации. 2.3 Требования к реализации Разработанный программный комплекс должен обладать следующими свойствами: Кроссплатформенность (Unix/Windows) Отказоустойчивость (отсутствие пользователя, целостность данных) 7 соединения, ошибки ввода 3. Выбор средств реализации В качестве средства разработки был выбран язык С++ [3] с библиотекой QT [1]. Причина: QT кроссплатформенная библиотека, C++ позволяет добиться лучшей производительности программного кода. Также QT значительно облегчает доступ базе данным и создание оконного интерфейса на кроссплатформенном уровне. Для визуализации сложных элементов интерфейса (например, графика кривой ЭДС) используется библиотека OpenGL [5], так как она поддерживает аппаратное ускорение отрисовки двумерной графики, а также является кроссплатформенной. В качестве СУБД выбрана MySQL. Это бесплатная СУБД, обеспечивающая высокую производительность, а также обладающая рядом полезных возможностей (триггеры, внешние ключи, представления, партицирование и т.д.). Выбранная среда разработки – QtCreator. Так как она кроссплатформенная, бесплатная, а также является естественной средой разработки под QT. 8 4. Проектирование системы 4.1. Прецеденты 1. Запуск программы a. Пользователь видит диалог конфигурирования соединения с базой данных, если отсутствуют сохраненные настройки соединения b. Если существуют сохраненные настройки соединения, программа пытается подключиться к базе данных c. В случае ошибки подключения пользователь видит сообщение «Подключение не выполнено» с текстом ошибки. 2. Конфигурирование подключения к базе данных a. Пользователь выбирает пункт меню «База данных» b. Пользователь выбирает подпункт «Конфигурация подключения» пункта меню «База данных» c. Пользователь видит диалог настройки подключения d. Пользователь заполняет поля «Имя базы данных», «Логин», «Пароль», «Имя хоста» e. Пользователь нажимает кнопку «Подключиться» f. В случае ошибки подключения пользователь видит сообщение «Подключение не выполнено» с текстом ошибки. g. В случае успешного подключения программа сохраняет настройки в постоянном хранилище (например, в файле) h. Если в диалоге конфигурирования пользователь нажимает «Отмена», диалог закрывается i. В случае отсутствия соединения с базой весь интерфейс блокируется, в а заголовке «Соединение не активно» 3. Выбор набора данных для работы 9 окна появляется надпись a. В случае успешного подключения становится активным пункт меню «Набор данных» b. Пользователь выбирает пункт меню «Набор данных» c. Пользователь выбирает подпункт «Выбрать полигон» пункта меню «Набор данных» d. Пользователь видит диалог поиска полигона e. Пользователь видит список всех существующих в базе данных полигонов f. Пользователь выбирает полигон из списка g. Пользователь нажимает кнопку «Выбрать» h. Диалог закрывается 4. Просмотр иерархии набора данных в выбранном полигоне a. Пользователь выбирает полигон b. Пользователь видит слева в окне два дерева – петли и пикеты. 5. Просмотр диаграммы пикетов и петель a. Пользователь щелкает ЛК мыши по любой петле или пикету b. В рабочей области окна появляется диаграмма пикетов и петель c. Выбранная петля или пикет выделяются цветом d. В правом окне приложения отображается информация о выбранном пикете или петле e. Если ничего не выбрано, диаграмма отображается без выбранных элементов 6. Просмотр информации о пикете и петле с помощью диаграммы a. Пользователь щелкает ЛК мыши по пикету или петле b. В правом окне отображается информация о выбранном пикете или петле c. В левом окне в дереве выбирается узел, соответствующий выбранному пикету или петле 7. Просмотр ЭДС пикетов 10 a. Пользователь щелкает ПК мыши по пикету в диаграмме или дереве b. Пользователь видит контекстное меню c. Пользователь выбирает пункт меню «Просмотреть ЭДС» d. Рабочая область переключается в режим просмотра ЭДС e. На рабочую область добавляется ЭДС от выбранного пикета f. Пользователь щелкает ЛК мыши по рабочей области g. Программа выбирает соответствующую точку на оси времени h. Программа в правом окне отображает значения всех загруженных ЭДС в выбранный момент времени 8. Изменение центра координат рабочей области a. Пользователь нажимает и удерживает нажатой ЛК мыши на свободном месте рабочей области и перемещает мышь – координаты меняются 9. Масштабирование a. Пользователь выделяет рабочую область b. Пользователь крутит колесо мыши – масштаб меняется 10. Изменение шага сетки a. Пользователь видит панель инструментов с активными элементами, которые соответствуют действиям «увеличить шаг по оси x», «уменьшить шаг по оси x» , «уменьшить шаг по оси y», «увеличить шаг по оси y», «1:1» 11. Отображение всех ЭДС выбранной петли a. Пользователь щелкает ПК мыши по петле в дереве b. Пользователь видит контекстное меню в дереве «Посмотреть ЭДС» c. Пользователь выбирает пункт «Посмотреть ЭДС» d. В рабочей области появляется график всех ЭДС, связанных с этой петлей 11 4.2. Проектирование базы данных Набор сущностей Выделен следующий набор сущностей, отражающий предметную область и обеспечивающий её адекватное представление. Полигон (местность) Тип измерений Петля Форма петли Пикет ЭДС Сущность ЭДС в данном случае является набором время/значение. Набор атрибутов Выделен необходимый набор атрибутов для каждой сущности Полигон *ID полигона указывающий Описание местности описательный Тип измерений описательный Петля *ID петли указывающий ID полигона вспомогательный ID формы петли вспомогательный Угол поворота описательный Размер (сторона или радиус) описательный Ток описательный Количество витков описательный 12 Форма петли *ID формы петли указывающий Форма описательный Пикет *ID пикета указывающий ID петли вспомогательный ID эдс вспомогательный X описательный Y описательный Z описательный Высота описательный ЭДС *ID эдс указывающий Вольт описательный Секунды описательный Тип измерений *ID типа измерений указывающий Тип описательный Связи между сущностями Полигон – тип измерений Петля – полигон Петля – форма петли Пикет – петля Пикет – ЭДС 13 Эта связь – результат упрощения связи Пикет – Кривая ЭДС – Координаты ЭДС. Избыточных связей нет. Множественность и условность связей Связь Тип Полигон – тип 1:1 измерений Описание У полигона может быть указан один тип. Один тип может быть у разных полигонов Петля – полигон M:1 Петля может принадлежать только одному полигону. На одном полигоне могут располагаться множество петель Петля – форма петли М:1 У петли может быть только одна геометрическая форма. Одна геометрическая форма может характеризовать множество петель. Пикет – петля М:1 Пикет может принадлежать только одной петле. У одной петли может быть много пикетов. Пикет – ЭДС 1:М У пикета может быть одна кривая ЭДС, у кривой ЭДС – много координат. Для упрощения схемы будем говорить, что у одного пикета может быть много ЭДС (координат). ЭДС может принадлежать только одному пикету. ER-диаграмма Полученная база данных находится в третьей нормальной форме [6]. 14 Создание спроектированной базы данных CREATE TABLE ` MeasurementType` (`idMeasurementType` INT,` type` TEXT) *Обозначающая сущность для Полигон Первичный ключ (idMeasurementType) Ограничения Значение idMeasurementType должно быть уникальным Значение idMeasurementType не должно быть NULL CREATE TABLE `Polygon` (`idPolygon` INT, `idMeasurementType` INT `description` TEXT) *Стержневая сущность Первичный ключ (idPolygon) 15 Внешний ключ (idMeasurementType) из Тип измерений Значение idMeasurementType не должно быть NULL Ограничения Значение idPolygon должно быть уникальным Значение idPolygon не должно быть NULL CREATE TABLE `LoopForm` (`idLoopForm` INT,`form` TEXT) *Обозначающая сущность для Петля Первичный ключ (idLoopForm) Ограничения Значение idLoopForm должно быть уникальным Значение idLoopForm не должно быть NULL CREATE TABLE `GeneratorLoop` ( `idGeneratorLoop` INT, `idPolygon` INT,`idLoopForm` INT,`turnAngle` DOUBLE, `size` DOUBLE, `current` DOUBLE, `turnsNumber` INT, `centerX` INT, `centerY` INT) * Обозначающая сущность для Полигон Первичный ключ (idGeneratorLoop) Внешний ключ (idPolygon) из Полигон Значение idPolygon не должно быть NULL Внешний ключ (idLoopForm) из Форма Петли Значение idLoopForm не должно быть NULL Ограничения Значение idGeneratorLoop должно быть уникальным Значение idGeneratorLoop не должно быть NULL Значение turnAngle не должно быть NULL Значение size не должно быть NULL Значение current не должно быть NULL Значение turnsNumber не должно быть NULL Значение centerX не должно быть NULL 16 Значение centerY не должно быть NULL CREATE TABLE `Emf` (`idEmf` INT, `time` DOUBLE, `value` DOUBLE, PRIMARY KEY (`idEmf`, `time`) ) Первичный ключ (idEmf, time) Ограничения Значение idEmf не должно быть NULL Значение time не должно быть NULL Значение value не должно быть NULL CREATE TABLE `Picket` (`idPicket` INT, `idGeneratorLoop` INT, `idEmf` INT, `x` DOUBLE, `y` DOUBLE, `z` DOUBLE, `height` DOUBLE) Первичный ключ (idPicket) Внешний ключ (idGeneratorLoop) из Петля Внешний ключ (idEmf) из ЭДС Ограничения Значение idPicket должно быть уникальным Значение idPicket не должно быть NULL Значение idEmf не должно быть NULL Значение idGeneratorLoop не должно быть NULL Значение height не должно быть NULL Значение x не должно быть NULL Значение y не должно быть NULL Значение z не должно быть NULL 4.3. Проектирование программного комплекса При проектировании программной системы был использован итеративный подход к созданию набора классов. Изначально в качестве базиса был разработан набор подсистем и выделена их первичная ответственность. 17 Далее каждая подсистема наполнялась классами по мере необходимости. После каждой итерации система проводился пересмотр все системы в целом, и изменялись или удалялись узкие места. Проектирование системы базировалось на принципах проектирования ПО [4]: Принцип единой ответственности Принцип открытости/закрытости Ниже описаны основные классы системы. Выделенные подсистемы Доступ к данным Подсистема доступа к данным отвечает за работу с базой данных. Подсистема доступа к данным позволяет соединяться с выбранной пользователем базой данных. Разработанный класс Settings отвечает за хранение введенных пользователем данных в постоянном хранилище. Для реализации самого соединения был создан класс DbConnection. Также подсистема позволяет иметь доступ к отдельным элементам базы данных. За создание моделей, посредством которых происходит этот доступ, отвечает класс-фабрика DbFabric. Пользовательский интерфейс Подсистема отвечает за общение с пользователем, предоставляет графические элементы управления для редактирования и просмотра данных. Делится на QT (простые элементы) и OpenGL [5] (сложные). Импорт данных Подсистема импорта данных отвечает за конвертацию данных, полученных из внешних источников и добавление их в базу. Исходные данные содержатся в таком формате, из которого импорт в базу данных невозможен. Задача этой подсистемы взять данные, правильно их интерпретировать и перевести в формат, удобный для работы с базой данных (*.csv, *.sql, *.xml). 18 Описание классов SETTINGS Ответственность Использованные Хранит настройки приложения паттерны Паттерн «Одиночка» [2] проектирования Мотивация к созданию Программа содержит настроек, которые редактировать Настройки множество может пользователь. должны сохраняться между запусками программы. Удобно хранить все настройки в одном месте и иметь доступ к ним из любого места программы. Методы Название Ответственность instance Создает или возвращает единственный экземпляр этого класса save Сохраняет настройки приложения в постоянное хранилище load Загружает настройки соединения Settings Приватный конструктор Атрибуты Название Ответственность login Логин для доступа к базе данных password Пароль для доступа к базе данных dbname Имя базы данных hostname Имя хоста, на котором находится база данных idPolygon Идентификатор полигона, который 19 однозначно данных, определяет с которым набор работает программа _instance Переменная хранит объект класса Settings DBCONNECTION Ответственность Создает, хранит и предоставляет доступ к единственному экземпляру соединения с базой данных Использованные паттерны Паттерн «Одиночка» [2] проектирования Мотивация к созданию Надо иметь одно глобальное соединение с базой данных и иметь к нему доступ из любой точки приложение. Одно - из соображений производительности Методы Название Ответственность DbConnection Приватный конструктор instance Создает или возвращает единственный экземпляр этого класса setupConnection Устанавливает соединение getDb Возвращает содержащий объект информацию соединении с базой данных Атрибуты Название Ответственность 20 database, о database Объект хранит информацию о соединении с базой данных _instance Переменная хранит объект класса DbConnection DBFABRIC Ответственность Управляет созданием связанного набора объектов, необходимых для доступа к базе данных Использованные паттерны Паттерн «Фабрика» [2] проектирования Мотивация к созданию Необходимо создавать иметь именно связанные логически объекты инициализировать образом. возможность их Поэтому и правильным используется фабрика. Методы Название Ответственность DbFabric Конструктор класса createPolygonModel Создает модель доступа к таблице «Полигон» createLoopModel Создает модель доступа к таблице «Петля» createPicketModel Создает модель доступа к таблице «Пикет» createEmfModel Создает модель доступа к таблице «ЭДС» 21 Атрибуты Название Ответственность LoopModelColumns Перечисление «Петля», столбцов являющихся таблицы внешними ключами PicketModelColumns Перечисление «Пикет», столбцов являющихся таблицы внешними ключами TREEVIEWADAPTER Ответственность отображает интерфейс модели QSqlRelationalTableModel, используемой для доступа к БД на интерфейс модели QStandardItemModel, пригодной для использования в стандартных представлениях QT Использованные паттерны Паттерн «Адаптер» [2] проектирования Мотивация к созданию С базой работает одна модель, а (стандартное QTreeView представление) принимает другую. Необходимо где-то написать конвертацию одной модели в другую. Идеально для этого подходит адаптер Методы Название Ответственность _prepareRow Переводит строку модели одного вида в строку модели другого вида 22 TreeViewAdapter Конструктор класса. Если передана модель базы данных, добавляет ее addModel Конвертирует пришедшие данные в нужный формат BUILDER Ответственность Управляет созданием графического представления переданной модели Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Каждый объект базы данных может иметь несколько различных представлений. Необходимо отделить процесс конструирования объекта от его представления. Методы Builder Конструктор класса setData Устанавливает значения атрибутов класса getGlobalId Возвращает глобальный идентификатор объекта Атрибуты _model Модель объекта базы данных _modelFilter Фильтр для модели _globalId Глобальный идентификатор объекта INFODOCKELEMENTSBUILDER Ответственность Управляет созданием графического 23 представления переданной модели Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Каждый объект базы данных может иметь несколько различных представлений. Необходимо отделить процесс конструирования объекта от его представления. Методы Название Ответственность build Конструирование объекта _prepareInfoLabel Создание графического представления отдельно взятого объекта PICKETINFODOCKBUILDER Ответственность Реализация абстрактного класса InfoDockElementsBuilder. Отвечает за создание структуры объекта «пикет». Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Необходимость отображать информацию об объекте «Пикет» Методы Название Ответственность build Конструирование объекта _prepareInfoLabel Создание представления пикета 24 графического отдельно взятого EMFINFODOCKBUILDER Ответственность Реализация абстрактного класса InfoDockElementsBuilder. Отвечает за создание структуры объекта «эдс». Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Необходимость отображать информацию об объекте «Эдс» Методы Название Ответственность build Конструирование объекта _prepareInfoLabel Создание графического представления отдельно взятой ЭДС _prepareLabel Не наследуемая функция, отвечает за создание графического представления для переданной пары время/значение DRAWABLEBUILDER Ответственность Управляет созданием графического представления переданной модели Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Каждый объект базы данных может иметь несколько различных представлений. Необходимо отделить процесс конструирования объекта от 25 его представления. Методы Название Ответственность build Конструирование объекта LOOPDRAWABLEBUILDER Ответственность Реализация абстрактного DrawableBuilder. класса Отвечает за создание структуры объекта «петля». Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Необходимость отображать информацию об объекте «Петля» Методы Название Ответственность build Конструирование объекта PICKETDRAWABLEBUILDER Ответственность Реализация абстрактного DrawableBuilder. класса Отвечает за создание структуры объекта «пикет». Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Необходимость отображать информацию об объекте «Пикет» Методы Название Ответственность build Конструирование объекта 26 EMFDRAWABLEBUILDER Ответственность Реализация абстрактного класса Отвечает DrawableBuilder. за создание структуры объекта «ЭДС». Использованные паттерны Паттерн «Строитель» [2] проектирования Мотивация к созданию Необходимость отображать информацию об объекте «ЭДС» Методы Название Ответственность build Конструирование объекта GLWIDGET Ответственность Холст для размещения объектов OpenGL Использованные паттерны Абстрактный класс проектирования Мотивация к созданию Имеется набор элементов, нетривиальных которые необходимо рисовать с помощью OpenGL. Этот класс ими управляет Методы Название Ответственность _calcTotalBounding Вычисление границ изображения _applyScaleAndTranslate Применение масштаба и перемещения _setGridStep Устанавливает шаг сетки _projectWindowCoordinates Переводит 27 координаты мыши в координаты GL-окна addDrawable Добавление графического объекта autoScale Применение масштаба к изображению clear Удаление графических объектов selectObject Наследуемая функция, описание ниже switchToLinearCoords Переход к линейным координатам switchToLogarithmicCoords Переход к логарифмическим координатам initializeGL Реализация стандартной унаследованной от функции, QGLWidget, вызывающаяся при инициализации графики paintGL Реализация стандартной унаследованной от функции, QGLWidget. Рисование графических объектов resizeGL Реализация стандартной унаследованной от функции, QGLWidget. Вызывается при изменении размеров окна. mousePressEvent Реализация стандартной унаследованной от функции, QGLWidget. Запоминает координаты мыши. mouseMoveEvent Реализация стандартной унаследованной Обработчик от функции, QGLWidget. перемещения мыши. Необходим для смещения центра координат. 28 wheelEvent Реализация стандартной унаследованной от функции, QGLWidget. Обработчик вращения колеса мыши. Необходим изменения масштаба. Атрибуты _drawables Объекты, которые будут изображены на холсте _grid Координатная сетка _viewport Видимая область _scale Масштаб _gridStep Шаг сетки _translateX Перемещение по оси абсцисс _translateY Перемещение по оси ординат _lastPos Позиция курсора мыши в момент последнего нажатия левой кнопки мыши _selectedItem Индекс выделенного элемента _logCoordsTransformer Экземпляр класса, отвечающий за преобразование координат _currentCoordsTransformer Текущий отвечающий экземпляр за класса, преобразование координат GLMAPWIDGET Ответственность Холст для размещения графического графического изображения петель и пикетов Использованные паттерны Паттерн «Контроллер» проектирования 29 Мотивация к созданию Управляет рисованием петель и пикетов Методы Название Ответственность selectObject По глобальному идентификатору определяет выделенный элемент Реализация paintGL стандартной унаследованной от функции, QGLWidget. Рисование графических объектов Реализация mouseReleaseEvent стандартной функции, унаследованной от QGLWidget. GLEMFWIDGET Ответственность Холст для размещения графического графического изображения ЭДС Использованные паттерны Паттерн «Контроллер» проектирования Мотивация к созданию Управляет рисованием ЭДС. Методы Название Ответственность _sendEmfInfoAndFillIntersectionPoints По клику мыши происходит вызов этого метода. Отображает точки, попавшие на присутствующих «срез» ЭДС, а всех также отсылает необходимую информацию в главное окно для отображения значений эдс для данного среза. paintGL Реализация стандартной унаследованной 30 от функции, QGLWidget. Рисование графических объектов mouseReleaseEvent Реализация стандартной функции, унаследованной от QGLWidget. _applyScaleAndTranslate Применение масштаба и перемещения Атрибуты _selector Линия, обозначающая срез по времени _isSelectorVisible Логическое значение: показывать линию среза или нет _emfPoints Точки на кривых ЭДС, соответствующие временному срезу TAGABLE Ответственность Интерфейс. Задает поведение объекта, который можно пометить. Использованные паттерны - проектирования Мотивация к созданию Создан для того, чтобы можно было соотнести элементы базы данных с их графическими представлениями Методы Название Ответственность setTag Устанавливает метку getTag Возвращает текущую метку SELECTABLE Ответственность Интерфейс. 31 Задает поведение выделенного объекта Использованные паттерны - проектирования Мотивация к созданию Имеется множество графических различных объектов. Каждый может быть выделен на холсте. Объект, который выделенным, хочет реализует быть этот интерфейс. Методы Название Ответственность isSelected Виртуальная функция. Отвечает за вычисление попадания заданной точки на объект. DRAWABLE Ответственность Интерфейс. Задает поведение объекта, который имеет графическое представление на экране. Использованные паттерны - проектирования Мотивация к созданию Имеется множество различных графических объектов (ЭДС, петли, пикеты). Всех их нужно рисовать поразному. Объект, желающий иметь представление на экране, реализует этот интерфейс. Таким образом, контроллеру не надо заботиться о конкретном 32 типе отображаемого элемента. Методы Название Ответственность draw Виртуальная функция. Отвечает за отрисовку объекта. getBoundingBox Виртуальная функция. Отвечает за вычисление сторон охватывающего объект прямоугольника. setColor Задание цвета resetColor Сброс цвета Атрибуты _color Текущий цвет объекта _defaultColor Умолчательный цвет объекта EMFSELECTOR Ответственность Реализует графическое отображение объекта «Линия» в режиме рисования ЭДС Использованные паттерны - проектирования Мотивация к созданию Необходимо отображать временной срез нескольких ЭДС Методы Название Ответственность draw Реализация представления, графического унаследована Drawable setViewPort Указание видимой области Атрибуты 33 от _viewport Видимая область _color Цвет линии SQUARELOOPDRAWABLE Ответственность Реализует графическое отображение объекта Реализует «квадратная интерфейс петля». Drawable, Selectable, Tagable Использованные паттерны - проектирования Мотивация к созданию Представление объекта «квадратная петля» Методы Название Ответственность draw Реализация графического представления, унаследована от Drawable getBoundingBox Реализация вычисления охватывающего сторон прямоугольника, унаследована от Drawable SquareLoopDrawable Конструктор класса isSelected Реализация вычисления попадания данной точки на объект, унаследована от Selectable EMFDRAWABLE Ответственность Реализует графическое отображение объекта «ЭДС». Реализует интерфейс 34 Drawable, Selectable Использованные паттерны - проектирования Мотивация к созданию Представление объекта «квадратная петля» Методы Название Ответственность draw Реализация графического представления, унаследована от Drawable getBoundingBox Реализация вычисления охватывающего сторон прямоугольника, унаследована от Drawable EmfDrawable Конструктор класса addCoordinates Добавляет координату к кривой ЭДС getValueByTime Возвращает значение кривой ЭДС для заданного времени COORDINATEGRID Ответственность Реализует графическое отображение сетки и осей координат Использованные паттерны - проектирования Мотивация к созданию Необходимость отображать координатную сетку на экране Методы Название Ответственность _drawAxis Реализация координат 35 отрисовки осей _drawLines Реализация отрисовки линий координатной сетки _drawText Реализация отрисовки разметки на координатных осях _getTranslatedBoundingBox Вычисляет нужно область, нарисовать на которой координатную сетку так, чтобы она закрыла весь экран _getTextPosition Вспомогательный метод вычисления позиции зависимости от для текста положения в осей координат относительно наблюдателя _getTextPositionX Вычисление значения позиции текста относительно оси абсцисс _getTextPositionY Вычисление значения позиции текста относительно оси ординат _getTranslatedAlignedBoundingBox Получает границы с учетом выравнивания относительно центра координат _createCoordLabel Создает текстовое представление числа в зависимости от режима отображения (линейный, логарифмический) CoordinateGrid Конструктор класса setBoundingBox Устанавливает границы сетки setStep Задает шаг по осям координат draw Реализация графического отображения координатной сетки switchToLogarithmicCoords Переход 36 к логарифмическим координатам switchToLinearCoords Переход к линейным координатам getNearestHumaReadableStep Получение шага соответствующего сетки, текущему масштабу setAxisColor Устанавливает цвет осей координат setGridLinesColor Устанавливает цвет линий координатной сетки getXCoordFromPoint Возвращает значение координаты. переданной Если это логарифмический режим, переведет х в линейные координаты Атрибуты _halfWidth Половина ширины видимой области _halfHeight Половина высоты видимой области _centerX Центр области по оси абсцисс _centerY Центр области по оси ординат _dx Шаг по оси абсцисс _dy Шаг по оси ординат _axisColor Цвет координатных осей _gridLinesColor Цвет линий _renderMode Режим рисования COODRSTRANSFORMER Ответственность Отвечает координат Использованные паттерны - проектирования 37 за преобразование Мотивация к созданию Необходимость перехода из одной системы координат в другую Методы Название Ответственность transform Преобразование координат точки LOGCOORDSTRANSFORMER Ответственность Отвечает за переход к логарифмической системе координат Использованные паттерны - проектирования Мотивация к созданию Необходимость перехода из одной системы координат в другую Методы Название Ответственность transform Преобразование к логарифмическим координатам transformCoord Вспомогательная вычисления функция для логарифмических координат COLORFABRIC Ответственность Позволяет раскрасить объекты в различные цвета Использованные паттерны «Одиночка» проектирования Мотивация к созданию Есть множество графических объектов. На одном холсте может 38 находится несколько ЭДС, на другом – множество пикетов. Для лучшего восприятия графической информации эти элементы необходимо унифицировать цветом Методы Название Ответственность instance Создание единственного экземпляра класса createColor Создание цвета для объекта Атрибуты _baseColors Базовые цвета, с помощью которых задается градиент _instance Единственный экземпляр класса POLYGONDIALOG Ответственность Выбор полигона, для которого будут загружены данные Использованные паттерны - проектирования Мотивация к созданию Необходимо было предоставить пользователю возможность выбора входных данных Методы Название Ответственность loadPolygons Загрузка имеющихся в базе полигонов getPolygon Возвращает выбранного полигона 39 идентификатор Атрибуты _idPolygon Идентификатор выбранного полигона CONFIGURATIONDIALOG Ответственность Настройка соединения с базой данных Использованные паттерны - проектирования Мотивация к созданию Необходимо было предоставить пользователю возможность выбора базы данных, с которой он будет работать Методы Название Ответственность setSettings Установка значений настройки соединения (логин, пароль, хост, имя базы данных) setDbConnection Метод принимает объект, отвечающий за соединение с базой данных, и сохраняет его в текущем диалоге _fillInputsBySettings Заполняет текстовые диалоговом окне поля в соответственно настройкам соединения done Реализация виртуальной функции родительского класса. Обрабатывает нажатие клавиш «ОК» и «Cancel» Атрибуты settings Экземпляр класса, отвечающий за 40 хранение настроек соединения с базой данных Экземпляр класса, отвечающий за dbConnect соединение с базой данных UML-диаграмма классов GLWidget DbConnection -database -_instance +instance() +setupConnection() +getDb() -DbConnection() -_drawables -_grid -_viewport -_scale -_gridStep -_translateX -_translateY -_lastPos -_selectedItem -_logCoordsTransformer -_currentCoordsTransformer -MIN_SCALE -MAX_SCALE -SCALE_STEP -GRID_STEP -_calcTotalBounding() -_applyScaleAndTranslate() -_setGridStep() -_projectWindowCoordinates() +addDrawable() +autoScale() +clear() +selectObject() +switchToLinearCoords() +switchToLogarithmicCoords() #initializeGL() #paintGL() #resizeGL() #mousePressEvent() #mouseMoveEvent() #wheelEvent() GLEmfWidget -_selector -_isSelectorVisible -_emfPoints -paintGL() -mouseReleaseEvent() -_sendEmfInfoAndFillIntersectionPoints() -_applyScaleAndTranslate() GLMapWidget +selectObject() -paintGL() -mouseReleaseEvent() TreeViewAdapter -_prepareRow() +TreeViewAdapter() +addModel() 41 Settings +login +password +dbname +hostname +idPolygon -_instance +instance() +save() +load() -Settings() DbFabric +LooModelColumns +PicketModelColumns +DbFabric() +createPolygonModel() +createLoopModel() +createPicketModel() +createEmfModel() CoordsTransformer +transform() LogCoordsTransformer +transform() +transformCoord() ConfigurationDialog -settings -dbConnect +setSettings() +setDbConnection() -_fillInputsBySettings() #done() ColorFabric -_baseColors -_instance +instance() +createColor() 42 CoordinateGrid -_halfWidth -_halfHeight -_centerX -_centerY -_dx -_dy -_axisColor -_gridLinesColor -_renderMode -_drawAxis() -_drawText() -_drawLines() -_drawText() -_getTranslatedBoundingBox() -_getTextPosition() -_getTextPositionX() -_getTextPositionY() -_getTranslatedAlignedBoundingBox() -_createCoordLabel() +CoordinateGrid() +setBoundingBox() +setStep() +draw() +switchToLogarithmicCoords() +switchToLinearCoords() +getNearestHumaReadableStep() +setAxisColor() +setGridLinesColor() +getXCoordFromPoint() Tagable LoopDrawableBuilder +build() EmfDrawableBuilder +setTag() +getTag() +build() DrawableBuilder +build() Builder #_model #_modelFilter #_globalId +Builder() +setData() +getGlobalId() +build() -_prepareInfoLabel() +build() -_prepareInfoLabel() +isSelected() PicketDrawable -_center -_color +draw() +getBoundingBox() +setColor() +PicketDrawable() +isSelected() EmfDrawable InfoDockElementsBuilder PicketInfoDockBuilder Drawable -_color -_defaultColor +draw() +getBoundingBox() +setColor() +resetColor() Selectable +draw() +getBoundingBox() +EmfDrawable() +addCoordinates() +getValueByTime() EmfInfoDockBuilder +build() -_prepareInfoLabel() -_prepareLabel() 43 EmfSelector -_color -_viewport +draw() +setViewPort() 5. Результаты работы программы Ниже представлены результаты работы программы. Интерфейс программы визуально разделен на три части: левая панель с деревом проекта, правая панель с информацией об элементах диаграммы и рабочая область по центру, в которой отображаются сложные графические элементы (Рис.1). Элементы состоят из координатной сетки и изображения петель и пикетов. Дерево проектов заполняется элементами из базы данных, также как и правая панель, которая содержит информацию о них. Рис.1. Интерфейс приложения. ОС Linux Mint. Интерфейс основан на плавающих окнах. Панели справа и слева свободно открепляются мышкой и размещаются в любом месте рабочего стола. Также могут быть прикреплены к любому краю главного окна приложения (Рис.2). 44 Рис.2. Интерфейс приложения. ОС Linux Mint. Плавающие доки. Благодаря библиотеке QT программа является кросс-платформенной на уровне исходного кода. Исходный текст программы без существенных изменений был скомпилирован и запущен под ОС Windows. Внешний вид можно увидеть на Рис.3. Рис.3. Интерфейс приложения. ОС Windows 7. Рабочая область приложения масштабируется и перемещается при помощи мыши. Это можно увидеть на Рис.4. 45 Рис.4. Интерфейс приложения. ОС Windows 7. Масштабирование и сдвиг. 46 Заключение В результате выполнения преддипломной практики были изучены подсистемы библиотеки QT, касающиеся доступа к базе данных, визуальной верстки интерфейса, программной генерации элементов графического интерфейса, обработка событий, взаимодействие элементов программы посредством сигналов и слотов. Разработка производилась в QT Creator под операционными системами Linux Mint и Microsoft Windows 7. Были изучены и выполнены основные этапы цикла разработки программного обеспечения [4]: Анализ требований к продукту Разработка спецификации в виде прецедентов Проектирование архитектуры базы данных и программы Реализация и тестирование на языке С++ в среде QTCreator Были изучены и применены следующие паттерны объектно- ориентированного проектирования [2]: Фабрика Одиночка Адаптер Модель/Представление/Контроллер Для закрепления полученных знаний был разработан рабочий прототип приложения со следующим функционалом: Подключение к базе данных и выборка элементов из таблиц базы данных Отображение петель и пикетов в дереве проекта в левом доке Отображение информации о пикетах и петлях в правом доке Подключение библиотеки OpenGL и отображение диаграммы петель и пикетов на экране Масштабирование и перемещение диаграммы мышкой 47 двумерной Отображение координатной сетки Программа является кросс-платформенной на уровне исходного кода 48 Список использованных источников 1. Online Reference Documentation. [Электронный ресурс]. Режим доступа: http://doc.qt.nokia.com/. 2. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектноориентированного проектирования. Паттерны проектирования. – СПб: Питер, 2010. – 366с.: ил. 3. Б. Страуструп Язык программирования С++, спец. изд./Пер. с англ. М.; СПб.: "Издательство БИНОМ" - "Невский Диалект", 2001г. 1099 с., ил. 4. Макконнелл С. Совершенный код. Мастер-класс / Пер. с англ. – М. : Издательство «Русская редакция», 2011. – 896 стр. : ил. 5. М. Э. Рояк, Г. М. Тригубович, А. В. Чернышев. Интерактивная компьютерная графика : учебно-методическое пособие / Новосиб. гос. техн. ун-т ; - НГТУ, 2005. - 24 c. 6. Введение в проектирование реляционных баз данных. [Электронный ресурс]. Режим доступа: http://ami.nstu.ru/~vms/method2m/index.htm. 49