简介
ParaView/Properties Panel - KitwarePublic
从ParaView 3.98.0开始,ParaView提供给使用者一个属性面板(Properties Panel)来进行模型管线(如reader,filter,source)等的参数修改。同时该面板还能控制生成的数据是如何渲染的。该面板代替了原有的对象查看器(Object Inspector)以及其属性和显示标签。
Key Features
1、对象查看器(Object Inspector)在不同的显示标签上显示模型和显示的参数,这意味着使用者需要切换不同的显示页来查看或控制对应的参数。属性面板(Properties Panel)能够在一个显示页上改变各种类别的参数。同时参数仍然可以按组进行组织,也可以显示或者隐藏。
2、属性面板支持将属性区分为默认展示属性(default)和高级展示属性(advanced)。这使得可以在显示页面上展示最少的参数(默认展示),同时能够通过选择高级(advanced)选项来显示更多更详细的参数。高级显示使用一个齿轮按钮来进行控制。
3、提供搜索框,能够搜索参数的标签。无论面板当前处于何种模式,搜索总是搜索所有可用参数,基本或高级。
4、插件和定制应用程序开发人员可以编写扩展来为单个参数提供定制小部件,而不必为整个面板编写定制。这确保了诸如搜索、切换基本/高级视图等功能继续工作,而不管面板是否有定制。这也使得开发人员可以只关注需要定制的参数,而不必处理所有其他参数。
5、默认视图(即非高级视图)中显示的微件可以是上下文相关的,例如,当用户切换到统一直线网格数据集的“切片”表示时,切片方向和切片偏移参数在默认视图中变得可用。
Implementation Details
以下类封装了属性面板的核心功能。
pqPropertiesPanel(base-calss: QWidget)
pqPropertiesPanel是一个QWidget子类。其中包含了整个面板的组成部分:搜索栏,按钮等。它在创建源/表示时跟踪创建面板,在相应的代理被破坏时清理它们,并显示活动源/表示的面板,等等。它没有任何逻辑来控制如何创建代理面板。为此,它简单地使用了pqProxyWidget。通常,面板显示两个独立的pqProxyWidget实例,一个用于过滤器/源代理的参数,另一个用于活动显示/表示的参数。
pqProxyWidget(base-class: QWidget)
pqProxyWidget代表vtkSMProxy的面板。pqProxyWidget为代理的每个属性(或代理组)创建小界面,这些属性(或代理组)与任何注册的pqPropertyWidgetInterface实例相关,以创建自定义小界面。pqProxyWidget由pqPropertiesPanel来调用,用来为面板的源/过滤器和显示/表示部分创建面板。
默认情况下,pqProxyWidget不会在面板中显示任何界面(在构造函数之后)。使用filterWidgets()或updatePanel()显示符合给定标准的界面。
pqProxyWidget也可以在其他需要显示和编辑代理属性的程序上创建和使用。比如在输出数据文件时改变输出器或者导出器的参数。
代理的vtkSMProperty(或vtkSMPropertyGroup)创建的每个小部件都是pqPropertyWidget子类。插件可以为额外的定制提供新的pqPropertyWidget子类。
pqPropertyWidget(base-class: QWidget)
pqPropertyWidget表示一个显示界面,该界面在pqPropertyPanel展示了代理的属性(代理的属性或者显示的属性)。有多个子类用来处理ParaView中遇到的典型属性类型。通过实现pqPropertyWidgetInterface,新的显示类型可以注册到程序中。
为特定属性或属性组创建的pqPropertyWidget子类的类型基于属性的类型及其域。ServerManager XML还可以有显式的覆盖来指示要创建的小部件的类型(如本文后面所解释的)。
pqPropertyWidgetDecorator(base-class: QObject)
通常,我们希望添加定制逻辑,但不一定要改变我们为属性创建的小部件,而是改变它的显示或启用方式和时间。例如,用于提取CTH部件过滤器的面板需要确保用户在任何给定时间仅检查一种类型的卷阵列。人们当然可以创建定制的小部件来处理这种情况。但是也可以简单地创建和使用pqPropertyWidgetDecorator子类。类似于pqPropertyWidgets,这些也可以在ServerManagerXML中指定。pqPropertyWidgetInterface提供了一种注册新类型的机制,从而使插件能够提供新类型的装饰器。
Extensions to ServerManager XML
如之前提到的,ServerManager XML新增了多个扩展来支持开发者控制创建代理属性的显示组件的类型。一般来说,每个非内部、非信息属性(vtkSMProperty或子类)都有一个小部件。此外,可以将属性分组在一起,并且可以为整个属性组创建一个小部件。属性组可以用来为组中的所有属性创建一个新的定制小部件,或者仅仅为面板上的布局创建一个定制小部件。
属性组(Property Groups)
属性组用来为一组属性创建一个自定义显示组件或者对面板进行布局控制。ServerManager XML中有多种方法来定义属性组。
Property Groups: Inline with Proxy Definitions
这是定义属性组的最简单方式。简单的添加<PropertyGroup />元素就可以定义一个代理属性的属性组。这些组定义将被继承(当使用base_proxygroup,base_proxyname属性将此代理定义作为基础时)。但是,如果这个代理定义成为另一个代理的子代理,这些属性组定义将不会公开。
代码如下:
<SourceProxy class="vtkRTAnalyticSource" label="Wavelet" name="RTAnalyticSource">
<IntVectorProperty command="SetWholeExtent" ...>
...
</IntVectorProperty>
...
<DoubleVectorProperty command="SetXMag" ...>
...
</DoubleVectorProperty>
...
<PropertyGroup label="Frequency">
<Property name="XFreq" />
<Property name="YFreq" />
<Property name="ZFreq" />
</PropertyGroup>
<PropertyGroup label="Amplitude">
<Property name="XMag" />
<Property name="YMag" />
<Property name="ZMag" />
</PropertyGroup>
</SourceProxy>
对于使用子代理的代理,通常是表示代理,仍然可以使用样式来内联定义组。在这种情况下,< PropertyGroup/>下的< Property/>元素的name属性必须使用该属性的exposed_name。
Property Groups: For Exposed Properties
当在子代理中声明公开属性时,也可以定义属性组。这对于拥有大量子代理的表达代理(representation proxies)来说是非常常见的。代码如下:
<PVRepresentationProxy name="PVRepresentationBase" ...>
...
<SubProxy>
<Proxy name="SurfaceRepresentation"
proxygroup="representations"
proxyname="SurfaceRepresentation">
</Proxy>
<ExposedProperties>
<PropertyGroup panel_visibility="default"
type="ColorEditor"
label="Coloring" >
<Property name="Ambient" />
<Property name="AmbientColor" />
<Property name="ColorArrayName" />
<Property name="ColorAttributeType" />
<Property name="Diffuse" />
<Property name="DiffuseColor" />
<Property name="LookupTable" />
</PropertyGroup>
</ExposedProxy>
</SubProxy>
...
</PVRepresentationProxy>
Widget Visibility
要指示对应于属性(或属性组)的显示组件是显示在代理的默认视图中还是高级视图中,可以使用panel_visibility属性。可以在代理的属性定义(case A)或PropertyGroup定义(case B)或公开的属性声明(case C)上指定该属性。panel_visibility的有效值为:
1、"default":在默认模式下,显示组件将会被显示。
2、"advanced":打开高级显示模式时,会显示该显示组件。
3、"never":任何情况下都不会被创建以及显示。
CASE A:
<SourceProxy label="Wavelet" name="RTAnalyticSource" ...>
...
<IntVectorProperty name="WholeExtent"
...
panel_visibility="default">
...
</IntVectorProperty>
<DoubleVectorProperty name="Maximum"
panel_visibility="advanced">
...
</DoubleVectorProperty>
</SourceProxy>
CASE B:
<PVRepresentationProxy name="PVRepresentationBase" ...>
...
<SubProxy>
<Proxy name="SurfaceRepresentation" ...></Proxy>
<ExposedProperties>
<PropertyGroup panel_visibility="default"
type="ColorEditor"
label="Coloring" >
...
</PropertyGroup>
</ExposedProperties>
</SubProxy>
...
</PVRepresentationProxy>
CASE C:
<PVRepresentationProxy name="PVRepresentationBase" ...>
...
<SubProxy>
<Proxy name="SurfaceRepresentation" ...></Proxy>
<ExposedProperties>
...
<PropertyGroup label="Scalar Coloring">
<Property name="MapScalars"
panel_visibility="advanced" />
<Property name="InterpolateScalarsBeforeMapping"
panel_visibility="advanced" />
</PropertyGroup>
</ExposedProperties>
</SubProxy>
</PVRepresentationProxy>
Widget Type
使用panel_widget属性来为属性或者属性组指定一个widget的类型。通常使用插件机制注册新的widget类型。ParaView还提供了一些widget类型。在所有情况下,该属性都可以作为panel_visibility属性在Property和PropertyGroup元素上提供。
<DoubleVectorProperty command="SetEdgeColor"
default_values="0 0 0.5"
name="EdgeColor"
panel_widget="color_selector"
panel_visibility="advanced">
</DoubleVectorProperty>
Debugging
为了帮助调试属性面板上小部件的创建,可以设置环境变量PV_DEBUG_PANELS。每当创建新的pqProxyWidget时,它都会在控制台和ParaView输出窗口中打印出调试文本。例如,“球体源”面板产生以下输出。
------------------------------------------------------
Creating Properties Panel for Wavelet ( sources , RTAnalyticSource )
------------------------------------------------------
Property: WholeExtent ( Whole Extent )
3x2 grid of QLineEdit's for an IntVectorProperty with an IntRangeDomain ( "range" ) and 6 elements
Property: Center ( Center )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: Maximum ( Maximum )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: XFreq ( X Freq )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: YFreq ( Y Freq )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: ZFreq ( Z Freq )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: XMag ( X Mag )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: YMag ( Y Mag )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: ZMag ( Z Mag )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: StandardDeviation ( Standard Deviation )
List of QLineEdit's for an DoubleVectorProperty with an DoubleRangeDomain ( "range" ) and more than one element
Property: SubsampleRate ( Subsample Rate )
List of QLineEdit's for an IntVectorProperty with an IntRangeDomain ( "range" ) and more than one element
此外,为了调试对Apply按钮状态的更改,可以设置环境变量PV_DEBUG_APPLY_BUTTON。