[vtkusers] how to use PolyData::GetPolys()?

John Biddiscombe biddisco at cscs.ch
Tue Oct 10 08:09:03 EDT 2006


Dominik

Does this code snippet help you.(snippet from an old filter of mine, 
ignore the preamble etc

    vtkPolyData  *input    = (vtkPolyData *)this->GetInput();
    vtkPolyData  *output   = (vtkPolyData *)this->GetOutput();
    vtkPolyData  *failOut  = this->GetFailedData();
    vtkPoints    *in_Pts   = input->GetPoints();
    vtkCellArray *in_Polys = input->GetPolys();
    if (input->GetNumberOfPoints()==0) return;
    int nc = in_Polys->GetNumberOfCells();
    //
    vtkCellArray *out_Polys    = vtkCellArray::New();
    vtkCellArray *bad_Polys    = vtkCellArray::New();
    //
    // Should have same polys out as in if no bad ones are found
    //
    out_Polys->Allocate(nc,nc);
    bad_Polys->Allocate(nc,nc);
    //
    // Walk Polygons and test them all
    //
    vtkIdType npoints, *pt_IDs, polyID=0;
    int m_c_s = input->GetMaxCellSize();
    doublevector3 *points = new doublevector3[m_c_s];
    double fnormal[3];
    for (in_Polys->InitTraversal(); 
in_Polys->GetNextCell(npoints,pt_IDs); polyID++) {
        // make local copy of cell points
        for (int i=0; i<npoints; i++) 
in_Pts->GetPoint(pt_IDs[i],&points[i].x);
....

now replace the line
        for (int i=0; i<npoints; i++) 
in_Pts->GetPoint(pt_IDs[i],&points[i].x);
with something more like float *rawdata = (float 
*)in_Pts->GetData()->GetVoidPointer()
and then
        for (int i=0; i<npoints; i++) points[i] = rawdata[i] - times 3 
for x,y,z

any use?

JB




> I still dont get how the GetNextCell works but I cann access the raw 
> int connectivity array - I guess PolyData::GetPolys::Get*Cell methods 
> base on it. Unfortunately it doesnt work any faster, against as 
> promised in the docu. I get ~ 5x better performance using an ugly glut 
> code on the same dataset. Missed anything?
> Thanks,
> Dominik
>
> Dominik Szczerba wrote:
>> Hi,
>> I am retrieving cells in a polydata using GetCell and it works, only 
>> very slow. I read I can use GetPolys to get faster, but there are no 
>> examples and hitting blind just leads me nowhere. I guess 
>> PolyData::GetPolys::GetCell(id, &N, &ids) should fill ids with 
>> connectivity array of a cell id, and set N to number of points in the 
>> cell. Even though it compiles it doenst work. Could someone provide 
>> me with one line example?
>> Regards,
>> Dominik
>


-- 
John Biddiscombe,                            email:biddisco @ cscs.ch
http://www.cscs.ch/about/BJohn.php
CSCS, Swiss National Supercomputing Centre  | Tel:  +41 (91) 610.82.07
Via Cantonale, 6928 Manno, Switzerland      | Fax:  +41 (91) 610.82.82





More information about the vtkusers mailing list