I often use the function AddInputData or AddInputConnection of vtkAppendPolydata that inherits vtkDataObjectAlgorithm to add multiple polydatas form a big one. That’s a very easy way to combine a few of different polydatas to only one.
But I found that it can give me a strange result if I use AddInputConnection method sometimes.
Part code:
vtkSmartPointerAPolydata = vtkSmartPointer ::New(); // ... for (int i = 1; i < 17; i++) { APolydata->AddInputConnection( actor[i]->GetMapper()->GetOutputPort() ); } APolydata->AddInputConnection( another->GetMapper()->GetInput() ); APolydata->Update(); vtkPolydata *pd = APolydata->GetOutput();
I use the following test code to output the information of the final polydata:
printf( "GetNumberOfPoints: %d, n", pd->GetNumberOfPoints() ); double bounds[6]; pd->ComputeBounds(); pd->GetBounds( bounds ); printf( "bounds: %lf, %lf, %lf, %lf, %lf, %lfn", bounds[0],bounds[1],bounds[2],bounds[3],bounds[4],bounds[5]);
It gives me this:
GetNumberOfPoints: 0 bounds: 1, -1, 1, -1, 1, -1
That’s weird.
Then I read vtk source code, the difference of AddInputData and AddInputConnection shows me some tips.
//---------------------------------------------------------------------------- void vtkDataObjectAlgorithm::AddInputData(vtkDataObject* input) { this->AddInputData(0, input); } //---------------------------------------------------------------------------- void vtkDataObjectAlgorithm::AddInputData(int index, vtkDataObject* input) { this->AddInputDataInternal(index, input); } void AddInputDataInternal(int port, vtkDataObject *input) { this->AddInputDataObject(port, input); } void vtkAlgorithm::AddInputDataObject(int port, vtkDataObject *input) { if(input) { vtkTrivialProducer* tp = vtkTrivialProducer::New(); tp->SetOutput(input); this->AddInputConnection(port, tp->GetOutputPort()); tp->Delete(); } }
AddInputData uses a vtkTrivialProducer object to support stand-alone object to be connected as input in a pipeline. After that, AddInputConnection helps to create a complete pipeline.
Finally, I use AddInputData to replace AddInputConnection in the original code, it works.