Viewprovider/ru

Введение

Viewproviders - ПоставщикВида - это классы, определяющие, как объекты будут выглядеть в дереве проекта и 3D виде, и как они будут взаимодействовать с определёнными графическими действиями, такими как выбор.

Они дополняют объекты скриптов. В то время как базовый класс скриптового объекта определяет его properties - свойства data - данные , viewprovider определяет его properties - свойства view - вид . Эти свойства представления не являются существенной информацией об объекте, поскольку они указывают только поверхностную информацию, такую как ширина линии, цвет линии, цвет грани и т. д. В сеансе работы только с терминалом viewprovider не загружается, поскольку не будет интерфейса для работы с этими видимыми свойствами.

Как и свойства данных, свойства вида доступны через редактор свойств.

Python ПоставщикВида

Классы viewproviders обычно содержат ViewProvider в своем имени. Они назначаются на атрибут ViewObject базового объекта.

В этом примере мы определяем два свойства для viewprovider, только если они ещё не существуют, и присваиваем им значения по умолчанию. Мы также определяем метод onChanged, который запускается каждый раз, когда свойство изменяется. Нам нужно проверить свойство по имени, а затем вызвать один из двух методов, которые выполнят фактическую работу по обновлению шаблона или установке его размера.

# views/view_custom.py
class ViewProviderCustom:
    """Viewprovider of the custom object."""

    def __init__(self, vobj):
        self.Object = vobj.Object

        self._set_properties(vobj)
        vobj.Proxy = self

    def _set_properties(self, vobj):
        if not hasattr(vobj, "Pattern"):
            vobj.addProperty("App::PropertyEnumeration",
                             "Pattern",
                             "Custom",
                             "Defines a hatch pattern for this object.")
            vobj.Pattern = ["None", "diagonals", "cross", "brick"]

        if not hasattr(vobj, "PatternSize"):
            vobj.addProperty("App::PropertyFloat",
                             "PatternSize",
                             "Custom",
                             "Defines the size of the hatch pattern.")
            vobj.PatternSize = 1

    def onChanged(self, vobj, prop):
        if prop in "Pattern":
            self._set_pattern(vobj.Pattern)
        if prop in "PatternSize":
            self._set_size(vobj.PatternSize)

    def _set_pattern(self, pattern):
        ...

    def _set_size(self, size):
        ...

Обычно сначала добавляется прокси класс объекта, например, CustomObject, а затем viewprovider, например, ViewProviderCustom. Viewprovider можно назначать только после того, как мы убедились, что графический интерфейс доступен, поскольку в противном случае атрибут ViewObject не существует, и использование этого элемента в качестве входного для нашего класса приведёт к ошибке.

import FreeCAD as App
import objects.custom as custom
import views.view_custom as view_custom

doc = App.newDocument()
obj = doc.addObject("Part::FeaturePython", "Custom")

custom.CustomObject(obj)

if App.GuiUp:
    view_custom.ViewProviderCustom(obj.ViewObject)

Пользовательские иконки

Реализовав метод getIcon, вы можете указать иконку, которая будет отображаться в дереве проекта в верхней части комбо панели.

Возвращаемое значение может быть полным путём к иконке.

import os
some_path = "/home/user/.FreeCAD/custom_icons"

class ViewProviderCustom:
    ...

    def getIcon(self):
        return os.path.join(some_path, "my_icon.svg")

Относительный путь к иконке в скомпилированном файле ресурса.

import MyModule_rc.py

class ViewProviderCustom:
    ...

    def getIcon(self):
        return ":/icons/my_icon.svg"

Необработанная иконка XPM (англ.) (рус.), которая по сути является ASCII-графикой.

import MyModule_rc.py

class ViewProviderCustom:
    ...

    def getIcon(self):
        return """
               /* XPM */
               static char *Some_icon_xpm[] = {
               /* columns rows colors chars-per-pixel */
               "16 16 3 1 ",
               "  c None",
               ". c #D71414",
               "+ c #AA1919",
               /* pixels */
               "                ",
               "  +          +  ",
               " +.+        +.+ ",
               "  +.+      +.+  ",
               "   +        +   ",
               "      ++++      ",
               "     +....+     ",
               "     +...++     ",
               "     +..+++     ",
               "     +.++.+     ",
               "      ++++      ",
               "   +        +   ",
               "  +.+      +.+  ",
               " +.+        +.+ ",
               "  +          +  ",
               "                "
               };
               """

Смотри различные примеры на странице Пользовательские иконки в дереве проекта.