[vtkusers] vtkCharts: No more Qt text rendering with vtk 5.10?

Arnaud BARRE arnaud.barre at gmail.com
Thu May 24 05:09:48 EDT 2012


I found somes issues in VTK 5.10 to render text with Qt in the charts,
and I filled a bug report with a patch to fix them
(http://www.vtk.org/Bug/view.php?id=13199).

Now everything is fine: http://dug.im/cbfbe

Arnaud

On Wed, May 23, 2012 at 4:04 PM, Arnaud BARRE <arnaud.barre at gmail.com> wrote:
> Hi,
>
> I am updating Mokka (http://b-tk.googlecode.com/svn/web/mokka/index.html - a
> software used in Biomechanics) from VTK 5.6.1 to VTK 5.10 and everything is
> fine except the text rendering in the charts.
>
> As there is is lots of differences in the charts module between vtk 5.6.1
> and vtk 5.10, I checked if the problem came from my code. For that, I
> created a small executable based on the example "Line plot" but embedded in
> a QVTKWidget.
>
> The following link (http://derp.co.uk/c040e) gives you the result for VTK
> 5.6.1 and VTK 5.10. Both version were compiled with Qt 4.7.3 and with the
> same options (VTK_USE_QT, VTK_USE_QVTK_QTOPENGL)
>
> As you can see the text rendering is not the same and in the case of
> vtk-5.10, the method vtkOpenGLContextDevice2D::SetStringRendererToQt()
> returns false (and then "No Qt rendering"  is displayed in the title). I
> tested under Windows 7 and MacOS X (Leopard - 10.5.8) and I have each time
> the same problem.
>
> Is there anything special to do in VTK 5.10 to have a Qt text rendering in
> the charts? Should I use QVTKWidget2?
>
> Regards,
>
> Arnaud
>
> The code is joined in the ZIP file, but if necessary, here is the source
> code and the CMake project
>
> main.cpp
>
> #include <vtkRenderWindow.h>
> #include <vtkSmartPointer.h>
> #include <vtkChartXY.h>
> #include <vtkPlot.h>
> #include <vtkPen.h>
> #include <vtkTable.h>
> #include <vtkFloatArray.h>
> #include <vtkContextView.h>
> #include <vtkContextScene.h>
> #include <vtkContext2D.h>
> #include <vtkOpenGLContextDevice2D.h>
> #include <vtkVersion.h>
>
> #include <QApplication>
> #include <QVTKWidget.h>
>
> #define VTK_CREATE(type, name) \
>   vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
>
> int main(int argc, char *argv[])
> {
>   QApplication app(argc,argv);
>
>   QVTKWidget widget;
>   widget.resize(640,480);
>
>   // Set up a 2D scene, add an XY chart to it
>   VTK_CREATE(vtkContextView, view);
>   VTK_CREATE(vtkChartXY, chart);
>   view->GetScene()->AddItem(chart);
>
>   // Link the view with the widget
>   view->SetInteractor(widget.GetInteractor());
>   widget.SetRenderWindow(view->GetRenderWindow());
>
>   // Create a table with some points in it
>   VTK_CREATE(vtkTable, table);
>
>   VTK_CREATE(vtkFloatArray, arrX);
>   arrX->SetName("X Axis");
>   table->AddColumn(arrX);
>
>   VTK_CREATE(vtkFloatArray, arrC);
>   arrC->SetName("Cosine");
>   table->AddColumn(arrC);
>
>   VTK_CREATE(vtkFloatArray, arrS);
>   arrS->SetName("Sine");
>   table->AddColumn(arrS);
>
>   // Fill in the table with some example values
>   int numPoints = 69;
>   float inc = 7.5 / (numPoints-1);
>   table->SetNumberOfRows(numPoints);
>   for (int i = 0; i < numPoints; ++i)
>   {
>     table->SetValue(i, 0, i * inc);
>     table->SetValue(i, 1, cos(i * inc));
>     table->SetValue(i, 2, sin(i * inc));
>   }
>
>   // Add multiple line plots, setting the colors etc
>   vtkPlot *line = chart->AddPlot(vtkChart::LINE);
> #if VTK_MAJOR_VERSION <= 5
>   line->SetInput(table, 0, 1);
> #else
>   line->SetInputData(table, 0, 1);
> #endif
>   line->SetColor(0, 255, 0, 255);
>   line->SetWidth(1.0);
>   line = chart->AddPlot(vtkChart::LINE);
> #if VTK_MAJOR_VERSION <= 5
>   line->SetInput(table, 0, 2);
> #else
>   line->SetInputData(table, 0, 2);
> #endif
>   line->SetColor(255, 0, 0, 255);
>   line->SetWidth(5.0);
>   line->GetPen()->SetLineType(2);//For dotted line, can be from 2 to 5 for
> different dot patterns
>
>   std::string vtkVersion = vtkVersion::GetVTKVersion();
>   std::string qtVersion = qVersion();
>   std::string title = "VTK-" + vtkVersion + " & Qt-" + qtVersion + ": ";
>
>   if
> (!vtkOpenGLContextDevice2D::SafeDownCast(view->GetContext()->GetDevice())->SetStringRendererToQt())
>     title += "No Qt Rendering";
>   else
>     title += "Qt Rendering";
>
>   chart->SetTitle(title.c_str());
>
>   widget.show();
>
>   app.exec();
>
>   return EXIT_SUCCESS;
> }
>
> CMakeLists.txt
>
> cmake_minimum_required(VERSION 2.6)
>
> PROJECT(vtkChartQtTextRendering)
>
> FIND_PACKAGE(VTK)
> INCLUDE(${VTK_USE_FILE})
>
> SET(QT_QMAKE_EXECUTABLE ${VTK_QT_QMAKE_EXECUTABLE} CACHE FILEPATH "")
> SET(QT_MOC_EXECUTABLE ${VTK_QT_MOC_EXECUTABLE} CACHE FILEPATH "")
> SET(QT_UIC_EXECUTABLE ${VTK_QT_UIC_EXECUTABLE} CACHE FILEPATH "")
>
> FIND_PACKAGE(Qt4 REQUIRED)
> INCLUDE(${QT_USE_FILE})
>
> # Use the include path and library for Qt that is used by VTK.
> INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}
>                     ${QT_QTGUI_INCLUDE_DIR}
>                     ${QT_QTCORE_INCLUDE_DIR})
>
> ADD_EXECUTABLE(vtkChartQtTextRendering main.cpp)
>
> TARGET_LINK_LIBRARIES(vtkChartQtTextRendering
>   QVTK
>   ${QT_LIBRARIES}
>   vtkCharts
> )



More information about the vtkusers mailing list