Перейти до вмісту
> 💻 🧠 Код 1001 > 📖 Гайди > > Урок 4. Графічний інтерфейс користувача (GUI): Діалогове вікно з полями введення

Урок 4. Графічний інтерфейс користувача (GUI): Діалогове вікно з полями введення

  • від

Мета уроку: Створити вікно з полями для введення довжини, ширини та висоти, і побудувати коробку з цими параметрами, натиснувши кнопку.

📜 Частина 1. Як працює GUI у FreeCAD?

FreeCAD використовує PySide — обгортку Python над бібліотекою Qt (тією самою, що використовується в Blender, Maya та багатьох інших програмах).

Ключові компоненти:

  • QtGui.QDialog — модальне вікно
  • QtGui.QLineEdit — поле для введення тексту
  • QtGui.QPushButton — кнопка
  • QtGui.QFormLayout — зручний макет “мітка + поле”

💡 Усі елементи GUI створюються всередині скрипта Python, без зовнішніх файлів (хоча можна використовувати .ui з Qt Designer — але ми почнемо з чогось простого).

3/8

🛠️ Частина 2. Додаток: “Box Builder with GUI”

Ми розширимо попередній додаток, додавши діалогове вікно.

Крок 1. Створити теку

1    .../Mod/BoxBuilderAddon/

Крок 2. Файл InitGui.py

# InitGui.py
1    import FreeCADGui
2    from BoxBuilderAddon.box_builder_workbench import import BoxBuilderWorkbench
3    
4    FreeCADGui.addWorkbench(BoxBuilderWorkbench())

Крок 3. Файл box_builder_workbench.py

# box_builder_workbench.py
1    import FreeCAD, FreeCADGui
2    from PySide import QtGui, QtCore
3    
4    # === ФУНКЦІЯ СТВОРЕННЯ КОРОБКИ ===
5    def create_box(length, width, height, name="CustomBox"):
6        doc = FreeCAD.ActiveDocument
7        if not doc:
8            doc = FreeCAD.newDocument("BoxBuilder")
9        
10       # Унікальне ім'я
11       base_name = name
12       index = 1
13       obj_name = base_name
14       while obj_name in [obj.Name for obj in doc.Objects]:
15           obj_name = f"{base_name}_{index}"
16           index += 1

4/8

17   
18       box = doc.addObject("Part::Box", obj_name)
19       box.Length = length
20       box.Width = width
21       box.Height = height
22       doc.recompute()
23       return box
24   
25   # === ДІАЛОГОВЕ ВІКНО ===
26   class BoxBuilderDialog (QtGui.QDialog):
27       def __init__(self):
28           super (BoxBuilderDialog, self).__init__()
29           self.setWindowTitle("Box Builder")
30           self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
31           self.resize(300, 150)
32   
33           # Поля введення
34           self.length_input = QtGui.QLineEdit("30.0")
35           self.width_input = QtGui.QLineEdit("20.0")
36           self.height_input = QtGui.QLineEdit("10.0")
37   
38           # Кнопки
39           self.create_button = QtGui.QPushButton("Create Box")
40           self.cancel_button = QtGui.QPushButton("Cancel")
41   
42           # Підключення кнопок
43           self.create_button.clicked.connect(self.on_create)
44           self.cancel_button.clicked.connect(self.reject)
45   
46           # Макет
47           layout = QtGui.QFormLayout()
48           layout.addRow("Length (mm):", self.length_input)
49           layout.addRow("Width (mm):", self.width_input)
50           layout.addRow("Height (mm):", self.height_input)
51   
52           button_layout = QtGui.QHBoxLayout()
53           button_layout.addWidget(self.create_button)
54           button_layout.addWidget(self.cancel_button)
55   
56           main_layout = QtGui.QVBoxLayout()
57           main_layout.addLayout(layout)
58           main_layout.addLayout(button_layout)

5/8

61          self.setLayout(main_layout)
62   
63       def on_create(self):
64           try:
65               length = float(self.length_input.text())
66               width = float(self.width_input.text())
67               height = float(self.height_input.text())
68   
69               if length <= 0 or width <= 0 or height <= 0:
70                   raise ValueError("Всі розміри мають бути позитивними")
71   
72               create_box(length, width, height)
73               self.accept() # Закрити вікно
74   
75           except ValueError as e:
76               QtGui.QMessageBox.warning(self, "Помилка введення", f"Недійсне введення:\n{str(e)}")
77   
78       # === КОМАНДА ===
79       class BoxBuilderCommand:
80           def GetResources(self):
81               return {
82                   "MenuText": "Box Builder",
83                   "ToolTip": "Створити коробку з власними розмірами"
84               }
85   
86           def Activated(self):
87               dialog = BoxBuilderDialog()
88               dialog.exec_() # Модальний виклик
89   
90           def IsActive(self):
91               return True
92   
93       # === РОБОЧЕ СЕРЕДОВИЩЕ ===
94       class BoxBuilderWorkbench (FreeCADGui.Workbench):
95           MenuText = "Box Builder"
96           ToolTip = "Створення власних коробок за допомогою GUI"
97   
98           def Initialize(self):
99               self.list = ["BoxBuilderCommand"]
100              self.appendToolbar("Box Tools", self.list)
101              self.appendMenu("Box Builder", self.list)
102   
103          def GetClassName(self):
104              return "Gui::PythonWorkbench"
105   
106      FreeCADGui.addCommand("BoxBuilderCommand", BoxBuilderCommand())

6/8

🔎 Розбір ключових частин

1. Діалогове вікно (BoxBuilderDialog)

  • Успадковується від QtGui.QDialog
  • Використовує QFormLayout для акуратного розміщення полів
  • Кнопка Create Box викликає on_create(), Cancel — закриває вікно

2. Обробка вхідних даних

  • Перетворення тексту на число з плаваючою комою (float)
  • Перевірка, що значення є позитивними
  • У разі помилки — показати попередження через QMessageBox.warning

3. Створення об’єкта

  • Функція create_box() винесена окремо — для більш чистого коду
  • Генерує унікальне ім’я, щоб уникнути конфліктів

4. Запуск вікна

  • dialog.exec_() — робить вікно модальним (ви не можете взаємодіяти з FreeCAD, поки воно відкрите)

7/8

📋 Крок 4. Перевірка роботи

  1. Зберегти файли
  2. Перезапустити FreeCAD
  3. Вибрати робоче середовище «Box Builder»
  4. Натиснути кнопку «Box Builder»
  5. У вікні, що з’явиться, ввести розміри → натиснути Create Box

✅ Повинна з’явитися коробка з вашими параметрами!

Спробуйте:

  • Введення літер → з’явиться помилка
  • Введення від’ємного числа → помилка
  • Введення дробових чисел (наприклад, 12.5) → працює!

🥕 Практичне завдання

  1. Додайте четверте поле: «Name» (Ім’я) — щоб користувач міг задавати ім’я об’єкта.
  2. Переконайтеся, що якщо ім’я порожнє, використовується значення за замовчуванням (“CustomBox”).
  3. Додайте прапорець (checkbox) «Center on origin» (Центрувати по початку координат) — якщо він увімкнений, коробка має бути відцентрована по початку координат.

💡 Підказка для центрування:
Після створення коробки змініть її властивість Placement:

1    from FreeCAD import Vector
2    box.Placement.Base = Vector(-length/2, -width/2, -height/2)

💡 Поради для роботи з GUI

8/8

  • Завжди обгортайте введення у try/except — користувач може ввести що завгодно
  • Використовуйте QDoubleValidator, щоб дозволити лише числа (за бажанням)
  • Для складних інтерфейсів краще використовувати Qt Designer і завантажувати файли .ui, але для простих завдань — код простіший

⏭️ Що далі?

В Уроці 5 ми:

  • Дізнаємося, як зберігати налаштування між запусками FreeCAD
  • Переконаємося, що останнє введене значення розміру запам’ятовується
  • Використаємо вбудований механізм FreeCAD: FreeCAD.ParamGet()

Це зробить ваш додаток ще зручнішим!

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *