Hi, I am writing a custom filter that takes polydata as input and outputs polydata that contains a subset of the cells in the input polydata. I would like the output polydata to include all the vector/scalar etc arrays associated with the input, appropriately subsetted. I think I have working code, but I think it only grabs e.g. 1 scalar array associated with point data (via input->GetPointData()->GetScalars();) How would I access multiple associated scalar arrays ?
The only way I found to implement getting even just the single scalar array is a sort of brute force loop that saves point/cell ids I want to keep (code snippet below). Is this the best way to implement this ? thanks kate ========================================================= // code snippet for filter to take polydata as input and output polydata // with a subset of input polydata cells int vtkMyFilter::RequestData(vtkInformation *vtkNotUsed(request), vtkInformationVector **inputVector, vtkInformationVector *outputVector) { // allocate vectors to store vtk ids of cells and points I want to keep vtkIdList *outcellids = vtkIdList::New (); outcellids->Allocate(num_cells_in,0); vtkIdList *outptids = vtkIdList::New (); outptids->Allocate(num_points_in,0); // loop over input lines, decide what to keep for(lines->InitTraversal(); lines->GetNextCell(npts,pts); num_poly++) { if (I want this cell) { out_line_cnt++; out_tot_pt_ctr = out_tot_pt_ctr + npts; // collect pt ids for output vectors for (k=0; k < npts; k++) { outptids->InsertNextId ((const vtkIdType) in_tot_pt_ctr++); } // collect cell ids for output outcellids->InsertNextId ((const vtkIdType) num_poly); } // not adding this line, just update points counter for input points array else { in_tot_pt_ctr = in_tot_pt_ctr + npts; } } // copy line/point data to output outcellids->Squeeze(); outptids->Squeeze(); output->Allocate(input,num_cells_in,0); output->CopyCells(input, outcellids, NULL); output->Squeeze(); /////// copy point data active??? vectors invec = input->GetPointData()->GetVectors(); if (invec != NULL) { num_comp = invec->GetNumberOfComponents(); outvec = invec->NewInstance(); outvec->SetNumberOfComponents(num_comp); outvec->SetNumberOfTuples(out_tot_pt_ctr); outvec->SetName(invec->GetName()); for (i=0; i<out_tot_pt_ctr; i++) { outvec->InsertTuple(i,invec->GetTuple(outptids->GetId(i))); } output->GetPointData()->SetVectors(outvec); } // repeat for // input->GetPointData()->GetScalars(); // input->GetCellData()->GetVectors(); // input->GetCellData()->GetScalars(); // etc } ========================================================== _______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the ParaView Wiki at: http://paraview.org/Wiki/ParaView Follow this link to subscribe/unsubscribe: http://www.paraview.org/mailman/listinfo/paraview