Додатки з gui і дескрипторного графіка

Що хочемо зробити?

У цьому розділі розглядається один з численних способів розробки додатків з графічним інтерфейсом користувача в MATLAB, при якому:

  1. основне вікно програми і дочірні вікна створюються в середовищі візуального програмування GUIDE;
  2. пишеться функція з підфункції, що реалізує спільну роботу цих вікон і взаємодія між ними.

Як простий приклад напишемо графічний інтерфейс до функцій quad і quadl, призначеним для чисельного інтегрування функцій однієї змінної від 0 до 1 по квадратурних формулах Сімпсона і Гаусса-Лобатто, відповідно. На прикладі цієї програми ми розглянемо реалізацію пунктів 1) і 2).

Зовнішній вигляд основного вікна integral додатки наведено нижче на малюнку.


Основне вікно integral додатки

Кнопка Метод призначена для відкриття діалогового вікна method, наведеного нижче на малюнку, в якому можна за допомогою перемикачів вибрати один з двох методів інтегрування:

  • по квадратурних формулах Сімпсона;
  • по квадратурних формулах Гаусса-Лобатто.


Діалогове вікно method для вибору методу інтегрування

Кнопка Точність в головному вікні призначена для відкриття діалогового вікна tolerance, наведеного нижче на малюнку, в якому в рядку введення користувач задає точність інтегрування.


Діалогове вікно tolerance для завдання точності інтегрування

Після натискання на кнопку Обчислити в головному вікні, обчислюється інтеграл від функції, заданої в рядку введення Функція основного вікна програми, і результат, отриманий за допомогою обраного методу і з заданою точністю виводиться в рядок Відповідь.

Отже, додаток з графічним інтерфейсом користувача складається з основного вікна integral і двох дочірніх діалогових вікон method і tolerance, в яких задаються деякі параметри програми. Ці діалогові вікна ми зробимо модальними, тобто після появи одного з них на екрані і завдання в них корисних властивостей необхідно закрити це вікно для продовження роботи з додатком integral.

Зрозуміло, налаштування, зроблені в вікнах method і tolerance, повинні бути доступні в Подфункция обробки подій елементів інтерфейсу основного вікна. І навпаки, обраний раніше метод інтегрування і точність повинні бути відомі при відкритті вікон method і tolerance для того, щоб у вікні method був встановлений перемикач, відповідний раніше обраному методу інтегрування, а в рядку введення вікна tolerance при його відкритті була виведена задана раніше точність.

Для початку в середовищі GUIDE потрібно створити основне вікно integral. (В розділі Додатки з GUI досить докладно розглянуто створення нескладних додатків з графічним інтерфейсом в середовищі GUIDE). У нашому випадку потрібно зробити вікно з трьома кнопками:

  • метод
  • точність
  • обчислити

і двома рядками введення, ліворуч від яких розміщені текстові підписи:

Створення нової панелі в середовищі GUIDE

Спочатку ми коротко розберемо створення діалогових вікон в середовищі візуального програмування GUIDE MATLAB для економії часу Новомосковсктеля і для того, щоб підкреслити необхідні в нашому випадку дії. Після виконання в командному рядку MATLAB команди guide


Етапи створення елементів інтерфейсу та значень їх властивостей

Значення або вводяться в комірки другого стовпчика, або вибираються натисканням на кнопку, розташовану поруч. Якщо значенням властивості є масив, то зліва від назви властивості є кнопка зі знаком плюс, клацання по якій розкриває масив і дозволяє змінити значення його компонент в правій колонці.

На головному вікні потрібно розмістити:

  1. Якщо випадково на заготівлі вікна програми був намальований непотрібний об'єкт, то його можна видалити, виділивши клацанням миші і натиснувши клавішу Delete.
  2. Намальовані об'єкти можна переміщати за допомогою миші і змінювати їх розміри, потягнувши курсором миші за маркери на кордоні виділеного об'єкта.
  3. Ми зараз не будемо розбирати всі способи і прийоми роботи з об'єктами, намальованими на заготівлі вікна програми.
Основне вікно програми integral

Властивості вікна integral

Розміри і положення кнопок можна встановити за допомогою миші.

Збереження основного вікна integral додатки

За замовчуванням, додаток, створене в середовищі візуального програмування GUIDE MATLAB, зберігається в двох файлах:

Примітка
Перед збереженням вікон method і tolerance, створення яких описано далі, слід виконати ту ж саму операцію для відмови від автоматичного створення m-файлу і збереження діалогового вікна тільки в файлі з розширенням fig.

Бажано відразу ж зробити обрану папку поточним каталогом MATLAB, наприклад за допомогою кнопки, розташованої зліва від списку Current Directory на панелі інструментів основного вікна MATLAB.

Створення діалогового вікна method

Властивості вікна method

тег рядка введення, який знадобиться для отримання покажчика на неї у функціях обробки подій

Створене діалогове вікно слід зберегти в файлі tol.fig, попередньо відмовившись від способу зберігання в двох файлах: з розширенням fig і з розширенням m (див. Розд. Збереження основного вікна integral додатки).

Тепер, коли всі три вікна intehral, ​​method і tolerance створені, ми перейдемо до програмування файл-функції з Подфункция для того, щоб змусити інтерфейс працювати.

програмування інтерфейсу

В цілому, ідея дуже проста. Якщо потрібно відобразити діалогове вікно на екрані, то ми робимо це за допомогою функції open (можна використовувати і функцію openfig). Функція open повертає покажчик на діалогове вікно.

Якщо структури Вам не знайомі, то можна почитати тут короткі відомості про роботу зі структурами в MATLAB.

Після отримання покажчиків на об'єкти діалогового вікна для деяких об'єктів (кнопок, панелі перемикачів) вказуються функції обробки їх подій, що виникають, наприклад, при натисканні користувачем на кнопку, або виборі перемикача. Самі ці функції є заздалегідь запрограмованими Подфункция в m-файлі c основною функцією integral, яка відкриває основне вікно integral нашого додатки з графічним інтерфейсом користувача.

Примітка
Для того, щоб запрограмувати подія, що виникає, наприклад при натисканні на кнопку, покажчик якої зберігається в handles.btn (в поле btn структури handles), слід виконати два наведених нижче дії:

  1. Связяать з цією кнопкою подфункцию обробки події (при натисканні користувачем кнопки виникає її подія Callback) за допомогою функції set

Тут btn_Callback - ім'я подфункции, яку треба запрограмувати. Це можна робити тільки тоді, коли об'єкт з покажчиком handles.btn (кнопка) існує, тобто коли відкрито діалогове вікно з цією кнопкою.

  • Запрограмувати в подфункции btn_Callback дії, які повинні бути виконані після натискання користувачем на кнопку. Тема подфункции btn_Callback повинен мати наступний вигляд:

    де src - покажчик на об'єкт, подія якого виконується, а evt - аргумент, який використовується при обробки деяких подій.

    При відкритті діалогових вікон method і tolerance в них повинні бути зроблені раніше користувачем настройки, тобто вибраний той же самий перемикач (у вікні method) і в рядку введення повинно знаходитися введене раніше користувачем число (у вікні tolerance). Установки обміну між основним вікном програми та його дочірніми вікнами проводиться за допомогою структури par, яка є даними основного вікна integral додатки, вона завжди може бути отримана в Подфункция за допомогою функції MATLAB guidata, при необхідності змінена і збережена оновленої за допомогою цієї ж самої функції.

    Для отримання структури з даними par слід в якості вхідного аргументу функції guidata задавати покажчик на діалогове вікно (в нашому випадку це вікно integral)

    Тут вважається, що покажчик на вікно integral зберігається в поле win_main структури handles. Для збереження структури з даними par використовується наступний виклик функції guidata з двома вхідними аргументами - покажчиком на вікно (або н об'єкт, розташований у вікні) і самою структурою:

    Ці звернення нам знадобиться робити в Подфункция обробки подій елементів інтерфейсу, розташованих не в основному вікні, а в дочірніх, тому в ці підфункції доведеться передавати додатковий аргумент - структуру з покажчиками на об'єкти основного вікна integral нашого застосування.

    Підфункції обробки подій за замовчуванням мають два вхідних аргументу. У подфункции обробки подій зручно передавати додаткові параметри: структуру покажчиків на основне вікно програми і на дочірні вікна. Це робиться в масиві осередків, відповідні параметри пишуться в фігурних дужках через кому. Тому при зв'язуванні події з обробної його подфункцией ми будемо використовувати такий варіант виклику функції set, коли значенням властивості з назвою події буде масив осередків, що містить покажчик на подфункцию і додаткові вхідні аргументи:

    Якщо подфункция обробки події має додатковий вхідний аргумент, то тоді її заголовок виглядає наступним чином:

    Відповідно, якщо ми вказали під функцію обробки події з двома додатковими вхідними аргументами:

    то її заголовок повинен виглядати так:

    Для програмування нашого додатки з графіческімм інтерфейсом користувача знадобиться основна функція, яку ми назвемо integral і збережемо в файлі integral.m, що містить сім подфункций

    • btn_method_Callback - подфункция обробки події Callback кнопки Метод основного вікна integral;
    • btn_tol_Callback - подфункция обробки події Callback кнопки Точність основного вікна integral;
    • btn_calc_Callback - подфункция обробки події Callback кнопки Обчислити основного вікна integral;
    • btn_methodOK_Callback - подфункция обробки події Callback кнопки OK дочірнього вікна method;
    • btn_ methodCancel_Callback - подфункция обробки події Callback кнопки Cancel дочірнього вікна method;
    • btn_tolOK_Callback - подфункция обробки події Callback кнопки OK дочірнього вікна tolerance;
    • btn_tolCancel_Callback - подфункция обробки події Callback кнопки Cancel дочірнього вікна tolerance.

    Нижче наведено текст основної функції integral з Подфункция. Функція integral.m, вікна integral.fig, method.fig і tol.fig повинні бути в одному каталозі, шлях до якого відомий MATLAB (наприклад в поточному каталозі). Для запуску нашого додатки з графічним інтерфейсом досить виконати

    В основній функції здійснюються такі дії:

    1. відкривається основне діалогове вікно integral.fig;
    2. його покажчики записуються в структуру handles (поля структури збігаються з тегами об'єктів, розташованих в діалоговому вікні integral);
    3. инициализируется структура даних par основного вікна integral з двома полями: method (для запам'ятовування обраного методу інтегрування) і tol (для запам'ятовування обраної точності інтегрування), в поле method записується 'quad', а в поле tol заноситься 1e-3, сама структура зберігається при допомогою функції guidata;
    4. з подією Callback кнопок Метод, Точність і Обчислити зв'язуються, відповідно, подфункции btn_method_Callback, btn_tol_Callback, btn_calc_Callback, в які передається додатковий вхідний аргумент - структура handles.

    У подфункции btn_method_Callback, яка викликається при натисканні користувачем на кнопку Метод діє таким чином:

    1. відкривається дочірнє діалогове вікно method.fig;
    2. його покажчики записуються в структуру handles_method (поля структури збігаються з тегами об'єктів, розташованих в діалоговому вікні method);
    3. в змінну par записується структура даних вікна integral;
    4. в залежності від значення par.method (тобто обраного методу інегрірованія) встановлюється відповідний перемикач на панелі перемикачів у вікні method;
    5. з подією Callback кнопок OK і Cancel зв'язуються, відповідно, подфункции btn_methodOK_Callback і btn_methodCancel_Callback, в які передається додатковий вхідний аргумент - структура handles_method.

    У подфункции btn_tol_Callback, яка викликається при натисканні користувачем на кнопку Точність діє таким чином:

    1. відкривається дочірнє діалогове вікно tol.fig;
    2. його покажчики записуються в структуру handles_tol (поля структури збігаються з тегами об'єктів, розташованих в діалоговому вікні tol);
    3. в змінну par записується структура даних вікна integral;
    4. в рядок введення вікна tolerance записується встановлена ​​раніше точність, значення якої записано в полі tol структури par:
    5. з подією Callback кнопок OK і Cancel зв'язуються, відповідно, подфункции btn_tolOK_Callback і btn_tolCancel_Callback, в які передається додатковий вхідний аргумент - структура handles_tol.

    У подфункции btn_calc_Callback, яка викликається при натисканні користувачем на кнопку Обчислити діє таким чином:

    1. зчитується введена користувачем формула з рядка введення Функція основного діалогового вікна integral;
    2. в змінну par записується структура даних вікна integral;
    3. перевіряється, який метод інтегрування був обраний користувачем в діалоговому вікні method (в поле method структури par записано або 'quad', або 'quadl') і в залежності від цього викликається або функція quad, або quadl, в яких вказується також точність інтегрування, записана в par.tol;
    4. результат перетворюється в строкову змінну str і виводиться в рядок Відповідь основного діалогового вікна integral;

    У подфункции btn_methodOK_Callback, яка викликається при натисканні користувачем на кнопку OK в діалоговому вікні method діє таким чином:

    1. в змінну par записується структура даних вікна integral;
    2. перевіряється, який метод інтегрування був обраний користувачем перемикачами в діалоговому вікні method і в залежності від цього в поле method структури par заноситься або 'quad', або 'quadl';
    3. зберігається структура даних par вікна integral;
    4. вікно method закривається;

    У подфункции btn_ methodCancel_Callback, яка викликається при натисканні користувачем на кнопку Cancel в діалоговому вікні method, закривається вікно method без зміни структури даних par вікна integral.

    У подфункции btn_tolOK_Callback, яка викликається при натисканні користувачем на кнопку OK в діалоговому вікні tolerance діє таким чином:

    1. в змінну str заноситься вміст рядка введення вікна tolerance, тобто введена користувачем точність;
    2. в змінну par записується структура даних вікна integral;
    3. вміст рядка str перетворюється в числове значення, яке заноситься в поле tol структури par;
    4. зберігається структура даних par вікна integral;
    5. вікно tolerance закривається;

    У подфункции btn_tolCancel_Callback, яка викликається при натисканні користувачем на кнопку Cancel в діалоговому вікні tolerance, закривається вікно tolerance без зміни структури даних par вікна integral.

    Наведений текст функції не містить

    1. перевірки на правильність введення функції в рядок введення Функція основного вікна integral;
    2. перевірки на правильність введення точності в рядок введення вікна tolerance.

    Крім того, можна було виводити в рядок відповідь не 16 цифр, а відповідно із заданою точністю, або вводити функцію без поелементний операцій, замінивши потім символи *, / і ^ на поелементні *. /. і ^. за допомогою функції strrep, але всі ці поліпшення збільшили б обсяг m-файлу.