[vtkusers] Re: Error msg when destroying a vtkTkRenderWidget
Goodwin Lawlor
goodwin.lawlor at ucd.ie
Wed Jun 14 12:20:34 EDT 2006
Roger Blum wrote:
> Thanks a lot for your answer. It was in fact the interactor which was not
> deleted and caused the warning.
>
> Thanks for the sample code for handling the closing of a window and dealing
> with vtk error messages / warnings, too.
> This helps me a lot.
>
> Roger
Hi Roger,
Actually, looking at the code again... pressing "e" causes a crash. It
happens when the ExitEvent is invoked but iren's "this->Start" points to
an observer that has been deleted. I haven't got time to find out what's
going on. Maybe someone will pick it up again in the future.
Clicking the destroy button in the title bar works ok though.
Goodwin
> "Goodwin Lawlor" <goodwin.lawlor at ucd.ie> schrieb im Newsbeitrag
> news:e6mn20$vt0$1 at sea.gmane.org...
>> Roger Blum wrote:
>>> Hi vtk users,
>>>
>>> I have an application written in Tcl which displays a scene of different
>>> actors. The user can select one actor to display in a separate window.
>>> To acheive this I create a new toplevel widget with an embedded
>>> vtkTkRenderWidget. I create a new mapper (as a shallow copy of the
>>> original mapper) and a new actor, which I add to the new renderer.
>>>
>>> When I close this separate window the following warning is displayed:
>>> Generic Warning: In
>>> C:\Dashboards\Releases\rc-VTK-5-0-0-rc1\VTK\Rendering\vtkTkRenderWidget.cxx,
>>> line 622
>>> A TkRenderWidget is being destroyed before it associated vtkRenderWindow
>>> is destroyed. This is very bad and usually due to the order in which
>>> objects are being destroyed. Always destroy the vtkRenderWindow before
>>> destroying the user interface components.
>>>
>>> How do I have to destroy/delete the vtk objects created for this separate
>>> window? I do not create a vtkRenderWindow explicitly. It is created by
>>> the vtkTkRenderWidget. I have tried to delete/destroy the objects in
>>> various sequences, nothing helped. A call to
>>> [tkRenderWidget GetRenderWindow] Delete
>>> caused error messages complaining about a non existing TempXYZ object.
>> In short, you have to delete the interactor too (which is created for you,
>> if needed). Here's some code to destroy the window, either by clicking the
>> destroy button in the title bar or pressing "e".
>>
>> package require vtk
>> package require vtkinteraction
>>
>> #console show
>> wm withdraw .
>>
>> toplevel .w
>>
>> vtkTkRenderWidget .w.renWidget
>>
>> ::vtk::bind_tk_render_widget .w.renWidget
>>
>> pack .w.renWidget -expand 1 -fill both
>>
>> set renWin [.w.renWidget GetRenderWindow]
>>
>> vtkRenderer ren
>> $renWin AddRenderer ren
>>
>> wm protocol .w WM_DELETE_WINDOW cbCloseWindow
>>
>> set iren [$renWin GetInteractor]
>> # remove the default callback to exit the app
>> $iren RemoveObserver [::vtk::get_widget_variable_value $iren ExitEventTag]
>> $iren AddObserver ExitEvent cbCloseWindow
>>
>> proc cbCloseWindow {} {
>> set renWin [.w.renWidget GetRenderWindow]
>>
>> set renCol [$renWin GetRenderers]
>> for {$renCol InitTraversal} {[set ren [$renCol GetNextItem]] ne ""} {}
>> {
>> $renWin RemoveRenderer $ren
>> $ren Delete
>> }
>>
>> set iren [$renWin GetInteractor]
>> $renWin Delete
>> $iren Delete
>> destroy .w
>> }
>>
>>> As a quick and dirty solution: Can I prevent vtk from showing the
>>> vtkOutputWindow?
>> You can direct the error messages to a file using vtkFileOutputWindow
>> (eg)
>>
>> vtkFileOutputWindow outputFile
>> outputFile SetFileName errors.log
>> outputFile SetInstance outputFile
>>
>> or just switch them off:
>>
>> vtkObject obj
>> obj GlobalWarningDisplayOff
>> obj Delete
More information about the vtkusers
mailing list