前言:本博文主要介绍vtk中的接口vtkInformation的应用,以及vtkInformation的衍生用法,希望对各位小伙伴有所帮助,谢谢!
目录
vtkInformation介绍
描述:
Information中接受的类型:
方法
vtkInformation在vtk中的应用
PipeLine Information
Port Information
Request Information
Data Information
Algorithm Information
vtkProp的方法SetPropertyKeys/GetPropertyKeys
vtkInformation介绍
描述:
用于存储vtkAlgorithm输入/输出信息。
vtkInformation表示vtkAlgorithm的一个输入或一个输出的信息和/或数据。它从键映射到几种数据类型的值。该类的实例收集在vtkInformationVector实例中,并传递给vtkAlgorithm::ProcessRequest调用。实例在特定输入或输出上引用的信息和数据定义了向vtkAlgorithm实例发出的请求。
Information中接受的类型:
方法
以vtkInformationStringKey为例说明vtkInformation提供的方法
//@{
/**
* Get/Set a string-valued entry.
*/
void Set(vtkInformationStringKey* key, const char*);
void Set(vtkInformationStringKey* key, const std::string&);
const char* Get(vtkInformationStringKey* key);
void Remove(vtkInformationStringKey* key);
int Has(vtkInformationStringKey* key);
//@}
vtkInformation在vtk中的应用
信息对象是整个VTK管道中用来保存各种信息的基本容器。所有信息对象都是vtkInformation类的实例。它们是异构的神经键到值映射,其中键的类型决定值的类型。以下是使用信息对象的位置的枚举。
PipeLine Information
管道信息对象保存管道执行的信息。它们存储在vtkExecutive或子类的实例中,可以通过vtkExecutive::GetOutputInformation()方法访问。每个输出端口有一个管道信息对象。它包含一个指向相应端口上的输出vtkDataObject的条目(如果已创建)。
vtkDataObject包含一个指向其相应的管道信息对象的指针,可通过vtkDataObject::GetPipelineInformation()访问。管道Information对象还保存了当过滤器执行和生成器生成输出时将填充数据对象的内容的信息。所包含的实际信息由输出数据类型和所使用的执行模型决定。输入连接的管道信息对象可以通过方法vtkExecutive::GetInputInformation()访问,它们是管道信息对象在与输入端口相连的输出端口上。
Port Information
端口信息对象保存有关输出端口上产生和输入端口使用的数据类型的信息。它们由vtkAlgorithm的实例存储。每个输入端口有一个输入端口信息对象,每个输出端口有一个输出端口信息对象。它们可以通过vtkAlgorithm::GetInputPortInformation()和vtkAlgorithm::GetOutputPortInformation()方法访问。端口信息对象通常被创建和填充通过vtkAlgorithm的子类来指定过滤器的接口。
Request Information
请求信息对象保存有关发送到执行或算法的特定请求的信息。有一个条目表明正在发送什么请求,可能还有其他条目提供有关特定请求的其他详细信息。这些信息对象不能通过任何公共方法访问,而是传递给实现请求的ProcessRequest()方法。
Data Information
数据信息对象保存有关当前存储在vtkDataObject中的内容的信息。每个数据对象中有一个数据信息对象,可通过vtkDataObject::GetInformation()访问。实际包含的信息由数据对象类型决定。
Algorithm Information
algorithm信息对象保存vtkAlgorithm实例的信息。每个算法对象都有一个算法信息对象,可通过vtkAlgorithm::GetInformation()访问。实际包含的信息由算法对象类型决定。
vtkProp的方法SetPropertyKeys/GetPropertyKeys
设置/获取属性键。属性键可以被一些渲染通道消化。例如,用户可以将道具标记为阴影映射渲染通道的阴影施法者。键被记录在渲染通道类中。初始值为NULL。
现对vtkActor对象增加一些辅助的属性,比如Name,Part Number等属性。
错误示例
//在创建vtkActor时添加Name属性
vtkActor* actor = ...;
vtkInformationStringKey* key = new vtkInformationStringKey("Name", "Merge");
vtkInformation* info = vtkInformation::New();
info->Set(key, strName.toStdString().c_str());
actor->SetPropertyKeys(info);
//获取刚添加的属性信息,结果OK
const char* name = actor->GetPropertyKeys()->Get(key);
int has = actor->GetPropertyKeys()->Has(key);
//在Picker获取选取Actor对象时,获取Name属性
if (nullptr != picker->GetActor()->GetPropertyKeys())
{
vtkInformation* info = nullptr;
info = picker->GetActor()->GetPropertyKeys();
int nKeys = info->GetNumberOfKeys();
vtkInformationStringKey* key = new vtkInformationStringKey("Name", "Merge");
int has = info->Has(key);//结果为-1;
const char* name = info->Get(key);//name为空
}
错误分析:在Picker获取属性时,又重新新建了Key,故无法获取相应的属性。
解决方案:在公共函数中,添加属性键
正确示例
//.h文件
static vtkInformationStringKey* MODEL_NAME();
//.cpp文件
vtkInformationKeyMacro(zx3DModel, MODEL_NAME, String);
//使用方法
vtkInformation* info = vtkInformation::New();
info->Set(zx3DModel::MODEL_NAME(), "name");
actor->SetPropertyKeys(info);
const char* name = info->Get(zx3DModel::MODEL_NAME());