In Questo Articolo📄 Посібник: Створення Додатків для FreeCAD
Мета уроку: Створити вікно з полями для введення довжини, ширини та висоти, і побудувати коробку з цими параметрами, натиснувши кнопку.
📜 Частина 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. Перевірка роботи
- Зберегти файли
- Перезапустити FreeCAD
- Вибрати робоче середовище «Box Builder»
- Натиснути кнопку «Box Builder»
- У вікні, що з’явиться, ввести розміри → натиснути Create Box
✅ Повинна з’явитися коробка з вашими параметрами!
Спробуйте:
- Введення літер → з’явиться помилка
- Введення від’ємного числа → помилка
- Введення дробових чисел (наприклад, 12.5) → працює!
🥕 Практичне завдання
- Додайте четверте поле: «Name» (Ім’я) — щоб користувач міг задавати ім’я об’єкта.
- Переконайтеся, що якщо ім’я порожнє, використовується значення за замовчуванням (“CustomBox”).
- Додайте прапорець (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()
Це зробить ваш додаток ще зручнішим!