[vtkusers] vtkParallelCoordinatesView with Qt

Paulo Carvalho paulo.r.m.carvalho at gmail.com
Sun Dec 2 08:41:06 EST 2018


Hi, Zoltan,

   Please, try the .cpp attached.  I managed to get the graph showing
within the main window and with the interactor working.  The two reasons
for the misbehavior were:

1) The code created a new renderer instead of using the view's.

2) The view and the Qt widget were using different render window objects.

  In conclusion, there were two renderers and two render windows in the
program, causing the observed misbehavior.  Let us know whether it works.

[image: image.png]

regards,

Paulo



Em qua, 28 de nov de 2018 às 09:28, Zoltan Kovacs <
Zoltan.Kovacs at esi-group.com> escreveu:

> Dear all,
>
>
>
> Based on the example
>
> https://www.vtk.org/Wiki/VTK/Examples/Cxx/InfoVis/ParallelCoordinatesView
>
> I created a simple Qt project using the class vtkParallelCoordinatesView.  It has only a main window with a PushButton and a QWidget to launch a file
>
> opening dialog for any CSV file and view its content. I also created a Qt Form Class called "ParallelCoordinatesView" with the public function "View", which contains the CSV file reading and the parallel coordinates visualization code from the example. I attached the files.
>
> There are two issues with the functions setting up the render window and the interactor in the public function "View".
>
>
>
> These function calls are commented out in the code:
>
>
>
>     // Set up render window
>
>     view->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
>
>     view->GetRenderer()->GradientBackgroundOff();
>
>     view->GetRenderWindow()->SetSize(1200,600);
>
>     //view->SetInteractor(renderWindowInteractor);
>
>     //view->SetRenderWindow(renderWindow);
>
>     view->ResetCamera();
>
>     view->Render();
>
>     //view->GetInteractor()->Start();
>
>
>
> When I compile and run the code in this form, the parallel coordinates view appears in a window detached from the Qt MainWindow after the file test.csv has been read from the file opening dialog.
>
>
>
> If I remove the comments only from
>
>    //view->SetInteractor(renderWindowInteractor);
>
>     //view->SetRenderWindow(renderWindow);
>
> and compile and run the code then the view window appears in the QWidget in the MainWindow, as expected,
>
> but as soon as I start to move the cursor, everything blacks out in the Mainwindow.
>
>
>
> If remove the comment only from the line
>
>  //view->GetInteractor()->Start();
>
> the I can select lines in the parallel coodinates view vindow, as expected with starting the interactor,
>
> but the Mainwindow hangs.
>
>
>
> I would like to ask if there is a proper setup of the render window and the interactor for the class vtkParallelCoordinatesView with Qt? Thank you very much for your help.
>
>
>
> Kind regards,
>
> Zoltan
>
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> https://public.kitware.com/mailman/listinfo/vtkusers
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://public.kitware.com/pipermail/vtkusers/attachments/20181202/7a6b397f/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 61769 bytes
Desc: not available
URL: <https://public.kitware.com/pipermail/vtkusers/attachments/20181202/7a6b397f/attachment.png>
-------------- next part --------------
#include "parallelcoordinatesview.h"
#include "ui_parallelcoordinatesview.h"

ParallelCoordinatesView::ParallelCoordinatesView(QVTKOpenGLWidget *OGLWidget, QWidget *widget, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ParallelCoordinatesView)
{
    ui->setupUi(this);
    ui->setupUi(this);
    QHBoxLayout * layout = new QHBoxLayout();
    layout->addWidget(OGLWidget);
    widget->setLayout(layout);

    renderWindow            = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();

    table                   = vtkSmartPointer<vtkTable>::New();
    reader                  = vtkSmartPointer<vtkDelimitedTextReader>::New();
    polydata                = vtkSmartPointer<vtkPolyData>::New();
    rep                     = vtkSmartPointer<vtkParallelCoordinatesRepresentation>::New();
    view                    = vtkSmartPointer<vtkParallelCoordinatesView>::New();

    //Do not create a new renderer, use the view's renderer.
    renderer = view->GetRenderer();

    //Both the view and the Qt widget must share the same render window
    view->SetRenderWindow( renderWindow );
    OGLWidget->SetRenderWindow( renderWindow );

    renderWindowInteractor  = renderWindow->GetInteractor();
    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderer->SetBackground(1.0, 1.0, 1.0);
    renderer->GradientBackgroundOff();
    renderWindow->AddRenderer(renderer);
}

ParallelCoordinatesView::~ParallelCoordinatesView()
{
    delete ui;
}

void ParallelCoordinatesView::View(QString fileName)
{
    std::string title;
    std::string inputFilename = fileName.toStdString();

    reader->SetFileName(inputFilename.c_str());
    reader->SetHaveHeaders(1);
    reader->DetectNumericColumnsOn();
    reader->SetFieldDelimiterCharacters(",");
    reader->Update();

    table = reader->GetOutput();
    title = vtksys::SystemTools::GetFilenameWithoutExtension(
                vtksys::SystemTools::GetFilenameName(inputFilename));

    for (vtkIdType i = 0; i < table->GetNumberOfColumns(); ++i)
        polydata->GetPointData()->AddArray(table->GetColumn(i));

    rep->SetInputData(polydata);

    for (vtkIdType i = 0; i < table->GetNumberOfColumns(); ++i)
    {
        if (vtkStringArray::SafeDownCast(table->GetColumn(i)))
            continue;
        else
            rep->SetInputArrayToProcess(i, 0, 0, 0, table->GetColumn(i)->GetName());
    }

    rep->SetFontSize(.5);
    rep->SetPlotTitle(title.c_str());
    rep->SetLineOpacity(0.5);
    rep->SetLineColor(0.7, 0.7, 0.7);
    rep->SetAxisColor(0.0, 0.0, 0.0);
    rep->SetAxisLabelColor(0.0, 0.0, 0.0);

    // Set up the Parallel Coordinates View and hook in the Representation
    view->SetRepresentation(rep);
    view->SetInspectMode(1);
    view->SetDisplayHoverText(1);

    // Brush Mode determines the type of interaction you perform to select data
    view->SetBrushModeToLasso();
    view->SetBrushOperatorToReplace();

    view->ResetCamera();
    view->Render();
    view->GetInteractor()->Start();
}


More information about the vtkusers mailing list