[vtkusers] vtkSplineWidget problem

madz madaramh at gmail.com
Fri Feb 28 06:52:04 EST 2014


I need a to display a set of drag-able points in a chart. To achieve this I
used vtkSplineWidget. But the problem occurs when I have to display the axis
legends and grid lines in the chart.
I tried using the vtkSplineWidget in vtkChartXY but the points does not
occur where the co-ordinates in the chart displays them to be.

Code eg -


#include <vtkSmartPointer.h>
#include <vtkChartXY.h>
#include <vtkContextScene.h>
#include <vtkContextView.h>
#include <vtkFloatArray.h>
#include <vtkPlotPoints.h>
#include <vtkTable.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkProperty.h>
#include <vtkSplineWidget.h>


void main(){

        double valueArr[4] = {12.4,11.2,10,15.5};

        int x = 4;
        // Set up a 2D scene, add an XY chart to it
        vtkSmartPointer<vtkContextView> view =
vtkSmartPointer<vtkContextView>::New();
        view->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
        view->GetRenderWindow()->SetSize(500, 400);

        vtkSmartPointer<vtkChartXY> chart =
                vtkSmartPointer<vtkChartXY>::New();
        view->GetScene()->AddItem(chart);
        chart->SetShowLegend(true);

        // Create a table with some points in it...
        vtkSmartPointer<vtkTable> table =
                vtkSmartPointer<vtkTable>::New();

        vtkSmartPointer<vtkFloatArray> arrX =
                vtkSmartPointer<vtkFloatArray>::New();
        arrX->SetName("X Axis");
        table->AddColumn(arrX);

        vtkSmartPointer<vtkFloatArray> arrC =
vtkSmartPointer<vtkFloatArray>::New();
        arrC->SetName("Y Axis");
        table->AddColumn(arrC);

        vtkSmartPointer<vtkPoints> po =  vtkSmartPointer<vtkPoints>::New();

        // Test charting with a few more points...
        table->SetNumberOfRows(x);
        for (int i = 0; i < x; i++)
        {
                table->SetValue(i, 0, i+1 );
                table->SetValue(i, 1, valueArr[i]);
                po->InsertNextPoint(i,valueArr[i],0);

        }

        // Add multiple scatter plots, setting the colors etc
        vtkPlot *points = chart->AddPlot(vtkChart::POINTS);
        vtkPlot *line = chart->AddPlot(vtkChart::LINE);
#if VTK_MAJOR_VERSION <= 5
        points->SetInput(table, 0, 1);
        line->SetInput(table, 0, 1);
#else
        points->SetInputData(table, 0, 1);
        line->SetInputData(table, 0, 1);
#endif
        points->SetColor(0, 0, 255, 255);
        points->SetWidth(1.0);
        line->SetColor(0, 255, 0, 255);
        line->SetWidth(1.0);
       
vtkPlotPoints::SafeDownCast(points)->SetMarkerStyle(vtkPlotPoints::CIRCLE);
        points = chart->AddPlot(vtkChart::POINTS);
        line = chart->AddPlot(vtkChart::LINE);

        vtkSmartPointer<vtkSplineWidget> splineWidget =
                vtkSmartPointer<vtkSplineWidget>::New();
        splineWidget->SetInteractor(view->GetInteractor());
        splineWidget->InitializeHandles(po);
       
        splineWidget->SetHandleSize( 0.01 );
        splineWidget->GetHandleProperty()->SetColor(0,1,0);
        double bnds[6];
        po->GetBounds( bnds );
        splineWidget->PlaceWidget( bnds[0], bnds[1], bnds[2], bnds[3],
bnds[4], bnds[5] );
        splineWidget->SetNumberOfHandles(po->GetNumberOfPoints()); //not
needed
        splineWidget->SetCurrentRenderer( view->GetRenderer() );
        splineWidget->SetDefaultRenderer( view->GetRenderer());

        vtkProperty* prop = vtkProperty::New();
        prop->SetColor(0,0,0 );

        splineWidget->SetLineProperty( prop );
        splineWidget->On();
        //Finally render the scene
        view->GetInteractor()->Initialize();
        view->GetRenderWindow()->SetWindowName("XY Simple Graph");
        view->GetInteractor()->Start();

}

Then I tried the vtkLegendScaleActor, but this does not display any grid
lines.

Code eg -


#include <vtkSmartPointer.h>
#include <vtkLegendScaleActor.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkProperty.h>
#include <vtkSplineWidget.h>


void main(){

        vtkSmartPointer<vtkRenderer> renderer =
                vtkSmartPointer<vtkRenderer>::New();
        vtkSmartPointer<vtkRenderWindow> renderWindow =
                vtkSmartPointer<vtkRenderWindow>::New();
        renderWindow->AddRenderer(renderer);

        // An interactor
        vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
                vtkSmartPointer<vtkRenderWindowInteractor>::New();
        renderWindowInteractor->SetRenderWindow(renderWindow);
        double valueArr[4] = {12.4,11.2,10,15.5};

        int x = 4;

        vtkSmartPointer<vtkPoints> po =  vtkSmartPointer<vtkPoints>::New();
        for (int i = 0; i < x; i++)
        {
                po->InsertNextPoint(i,valueArr[i],0);

        }

        vtkSmartPointer<vtkSplineWidget> splineWidget =
                vtkSmartPointer<vtkSplineWidget>::New();
        splineWidget->SetInteractor(renderWindowInteractor);
        splineWidget->InitializeHandles(po);

        splineWidget->SetHandleSize( 0.01 );
        splineWidget->GetHandleProperty()->SetColor(0,1,0);
        double bnds[6];
        po->GetBounds( bnds );
        splineWidget->PlaceWidget( bnds[0], bnds[1], bnds[2], bnds[3],
bnds[4], bnds[5] );
        splineWidget->SetNumberOfHandles(po->GetNumberOfPoints()); //not
needed
        splineWidget->SetCurrentRenderer( renderer );
        splineWidget->SetDefaultRenderer( renderer);

        vtkProperty* prop = vtkProperty::New();
        prop->SetColor(0,0,0 );

        vtkSmartPointer<vtkLegendScaleActor> legendScaleActor =
                vtkSmartPointer<vtkLegendScaleActor>::New();
        legendScaleActor->SetLabelModeToXYCoordinates();
        legendScaleActor->GetRightAxis()->GetProperty()->SetColor(0,0,0);
        legendScaleActor->GetRightAxis()->AdjustLabelsOn();
       
legendScaleActor->GetRightAxis()->GetLabelTextProperty()->SetColor(0,0,0);
        legendScaleActor->GetLeftAxis()->GetProperty()->SetColor(0,0,0);
       
legendScaleActor->GetLeftAxis()->GetLabelTextProperty()->SetColor(0,0,0);
        legendScaleActor->GetLeftAxis()->AdjustLabelsOn();
        legendScaleActor->GetTopAxis()->GetProperty()->SetColor(0,0,0);
       
legendScaleActor->GetTopAxis()->GetLabelTextProperty()->SetColor(0,0,0);
        legendScaleActor->GetTopAxis()->AdjustLabelsOn();
        legendScaleActor->GetBottomAxis()->GetProperty()->SetColor(0,0,0);
       
legendScaleActor->GetBottomAxis()->GetLabelTextProperty()->SetColor(0,0,0);
        legendScaleActor->GetBottomAxis()->AdjustLabelsOn();

        legendScaleActor->LegendVisibilityOff();
        renderer->AddActor(legendScaleActor);
        renderer->ResetCamera();

        renderWindow->Render();
        renderer->SetBackground(1,1,1);
        renderWindowInteractor->Start();

}

 Is there a way to set the grid line and axis legend positions to imitate
the vtkLegendScaleActor or to set the vtkSplineWidget point co-ordinates
according to the vtkChartXY?

Any help would be appreciated, Thank you. 



--
View this message in context: http://vtk.1045678.n5.nabble.com/vtkSplineWidget-problem-tp5726141.html
Sent from the VTK - Users mailing list archive at Nabble.com.


More information about the vtkusers mailing list