[vtkusers] vtkUnstructuredGrid problem

Teresa Azevedo teresa.azevedo at fe.up.pt
Wed May 21 11:27:34 EDT 2008


Hi all.

I am new at VTK, but I tried to find a solution in this forum, without  
success.
So, my problem is:

I want to draw several voxels using an vtkUnstructuredGrid. Assuming  
that I know how many voxels (for example, 2) I need to draw and its 3D  
coordinates, I can use this code and it works fine:

vtkUnstructuredGrid *octreeGrid = vtkUnstructuredGrid::New();
        octreeGrid->Allocate(2);

        vtkPoints *voxelPoints = vtkPoints::New();
        voxelPoints->SetNumberOfPoints(16);
        voxelPoints->InsertPoint(0, 0, 0, 0);
        voxelPoints->InsertPoint(1, 1, 0, 0);
        voxelPoints->InsertPoint(2, 0, 1, 0);
        voxelPoints->InsertPoint(3, 1, 1, 0);
        voxelPoints->InsertPoint(4, 0, 0, 1);
        voxelPoints->InsertPoint(5, 1, 0, 1);
        voxelPoints->InsertPoint(6, 0, 1, 1);
        voxelPoints->InsertPoint(7, 1, 1, 1);

        voxelPoints->InsertPoint(8, 0, 0, 1);
        voxelPoints->InsertPoint(9, 1, 0, 1);
        voxelPoints->InsertPoint(10, 0, 1, 1);
        voxelPoints->InsertPoint(11, 1, 1, 1);
        voxelPoints->InsertPoint(12, 0, 0, 2);
        voxelPoints->InsertPoint(13, 1, 0, 2);
        voxelPoints->InsertPoint(14, 0, 1, 2);
        voxelPoints->InsertPoint(15, 1, 1, 2);
       
        vtkVoxel *aVoxel1 = vtkVoxel::New();
        aVoxel1->GetPointIds()->SetId(0, 0);
        aVoxel1->GetPointIds()->SetId(1, 1);
        aVoxel1->GetPointIds()->SetId(2, 2);
        aVoxel1->GetPointIds()->SetId(3, 3);
        aVoxel1->GetPointIds()->SetId(4, 4);
        aVoxel1->GetPointIds()->SetId(5, 5);
        aVoxel1->GetPointIds()->SetId(6, 6);
        aVoxel1->GetPointIds()->SetId(7, 7);

        vtkVoxel *aVoxel2 = vtkVoxel::New();
        aVoxel2->GetPointIds()->SetId(0, 8);
        aVoxel2->GetPointIds()->SetId(1, 9);
        aVoxel2->GetPointIds()->SetId(2, 10);
        aVoxel2->GetPointIds()->SetId(3, 11);
        aVoxel2->GetPointIds()->SetId(4, 12);
        aVoxel2->GetPointIds()->SetId(5, 13);
        aVoxel2->GetPointIds()->SetId(6, 14);
        aVoxel2->GetPointIds()->SetId(7, 15);

        octreeGrid->InsertNextCell(VTK_VOXEL,aVoxel1->GetPointIds());
        octreeGrid->InsertNextCell(VTK_VOXEL,aVoxel2->GetPointIds());
       
        octreeGrid->SetPoints(voxelPoints);

My problem is: in the beginning of my program, I do not how many
voxels I need to draw. I tried this and it did not work:

vtkUnstructuredGrid *octreeGrid = vtkUnstructuredGrid::New();
        octreeGrid->Allocate(2);

        vtkPoints *voxelPoints1 = vtkPoints::New();
        voxelPoints->SetNumberOfPoints(8);
        voxelPoints->InsertPoint(0, 0, 0, 0);
        voxelPoints->InsertPoint(1, 1, 0, 0);
        voxelPoints->InsertPoint(2, 0, 1, 0);
        voxelPoints->InsertPoint(3, 1, 1, 0);
        voxelPoints->InsertPoint(4, 0, 0, 1);
        voxelPoints->InsertPoint(5, 1, 0, 1);
        voxelPoints->InsertPoint(6, 0, 1, 1);
        voxelPoints->InsertPoint(7, 1, 1, 1);

         vtkVoxel *aVoxel1 = vtkVoxel::New();
        aVoxel1->GetPointIds()->SetId(0, 0);
        aVoxel1->GetPointIds()->SetId(1, 1);
        aVoxel1->GetPointIds()->SetId(2, 2);
        aVoxel1->GetPointIds()->SetId(3, 3);
        aVoxel1->GetPointIds()->SetId(4, 4);
        aVoxel1->GetPointIds()->SetId(5, 5);
        aVoxel1->GetPointIds()->SetId(6, 6);
        aVoxel1->GetPointIds()->SetId(7, 7);

         octreeGrid->InsertNextCell(VTK_VOXEL,aVoxel1->GetPointIds());
         octreeGrid->SetPoints(voxelPoints1);

        vtkPoints *voxelPoints2 = vtkPoints::New();
        voxelPoints2->SetNumberOfPoints(8);
        voxelPoints2->InsertPoint(8, 0, 0, 1);
        voxelPoints2->InsertPoint(9, 1, 0, 1);
        voxelPoints2->InsertPoint(10, 0, 1, 1);
        voxelPoints2->InsertPoint(11, 1, 1, 1);
        voxelPoints2->InsertPoint(12, 0, 0, 2);
        voxelPoints2->InsertPoint(13, 1, 0, 2);
        voxelPoints2->InsertPoint(14, 0, 1, 2);
        voxelPoints2->InsertPoint(15, 1, 1, 2);

        vtkVoxel *aVoxel2 = vtkVoxel::New();
        aVoxel2->GetPointIds()->SetId(0, 8);
        aVoxel2->GetPointIds()->SetId(1, 9);
        aVoxel2->GetPointIds()->SetId(2, 10);
        aVoxel2->GetPointIds()->SetId(3, 11);
        aVoxel2->GetPointIds()->SetId(4, 12);
        aVoxel2->GetPointIds()->SetId(5, 13);
        aVoxel2->GetPointIds()->SetId(6, 14);
        aVoxel2->GetPointIds()->SetId(7, 15);

        octreeGrid->InsertNextCell(VTK_VOXEL,aVoxel2->GetPointIds());
         octreeGrid->SetPoints(voxelPoints2);
       
Is there any possible way to put the voxels in the unstructuredGrid  
using separate vtkPoints? Something like this pseudo-code:

vtkUnstructuredGrid octreeGrid
allocate_enough_memory octreeGrid

while (voxels_to_draw)
   vtkVoxel voxel
   vtkPoints points
   points->put_coordinates
   voxel->insert_points
   grid->insert_voxel
end

Thank you,
Teresa




More information about the vtkusers mailing list