[vtkusers] Mac/Cocoa/Qt "invalid drawable"

Chris Kees Christopher.E.Kees at usace.army.mil
Tue May 5 16:03:11 EDT 2009


I commented out Render() and the warning went away in all the simple  
cases:

RCS file: /cvsroot/VTK/VTK/Rendering/vtkRenderWindowInteractor.cxx,v
retrieving revision 1.121
diff -r1.121 vtkRenderWindowInteractor.cxx
629c629
<   this->Render();
---
 >   //this->Render();

For future reference, in one case where I keep pushing frames into a  
tab widget I found that I still got the warning unless I raise the  
tabs as I add them:

             g.tabWidget.addTab(self.frameWidget,title)
             g.tabWidget.setCurrentWidget(self.frameWidget)#added to  
get rid of warning

Maybe in that case what is happening is that only the first tab gets  
drawn unless you select the tab. As the code was building the frames  
it was calling Render() on things  that must be in much the same state  
as a newly initialized iren.

Chris



On May 5, 2009, at 1:53 PM, Clinton Stimpson wrote:

>
> I saw the same thing when doing it in C++ with Qt 4.5 and  Cocoa.
> The fix there was to overload vtkRenderWindowInteractor::Initialize()
> and skip the Render() and let the GUI say when to do the first render.
>
> Can you do that in QVTKRenderWindowInteractor.py?  Or try commenting  
> out the Render() call in vtkRenderWindowInteractor::Initialize() to  
> see if that fixes your problem.
>
> I don't know why it even has the Render() in there.  It seems if the  
> window is coming up for the first time and an event loop is being  
> used, one would get an event to do a first Render() anyways.  If one  
> isn't using an event loop (and probably not using the interactor),  
> they are calling Render() themselves.
>
> Clint
>
>
> Chris Kees wrote:
>> Hi,
>>
>> I've installed vtk from cvs on a Mac with OS X 10.5.6 using the 64  
>> bit Qt 4.5 libraries and the patched VTK source. The code runs fine  
>> except I get a warning:
>>
>> 2009-05-05 12:17:16.313 python[75352:807] invalid drawable
>>
>> when calling Initialize on the QVTKRenderWindowInteractor.  If I  
>> just remove the Initialize call then the code runs fine without  
>> warnings. I saw a post from 2005 that mentioned the warning and a  
>> work around that I don't quite understand.  Anybody know if this is  
>> still  something that needs a work around, or am I just doing  
>> something wrong?
>>
>> Chris
>>
>> Here's an example that generates the warning (needs PyQt installed  
>> as well):
>>
>> #!/usr/bin/env python
>> from vtk import *
>> from vtk.qt4.QVTKRenderWindowInteractor import *
>> import sys
>> from PyQt4 import QtGui
>> import copy
>>
>> app = QtGui.QApplication(sys.argv)
>>
>> import numpy
>> from math import cos,sin
>>
>> nPoints=10
>> x = numpy.zeros((3,),'d')
>> d=2.0
>> pointData=vtkPoints()
>> pointData.SetNumberOfPoints(2*nPoints)
>> for ix in range(2):
>>    for iTheta in range(nPoints):
>>    x[0] = ix*d
>>    x[1] = cos(float(iTheta)*(2.0*3.14)/float(nPoints))
>>    x[2] = sin(float(iTheta)*(2.0*3.14)/float(nPoints))
>>    pointData.SetPoint(ix*nPoints+iTheta,x)
>> polygons=vtkCellArray()
>> scalars=vtkDoubleArray()
>>
>> for ix in range(2):
>>    polygons.InsertNextCell(nPoints)
>>    scalars.InsertNextValue(float(ix))
>>    for iTheta in range(nPoints):
>>        polygons.InsertCellPoint(ix*nPoints+iTheta)
>>
>> ix=0
>> for iTheta in range(nPoints):
>>    polygons.InsertNextCell(4)
>>    scalars.InsertNextValue(0.5)
>>    polygons.InsertCellPoint(ix*nPoints+iTheta)
>>    polygons.InsertCellPoint(ix*nPoints+(iTheta+1)%nPoints)
>>    polygons.InsertCellPoint((ix+1)*nPoints+(iTheta+1)%nPoints)
>>    polygons.InsertCellPoint((ix+1)*nPoints+iTheta)
>>
>> cylinder = vtkPolyData()
>> cylinder.SetPoints(pointData)
>> cylinder.SetPolys(polygons)
>> cylinder.GetCellData().SetScalars(scalars)
>>
>> #
>> #visualize
>> #
>> tabs = True#False
>> mainWindow = QtGui.QMainWindow()
>>
>> if tabs:
>>    tabWidget = QtGui.QTabWidget(mainWindow)
>>    mainWindow.setCentralWidget(tabWidget)
>>    frameWidget = QtGui.QFrame(mainWindow)
>>    hbox = QtGui.QHBoxLayout()
>>    frameWidget2 = QtGui.QFrame(mainWindow)
>>    hbox2 = QtGui.QHBoxLayout()
>>    iren = QVTKRenderWindowInteractor(frameWidget)
>>    iren2 = QVTKRenderWindowInteractor(frameWidget2)
>> else:
>>    frameWidget = QtGui.QFrame(mainWindow)
>>    hbox = QtGui.QHBoxLayout()
>>    mainWindow.setCentralWidget(frameWidget)
>>    iren = QVTKRenderWindowInteractor(frameWidget)
>>    iren2 = QVTKRenderWindowInteractor(frameWidget)
>>
>> iren.Initialize()
>> iren2.Initialize()
>>
>> cylinderMapper = vtkPolyDataMapper()
>> cylinderMapper.SetInput(cylinder)
>> cylinderMapper.SetScalarRange(0,1)
>>
>> cylinderActor = vtkActor()
>> cylinderActor.SetMapper(cylinderMapper)
>>
>> renderer = vtkRenderer()
>> renderer.AddActor(cylinderActor)
>>
>> renderer2 = vtkRenderer()
>> renderer2.AddActor(cylinderActor)
>>
>> renWin = iren.GetRenderWindow()
>> renWin.AddRenderer(renderer)
>>
>> renWin2 = iren2.GetRenderWindow()
>> renWin2.AddRenderer(renderer2)
>>
>> if tabs:
>>    hbox.addWidget(iren)
>>    frameWidget.setLayout(hbox)
>>    hbox2.addWidget(iren2)
>>    frameWidget2.setLayout(hbox2)
>>    tabWidget.addTab(frameWidget,"Cylinder 1")
>>    tabWidget.addTab(frameWidget2,"Cylinder 2")
>> else:
>>    hbox.addWidget(iren)
>>    hbox.addWidget(iren2)
>>    frameWidget.setLayout(hbox)
>>
>> mainWindow.show()
>>
>> #iren.show()
>> #iren2.show()
>> #app.exec_()
>> #iren.show()
>> #iren2.show()
>> #app.exec_()
>> sys.exit(app.exec_())
>>
>> _______________________________________________
>> 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
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>




More information about the vtkusers mailing list