Jump to content

Создание инструментов интерфейса

From FreeCAD Documentation
This is the approved revision of this page, as well as being the most recent.

В последних двух главах мы рассмотрели, как создать геометрию Детали - Part и создать параметрические объекты. Для получения полного контроля над FreeCAD не хватает последней детали: Создать инструменты, которые будут взаимодействовать с пользователем.

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

Python предлагает базовый инструмент, позволяющий пользователю вводить текст на экране:

text = raw_input("Высота прямоугольника?")
print("Введённая высота равна ",text)

Однако для этого требуется запущенная консоль Python, а при запуске нашего кода из макроса мы не всегда уверены, что консоль Python будет включена на компьютере пользователя.

Графический интерфейс пользователя ГИП (рус.) GUI (англ.) - включающий в себя меню, панели инструментов, 3D-вид и другие визуальные компоненты FreeCAD - разработан для того, чтобы сделать программу интуитивно понятной и доступной. Он служит мостом между пользователем и основной функциональностью FreeCAD, позволяя как обычным пользователям, так и экспертам эффективно взаимодействовать с программой.

Графический интерфейс FreeCAD построен с использованием Qt, мощного набора инструментов графического интерфейса с открытым исходным кодом, который предоставляет широкий спектр возможностей. Qt предлагает основные строительные блоки для проектирования интерфейса, такие как диалоговые окна, кнопки, ярлыки, поля ввода текста и выпадающие меню, известные под общим названием "виджеты". Эти виджеты составляют основу пользовательского интерфейса FreeCAD.

Одним из ключевых преимуществ Qt является его кроссплатформенная совместимость, позволяющая FreeCAD без проблем работать на различных операционных системах, таких как Windows, macOS и Linux. Кроме того, гибкость Qt позволяет разработчикам легко расширять и настраивать интерфейс FreeCAD, создавая новые панели инструментов и меню или создавая совершенно новые модули, интегрируемые в программу. Благодаря такой адаптивности FreeCAD остаётся удобным для пользователя и легко расширяемым.

Для пользователей, заинтересованных в написании скриптов или разработке новых инструментов, Python API FreeCAD также предоставляет доступ ко многим функциям Qt. Это означает, что вы можете не только автоматизировать задачи, но и создавать пользовательские виджеты или диалоговые окна, которые интегрируются непосредственно в среду FreeCAD.

Инструменты Qt очень легко использовать из Python, благодаря модулю Python под названием PySide. PySide - это официальная привязка библиотеки Qt к Python, обеспечивающая удобный способ создания виджетов и взаимодействия с ними программным путём. Она позволяет разработчикам создавать интерфейсы, управлять пользовательским вводом (например, считывать текст из полей ввода) и определять действия, основанные на взаимодействии с пользователем, например, реагировать на нажатие кнопки. Используя PySide, вы можете создавать пользовательские диалоговые окна, меню и панели инструментов непосредственно в FreeCAD, расширяя его функциональность таким образом, чтобы она плавно интегрировалась с существующим интерфейсом.

PySide позволяет легко связать действия пользователя с конкретными функциями в вашем коде. Например, вы можете настроить кнопку так, чтобы при её нажатии запускался скрипт, выполняющий команду или изменяющий объект в 3D-виде. Эта интерактивная возможность открывает безграничные возможности для настройки рабочих процессов и автоматизации повторяющихся задач.

Qt также предоставляет ещё один интересный инструмент под названием Qt Designer, который сегодня встроен в более крупное приложение под названием Qt Creator. Он позволяет создавать диалоговые окна и панели интерфейса в графическом виде, вместо того чтобы писать код вручную. В этой главе мы будем использовать Qt Creator для разработки виджета панели, который мы будем использовать в панели Task - Задача FreeCAD. Итак, вам нужно скачать и установить Qt Creator с его официальной страницы, если вы работаете под Windows или Mac (под Linux он обычно доступен из приложения "Менеджер приложений").

В следующем упражнении мы сначала создадим панель с помощью Qt Creator, которая будет запрашивать значения длины, ширины и высоты, а затем создадим вокруг неё класс Python, который будет считывать значения, введённые пользователем с панели, и создавать куб с заданными размерами. Этот класс Python будет затем использоваться FreeCAD для отображения и управления панелью задач:

Начнём с создания виджета. Запусти Qt Creator, а затем выбери меню Файл → Создать файл или проект → Qt → Форма Qt Designer (затем нажать "Choose...") → Dialog without buttons. Нажми Далее (Next), укажи имя файла для сохранения, щёлкни Далее (Next), оставь все поля проекта в значениях по умолчанию ("<none>") и Создать (Create). Система задач FreeCAD автоматически добавляет кнопки OK/Отмена, поэтому здесь мы выбрали диалог без кнопок.

  • Найди Label в списке на левой панели (в разделе Display Widgets) и перетащи его на холст нашего виджета. Дважды щёлкни на недавно размещённом Label и измени его текст на Длина.
  • Щёлкни правой кнопкой мыши по свободному месту холста виджета и выбери Компоновка → Скомпоновать по сетке. Это превратит наш виджет в сетку с одной ячейкой, занятой нашей первой меткой. Теперь мы можем добавить следующие элементы слева, справа, сверху или снизу от нашей первой метки, и сетка автоматически расширится.
  • Добавь ещё две метки под первой и измени их текст на Ширина и Высота:

  • Теперь поместите 3 виджета Double Spin Box (в разделе Input Widgets) рядом с нашими метками Length, Width и Height. Для каждого из них в правой нижней панели, которая показывает все доступные настройки для выбранного виджета, найдите Suffix и установите для них суффикс мм. В FreeCAD есть более продвинутый виджет, который может работать с разными единицами измерения, но он недоступен в Qt Creator по умолчанию (но может быть скомпилирован), поэтому пока мы будем использовать стандартный Double Spin Box, и добавим суффикс "мм", чтобы пользователь знал, в каких единицах он работает:

  • Теперь наш виджет готов, осталось убедиться в последней вещи. Так как FreeCAD должен будет обращаться к этому виджету и считывать значения длины, ширины и высоты, нам нужно дать соответствующие имена этим виджетам, чтобы мы могли легко получить их из FreeCAD. Выдели каждый из виджетов Double Spin Boxes и в правом верхнем окне дважды щёлкни по их Object Name, изменив их на что-нибудь легко запоминающееся, например: BoxLength, BoxWidth и BoxHeight:

  • Сохрани файл, теперь ты можешь закрыть Qt Creator, остальное будет сделано в Python.
  • Открой FreeCAD и создай новый макрос из меню „“'Макросы → Макрос... → Создать
  • Вставь следующий код. Убедитесь, что путь к файлу совпадает с тем, куда ты сохранил .ui файл, созданный в QtCreator:
import FreeCAD,FreeCADGui,Part
 
# CHANGE THE LINE BELOW
path_to_ui = "C:\Users\yorik\Documents\dialog.ui"
 
class BoxTaskPanel:
   def __init__(self):
       # this will create a Qt widget from our ui file
       self.form = FreeCADGui.PySideUic.loadUi(path_to_ui)
 
   def accept(self):
       length = self.form.BoxLength.value()
       width = self.form.BoxWidth.value()
       height = self.form.BoxHeight.value()
       if (length == 0) or (width == 0) or (height == 0):
           print("Error! None of the values can be 0!")
           # we bail out without doing anything
           return
       box = Part.makeBox(length,width,height)
       Part.show(box)
       FreeCADGui.Control.closeDialog()
        
panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)

В приведённом выше коде мы использовали удобную функцию „“'PySideUic.loadUi'„“ из модуля FreeCADGui. Эта функция загружает файл .ui, создаёт из него виджет Qt и сопоставляет имена, чтобы мы могли легко получить доступ к подвиджетам по их именам (например: self.form.BoxLength)

Функция "accept - принять" также является удобством, предлагаемым Qt. Если в диалоге есть кнопка "OK" (что происходит по умолчанию при использовании панели задач FreeCAD), любая функция с именем "accept - принять" будет автоматически выполняться при нажатии кнопки "OK". Аналогично можно добавить функцию "reject - отклонить", которая будет выполняться при нажатии кнопки "Отмена". В нашем случае мы не добавили эту функцию, поэтому нажатие кнопки "Отмена" приведёт к поведению по умолчанию (ничего не делать и закрыть диалог).

Если мы реализуем любую из функций accept или reject (принять или отклонить), их поведение по умолчанию (ничего не делать и закрыть) больше не будет выполняться. Поэтому нам нужно самим закрыть панель задач. Это делается с помощью:

FreeCADGui.Control.closeDialog()

После того как мы получили нашу панель BoxTaskPanel, которая имеет 1-е виджет под названием «self.form» и 2-е, если необходимо, функции принятия и отклонения, мы можем открыть панель задач с её помощью, что и делается с помощью этих двух последних строк:

panel = BoxTaskPanel()
 FreeCADGui.Control.showDialog(panel)

Обратите внимание, что виджет, созданный с помощью PySideUic.loadUi, не является специфическим для FreeCAD, это стандартный виджет Qt, который можно использовать с другими инструментами Qt. Например, мы могли бы показать с его помощью отдельное диалоговое окно. Попробуйте сделать это в Python-консоли FreeCAD (конечно, используя правильный путь к вашему .ui файлу):

from PySide import QtGui
 w = FreeCADGui.PySideUic.loadUi("C:\Users\yorik\Documents\dialog.ui")
 w.show()

Конечно, мы не стали добавлять в диалог кнопки "ОК" или "Отмена", поскольку он был создан для использования из панели задач FreeCAD, где уже есть такие кнопки. Поэтому нет никакого способа закрыть диалог (кроме нажатия кнопки "Закрыть окно"). Но функция show() создаёт немодальный диалог, то есть не блокирует остальную часть интерфейса. Поэтому, пока наш диалог открыт, мы можем читать значения полей:

w.BoxHeight.value()

Это очень полезно для тестирования.

Наконец, не забудьте, что на FreeCAD Wiki, в разделе Написание сценариев Python, есть много другой документации по использованию виджетов Qt, которая содержит Руководство по созданию диалогов, специальный учебник по PySide из 3-х частей, который подробно освещает эту тему.

Связанные ссылки