摘要


对vtk版本4和5的管道机制重新架架构的主要目的是:迁移数据对象和算法对象中的管道执行逻辑到一个新集合的类中,我们称这个集合类叫executives。分离数据和执行模型的代码后,可以双双简化修改或者扩展管道机制的难度及工作量。VTK4和5之间的更改相当好取得的第一个目标,但不是解决第二个目标。本文所述的工作有两个主要目标:

  1. 删除在vtk5中为了兼容vtk4而引入的兼容层,简化vtk6 的可视化工具包。
  2. 继续开展在vtk5中开始的工作,完全分离数据模型和执行模型。

这项工作是要付出代价:该文章所描述的 许多都已经不兼容vtk4了, 一些也不能兼容vtk5了。在此文档中,我们总结了这些更改,以及提供一个迁移以前代码的指引概述。

变化的概述


现在引入的改变工作,可以典型的分为如下几类:

  1. 删除所有为了兼容VTK 4 而引入的超类:这些包括 vtkProcessObject, vtkSource和所有其超类。为了提供兼容性,这些类在VTK中被改变了。在VTK 6 中,所有的管道模块都应该派生于 vtkAlgorithm或它的一个子类。
  2. 从vtkDataObject中删除所有的管线元数据API:像VTK 5中,所有管道的 meta-data and heavy-data的主要容器是vtkInformation类,表现算法的输入和输出。数据对象不应该被用来存储meta-data (e.g. Whole Extent, Update Extent etc.). 在VTK 5 中,vtkDataObject的meta-data 中保存兼容VTK4 的方法,作为VTK6 的工作的部分,这些方法都要被移除。
  3. 移除data object的所有依赖的管道代码(algorithms and executives):此改变的目的是简化数据对象类型,分离数据和可执行模型库化作为正在进行的模块化努力的一部分。这个变化引起了如下的一些不兼容。

详细的变化


删除 VTK4 的向后兼容性的超类


关于对管道和管道模块的变化的详细解释可以在VTK源码目录中找到VTK/Utilities/Upgrading/TheNewVTKPipeline.pdf。如果你不熟悉这些变化,而且发现由于这些变化自己的代码无法编译,我强烈建议你先查看文档,它更详细的描述了对于管道模块的变化及如何迁移代码到新的VTK中。

为了尽量平滑的对于VTK 5 管道实现的过度, VTK 5 引入了一套向后兼容的类,这些包括修改版本前的一种算法超类,其中包括vtkProcessObject, vtkSource, vtkXXXSource(xxx表示各种数据类型) 和 vtkXXXToYYYFilter(xxx 和 yyy表示各种数据类型)。VTK 6 删除了所有这些类,要求所有的管道模块类派生于vtkAlgorithm 或者它的子类,优先使用RequestInformation / RequestUpdateExtent / RequestData API相比于xecutionInformation / PropagateUpdateExtent / Execute API。在VTK6 删除了一些向后兼容类的全部列表如下。如果由于引用了下面类而导致你的代码编译不过,是时候对原先的VTK5 API 代码进行迁移了(列表如下:)

已经删除列表

  • Filtering/vtkDataObjectSource
  • Filtering/vtkDataSetSource
  • Filtering/vtkDataSetToDataSetFilter
  • Filtering/vtkDataSetToImageFilter
  • Filtering/vtkDataSetToPolyDataFilter
  • Filtering/vtkDataSetToStructuredGridFilter
  • Filtering/vtkDataSetToStructuredPointsFilter
  • Filtering/vtkDataSetToUnstructuredGridFilter
  • Filtering/vtkImageInPlaceFilter
  • Filtering/vtkImageMultipleInputFilter
  • Filtering/vtkImageMultipleInputOutputFilter
  • Filtering/vtkImageSource
  • Filtering/vtkImageToImageFilter
  • Filtering/vtkImageTwoInputFilter
  • Filtering/vtkPointSetSource
  • Filtering/vtkPointSetToPointSetFilter
  • Filtering/vtkPolyDataSource
  • Filtering/vtkPolyDataToPolyDataFilter
  • Filtering/vtkProcessObject
  • Filtering/vtkRectilinearGridSource
  • Filtering/vtkRectilinearGridToPolyDataFilter
  • Filtering/vtkSource
  • Filtering/vtkStructuredGridSource
  • Filtering/vtkStructuredGridToPolyDataFilter
  • Filtering/vtkStructuredGridToStructuredGridFilter
  • Filtering/vtkStructuredPointsSource
  • Filtering/vtkStructuredPointsToPolyDataFilter
  • Filtering/vtkStructuredPointsToStructuredPointsFilter
  • Filtering/vtkStructuredPointsToUnstructuredGridFilter
  • Filtering/vtkUnstructuredGridSource
  • Filtering/vtkUnstructuredGridToPolyDataFilter
  • Filtering/vtkUnstructuredGridToUnstructuredGridFilter
  • FilteringvtkStructuredPointsToUnstructuredGridFilter
  • FilteringvtkUnstructuredGridToUnstructuredGridFilter
  • Imaging/vtkImageSpatialFilter

从vtkDataObject中删除所有管道的Meta-Data API

原管道 meta-data的例子如WholeExtent, UpdateExtent, MaximumNumberOfPieces, UpdateNumberOfPieces, UpdatePiece, UpdateGhostLevel, ScalarType and NumberOfScalarComponents。在VTK 5中,meta-data以vtkInformation 类表示,例如vtkStreamingDemandDriven::WHOLE_EXTENT() 和vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT() ,在管道中,输入和输出信息对象流向ProcessRequest((如 RequestInformation, RequestUpdateExtent and RequestData)。在VTK 4 中,为了达到管道中数据的流动,使用了vtkDataObjects 和e vtkDataObject API (如方法 Set/GetWholeExtent, Set/GetUpdateExtent etc.)。VTK5 维护这些API及相关联的vtkDataObject 数据成员。Executives 负责同步在输入及输出对象中的vtkDataObjet的数据成员。要实现这一目标的代码是难以维持和脆弱。、开发者对这些api去获取管道特定的元数据经常困惑(例如 WholeExtent )和 数据meta -data 。例如,我们遇到如下的几处代码:

vtkImageData* image = vtkImageData::New();
int extent[6] = {0, 10, 0, 10, 0, 10};
image->SetExtent(extent);
image->SetUpdateExtent(extent);
image->SetWholeExtent(extent);
image->AllocateScalars();

关于正确的实现对于许多开发者并不清楚,他们认为安全的做法,选择设置每个Extent都是一样的值,实际上并不真实的安全。VTK 6 中从 数据对象中删除了所有管道 meta -data API,需要使用的适当的信息键来创建、修改和读取管道的元数据。请参阅附录,以供从vtkDataObject中删除的方法的完整列表。

删除Data object中对的依赖


变化工作的最后一部分是移除vtkDataObject中对管道对象的依赖,完全解耦和数据模型和执行模型。这样的做法有2个优势:

  • 支持模块化:可以有能力创建小型、自包含的的类库,仅仅包含核心类和数据模型类。
  • 简化数据对象和管道执行API的逻辑:例如:方法Update(强制执行算法),现在开发者只要使用一个方法vtkAlgorithm:Update() ,相对于分离在数据对象和算法中已经方便了很多了。

首先,所有的管道执行的API都被从vtkDataObject中移除了,所有很多相似如下的方法都将不能编译。

vtkDataObject* dobj = someAlgorithm->GetOutput();
dobj->Update();

  在VTK6 中,需要被下面代码所替代:

someAlgorithm->Update();

在vtk4 中,关联对象的做法是someFilter->SetInput(someReader->GetOutput());,在vtk 5 中,变成 someFilter->SetInputConnection(someReader->GetOutputPort());然而,SetInput()和相关的方法被保留向后兼容性。在VTK6中,像 SetSource等被移掉。移除的主要原因是,从管道对象中解耦和数据对象的时候不可能保留这个方法。在VTK5 中SetInput的方法是通过SetInputConnection来实现的,但这要要求能访问算法和它的输出对象的端口。在VTK6 中, 因为data object 已经没有关于算法的引用了,它不可能只通过数据对象建立管道连接。在VTK 6 中,为了方便的分配stand-alone的数据对象作为算法的输入,我们引入了一套方便的函数。如下,

someFilter->SetInputData(aDataObject);

注意,如下的代码虽然能编译通过,但是它也不会创建管道连接,因为不应该用来代替方法 SetInputConnection().

someFilter->SetInputData(someReader->GetOutput());

另外一个解耦和数据对象和管道对象的优势是,开发者不再需要去创建输入的引用。以前的代码如下:

void MyFilter::RequestData(…)
{
vtkDataObject* input = inInfo->Get(vtkDataObject::DATA_OBJECT());
vtkDataObject* copy = input->NewInstance();
copy->ShallowCopy(input);
this->InternalFilter->SetInput(copy);
this->InternalFilter->Update();

}

现在在VTK6中可以被下面的代码替代:

void MyFilter::RequestData(…)
{
vtkDataObject* input = inInfo->Get(vtkDataObject::DATA_OBJECT());
this->InternalFilter->SetInputData(input);
this->InternalFilter->Update();

}

另外一个优势,是避免了管道中的循环引用,使垃圾回收机制能正常工作。在使用大数据的管道的时候,这应该对VTK的性能有显著地提高。

微笑变化


VTK5的一些类仅仅提供SetInput(vtkDataObject*)或者相似的方法,而没有SetInputConnection(vtkAlgorithmOutput*) 或者相似的method。在所有的类的SetInput方法,通过保存对data object对象的引用。它们都不是vtkAlgorithm的派生类。我们替换了所有这些方法,现在用SetInputData()及SetInputConnection(), SetInputData()并不建立管道连接(因为在执行期间,并不会通过管道更新数据),SetInputConnection (建立管道,并在执行期间更新数据)。这些类包括:

  • vtkParallelCoordinatesActor
  • vtkTkRenderWidget
  • vtkEncodedGradientEstimator
  • vtkGPUVolumeRayCastMapper (no longer updates “TransformedInput”)
  • vtkPKdTree
  • vtkBarChartActor
  • vtkCaptionActor2D
  • vtkCubeAxesActor2D
  • vtkGridTransform
  • vtkLegendBoxActor
  • vtkPieChartActor
  • vtkSpiderPlotActor
  • vtkXYPlotActor
  • vtk3DWidget
  • vtkBalloonRepresentation
  • vtkCheckerboardRepresentation
  • vtkLogoRepresentation
  • vtkPolyDataSourceWidget
  • vtkSCurveSpline
  • vtkKdTree
  • vtkImplicitDataSet
  • vtkImplicitVolume
  • vtkKochanekSpline
  • vtkCardinalSpline

此外,我们更改或删除产生可变输出的几个算法。我们删除了vtkPLOT3DReader,使用了vtkMultiBlockPLOT3DReader 替代。我们改变了vtkProcrustesAlignmentFilter 去生产多块的数据集,拥有一个输入端口并接受多个连接。

01 - 概述 VTK 6.0 迁移的更多相关文章

  1. 05 - 替换vtkDataObject中的Update方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.下面讨论update方法并提供迁移现有代码的建议. Update() vtkDataObject::Upd ...

  2. 09 - 删除vtkDataObject中的ShouldIReleaseData() and ReleaseDataFlag 方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.下面列出来的就是其中的一些方法: ShouldIReleaseData() SetReleaseDataF ...

  3. 06 - 从Algorithm 算法派生类中删除ExecuteInformation() 和ExecuteData() VTK 6.0 迁移

    在先前的vtk中,如vtkPointSetAlgorithm 等算法派生类中定义了虚方法:ExecuteInformation() 和 ExecuteData().这些方法的定义是为了平稳的从VTK4 ...

  4. 04 - 替换vtkDataObject中的GetPipelineInformation 和GetExecutive 方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中的两个方法就是GetPipelineInformation() 和 GetExecutive().这些 ...

  5. 11 - 改变vtkImageData中的Manipulation 方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.这其中就包括关于vtkImageData中元数据管理及内存分配的方法.这些方法有些直接改变了行为或者能加了额外的参数. GetScalarTypeMin() GetSc ...

  6. 10 - 删除vtkDataObject中的Update Extent方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.下面列出来的就是其中的一些方法: SetUpdateExtent(int piece, int numPi ...

  7. 08 - 删除vtkDataObject中的SetWholeExtent() 方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中之一就是SetWholeExtent().SetWholeExtent()方法先前被用来管理结构话数据 ...

  8. 07 - 删除vtkDataObject中的SetExtentTranslator 和 GetExtentTranslator方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中的两个方法就是SetExtentTranslator() 和 GetExtentTranslator( ...

  9. 03 - 替换vtkDataObject中的GetProducerPort()方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中的一个方法就是GetProducerPort(). 一般,先前使用这个方法如下例子: vtkPolyD ...

随机推荐

  1. HDOJ 1056 HangOver(水题)

    Problem Description How far can you make a stack of cards overhang a table? If you have one card, yo ...

  2. Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

    按教程,使用Convention插件进行配置 教程中说只要加入struts2-convention-plugin-2.3.4.1.jar这个jar包就可以使用. 按照这种方法部署后,启动tomcat报 ...

  3. DataGuard体系结构

    一.DataGuard总体结构 总体目标 1.   描述计划和非计划停机的不同因数 2.   DataGuard的主要组件 3.   物理以及逻辑DataGuard的异同 4.   建立DataGua ...

  4. 在SQL中用正则表达式替换html标签

    由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...

  5. Android中如何将dp,dip,sp与px相互转化

    Android中有很多度量单位:比如常用的dp,dip,sp,px等,有时候需要将他们相互转换,有下面非常方便的方法: 比如sp转换成px: TypedValue.applyDimension(Typ ...

  6. js怪招(摘录篇)

    利用a标签自动解析URL 很多时候我们有从一个URL中提取域名,查询关键字,变量参数值等的需要,而万万没想到可以让浏览器方便地帮我们完成这一任务而不用我们写正则去抓取.方法就在JS代码里先创建一个a标 ...

  7. apache利用.htaccess实现部分页面301

    由于网站改版,对访问url进行了改进 原:http://www.tutufu.com/w_weifenlei/DeHaiZi_38251/ 现:http://www.tutufu.com/unclas ...

  8. Android中解析网络请求的URL

    近期正在做Android网络应用的开发,使用了android网络请求方面的知识.如今向大家介绍网络请求方面的知识.我们知道android中向server端发送一个请求,(这就是我们通常所说的POST请 ...

  9. Easyui弹出窗体在iframe的父级页面显示

    今天做EasyUI学习的预到了一个这样的问题:通过iframe加载的一个页面在调用$.messager.alert();这个方法后只能在iframe中显示alert效果而不是在全局的页面上显示这并不我 ...

  10. Java基础知识强化79:被遗忘的Java Math类

    1. Math类概述 Math类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 2. 成员变量 和 成员方法(常用的) (1)成员变量 public static final d ...