[vtkusers] Problem in coloring Glyph2D by array values

Jong Youl Choi jychoi at indiana.edu
Fri Apr 8 15:11:51 EDT 2011


Hi everyone,

I want to display 2D glyphs scaled by and colored by using two
different vectors, say scales and group ids. I can successfully do
this using 3D glyph but I cannot do with Glyph2D. Especially I cannot
color them correctly. I'm enclosing my simple code for your reference.
Any help will be appreciated.

Thanks,
Jong

#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkGlyph3D.h>
#include <vtkCellArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkUnsignedIntArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkLabeledDataMapper.h>
#include <vtkActor2D.h>
#include <vtkTransformCoordinateSystems.h>
#include <vtkGlyphSource2D.h>
#include <vtkGlyph2D.h>
#include <vtkPolyDataMapper2D.h>

#define VTK_CREATE(type, name) vtkSmartPointer<type> name =
vtkSmartPointer<type>::New()

int main(int, char *[])
{
    // Setup renderer
    VTK_CREATE(vtkRenderer, renderer);
    VTK_CREATE(vtkRenderWindow, renderWindow);
    VTK_CREATE(vtkRenderWindowInteractor, renderWindowInteractor);
    renderWindow->AddRenderer(renderer);
    renderWindowInteractor->SetRenderWindow(renderWindow);

    // Build Data
    VTK_CREATE(vtkPoints, points);
    points->InsertNextPoint(0,0,0);
    points->InsertNextPoint(1,1,1);
    points->InsertNextPoint(2,2,2);

    VTK_CREATE(vtkPolyData, polydata);
    polydata->SetPoints(points);

    VTK_CREATE(vtkUnsignedIntArray, gid);
    gid->SetName("ID");
    gid->InsertNextValue(1);
    gid->InsertNextValue(2);
    gid->InsertNextValue(1);
    polydata->GetPointData()->AddArray(gid);

    VTK_CREATE(vtkFloatArray, scale);
    scale->SetName("SCALE");
    scale->InsertNextValue(3.0);
    scale->InsertNextValue(2.0);
    scale->InsertNextValue(1.0);
    polydata->GetPointData()->AddArray(scale);

    //polydata->GetPointData()->SetActiveScalars("SCALE");
    polydata->GetPointData()->SetActiveScalars("ID");

    // Build Glyph3D
    VTK_CREATE(vtkCubeSource, cubeSource);

    VTK_CREATE(vtkGlyph3D, glyph3D);
    glyph3D->SetSource(cubeSource->GetOutput());
    glyph3D->SetInput(polydata);
    glyph3D->SetScaleModeToScaleByScalar();
    glyph3D->SetColorModeToColorByScalar();
    glyph3D->SetScaleFactor(0.5);
    glyph3D->SetInputArrayToProcess(0, 0, 0,
vtkDataObject::FIELD_ASSOCIATION_POINTS, "SCALE");

    VTK_CREATE(vtkPolyDataMapper, mapper);
    mapper->SetInputConnection(glyph3D->GetOutputPort());
    mapper->SetColorModeToMapScalars();
    mapper->SelectColorArray("ID");
    mapper->SetScalarRange(1, 2);

    vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    renderer->AddActor(actor);

    // Build Label
    VTK_CREATE(vtkLabeledDataMapper, labelMapper);
    labelMapper->SetInput(polydata);
    labelMapper->SetLabelModeToLabelIds();

    vtkSmartPointer<vtkActor2D> labelActor =
    vtkSmartPointer<vtkActor2D>::New();
    labelActor->SetMapper(labelMapper);
    renderer->AddActor(labelActor);

    // Build Glyph2D
    VTK_CREATE(vtkTransformCoordinateSystems, xform);
    xform->SetInput(polydata);
    xform->SetInputCoordinateSystemToWorld();
    xform->SetOutputCoordinateSystemToDisplay();
    xform->SetViewport(renderer);

    VTK_CREATE(vtkGlyphSource2D, gs);
    gs->SetGlyphTypeToCircle();
    gs->SetScale(40);
    gs->FilledOff();
    gs->CrossOn();

    VTK_CREATE(vtkGlyph2D, glyph2D);
    glyph2D->SetInput(xform->GetOutput());
    glyph2D->SetSource(gs->GetOutput());
    glyph2D->SetScaleModeToScaleByScalar();
    glyph2D->SetColorModeToColorByScalar();
    glyph2D->SetInputArrayToProcess(0, 0, 0,
vtkDataObject::FIELD_ASSOCIATION_POINTS, "SCALE");

   // I cannot color by using "ID"
    VTK_CREATE(vtkPolyDataMapper2D, mapper2D);
    mapper2D->SetInput(glyph2D->GetOutput());
    mapper2D->SetColorModeToMapScalars();
    mapper2D->ColorByArrayComponent((char*)"ID", 0);
    mapper2D->SetScalarRange(1, 2);

    VTK_CREATE(vtkActor2D, actor2D);
    actor2D->SetMapper(mapper2D);

    renderer->AddActor(actor2D);

    // Visualization
    renderer->SetBackground(.3, .6, .3); // Background color green

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}



More information about the vtkusers mailing list