[vtk-developers] Error on glGenQueries

Romain CENDRE romain.cendre at optopartner.com
Mon Dec 19 11:26:08 EST 2016


Hi again, 
So I tried several things based on your reply and he seems to have the same symptoms. 

I shared my piece of code below, I hope it help a little bit more on what I'm doing wrong: 

/////////////////////////////////////////////////// /////////////////////////////////////////////////// /////////////////////////////////////////////////// 
/////////////////////////////////////////////// For the .H 
/////////////////////////////////////////////////// /////////////////////////////////////////////////// /////////////////////////////////////////////////// 

#ifndef VTK_DISPLAY_H 
#define VTK_DISPLAY_H 

#include <QMainWindow> 
#include <QVTKWidget.h> 
#include <vtkActor.h> 
#include <vtkCubeAxesActor.h> 
#include <vtkDataSetMapper.h> 
#include <vtkEventQtSlotConnect.h> 
#include <vtkImageSliceMapper.h> 
#include <vtkImageMagnitude.h> 
#include <vtkImageDataGeometryFilter.h> 
#include <vtkImageReader.h> 
#include <vtkWarpScalar.h> 
#include <vtkLegendScaleActor.h> 
#include <vtkLookupTable.h> 
#include <vtkMergeFilter.h> 
#include <vtkPNGReader.h> 
#include <vtkRenderer.h> 
#include <vtkRenderWindow.h> 
#include <vtkRenderWindowInteractor.h> 
#include <vtkScalarBarActor.h> 
#include <vtkScalarBarWidget.h> 
#include <vtkScalarBarRepresentation.h> 
#include <vtkImageImport.h> 
#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <vector> 

class QVTKDisplay : public QMainWindow 
{ 
Q_OBJECT 

/////////////////////////////////////////////////////////// 
//////////////////////// MEMBERS ////////////////////////// 
private: 
//Graphic part 
QAction* m_actionOpen; 
QAction* m_actionReset; 
QToolBar* m_toolBar; 
QVTKWidget* m_qvtkWidget; 

//VTK stuff 
vtkSmartPointer<vtkActor> m_actor; 
vtkSmartPointer<vtkCubeAxesActor> m_cubeAxesActor; 
vtkSmartPointer<vtkDataSetMapper> m_mapper; 
vtkSmartPointer<vtkImageImport> m_readerFile; 
vtkSmartPointer<vtkEventQtSlotConnect> m_connections; 
vtkSmartPointer<vtkImageMagnitude> m_luminanceFilter; 
vtkSmartPointer<vtkImageDataGeometryFilter> m_geometryFilter; 
vtkSmartPointer<vtkMergeFilter> m_merge; 
vtkSmartPointer<vtkLegendScaleActor> m_legendScaleActor; 
vtkSmartPointer<vtkLookupTable> m_lut; 
vtkSmartPointer<vtkRenderer> m_renderer; 
vtkSmartPointer<vtkRenderWindow> m_windowRend; 
vtkSmartPointer<vtkScalarBarActor> m_scalarBar; 
vtkSmartPointer<vtkScalarBarRepresentation> m_scalarRepresentation; 
vtkSmartPointer<vtkScalarBarWidget> m_scalarWidget; 
vtkSmartPointer<vtkWarpScalar> m_warp; 


/////////////////////////////////////////////////////////// 
//////////////////////// CONSTRUCTOR ////////////////////////// 
public: 
/** 
* 
*/ 
QVTKDisplay(QWidget *parent = 0); 
/** 
* 
*/ 
~QVTKDisplay(); 


/////////////////////////////////////////////////////////// 
//////////////////////// METHODS ////////////////////////// 
private: 
/** 
* 
*/ 
void changeSource(const QString&); 
/** 
* 
*/ 
void initializeQtComponents(); 
/** 
* 
*/ 
void initializeVTKComponents(); 
/** 
* 
*/ 
void initializeVTKDataPipe(); 
/** 
* 
*/ 
void initializeVTKScene(); 
/** 
* 
*/ 
void readCSV(std::istream& , std::vector< std::vector<double> >&, int&,int& ); 
////////////////////////////////////////////// 
/// SLOTS 
public slots: 
/** 
* 
*/ 
void actionOpen(); 
/** 
* 
*/ 
void customContext(const QPoint &); 
/** 
* 
*/ 
void resetView(); 
}; 

#endif // VTK_DISPLAY_H 

/////////////////////////////////////////////////// /////////////////////////////////////////////////// /////////////////////////////////////////////////// 
/////////////////////////////////////////////////// For the CPP 
/////////////////////////////////////////////////// /////////////////////////////////////////////////// /////////////////////////////////////////////////// 

#include "stdafx.h" 
#include "QVTKDisplay.h" 

#include <math.h> 
#include <QGridLayout> 
#include <vtkCamera.h> 
#include <vtkDataSetAlgorithm.h> 
#include <vtkTextProperty.h> 
#include <limits> 

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkInteractionStyle) 
VTK_MODULE_INIT(vtkRenderingFreeType) 
VTK_MODULE_INIT(vtkRenderingOpenGL2) 

/////////////////////////////////////////////////////////// 
//////////////////////// CONSTRUCTOR ////////////////////////// 
QVTKDisplay::QVTKDisplay(QWidget *parent) 
: QMainWindow(parent) 
{ 
//////////////////// 
///// QT 
/////////////////// 
initializeQtComponents(); 

//////////////////// 
///// VTK 
/////////////////// 
initializeVTKComponents(); 
} 

QVTKDisplay::~QVTKDisplay() 
{ 
} 

/////////////////////////////////////////////////////////// 
//////////////////////// METHODS ////////////////////////// 

////////////// PRIVATE 
void QVTKDisplay::changeSource(const QString& fileName) 
{ 
if(!m_readerFile) 
{ 
return; 
} 
//m_readerFile->SetFileName(fileName.toStdString().c_str()); 
std::fstream file(fileName.toStdString().c_str(), ios::in); 
if(!file.is_open()) 
{ 
return; 
} 

std::vector< std::vector<double> > data; 
int width, height; 
readCSV(file, data, width, height); 

double* image = new double [width * height]; 
for(int row = 0;row<height;row++) 
{ 
std::vector<double> line = data.at(row); 
for(int col = 0; col < width; col++) 
{ 
image[row * width + col] = line.at(col); 
} 
} 

m_readerFile->SetDataSpacing(1, 1, 1); 
m_readerFile->SetDataOrigin(0, 0, 0); 
m_readerFile->SetWholeExtent(0, width-1, 0, height-1, 0, 0); 
m_readerFile->SetDataExtentToWholeExtent(); 
m_readerFile->SetDataScalarTypeToDouble(); 
m_readerFile->SetNumberOfScalarComponents(1); 
m_readerFile->SetImportVoidPointer(image); 
m_readerFile->Modified(); 

m_luminanceFilter->SetInputConnection(m_readerFile->GetOutputPort()); 

resetView (); 
} 

void QVTKDisplay::initializeQtComponents() 
{ 
//Create title toolbar 
m_toolBar = new QToolBar(this); 
m_actionOpen = new QAction("Open",m_toolBar); 
connect(m_actionOpen,SIGNAL(triggered()),this,SLOT(actionOpen())); 
m_toolBar->addAction(m_actionOpen); 

addToolBar(Qt::TopToolBarArea, m_toolBar); 

//Init visualisation widget 
m_qvtkWidget = new QVTKWidget(parentWidget()); 

//Layout creation 
setCentralWidget(m_qvtkWidget); 

//QT Action for context actions 
m_actionReset = new QAction("Reset",this); 
connect(m_actionReset,SIGNAL(triggered()),this,SLOT(resetView())); 

//Intercept custom context menu 
m_qvtkWidget->setContextMenuPolicy(Qt::CustomContextMenu); 
connect(m_qvtkWidget,SIGNAL(customContextMenuRequested(const QPoint &)), 
this,SLOT(customContext(const QPoint &))); 
} 

void QVTKDisplay::initializeVTKComponents() 
{ 
/////////////////////////////// 
//Init all needed VTK instance 
m_actor = vtkSmartPointer<vtkActor>::New(); 
m_cubeAxesActor = vtkSmartPointer<vtkCubeAxesActor>::New(); 
m_mapper = vtkSmartPointer<vtkDataSetMapper>::New(); 
m_connections = vtkSmartPointer<vtkEventQtSlotConnect>::New(); 
m_luminanceFilter = vtkSmartPointer<vtkImageMagnitude>::New(); 
m_geometryFilter = vtkSmartPointer<vtkImageDataGeometryFilter>::New(); 
m_merge = vtkSmartPointer<vtkMergeFilter>::New(); 
m_readerFile = vtkSmartPointer<vtkImageImport>::New(); 
m_renderer = vtkSmartPointer<vtkRenderer>::New(); 
m_scalarBar = vtkSmartPointer<vtkScalarBarActor>::New(); 
m_warp = vtkSmartPointer<vtkWarpScalar>::New(); 
m_scalarRepresentation = vtkSmartPointer<vtkScalarBarRepresentation>::New(); 
m_scalarWidget = vtkSmartPointer<vtkScalarBarWidget>::New(); 
m_lut = vtkSmartPointer<vtkLookupTable>::New(); 


//m_readerFile->SetFileName("C:\\Users\\rcendre\\Desktop\\VTK_display\\influence_actuator_1.txt"); //DEBUG 

/////////////////////////////// 
//Setting up VTK pipe for render 
////// 
initializeVTKDataPipe(); 

//Initialize actor on scene 
initializeVTKScene(); 

// Restart view to 2D projection 
resetView ( ); 

changeSource("C:\\Users\\rcendre\\Documents\\Visual Studio 2010\\Projects\\VTK_display\\influence_actuator_1.txt"); 
} 

void QVTKDisplay::initializeVTKDataPipe() 
{ 
//Set input data to luminance (PNG data) 
//m_readerFile->setDe; 
//m_luminanceFilter->SetInputConnection(m_readerFile->GetOutputPort()); 
//Extract as a set of polygons 
m_geometryFilter->SetInputConnection(m_luminanceFilter->GetOutputPort()); 
//Increase scale of geometry variations 
m_warp->SetInputConnection(m_geometryFilter->GetOutputPort()); 
m_warp->SetScaleFactor(-.3); 
//Now we just have to merge our data (color) and level map (geometry) that's all 
m_merge->SetGeometryConnection(m_warp->GetOutputPort()); 
m_merge->SetScalarsConnection(m_readerFile->GetOutputPort()); 

m_lut->SetNumberOfTableValues(3); 
m_lut->Build(); 
m_lut->SetTableValue(0, 0, 0, 1, 1); //Blue 
m_lut->SetTableValue(1, 0, 1, 0, 1); // Green 
m_lut->SetTableValue(2, 1, 0, 0, 1); // Red 
m_lut->SetTableRange(0.0, 100.0); 
//Transition between datas and actors 
m_mapper->SetInputConnection(m_merge->GetOutputPort()); 
m_mapper->SetScalarRange(0, 2); 
m_mapper->SetLookupTable(m_lut); 

//vtkPolyDataMapper* mapper = vtkPolyDataMapper::New(); 
// mapper->SetInputConnection(m_luminanceFilter->GetOutputPort()); 
// mapper->SetScalarRange(0, 2); 
// mapper->SetLookupTable(m_lut); 

//Create an actor to provide a representation to our 2D data 
m_actor->SetMapper(m_mapper); 
} 

void QVTKDisplay::initializeVTKScene() 
{ 
//Creation of axes 
m_cubeAxesActor->SetBounds(m_actor->GetBounds()); 
m_cubeAxesActor->SetCamera(m_renderer->GetActiveCamera()); 
//m_cubeAxesActor->StickyAxesOn(); 
//m_cubeAxesActor->CenterStickyAxesOn(); 

//Scale bar 
m_legendScaleActor = vtkSmartPointer<vtkLegendScaleActor>::New(); 
m_legendScaleActor->RightAxisVisibilityOff (); 
m_legendScaleActor->TopAxisVisibilityOff (); 
m_legendScaleActor->LegendVisibilityOff (); 

//LUT bar 
m_scalarRepresentation->SetPosition(0.9, 0.1); 
m_scalarRepresentation->SetPosition2(0.1, 0.8); 
m_scalarRepresentation->MovingOff (); 
m_scalarRepresentation->DragableOn(); 

m_scalarBar->SetLookupTable(m_lut); 
m_scalarBar->SetBarRatio( 0.25 ); 
m_scalarBar->SetTitleRatio( 0.1 ); 

m_scalarWidget->SetInteractor(m_qvtkWidget->GetRenderWindow()->GetInteractor()); 
m_scalarWidget->SetRepresentation(m_scalarRepresentation); 
m_scalarWidget->SetScalarBarActor(m_scalarBar); 
m_scalarWidget->SetDefaultRenderer(m_renderer); 
m_scalarWidget->SetCurrentRenderer(m_renderer); 
m_scalarWidget->ProcessEventsOff(); 
//m_scalarWidget->PickingManagedOff (); 

m_qvtkWidget->GetRenderWindow()->GetInteractor()->Initialize(); 
m_scalarWidget->On(); 
m_qvtkWidget->GetRenderWindow()->GetInteractor()->Start(); 

//Compose our VTK scene ! 
m_renderer->SetRenderWindow (m_qvtkWidget->GetRenderWindow()); 
m_renderer->AddViewProp(m_actor); 
m_renderer->AddViewProp(m_cubeAxesActor); 
m_renderer->AddViewProp(m_legendScaleActor); 
m_renderer->AddViewProp(m_scalarBar); 

//We set the renderer to our visual widget and set an interactor for user interaction 
m_qvtkWidget->GetRenderWindow()->AddRenderer(m_renderer); 
} 

void QVTKDisplay::readCSV(std::istream &input, std::vector< std::vector<double> > &output,int& width,int& height ) 
{ 
std::string csvLine; 
// read every line from the stream 
while( std::getline(input, csvLine) ) 
{ 
std::istringstream csvStream(csvLine); 
std::string csvElement; 
std::string::size_type sz; 
std::vector<double> csvColumn; 
// read every element from the line that is seperated by commas 
// and put it into the vector or strings 
while( std::getline(csvStream, csvElement, ' ') ) 
{ 
if( csvElement.compare("nan") != 0 ) 
{ 
csvColumn.push_back(std::stod (csvElement,&sz)); 
} 
else 
{ 
csvColumn.push_back( std::numeric_limits<double>::quiet_NaN() ); 
} 
} 
width = csvColumn.size(); 
output.push_back(csvColumn); 
} 
height = output.size(); 
} 

/////////////////////////////////////////////////////////// 
////////// SLOTS 

void QVTKDisplay::actionOpen() 
{ 
QString file = QFileDialog::getOpenFileName(this,tr("Open PNG"), QDir::currentPath(), tr("PNG Files (*.png)")); 
if (file.isEmpty()) 
{ 
return; 
} 

changeSource(file); 
} 

void QVTKDisplay::customContext(const QPoint& p_pos) 
{ 
QMenu contextMenu(tr("Context menu"), this); 
contextMenu.addAction(m_actionReset); 
contextMenu.exec(mapToGlobal(p_pos)); 
} 

void QVTKDisplay::resetView() 
{ 
double * bounds = m_actor->GetBounds(); 

double imageCenterX = 0.5f * (bounds[1] - bounds[0]); 
double imageCenterY = 0.5f * (bounds[3] - bounds[2]); 
double imageWidth = bounds[1] - bounds[0]; 
double imageHeight = bounds[3] - bounds[2]; 

//m_renderer->Render(); 
m_renderer->ResetCamera(); 
//m_renderer->ReleaseGraphicsResources(m_qvtkWidget->GetRenderWindow()); 
m_renderer->GetActiveCamera()->ParallelProjectionOn(); 
m_renderer->GetActiveCamera()->SetFocalPoint(imageCenterX, imageCenterY, 0.f); 
m_renderer->GetActiveCamera()->SetPosition( imageCenterX, imageCenterY, m_renderer->GetActiveCamera()->GetDistance()); 
m_renderer->GetActiveCamera()->SetViewUp(0, 1, 0); 
m_renderer->Render(); 
} 


De: "Ken Martin" <ken.martin at kitware.com> 
À: "Romain CENDRE" <romain.cendre at optopartner.com> 
Cc: "vtk-developers" <vtk-developers at vtk.org> 
Envoyé: Lundi 19 Décembre 2016 15:16:58 
Objet: Re: [vtk-developers] Error on glGenQueries 

Yes, what you are doing in (1) is all good. That is the right way to do it. 

On Mon, Dec 19, 2016 at 8:48 AM, Romain CENDRE < romain.cendre at optopartner.com > wrote: 



Ok thanks for your advices Ken, I will tryit. 

1) At this time I've made this to create my pipe: 



//Set input data to luminance (PNG data) 
m_luminanceFilter->SetInputConnection(m_reader->GetOutputPort()); 
//Extract as a set of polygons 
m_geometryFilter->SetInputConnection(m_luminanceFilter->GetOutputPort()); 
//Increase scale of geometry variations 
m_warp->SetInputConnection(m_geometryFilter->GetOutputPort()); 
m_warp->SetScaleFactor(-.3); 
//Now we just have to merge our data (color) and level map (geometry) that's all 
m_merge->SetGeometryConnection(m_warp->GetOutputPort()); 
m_merge->SetScalarsConnection(m_reader->GetOutputPort()); 

//Transition between datas and actors 
m_mapper->SetInputConnection(m_merge->GetOutputPort()); 

//Create an actor to provide a representation to our 2D data 
m_actor->SetMapper(m_mapper); 


After that, I'm only doing m_reader->SetFileName(fileName.toStdString().c_str()); to change my data. 
I've supposed that all pipe refresh itself. 

2) I will explore this way after the first thing. 

I will come back! 

Thanks! 


De: "Ken Martin" < ken.martin at kitware.com > 
À: "Romain CENDRE" < romain.cendre at optopartner.com > 
Envoyé: Lundi 19 Décembre 2016 14:41:00 
Objet: Re: [vtk-developers] Error on glGenQueries 

That code looks fine. Two ideas of what the issue could be 

1) you mentioned holding onto ImageMagnitude and changing its data inside. I'm not sure how your doing that but if you are messing with the underlying C++ data in an image data instance make sure you mark the data as modified. ala myImageData->Modified() maybe even myImageData->GetPointData()->GetScalars()->Modified(); 

2) is the rendering working prior to calling resetCamera? If so maybe try commenting out the ParallelProjection although I doubt that is it. If you are rendering correctly before that call, and not creating a different window, then you should be OK. Nothing in that code looks problematic. One other thing you can try is adding a m_renderWindow(or whatever your renderWindow is named, maybe this) ->ReleaseGraphicsResources(m_renderWindow); call at the end of your resetCamera. If something funny is going on with multiple windows that may fix it. 



On Mon, Dec 19, 2016 at 8:28 AM, Romain CENDRE < romain.cendre at optopartner.com > wrote: 

BQ_BEGIN

Hi Ken! 

This is my resetView() function: 

void QVTKDisplay::resetView() 
{ 
double * bounds = m_actor->GetBounds(); 

double imageCenterX = 0.5f * (bounds[1] - bounds[0]); 
double imageCenterY = 0.5f * (bounds[3] - bounds[2]); 
double imageWidth = bounds[1] - bounds[0]; 
double imageHeight = bounds[3] - bounds[2]; 

m_renderer->ResetCamera(); 
m_renderer->GetActiveCamera()->ParallelProjectionOn(); 
m_renderer->GetActiveCamera()->SetFocalPoint(imageCenterX, imageCenterY, 0.f); 
m_renderer->GetActiveCamera()->SetPosition( imageCenterX, imageCenterY, m_renderer->GetActiveCamera()->GetDistance()); 
m_renderer->GetActiveCamera()->SetViewUp(0, 1, 0); 
//m_renderer->Render(); 
} 

I try to keep always the same instance of object, idem for window. 
Does it answer to your question? 


De: "Ken Martin" < ken.martin at kitware.com > 
À: "Romain CENDRE" < romain.cendre at optopartner.com > 
Cc: "vtk-developers" < vtk-developers at vtk.org > 
Envoyé: Lundi 19 Décembre 2016 14:23:49 
Objet: Re: [vtk-developers] Error on glGenQueries 

What version of VTK are you using? How do you change your camera? Using the same window or creating a new one? 
Ken 

On Mon, Dec 19, 2016 at 4:01 AM, Romain CENDRE < romain.cendre at optopartner.com > wrote: 

BQ_BEGIN

Hi everyone, 
I'm new and I'm starting to work on VTK. 

//// CONTEXT 

We use VTK with OpenGL2 (don't ask me why, it's not mandatory, it was choosen by a previous developper). 

I've made a Pipeline made like this: 

2D data image => vtkImageMagnitude => vtkImageDataGeometryFilter => vtkWarpScalar => vtkMergeFilter (geometry) => Actor 
=========================================> vtkMergeFilter (Scalars) 

I keep a reference on vtkImageMagnitude to change image data stored inside, hope that all the pipe refresh itself and it seems to work at this time. 

My image actor is included in a Renderer, with an cubeAxesActor, a ScalarBar and a LegendScaleActor. 

All pipeline objects are started one time at the start. 


//// PROBLEM 

My problem is when I want to change my camera location (to get a 2D view) and call Render() on the renderer to refresh scene I get the following error: 

vtkOpenGLRenderer (0537D740): failed after Clear 16 OpenGL errors detected 
0 : (1282) Invalid operation 
1 : (1282) Invalid operation 
2 : (1282) Invalid operation 
3 : (1282) Invalid operation 
4 : (1282) Invalid operation 
5 : (1282) Invalid operation 
6 : (1282) Invalid operation 
7 : (1282) Invalid operation 
8 : (1282) Invalid operation 
9 : (1282) Invalid operation 
10 : (1282) Invalid operation 
11 : (1282) Invalid operation 
12 : (1282) Invalid operation 
13 : (1282) Invalid operation 
14 : (1282) Invalid operation 
15 : (1282) Invalid operation 


ERROR: In ..\..\..\sources\Rendering\OpenGL2\vtkOpenGLCamera.cxx, line 144 
vtkOpenGLCamera (053D4D20): failed after Render 16 OpenGL errors detected 
0 : (1282) Invalid operation 
1 : (1282) Invalid operation 
2 : (1282) Invalid operation 
3 : (1282) Invalid operation 
4 : (1282) Invalid operation 
5 : (1282) Invalid operation 
6 : (1282) Invalid operation 
7 : (1282) Invalid operation 
8 : (1282) Invalid operation 
9 : (1282) Invalid operation 
10 : (1282) Invalid operation 
11 : (1282) Invalid operation 
12 : (1282) Invalid operation 
13 : (1282) Invalid operation 
14 : (1282) Invalid operation 
15 : (1282) Invalid operation 


ERROR: In ..\..\..\sources\Rendering\OpenGL2\vtkOpenGLRenderer.cxx, line 125 
vtkOpenGLRenderer (0537D740): failed after UpdateLights 16 OpenGL errors detected 
0 : (1282) Invalid operation 
1 : (1282) Invalid operation 
2 : (1282) Invalid operation 
3 : (1282) Invalid operation 
4 : (1282) Invalid operation 
5 : (1282) Invalid operation 
6 : (1282) Invalid operation 
7 : (1282) Invalid operation 
8 : (1282) Invalid operation 
9 : (1282) Invalid operation 
10 : (1282) Invalid operation 
11 : (1282) Invalid operation 
12 : (1282) Invalid operation 
13 : (1282) Invalid operation 
14 : (1282) Invalid operation 
15 : (1282) Invalid operation 


ERROR: In ..\..\..\sources\Rendering\OpenGL2\vtkOpenGLProperty.cxx, line 91 
vtkOpenGLProperty (05A061E8): failed after Render 16 OpenGL errors detected 
0 : (1282) Invalid operation 
1 : (1282) Invalid operation 
2 : (1282) Invalid operation 
3 : (1282) Invalid operation 
4 : (1282) Invalid operation 
5 : (1282) Invalid operation 
6 : (1282) Invalid operation 
7 : (1282) Invalid operation 
8 : (1282) Invalid operation 
9 : (1282) Invalid operation 
10 : (1282) Invalid operation 
11 : (1282) Invalid operation 
12 : (1282) Invalid operation 
13 : (1282) Invalid operation 
14 : (1282) Invalid operation 
15 : (1282) Invalid operation 


The error happens at this line : 

if (this->TimerQuery == 0) 
{ 
glGenQueries(1, static_cast<GLuint*>(&this->TimerQuery)); 
} 

If you want my code, you can ask me. 

I think it's just a newbie problem, but I don't find anything on it. 

Best regards 
Romain 

_______________________________________________ 
Powered by www.kitware.com 

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html 

Search the list archives at: http://markmail.org/search/?q=vtk-developers 

Follow this link to subscribe/unsubscribe: 
http://public.kitware.com/mailman/listinfo/vtk-developers 








-- 
Ken Martin PhD 
Chairman & CFO 
Kitware Inc. 
28 Corporate Drive 
Clifton Park NY 12065 
518 371 3971 
This communication, including all attachments, contains confidential and legally privileged information, and it is intended only for the use of the addressee. Access to this email by anyone else is unauthorized. If you are not the intended recipient, any disclosure, copying, distribution or any action taken in reliance on it is prohibited and may be unlawful. If you received this communication in error please notify us immediately and destroy the original message. Thank you. 


BQ_END




-- 
Ken Martin PhD 
Chairman & CFO 
Kitware Inc. 
28 Corporate Drive 
Clifton Park NY 12065 
518 371 3971 
This communication, including all attachments, contains confidential and legally privileged information, and it is intended only for the use of the addressee. Access to this email by anyone else is unauthorized. If you are not the intended recipient, any disclosure, copying, distribution or any action taken in reliance on it is prohibited and may be unlawful. If you received this communication in error please notify us immediately and destroy the original message. Thank you. 


BQ_END




-- 
Ken Martin PhD 
Chairman & CFO 
Kitware Inc. 
28 Corporate Drive 
Clifton Park NY 12065 
518 371 3971 
This communication, including all attachments, contains confidential and legally privileged information, and it is intended only for the use of the addressee. Access to this email by anyone else is unauthorized. If you are not the intended recipient, any disclosure, copying, distribution or any action taken in reliance on it is prohibited and may be unlawful. If you received this communication in error please notify us immediately and destroy the original message. Thank you. 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20161219/50b4f871/attachment-0001.html>


More information about the vtk-developers mailing list