paraview:Composite Datasets(复合数据集)

Composite Datasets
VTK5.0引入了复合数据集。复合数据集只是由其他数据集组成的数据集。这一概念在定义由其他较小组件组成的复杂结构时非常有用,例如,由轮胎、底盘、座椅等网格组成的汽车非结构化网格。它还用于表示具有自适应网格细化(AMR)的数据集。AMR是指在数值模拟过程中自动细化物理域某些区域的技术。
2006年10月的Kitware Source包括一篇描述VTK中的复合数据集以及如何使用它们的文章。从那时起,VTK中复合数据集的实现经历了一些重大的修改。主要目标为了使使用简单直观。本文描述了这些变化。

复合数据集

复合数据集的新类层次结构如下所示:
在这里插入图片描述

复合数据集的新类层次结构
从上图可以明显看出,我们有vtkCompositeDataSet的3个具体子类。

vtkMultiBlockDataSet是由块组成的数据集。每个块可以是非复合vtkDataObject子类(或叶)或vtkMultiBlockDataSet本身的实例。这使得建造完整的树木成为可能。
vtkHierarchicalBoxDataSet用于AMR数据集,该数据集由细化级别和每个细化级别的统一网格数据集组成。vtkMultiPieceDataSet可以被认为是vtkMultiBlockDataSet的特化,其中任何块都不能是复合数据集。vtkMultiPieceDataSet用于将一个数据集的多个部分分组在一起。

vtkCompositeDataSet是所有复合数据集的抽象基类。它提供了树数据结构的实现。复合数据集的所有子类基本上都是有一定限制的vtkDataSet实例树。
因此,vtkCompositeDataSet为内部树实现提供了受保护的API,子类可以通过该API访问内部树,而离开vtkCompositeDataSet后子类也可以提供公共API来填充数据集。此类提供唯一与迭代器相关的公共API。迭代器用于访问复合数据集中的节点。下面的示例演示了如何使用迭代器在非空、非复合数据集节点上进行迭代。

vtkCompositeDataIterator* iter = compositeData->NewIterator();
for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
  {
  vtkDataObject* dObj = iter->GetCurrentDataObject();
  cout << dObj->GetClassName() <<endl;
  }

正如我们所看到的,访问复合数据集中的节点并没有真正改变。但是,vtkcompositedaset提供的通用API,该API用于使用迭代器设置数据集,使得创建具有相同结构的复合数据集树成为可能,而不必向下转换为具体类型。
下面是一个Outline过滤器的示例,它将standard outline过滤器应用于复合树的每个叶数据集。输出也是一个复合树,每个节点都由大纲过滤器的输出替换。

vtkCompositeDataSet* input = …
vtkCompositeDataSet* output = input->NewInstance();
output->CopyStructure(input);
vtkCompositeDataIterator* iter = input->NewIterator();
for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
  {
  vtkDataSet* inputDS = vtkDataSet::SafeDownCast(iter->GetCurrentDataObject());
  vtkPolyData* outputDS = this->NewOutline(inputDS);
  output->SetDataSet(iter, outputDS);
  outputDS->Delete();
  }
iter->Delete();

默认情况下,迭代器只访问叶节点,即复合树中的非复合数据集。这可以通过切换VisitOnlyLeaves标志来更改。通过将skipmptynodes标志设置为false,可以避免跳过空节点的默认行为。类似地,为了避免遍历整个子树,而不是只访问第一级子树,请将TraverseSubTree标志设置为false。
为了能够寻址复合树中的特定节点,迭代器还为每个节点提供了一个平面索引。节点的平面索引是树的前序遍历中节点的索引。在下图中,树的前序遍历产生:A、B、D、E、C。因此,A的平面索引为0,而C的平面索引为4。vtkExtractBlockFilter等过滤器使用平面索引来标识节点。
在这里插入图片描述

节点的平面索引

MultiPiece Dataset

vtkMultiPieceDataSet是所有复合数据集中最简单的。它用于将一组非复合数据集组合在一起。保存在进程之间划分的数据集片段以及名称非常有用。重申一下,多片段数据集中的片段不能是复合数据集。

Multi-Block Dataset

vtkMultiBlockDataSet是由块组成的复合数据集。它提供API来设置/访问块,如SetBlock、GetBlock、GetNumberOfBlocks等。
块可以是vtkMultiBlockDataSet的实例,也可以vtkDataObject的任何其他子类而非vtkCompositeDataSet的子类。多块数据集不再支持带有块的子数据集的概念。为了达到相同的效果,可以添加一个vtkMultiPieceDataSet作为块,然后将子数据集作为片段放入vtkMultiPieceDataSet中。

Hierarchical-Box Dataset

vtkHierarchicalBoxDataSet用于表示AMR数据集。它包括多个级别的改进以及与每个级别关联的数据集。每个级别的数据集仅限于网格vtkUniformGrid。vtkUniformGrid是支持单元格和点消隐的vtkImageData。在内部,vtkHierarchicalBoxDataSet为每个级别创建一个vtkMultiPieceDataSet实例。一个级别上的所有数据集都作为片段添加到多片段数据集中。vtkHierarchicalDataSet已被弃用,不再受支持。它与vtkMultiBlockDataSet没有太大区别,因此被弃用。

Pipeline Execution

可以创建过滤器的混合管道,过滤器它可以或不可以处理复合数据集。
对于不支持复合数据的筛选器,VTKCompositeDapipeline对复合数据集中的每个叶节点执行筛选器,以生成与输入复合数据集中结构相似的输出。
在该执行程序的前一个实现中,输出将始终是具体复合数据集的通用超类。
换句话说,如果将vtkCellDataToPointData筛选器插入到复合数据管道中,如果输入是vtkHierarchicalBoxDataSet,则输出仍然是vtkMultiGroupDataSet。
已对此进行更改,以尝试保留输入数据类型。由于vtkCellDataToPointData不会更改输入数据集的数据类型,因此如果输入为vtkHierarchicalBoxDataSet,那么现在,输出将为vtkHierarchicalBoxDataSet。但是,对于输出类型不是vtkUniformGrid的vtkContourFilter等过滤器,输出将是结构类似于输入vtkHierarchicalBoxDataSet的vtkMultiBlockDataSet。

Extraction Filters(提取过滤器)

添加了一些新的提取过滤器,可以从复合数据集中提取组件数据集。

Extract Block

vtkExtractBlock筛选器用于从vtkMultiBlockDataSet中提取一组块。要提取的块由它们的平坦索引标识。如果PruneOutput为true,则将对输出进行修剪,以删除空分支和冗余的vtkMultiBlockDataSet节点,即具有单个子级的vtkMultiBlockDataSet节点,该子级也是vtkMultiBlockDataSet。此筛选器的输出始终是vtkMultiBlockDataSet,即使选择提取单个叶节点也是如此。

Extract Level

vtkExtractLevel用于从vtkHierarhicalBoxDataSet中提取一组级别。它只是从所有级别删除数据集,选择要提取的数据集除外。它总是生成一个vtkHierarchicalBoxDataSet作为输出。

Extract Datasets

vtkExtractDataSets用于从vtkHierarchicalBoxDataSet提取数据集。用户使用级别号和该级别内的数据集索引标识要提取的数据集。输出是与输入具有相同结构的vtkHierarchicalBoxDataSet,仅包含选定的数据集。

结论

经过重新设计,复合数据集现在使用完整的树数据结构来存储数据集,而不是以前使用的表表。这使得构建/解析结构更加容易。
Iterators have been empowered and can now be used to getting as well as setting datasets in the composite tree, thus minimizing the need to downcast to concrete subclasses for simple filters.
迭代器已经被授权,现在可以用来获取和设置复合树中的数据集,从而最大限度地减少了简单过滤器的需要,该简单过滤器向下转换具体子类。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片