## VisIt 的基础架构
在开始之前,重要的是要了解VisIt的基础架构。 有关更多信息,请参见以下链接:
- AVT Overview
- State objects
- Engine Design
- Building plugins using CMake
您首先应该问自己是否需要新的plot。 如果您需要的仅仅是转换数据而不是专门绘制它的方法,则可以考虑编写一个operator,这将更容易。 如果您既需要转换数据并为该数据提供新的图形表示,则可能需要使用新的plot。
## Plot 是如何工作的
一个Plot由很多部分组成,每个部分运行在一个VisIt的组件中。Plot中不同的部分会被编译进不同的Plugin中。
- libE:运行在计算引擎中,它包括了`avtPlot`以及实现它的各种`filters`。这正是数据处理的地方。
- libV:运行在viewer中,可以做一小部分的数据处理,但主要用于渲染在计算引擎中生成的图的几何形状。
- libG : 运行在 gui 中,提供了一个Qt GUI窗口,可让您操纵绘图属性。
- libS : 运行在 CLI 中,提供的绑定可让您从Python操作图的属性。
Plot 在VisIt的计算引擎中创建管道。pipeline最初是database,plot就是在这个database上操作的,然后可以向pipeline上增添filters。pipeline的重点是一个数据集,这个数据集会传输到viewer。一旦将数据集发送到viewer后,plot可以应用渲染filter来更改绘图数据集的表示形式,并影响它的绘制方式。viewer还执行将绘图渲染到VisIt的OpenGL可视化窗口中的这一部分工作。
gui和cli的plot插件提供了用于设置图属性的机制,这些属性最终最终落入计算引擎的管道中,并影响对图数据集进行数据处理的方式。
## Getting started
待续。。。
## The state object
VisIt中的所有状态都以**状态对象**的形式在应用程序之间传输。状态对象本质上是一个C++类,其中包含描述对象的字段。对于plot而言,状态对象包含图的属性,这些属性会影响应用于图的过滤器以及发生的任何渲染。通过使用`xmledit`定义包含状态对象字段的XML文件,可以与其他状态对象一样创建plot的状态对象。生成XML文件后,作为xml2plugin生成脚本的一部分运行的xml2atts工具将创建一个包含所需字段的C++类。C++状态对象类作为libG, libS, libV, libE插件的一部分进行编译,这些插件构成由VisIt的各种组件加载的不同插件。
## The filter
一种考虑plot的方法是作为一组管道filter,这些filter将执行并与呈现结果数据的特定方法关联。并非所有图都需要新的过滤器来转换数据,但这取决于要处理的数据类型以及如何以图形方式表示。plot可以提供一个新的`avtFilter`来接收数据并将其转换为新的表示形式。例如,VisIt的散点图采用一个包含2个或多个变量的数据组成的网格,其过滤器使用这些变量来创建一个与原始网格完全不同的基于点的新网格。
![](https://pic.stdstring.com/Visit_ex_network.jpg)
## 派生的avtXXXPlot类
派生的`avtPlot`类是用于过滤器的各种容器,这些过滤器实现绘图的数据处理并设置绘制绘图的映射器。 您的avtPlot类将:
1. 将过滤器添加到VisIt管道
1. 接受新的绘图属性并使用它们来设置过滤器属性和渲染属性
1. 提供行为信息(例如添加图例)
## Plot types
VisIt的所有绘图最终都源自`avtPlot`类,但大多数源自特殊的子类,这些子类合并了逻辑以执行特定于该绘图所表示的数据类型的操作。
| Plot type | When to use |
| ------------------ | ------------------------------------------------------------ |
| avtSurfaceDataPlot | When you only need to plot external surfaces. |
| avtVolumeDataPlot | When you need the plot's 3D, internal data too. |
| avtImageDataPlot | When you will create an image-based representation of the plot. |
| avtLineDataPlot | When your plot will consist of lines. |
| avtPointDataPlot | When your plot will consist of point data. |
## 重要 methods
### SetAtts
此方法将新的绘图属性(状态对象)设置到绘图中。 此方法必须将情节的atts成员设置为新的情节属性。 它还应设置图的needsRecalculation字段,以确定图属性是否已足够更改,以使图应在计算引擎上重新执行。 有时,不需要重新执行绘图,例如,当您更改影响绘图方式且不影响绘图数据的绘图属性时。
```cpp
virtual void SetAtts(const AttributeGroup*);
```
### GetMapper
返回绘制绘图的映射器。
```cpp
virtual avtMapper *GetMapper(void);
```
### ApplyOperators
此方法允许您的绘图将过滤器添加到将在计算引擎上执行的管线部分。
```cpp
virtual avtDataObject_p ApplyOperators(avtDataObject_p);
```
### ApplyRenderingTransformation
该方法允许您的绘图将过滤器添加到将在查看器上执行的管线部分。 这最常用于与绘制数据有关的操作。
```cpp
virtual avtDataObject_p ApplyRenderingTransformation(avtDataObject_p);
```
### CustomizeBehavior
使用此方法设置绘图顺序并添加图例等。
```cpp
virtual void CustomizeBehavior(void);
```
### CustomizeMapper
在用于绘制绘图的映射器上设置属性。 这通常意味着使用合同中的信息来设置控制如何绘制绘图的属性。
```cpp
virtual void CustomizeMapper(avtDataObjectInformation &);
```