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);
}
}
暂无评论内容