Мегаобучалка Главная | О нас | Обратная связь


Структура и функциональное назначение отдельных модулей



2020-02-03 226 Обсуждений (0)
Структура и функциональное назначение отдельных модулей 0.00 из 5.00 0 оценок




 

Рассмотрим структуру основного модуля графического редактора (управляющего модуля), так как он выполняет основную функцию этого приложения – составление пользователем структуры моделируемой системы и сохранение этой информации для последующего расчёта в программе расчётов.

Частично, этот модуль был уже описан в предыдущих разделах, остановимся подробно на функциях, которые выполняет модуль.

Создание главного окна приложения.

При создании главного окна приложения автоматически заполняется панель (ToolBar) элементами (ToolButton), которые описывают каждый тип массы, происходит это следующим образом. В той же директории где находится графический редактор, создадим директорию images\, в этой директории находятся файлы со структурным изображением каждого типа массы, создадим файл images.lst. В этом файле напишем имя каждого файла с иконкой и соответствующее название этого элемента. Приложение находит соответствующий файл и создаёт кнопку на панели инструментов, в противном случае выводится сообщение об ошибке (файл не найден) и даже если существует модуль, описывающий данный подкласс, создать элемент данного класса не удастся.

Реакция на события мыши.

При щелчке (OnCLick) на панели ввода (STDPanel) если пользователь выбрал какой то тип массы нажатием на панели соответствующей кнопки [39], то будет создан экземпляр класса того объекта, который выбрал пользователь,пользователю будет выдано диалоговое окно в котором он укажет параметры создаваемого объекта экземпляр этого объекта будет занесен в массив item.(Подробнее смотри приложение Б).

При нажатии кнопки мыши (OnMauseDown) если левая кнопка нажата и не нажат правый Shift, то все выделенные объекты становятся не выделенными, запоминается точка нажатия.

При перемещении указателя мыши, если нажата левая кнопка, на панели рисуется четырёхугольник, который покажет, какие объекты будут выделены, если отпустить кнопку мыши.

При отпускании кнопки все объекты, которые попали в выделенную зону, становятся выделенными.

В главном модуле так же описаны процедуры, которые описывают реакцию элементов (масс и связей) на события мыши, так как классы наших элементов наследованы от класса TgraphicControl, то они имеют стандартные события OnCLick, OnMauseDown, OnMauseUp, OnMauseMove, при создании элементов им приписываются эти процедуры.

Событие нажатия кнопки мыши на элементе (ItemMouseDown), в этой процедуре выполняется следующее:

Если нажата левая кнопка мыши, то если не нажат Shift элемент, над которым нажата кнопка, становится выделенным, а элементы, которые были выделены до этого, становятся не выделенными. Если же Shift нажат, то к выделенным элементам добавляется элемент, над которым нажали кнопку, если этот элемент уже выделен, то его выделение отменяется, все выделенные элементы переходят в состояние pmMove.

При перемещении указателя мыши, если была нажата левая кнопка мыши, все выделенные объекты перемещаются.

Отпускание указателя мыши. (ItemMouseUp)

В этой процедуре происходит вызов конструктора связи, происходит это следующим образом, проверяется, нажал ли пользователь переключатель создания связи, далее просматриваются все связи, находится номер элемента, над которым нажата кнопка мыши, если флаг выбора первой массы не установлен, то тогда вызывается, конструктор связи. Если же установлен флаг выбора первой массы, то устанавливается флаг в значение «ложь», номер элемента, над которым отпустили кнопку, запомнили, тогда при нажатии на второй массе, если нет связи, которая уже соединяет данные элементы, произойдёт вызов конструктора связи. Далее, будет выведено диалоговое окно создания связи, в этом окне пользователь добавит элементы (пружина, резьба, и т. д.), которые в модели будут соединять эти массы, после того как пользователь закончит редактировать связь, созданный элемент будет занесён в массив связей.

Двойной щелчок над элементом (и над массой и над связью) происходит вызов диалогового окна для редактирования параметров элементов (такое же как и при создании).

Так же на главном окне приложения есть панель со стандартными элементами управления.

Создать новый проект – пользователю выводится диалоговое окно с предложением сохранить редактируемую модель, далее если пользователь выбрал сохранить, то текущая модель сохраняется в файл, если нет, не сохраняется, и все массы и связи из массивов Items и Links удаляются.

Сохранить проект – текущая модель сохраняется в файле, выбранном пользователем. Как было указанно выше. Интерфейс между графическим редактором и программой расчётов обеспечивается с помощью ini файлов. Ini файлы характеризуются секцией и именем параметра и его значением. Для каждого элемента модели будем создавать секцию, в которую мы будем записывать параметры и их значения. Так же создадим секцию, в которую запишем параметры моделирования (шаг, время метод, имя модели), секция “Model”.У элемента массы есть свойство param, список строк в котором в одной строке имя параметра, а в другой его значение. Таким образом, в цикле устраивая перебор всех элементов массива items, создаём секцию для каждого элемента, перебирая значение свойства param, записываем в секцию значение каждого параметра элемента, кроме того, в секцию записывается класс элемента. Дальше перебираем все элементы массива Links. У элементов типа Link есть свойство relations – массив, в котором записаны все элементы, которые физически связывают элементы модели. Для каждого элемента создадим секцию, в которую запишем параметры реальной связи (точно так же как и для массы), от элемента типа Link нам нужны только указатели на соединяемые массы, через эти указатели записываем в секцию номера тех масс, которые соединяет данная связь.

Открыть проект – загружается ранее сохранённая на диск модель. Происходит это следующим образом. Из файла берётся первая секция, читается её параметр, в котором записано имя класса, в зависимости от этого параметра вызывается конструктор, далее читаются строки секции и заполняются значения параметров. При этом если находится секция, в которой описана связь, и до этого не встретилось связи соединяющей те же массы, то создаётся элемент класса Link и элемент типа Screw, Spring, Dempfer и т. д. Если такая связь уже есть, то создаётся только экземпляр типа Screw, Spring, Dempfer и т. д.

Удаление элементов. При работе с моделью пользователь может, как добавлять элементы, так и удалять их. Реализовано это следующим образом, при нажатии на панели инструментов кнопки «Удалить» или кнопки «Del», на клавиатуре. В процедуре, которая закреплена за данным событием, происходит следующее. Проверяется количество выделенных масс и количество выделенных связей, если их суммарное количество больше нуля, то происходит перебор всех выделенных масс (один цикл) и перебор всех связей (вложенный цикл), если какая то связь содержит указатель на удаляемую массу, то это связь удаляется. Таким образом, удаляются все выделенные массы и связи, и все связи, которые связаны с удаляемыми массами, если удаляется связь, то её удаление не несёт за собой удаление масс.

Копирование элементов. При работе с графическим редактором у пользователя так же есть возможность скопировать ранее созданные элементы. Для копирования на панели инструментов есть кнопка «Копировать элементы». Процедура, которая выполняется при нажатии кнопки, имеет следующую структуру. В процедуре описана функция: DoCopyItem(CopyItem: Tprocess): Tprocess, выполняет следующее, создаёт элемент класса Tprocess и всем свойствам созданного объекта присваиваются значения свойств объекта, который передаётся в функцию. В самой процедуре для каждого выделенного объекта вызывается функция DoCopyItem, выделенные объекты становятся не выделенными, выделяются скопированные объекты.

Рассмотрим модуль Tprocess, в этом модуле описано диалоговое окно которое вызывается при создании связи. Рассмотрим подробно структуру функций модуля, которые связанны с добавлением связи в модель, и редактированием её свойств.

Создание диалогового окна.

Процедура создания дианового окна выполняет заполнение компонентами панель, на которой будут расположены кнопки с изображениями конкретных типов связей, происходит это, как и в главном окне приложения, только анализируется файл images1.lst.

Как уже указывалось выше, это окно вызывается при создании, это происходит следующим образом. При создании элемента класса Link после создания элемента вызывается метод ShowEdit. При работе этого метода, перебираются все компоненты свойства Relations создаваемого элемента, и для каждого вызывается метод InitData, который заполняет для каждого объекта в своём диалоговом окне значения своих свойств и добавляет в диалоговом окне связи, в список элементов этой связи своё имя.

Добавление элементов связи.

Так как графически связь изображается в виде одного элемента (Link), то для того, что бы добавить связь, реально соединяющую массы необходимо создать экземпляр какогото из классов Screw, Spring, и т. д. И записать этот экземпляр в свойство графической связи (Link) Relations. Создание экземпляров классов потомков класса Relations (Screw, Spring, и т. д.) происходит при нажатии кнопки на панели с изображением данной связи. При нажатии одной из кнопок происходит вызов конструктора данного класса и присваивание объекту уникального имени. При создании объекту присваивается имя, например «Пружина», но в принципе массы могут соединять и две пружины. Поэтому после того как создан объект, просматриваются все элементы и считается, сколько связей данного типа содержит редактируемый объект (графическая связь). После этого имя созданного объекта изменяется и становится, например «Пружина 3». Следующее действие, которое происходит при нажатии кнопки создания элемента связи – вызов диалогового окна для созданного нами элемента. Происходит это путём вызова метода InitWidow, тот метод вызывает диалоговое окно для созданного элемента и передаёт ему параметры этого объекта (в данном случае параметры по умолчанию). После редактирования свойств, пользователь принимает или отвергает параметры. Для того, что бы присвоить значение свойствам созданного объекта из диалогового окна вызывается метод GetData – записывает информацию из окна в свойства объекта.

Возможно так же удалять созданные объекты, для этого необходимо выбрать в списке элемент и нажать клавишу del или соответствующую кнопку в окне. При этом в свойстве редактируемой графической связи Relations находится элемент с таким именем и удаляется.

Рассмотрим структуру отдельных модулей программы расчётов.

Главный модуль приложения – Model, этот модуль содержит функции и процедуры расчёта параметров моделируемой системы. В данном модуле описан список масс и список связей. Порядок расчёта параметров системы был достаточно подробно рассмотрен выше, поэтому сейчас рассмотрим такой аспект функционирования системы как вывод результатов. Результатами расчёта являются для масс – список перемещений, скоростей и сил, для каждого момента времени моделирования, для связей это сила в каждый момент времени. Следует отметить, выходные данные организованы таким образом, что каждый класс «сам знает» какие данные для его экземпляров необходимо сохранять (класс содержит для каждого параметра список вещественных значений).

Итак, в модуле Model описаны функции для поддержки интерфейса с графическим редактором, это функции сохранения данных и чтения.

Кроме того, здесь описано окно редактора, в этом окне пользователь может редактировать параметры модели. Редактор содержит стандартные функции – добавление элементов, редактирование элементов, удаление. Отличие от редактора в том, что редактировать массы и связи пользователь выполняет в одном окне. Это обусловлено тем, что здесь система представляется не графически, а в виде описаний.

Расчёт параметров моделируемой системы выполняется с помощью функции Calculate, суть её работы заключается в следующем. Есть информация о каждой массе (положение и размеры) зная эти параметры в начальный момент времени можно рассчитать с какой силой каждая связь действует на соединяемые массы. Зная, какое расстояние между массами и их габариты, можем узнать, какая длинна связи в данный момент времени, а в зависимости от этого уже находится сила. Зная, какая сила действует на массу, можем рассчитать, решая задачу коши, какое положение будет занимать масса в следующий момент времени. Таким образом, происходит расчёт, до тех пор, пока не достигнем конечного времени.

Так же в модуле описано окно модели, это окно выводится пользователю для выполнения расчётов и вывода результирующей информации. В окне имеется поле, на котором изображаются элементы модели. Каждый класс элемента модели в программе расчётов имеет в предках класс TabstractElement, поэтому все экземпляры этих классов имеют свойство picture – рисунок и свойство hint – подсказка, которая выводится при наведении указателя мыши на элементе. Каждый элемент при создании загружает из файла своё изображение и размещается на поле модели по введенным параметрам. При выполнении расчёта на каждом шаге элементы на поле модели перемещаются согласно данным расчёта, таким образом, организована визуализация работы модели, по этой визуализации пользователь видит, как будут происходить колебания в моделируемой системе. Для каждого элемента определено так же событие OnClick по этому событию происходит вызов окна, на котором изображены графики для данного элемента, какие конкретно графики, «знает» сам элемент, то есть процедура заполнения этого окна описана в каждом классе.

Из окна модели можно вызвать общее окно для построения графиков, в этом окне есть поле, на котором изображаются графики, а справа находятся переключатели для каждого элемента. Заполнение этого окна происходит динамически на основе списков масс и списков связей.

В данном модуле так же описаны методы для создания отчёта по моделированию. Отчёт сохраняется в виде документа Word. Механизм создания реализован с помощью OLE Automation.

 



2020-02-03 226 Обсуждений (0)
Структура и функциональное назначение отдельных модулей 0.00 из 5.00 0 оценок









Обсуждение в статье: Структура и функциональное назначение отдельных модулей

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (226)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)