插件简介

c++ 开发手册

ParaView: ParaView C++ API Documentation

插件可以通过多种方式来扩展ParaView:

(1)添加新的读写器以及滤波器;

(2)添加新的自定义用户界面(GUI),比如工具栏。

(3)新的显示数据的显示器

插件分类

插件是以共享库(*.so,linux及maxos系统)或者动态链接库(*.dll,windows系统)的形式存在。对于一个能够被ParaView加载的插件,它必须使用相对应版本的ParaView进行开发。

插件可以分为两大类:

(1)服务端插件:这些插件用来扩展ParaView的算法能力。比如新的滤波算法,新的读取器。ParaView在服务端进行数据处理,所以这些插件在服务端加载。

(2)客户端插件:客户端插件用来扩展ParaView用户交互界面,比如新滤波器的属性面板工具栏以及显示界面。这些插件在客户端加载。

一般情况下,一个插件既包括服务端插件,也包括客户端插件。如一个新的滤波器插件,即需要在服务端进行数据处理,也需要在客户端进行属性设置。该插件则需要服务端和客户端都进行对应的加载。

一边情况下,开发者不需要区分一个插件是否为服务端插件或者客户端插件。只要同时在服务端及客户端进行一个插件的加载,ParaView会自动进行相关模块的处理。

插件加载方式

插件加载的方式有四种。

(1)使用GUI中的插件管理(Plugin Manager)

插件管理有加载客户端插件以及加载服务端插件(仅当连接到服务端时显示)。通过选在插件(*.dll或者*.so)文件进行加载。如果加载成功,已加载列表中会显示该插件的名称。插件管理也会列出自动加载插件的所有地址。

插件系统会记录已经加载的所有插件,这也意味着,如果没有卸载插件,未来重新打开ParaView时会自动加载之前加载过的插件。

也可以通过设置"Auto Load"选择框来进行插件自动添加。客户端插件会在系统启动时自动添加,服务端插件会在连接上服务端时自动添加。

(2)使用环境变量自动加载插件

为了让ParaView能够在启动时自动加载一系列插件,可以定义PV_PLGUIN_PATH环境变量。PV_PLUGIN_PATH是一个目录列表(Unix中使用:分隔,Windows中使用;分隔)。ParaView启动时会自动在这些目录中进行插件加载。

更加灵活的控制可以使用PV_PLUGIN_CONFIG_FILE环境变量。PV_PLUGIN_CONFIG_FILE同样是一个目录列表。这些目录下存放着一些列XML插件配置分拣。ParaView会在启动时自动加载该配置文件中的插件。XML插件配置文件格式如下:

<?xml version="1.0"?>
<Plugins>
  <Plugin name="MyPlugin" filename="/absolute/path/to/libMyPlugin.so"/>
  
  <Plugin name="MyPluginRel" filename="relative/path/to/libMyPlugin.so"/>
</Plugins>

不管状态如何,以这种方式列出的插件将总是被加载 “插件管理器”中的“自动加载”复选框。

(3)使用插件文件(*.plugins)

请确保插件是可用的,并且能够被自动加载。

在插件文件(*.plugins)中的插件会被自动列在Plugin Manager中,并且可以在Plugin Manager中选择自动加载。ParaView在编译构建时创建了默认的插件文件,里面列出了一系列默认插件。插件文件格式如下:

<?xml version="1.0"?>
<Plugins>
  <Plugin name="Moments" auto_load="0"/>
  <Plugin name="PrismPlugin" auto_load="0"/>
  <Plugin name="PointSprite_Plugin" auto_load="0"/>
  <Plugin name="pvblot" auto_load="0"/>
  <Plugin name="H5PartReader" auto_load="1"/>
</Plugins>

调试插件

如果插件加载失败,定义PV_PLUGIN_DEBUG环境变量会让ParaView打印每一步的信息,并且会输出插件加载失败的原因。

***************************************************
Attempting to load /home/utkarsh/Kitware/ParaView3/ParaView3Bin/bin/libSurfaceLIC.so
Loaded shared library successfully. Now trying to validate that it's a ParaView plugin.
Updating Shared Library Paths: /home/utkarsh/Kitware/ParaView3/ParaView3Bin/bin
Plugin instance located successfully. Now loading components from the plugin instance based on the interfaces it implements.
----------------------------------------------------------------
Plugin Information:
  Name        : SurfaceLIC
  Version     : 1.0
  ReqOnServer : 1
  ReqOnClient : 1
  ReqPlugins  :
  ServerManager Plugin : Yes
  Python Plugin : No

CMake文件-添加ParaView包

为了创建插件,需要通过源码编译ParaView。从官网(www.paraview.org)下载的二进制包不包含一些必要的头文件或者一些必要的库。

编写插件的cmake工程需要加载ParaView,如下:

# ParaView requires CMake 3.8 in order to be used.
cmake_minimum_required(VERSION 3.8)
project(myplugin C CXX)

find_package(ParaView REQUIRED)

需要定义ParaView_DIR变量来告诉CMake,ParaView安装的地址。

需要注意的是,C 和 CXX 标志是必须的,因为ParaView需要寻找其他开发包,这些开发包可能是纯C语言编写的(如MPI),并且需要可用的C语言编译器。

加载现有的vtk滤波器

如果一个需要加载的滤波器是vtk开发的,但还没有尝试过加载到ParaView中,这个vtk滤波器可以很容易加载到ParaView中。步骤如下:

(1)编写XML文件,添加该插件

(2)将这个插件编译成共享库或者动态链接库

第一步是简单的,第二步是创建一个ParaView插件的基本步骤。

添加一个新滤波器

为ParaView添加一个新的滤波器是很常见的。该滤波器需要使用基于vtk的算法流程标准进行编写。添加一个vtk类到ParaView中需要满足以下条件:

(1)编写服务器管理配置XML文件,这个文件中描述了该滤波器的代理接口(Proxy interface)。该接口可以在客户端进行创建并修改类服务端的插件实例。该XML文件的编写方式请参考ParaView指南。

(2)为GUI编写一个配置XML文件。该文件可以让ParaView GUI识别该新类。对于滤波器,这一步是可选的,因为ParaView可以通过插件系统自动识别添加滤波器,并显示在 Alphabetical 子菜单中。用户可以使用GUI配置XML将新过滤器添加到滤波器菜单中的特定类别,或者添加新类别。对于读写器,该步骤是必须的,因为ParaView需要知道新的读写器支持的扩展有哪些。

插件资源

通过 _paraview_build_plugin_directory 变量,插件可以在运行时获取和它相关的资源。该变量只在编译成共享库或动态链接库时有效。对于静态插件,该路径为nullptr。如果一个拥有资源的插件需要支持某些资源,建议使用*.qrc文件将资源嵌入插件中。

对于安装的资源,_paraview_build_plugin_directory变量包含编译和安装目录下的插件的位置。编译目录下的资源可能位于"${CMAKE_BINARY_DIR}/${_paraview_build_plugin_directory}"中,并且安装到了安装目录"${_paraview_build_plugin_directory}"下。插件属于 ${_paraview_build_PLUGINS_COMPONENT}组件中,所以资源一般会使用与组件相关的名字。