Paraview源码解析3:vtkAlgorithm类

vtkAlgorithm是VTK中所有源、过滤器和接收器的超类。它定义了执行数据处理算法的通用接口。管道连接与输入和输出端口相关联,输入和输出端口独立于通过连接的数据类型。

  • 实例可以独立使用,也可以在具有各种体系结构和更新机制的管道中使用。
  • 管道由vtkExecutive的实例控制。在管道中使用时,每个vtkAlgorithm实例都有一个关联的vtkeExecutive。执行官负责数据流。
  • vtkExecutive* Executive;vtkAlgorithm类有一个vtkExecutive指针。

1.调用流程

在这里插入图片描述

1.1vtkInitializationHelper::Initialize

1.1.1调用关系

调用vtkInitializationHelper::Initialize()有三个模块:Catalyst、pqCore、pvserver。

  • Catalyst

文件路径:Paraview==>Client==>Catalyst==>vtkCPCxxHelper.cxx
调用位置:

vtkCPCxxHelper* vtkCPCxxHelper::New()
{
}
  • pqCore

文件路径:Paraview==>Qt==>Core==>pqApplicationCore.cxx
调用位置:
pqApplicationCore类的构造函数中调用,pqApplicationCore类应该是Paraview GUI客户端的入口类,即Paraview.exe的入口类。

pqApplicationCore::pqApplicationCore(
  int& argc, char** argv, pqOptions* options, QObject* parentObject)
  : QObject(parentObject)
  {
  }
  • pvserver

文件路径:Paraview==>Clients==>CommandLineExecutables==>pvserver_common.h
调用位置:

static bool RealMain(int argc, char* argv[], vtkProcessModule::ProcessTypes type)
{
  // Marking this static avoids the false leak messages from vtkDebugLeaks when
  // using mpich. It appears that the root process which spawns all the
  // main processes waits in MPI_Init() and calls exit() when
  // the others are done, causing apparent memory leaks for any non-static objects
  // created before MPI_Init().
  ....
  }

pvserver_common.h可能与pvserver.exe有关

1.1.2实现模块

vtkInitializationHelper::Initialize()属于RemotiongApplication模块。
实现位置:Paraview==>Remoting==>Application==>vtkInitializationHelper.cxx

void vtkInitializationHelper::Initialize(int argc, char** argv, int type, vtkPVOptions* options)
{
}

1.2paraview_initialize

paraview_initialize()方法属于RemotiongApplication模块。
实现位置:Paraview==>Remotiong==>Application==>vtkPVInitializer.h
实现代码:

void paraview_initialize()
{
 static vtkPVInitializerPlugin instance;
 vtkPVPlugin::ImportPlugin(&instance);
}

1.3vtkPVInitializerPlugin构造函数

class vtkPVInitializerPlugin : public vtkPVPlugin, public vtkPVServerManagerPluginInterface
{
 const char* GetPluginName() override { return "vtkPVInitializerPlugin"; }
 const char* GetPluginVersionString() override { return "0.0"; }
 bool GetRequiredOnServer() override { return false; }
 bool GetRequiredOnClient() override { return false; }
 const char* GetRequiredPlugins() override { return ""; }
 const char* GetDescription() override { return ""; }
 void GetBinaryResources(std::vector<std::string>&) override {}
 const char* GetEULA() override { return nullptr; }

 void GetXMLs(std::vector<std::string>& xmls) override
 {
   paraview_server_manager_initialize(xmls);
 }

 vtkClientServerInterpreterInitializer::InterpreterInitializationCallback
 GetInitializeInterpreterCallback() override
 {
   return paraview_client_server_initialize;
 }
};

1.4paraview_client_server_initialize

paraview_client_server_initialize属于RemotingApplication模块。
文件位置:pvb1==>CMakeFiles==>paraview_client_server==>paraview_client_server.h
pvb1文件夹下的内容是cmake编译生成的文件

1.5vtkCommonExecutionModelCS_Initialize(csi)

vtkCommonExecutionModelCS_Initialize属于vtkCommonExecutionModelCS模块。
所在位置:
pvb1==>CMakeFiles==>vtkCommonExecutionModelCSInit.cxx
实现代码:

extern "C" void VTK_ABI_EXPORT vtkCommonExecutionModelCS_Initialize(vtkClientServerInterpreter* csi)
{
 (void)csi;
 vtkAlgorithm_Init(csi);
 ......
 }

1.6 vtkAlgorithm_Init(csi)

vtkAlgorithm_Init(csi)属于vtkCommonExecutionModelCS模块。
文件位置:
pvb1==>CMakeFiles==>vtkCommonExecutionModelCS==>vtkAlgorithmClientServer.cxx
实现代码:

void VTK_EXPORT vtkAlgorithm_Init(vtkClientServerInterpreter* csi)
{
 static vtkClientServerInterpreter* last = nullptr;
 if(last != csi)
   {
   last = csi;
   csi->AddNewInstanceFunction("vtkAlgorithm", vtkAlgorithmClientServerNewCommand);
   csi->AddCommandFunction("vtkAlgorithm", vtkAlgorithmCommand);
   }
}

vtkAlgorithmClientServerNewCommand:

vtkObjectBase *vtkAlgorithmClientServerNewCommand(void* /*ctx*/)
{
 return vtkAlgorithm::New();
}

vtkAlgorithmCommand:

 int VTK_EXPORT vtkAlgorithmCommand(vtkClientServerInterpreter *arlu, vtkObjectBase *ob, const char *method, const vtkClientServerStream& msg, vtkClientServerStream& resultStream, void* /*ctx*/)
{
 vtkAlgorithm *op = vtkAlgorithm::SafeDownCast(ob);
 if(!op)
   {
   ....
   }
}

2.实现代码

2.1 virtual vtkTypeBool ProcessRequest()

virtual vtkTypeBool ProcessRequest(
   vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo);
  • Upstream/Downstream请求形成通用接口,executives执行程序通过该接口调用算法的功能。
  • Upstream请求对应于从算法输出到输入的信息流。Downstream请求对应于从算法输入到输出的信息流。
  • 下游请求由请求信息对象的内容定义。请求的输入存储在传递给ProcessRequest的输入信息向量中。下游请求的结果存储在传递给ProcessRequest的输出信息向量中。
  • 上游请求由请求信息对象的内容定义。请求的输入存储在传递给ProcessRequest的输出信息向量中。上游请求的结果存储在传递给ProcessRequest的输入信息向量中。
  • 它返回管道pipeline的布尔状态(false表示失败)。

2.2 vtkTypeBool ProcessRequest()

已包装的ProcessRequest()的版本。这会将集合转换为数组,并调用另一个版本,即2.1版本。
声明:

vtkTypeBool ProcessRequest(
    vtkInformation* request, vtkCollection* inInfo, vtkInformationVector* outInfo);

实现:

vtkTypeBool vtkAlgorithm::ProcessRequest(
  vtkInformation* request, vtkCollection* inInfo, vtkInformationVector* outInfo)
{
  vtkSmartPointer<vtkCollectionIterator> iter;
  iter.TakeReference(inInfo->NewIterator());

  std::vector<vtkInformationVector*> ivectors;
  for (iter->GoToFirstItem(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
  {
    vtkInformationVector* iv = vtkInformationVector::SafeDownCast(iter->GetCurrentObject());
    if (!iv)
    {
      return 0;
    }
    ivectors.push_back(iv);
  }
  if (ivectors.empty())
  {
    return this->ProcessRequest(request, (vtkInformationVector**)nullptr, outInfo);
  }
  else
  {
    return this->ProcessRequest(request, &ivectors[0], outInfo);
  }
}

3.类图结构

vtkAlgorithm Class Reference

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

昵称

取消
昵称表情代码图片