МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра
Прикладой математики
ОТЧЕТ ПО ПРЕДДИПЛОМАНОЙ ПРАКТИКЕ СТУДЕНТА
Голубевой Владиславы Владимировны
(фамилия, имя, отчество автора)
Разработка программной системы хранения и визуализации геофизических
данных
Направление
подготовки
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
Download