7 #include "imstkVTKChartRenderDelegate.h" 8 #include "imstkGeometryUtilities.h" 11 #include <vtkChartXY.h> 12 #include <vtkContextActor.h> 13 #include <vtkContextScene.h> 14 #include <vtkDataArray.h> 15 #include <vtkDataSetAttributes.h> 19 using namespace imstk;
21 VTKChartRenderDelegate::VTKChartRenderDelegate() :
22 m_table(vtkSmartPointer<vtkTable>::New()),
23 m_chart(vtkSmartPointer<vtkChartXY>::New()),
24 m_chartActor(vtkSmartPointer<vtkContextActor>::New()),
25 m_contextScene(vtkSmartPointer<vtkContextScene>::New())
30 VTKChartRenderDelegate::init()
32 auto chartVisualModel = std::dynamic_pointer_cast<
ChartVisualModel>(m_visualModel);
33 CHECK(chartVisualModel !=
nullptr) <<
"VTKChartRenderDelegate only works with ChartVisualModel VisualModel";
35 m_chart->SetAutoSize(
false);
36 const Vec4d& bounds = chartVisualModel->getViewBounds();
37 m_chart->SetSize(vtkRectf(bounds[0], bounds[2], bounds[1], bounds[3]));
39 m_contextScene->AddItem(m_chart);
40 m_chartActor->SetScene(m_contextScene);
41 m_actor = m_chartActor;
49 auto chartVisualModel = std::dynamic_pointer_cast<
ChartVisualModel>(m_visualModel);
50 const std::vector<std::shared_ptr<Plot2d>>& plotsImstk = chartVisualModel->getPlots();
56 std::vector<std::shared_ptr<Plot2d>> plotsToAdd;
57 std::vector<std::shared_ptr<Plot2d>> plotsToRemove;
58 for (
auto plot : plotsImstk)
61 if (m_plots.count(plot) == 0)
64 plotsToAdd.push_back(plot);
68 for (
auto pair : m_plots)
71 if (std::find(plotsImstk.begin(), plotsImstk.end(), pair.first) == plotsImstk.end())
74 plotsToRemove.push_back(pair.first);
79 if (plotsToAdd.size() > 0 || plotsToRemove.size() > 0)
81 m_chart->ClearPlots();
83 for (
auto plot : plotsToRemove)
87 for (
auto plot : plotsToAdd)
89 m_plots[plot] = m_chart->AddPlot(vtkChart::LINE);
92 if (m_plots.size() == 0)
94 m_chart->ClearPlots();
98 m_chart->SetAutoSize(
false);
99 const Vec4d& bounds = chartVisualModel->getViewBounds();
100 m_chart->SetSize(vtkRectf(bounds[0], bounds[2], bounds[1], bounds[3]));
103 std::unordered_map<std::shared_ptr<AbstractDataArray>,
size_t> m_arrayLocations;
104 for (
auto pair : m_plots)
106 std::shared_ptr<Plot2d> plotImstk = pair.first;
107 if (m_arrayLocations.count(plotImstk->xVals) == 0)
109 const size_t i1 = m_arrayLocations.size();
110 m_arrayLocations[plotImstk->xVals] = i1;
112 if (m_arrayLocations.count(plotImstk->yVals) == 0)
114 const size_t i2 = m_arrayLocations.size();
115 m_arrayLocations[plotImstk->yVals] = i2;
120 m_table = vtkSmartPointer<vtkTable>::New();
121 for (
auto arrayKeyValPair : m_arrayLocations)
123 vtkSmartPointer<vtkDataArray> arrVtk = GeometryUtils::copyToVtkDataArray(arrayKeyValPair.first);
124 const std::string arrName =
"data" + std::to_string(arrayKeyValPair.second);
125 arrVtk->SetName(arrName.c_str());
126 m_table->AddColumn(arrVtk);
129 Vec2d min = Vec2d(IMSTK_DOUBLE_MAX, IMSTK_DOUBLE_MAX);
130 Vec2d max = Vec2d(IMSTK_DOUBLE_MIN, IMSTK_DOUBLE_MIN);
131 for (
auto pair : m_plots)
133 vtkPlot* plotVtk = pair.second;
134 std::shared_ptr<Plot2d> plotImstk = pair.first;
136 const size_t xLocation = m_arrayLocations[plotImstk->xVals];
137 const size_t yLocation = m_arrayLocations[plotImstk->yVals];
139 plotVtk->SetInputData(m_table, xLocation, yLocation);
140 const Color& color = plotImstk->lineColor;
141 plotVtk->SetColor(color.r * 255.0, color.g * 255.0, color.b * 255.0, color.a * 255.0);
142 plotVtk->SetWidth(plotImstk->lineWidth);
144 double* rangeX = m_table->GetRowData()->GetArray(static_cast<int>(xLocation))->GetRange();
145 double* rangeY = m_table->GetRowData()->GetArray(static_cast<int>(yLocation))->GetRange();
147 min[0] = std::min(min[0], rangeX[0]);
148 min[1] = std::min(min[1], rangeY[0]);
150 max[0] = std::max(max[0], rangeX[1]);
151 max[1] = std::max(max[1], rangeY[1]);
154 m_chart->GetAxis(1)->SetMinimum(min[0]);
155 m_chart->GetAxis(1)->SetMaximum(max[0]);
157 m_chart->GetAxis(0)->SetMinimum(min[1]);
158 m_chart->GetAxis(0)->SetMaximum(max[1]);
void processEvents() override
Update render delegate source based on the internal data.
Class for graphing 2d charts, only supports 2d data.