Viewprovider/zh-cn

简介

视图提供器是一些类,用于定义对象在树状视图三维视图中的显示方式,以及它们如何与某些图形操作(如选择)进行交互。

它们是对脚本化对象的补充。脚本对象的基类定义了其数据属性,而视图提供器则定义了其视图属性。这些视图属性并非对象的核心信息,仅表示诸如线宽、线色、面色等非核心的信息。在仅使用终端的会话中,不会加载视图提供器,因为没有界面来操作这些可见属性。

视图属性和数据属性一样,都能从属性编辑器访问。

Python 视图提供器

视图提供器类的名称经常包括 ViewProvider, 它们被分配给基对象的 ViewObject 属性。

在这一例子中,我们为视图提供器定义了两个原本不存在的属性,并为它们分配默认值。我们还定义了 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, 然后再添加视图提供器,例如 ViewProviderCustom. 只有在确认图形界面可用时,才能分配视图提供器,否则 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 */
               "                ",
               "  +          +  ",
               " +.+        +.+ ",
               "  +.+      +.+  ",
               "   +        +   ",
               "      ++++      ",
               "     +....+     ",
               "     +...++     ",
               "     +..+++     ",
               "     +.++.+     ",
               "      ++++      ",
               "   +        +   ",
               "  +.+      +.+  ",
               " +.+        +.+ ",
               "  +          +  ",
               "                "
               };
               """

参见树状视图中的自定义图标中的多个示例。