<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hello, beginner question:<br> Data I'm reading is not getting charted.<br> After reading a space-delimited file of stock market data I'm trying to view a chart of this and the chart comes out as a single straight line at a 45° angle. There should be 2 lines, neither of which are straight. I suspect that both are being plotted, one on top of the other.<br> When I break the program in the reading loop the values appear correctly so I think that reading the file is not the problem. Is the data getting into the table? Debugging doesn't show it. Is the table transferring properly to the chart?<br> I'm using C++ in VS 2005 Express.<br> Below is my code, largely taken from an online example:<br><br>// Points.cpp :<br>//
READING A CSV FILE, OUTPUT FROM OPENOFFICE, OF WEEKLY DOW AND VARIOUS MEASURES,<br>// SPACE DELIMITED. COMMAND LINE ARGUMENT PUT IN GUI AT: PROJECTS->POINTS PROPERTIES-><br>// PROGRAM BASED ON http://vtk.org/Wiki/VTK/Examples/Cxx/IO/ReadPlainText<br>// AS SUGGESTED BY BILL LORENSEN FROM VTKUSERS LIST ON 10/1/2010<br>// MODIFICATIONS 10/2010<br><br>#include <vtkAxes.h><br>#include <vtkSmartPointer.h><br>#include <vtkPolyLine.h><br>#include <vtkPolyDataMapper.h><br>#include <vtkActor.h><br>#include <vtkParticleReader.h><br>#include <vtkRenderWindow.h><br>#include <vtkRenderWindowInteractor.h><br>#include <vtkRenderer.h><br>#include <vtkVertexGlyphFilter.h><br>#include <vtkChartXY.h><br>#include <vtkPlot.h><br>#include <vtkTable.h><br>#include <vtkFloatArray.h><br>#include <vtkContextView.h><br>#include <vtkContextScene.h><br>#include
<sstream><br> <br>int main(int argc, char* argv[])<br>{<br> //Verify input arguments<br> if ( argc != 2 )<br> {<br> std::cout << "Usage: " << argv[0]<br> << " Filename(.xyz)" << std::endl;<br> return EXIT_FAILURE;<br> }<br> //get all data from the file<br> std::string filename = argv[1];<br> std::ifstream fin(filename.c_str());<br> <br> //Create a renderer, render window, and interactor<br> vtkSmartPointer<vtkRenderer> renderer =<br> vtkSmartPointer<vtkRenderer>::New();<br> vtkSmartPointer<vtkRenderWindow> renderWindow =<br> vtkSmartPointer<vtkRenderWindow>::New();<br> renderWindow->AddRenderer(renderer);<br><br> std::string line;<br>
vtkSmartPointer<vtkPoints> dow_points =<br> vtkSmartPointer<vtkPoints>::New();<br> vtkSmartPointer<vtkPoints> consensus_points =<br> vtkSmartPointer<vtkPoints>::New();<br><br> vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();<br> vtkSmartPointer<vtkFloatArray> arrayX = vtkSmartPointer<vtkFloatArray>::New();<br> vtkSmartPointer<vtkFloatArray> dow_vals = vtkSmartPointer<vtkFloatArray>::New();<br> vtkSmartPointer<vtkFloatArray> consensus_vals = vtkSmartPointer<vtkFloatArray>::New();<br> arrayX->SetName("Week #");<br> table->AddColumn(arrayX);<br> dow_vals->SetName("DOW");<br> table->AddColumn(dow_vals);<br> consensus_vals->SetName("Consensus %");<br> table->AddColumn(consensus_vals);<br> table->SetNumberOfRows(10); // NEED
TO BE AWARE OF THIS MAGIC NUMBER<br><br> vtkSmartPointer<vtkContextView> view = vtkSmartPointer<vtkContextView>::New();<br> view->GetRenderer()->SetBackground(0.0, 0.0, 0.0);<br> <br> vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();<br><br> // INPUT 8 DOUBLE VALUES FROM A SPACE-DELIMITED CSV FILE<br> double loop = 0.0, dow, consensus, c,d,e,f,g,h;<br> std::stringstream linestream;<br> <br> while(std::getline(fin, line))<br> {<br> loop++;<br> linestream << line;<br> linestream >> dow >> consensus >> c >> d >> e >> f >> g >> h;<br> dow_points->InsertNextPoint(loop, dow, 0);<br> consensus_points->InsertNextPoint(loop, consensus, 0);<br> if (loop <
10.0)<br> {<br> table->SetValue(loop,0,loop);<br> table->SetValue(loop,1,dow);<br> table->SetValue(loop,2,consensus);<br> }<br> }<br> <br> fin.close();<br><br> //- - - - - - - - - - - - - - -<br><br> // THE NEXT SECTION OF CODE IS DUPLICATED BELOW FOR ANOTHER SERIES<br> // A NATURAL PLACE TO MAKE A FUTURE FUNCTION CALL<br> vtkSmartPointer<vtkPolyData> dow_polydata =<br> vtkSmartPointer<vtkPolyData>::New();<br> dow_polydata->SetPoints(dow_points);<br><br> vtkSmartPointer<vtkVertexGlyphFilter> dow_glyphFilter =<br> vtkSmartPointer<vtkVertexGlyphFilter>::New();<br> dow_glyphFilter->SetInputConnection(dow_polydata->GetProducerPort());<br> dow_glyphFilter->Update();<br> <br> //
Visualize<br> //Create a mapper and actor<br> vtkSmartPointer<vtkPolyDataMapper> dow_mapper =<br> vtkSmartPointer<vtkPolyDataMapper>::New();<br> dow_mapper->SetInputConnection(dow_glyphFilter->GetOutputPort());<br><br> vtkSmartPointer<vtkActor> dow_actor =<br> vtkSmartPointer<vtkActor>::New();<br> dow_actor->SetMapper(dow_mapper);<br><br> //renderer->AddActor(dow_actor);<br> view->GetScene()->AddItem(chart);<br> chart->DebugOn();<br> vtkPlot *line1 = chart->AddPlot(vtkChart::LINE);<br> line1->SetInput(table,0,1);<br> line1->SetColor(0,255,0,255); // RGBA<br> line1->SetWidth(5.0);<br> <br> //- - - - - - - - - - - - - - - - - - - -<br><br> vtkSmartPointer<vtkPolyData> consensus_polydata =<br>
vtkSmartPointer<vtkPolyData>::New();<br><br> consensus_polydata->SetPoints(consensus_points);<br><br> vtkSmartPointer<vtkVertexGlyphFilter> consensus_glyphFilter =<br> vtkSmartPointer<vtkVertexGlyphFilter>::New();<br> consensus_glyphFilter->SetInputConnection(consensus_polydata->GetProducerPort());<br> consensus_glyphFilter->Update();<br><br> vtkSmartPointer<vtkPolyDataMapper> consensus_mapper =<br> vtkSmartPointer<vtkPolyDataMapper>::New();<br> consensus_mapper->SetInputConnection(consensus_glyphFilter->GetOutputPort());<br><br> vtkSmartPointer<vtkActor> consensus_actor =<br> vtkSmartPointer<vtkActor>::New();<br> consensus_actor->SetMapper(consensus_mapper);<br><br> vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =<br>
vtkSmartPointer<vtkRenderWindowInteractor>::New();<br> //renderWindowInteractor->SetRenderWindow(renderWindow);<br> renderWindowInteractor->SetRenderWindow(view->GetRenderWindow());<br><br> vtkPlot *line2 = chart->AddPlot(vtkChart::LINE);<br> line2->SetInput(table, 0, 2);<br> line2->SetColor(255,0,0,255);<br> line2->SetWidth(5.0);<br> //Add the actor to the scene<br> //renderer->AddActor(consensus_actor);<br><br> //- - - - - - - - - - - - - - - - - - - -<br> <br> // THIN RED, YELLOW AND GREEN LINE SEGMENTS WITH DATA POINTS SCALED WITHIN THEM. HARD TO SEE AXES<br> vtkSmartPointer<vtkAxes> axes = vtkSmartPointer<vtkAxes>::New();<br> axes->SetOrigin( 0.0, 0.0, 0.0 );<br> axes->SetScaleFactor(120.0); // AXES STAY VISIBLE BUT DATA POINTS SHRINK TOWARD ORIGIN AS VALUE INCREASES<br><br>
vtkSmartPointer<vtkPolyDataMapper> axesMapper = vtkSmartPointer<vtkPolyDataMapper>::New();<br> axesMapper->SetInputConnection(axes->GetOutputPort());<br><br> vtkSmartPointer<vtkActor> axesActor = vtkSmartPointer<vtkActor>::New();<br> axesActor->SetMapper(axesMapper);<br> <br> renderer->AddActor(axesActor);<br><br> renderer->SetBackground(0.0, 0.0, 0.0); // RGB BACKGROUND<br> <br> //Render and interact<br> renderWindow->Render();<br> renderWindowInteractor->Initialize();<br> renderWindowInteractor->Start();<br> <br> return EXIT_SUCCESS;<br>}<br><br><br></td></tr></table><br>