<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hello,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>I'm working on adding user interface on my VTK 
application, is using the famous "vtkFlRenderWindowInteractor (0.9)". However, 
there is problems in saving the image correctly, the saved imaged is always 
deformed seriously. Following is the Cone3.cpp code. A "save" button is added, 
everything else is the same as before. The&nbsp;libraries I used&nbsp;are VTK 
4.4 and&nbsp;FLTK 1.1.5. The application is running under RedHat 9.0 shrike. One 
odd thing is if run exactly same code under RH 8.0, everything work 
fine.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Can anyone help me out? Thanks a lot.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>chuang</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>// Cone3.cxx adapted to illustrate the use of 
vtkFlRenderWindowInteractor<BR>// $Id: Cone3.cxx,v 1.7 2002/12/30 14:51:26 
cpbotha Exp $<BR>// Study this example carefully.&nbsp; Study it again.&nbsp; 
Repeat.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>// here we have all the usual VTK stuff that we 
need for our pipeline<BR>#include &lt;vtkRenderer.h&gt;<BR>#include 
&lt;vtkRenderWindow.h&gt;<BR>#include &lt;vtkConeSource.h&gt;<BR>#include 
&lt;vtkPolyDataMapper.h&gt;<BR>#include &lt;vtkActor.h&gt;<BR>#include 
&lt;vtkWindowToImageFilter.h&gt;<BR>#include &lt;vtkJPEGWriter.h&gt;<BR>#include 
&lt;vtkPNGWriter.h&gt;<BR>#include &lt;vtkTIFFWriter.h&gt;<BR>#include 
&lt;vtkBMPWriter.h&gt;<BR>#include &lt;vtkRendererCollection.h&gt;<BR>#include 
&lt;vtkRendererSource.h&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>// and here we have the famous 
vtkFlRenderWindowInteractor class<BR>#include 
&lt;vtkFlRenderWindowInteractor.h&gt;</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>// and of course some fltk stuff<BR>#include 
&lt;Fl/Fl_Box.h&gt;<BR>#include &lt;Fl/Fl_Button.h&gt;</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>// this is a callback for the quit button<BR>void 
quit_cb(Fl_Widget*, void*)<BR>{<BR>&nbsp;&nbsp; exit(0);<BR>}</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>// this callback gets called when the main window 
is closed<BR>// remember that one should NEVER delete() a 
vtkFlRenderWindowInteractor,<BR>// since it's a vtk object.&nbsp; instead, its 
Delete() method should be used.<BR>// so, in the callback of the containing 
window, you should either terminate<BR>// your application (if that's 
applicable) or if you have a multi-window <BR>// application, call -&gt;Delete() 
on the vtkFlRWI and then take care of the<BR>// surrounding logic.<BR>void 
main_window_callback(Fl_Widget *w, void 
*fl_vtk_window)<BR>{<BR>&nbsp;&nbsp;&nbsp; exit(0);<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>void save_callback(Fl_Widget *w, void 
*fl_vtk_window)<BR>{<BR>&nbsp;vtkFlRenderWindowInteractor *fw = 
(vtkFlRenderWindowInteractor *)fl_vtk_window;<BR>&nbsp;vtkRenderWindow *rw = 
fw-&gt;GetRenderWindow();</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;vtkRendererCollection *rc = 
rw-&gt;GetRenderers();<BR>&nbsp;rc-&gt;InitTraversal();<BR>&nbsp;vtkRenderer *rr 
= rc-&gt;GetNextItem();</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;vtkRendererSource *rsrc = 
vtkRendererSource::New();<BR>&nbsp;rsrc-&gt;SetInput(rr);<BR>&nbsp;rsrc-&gt;WholeWindowOn();<BR>&nbsp;rsrc-&gt;RenderFlagOn();<BR>&nbsp;rsrc-&gt;DepthValuesOff();&nbsp;<BR>&nbsp;rsrc-&gt;DepthValuesInScalarsOff();</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;//vtkWindowToImageFilter *w2i = 
vtkWindowToImageFilter::New();<BR>&nbsp;//w2i-&gt;SetInput(rsrc-&gt;GetOutput()); 
</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;//vtkPNGWriter *writer = 
vtkPNGWriter::New();<BR>&nbsp;vtkJPEGWriter *writer = 
vtkJPEGWriter::New();<BR>&nbsp;//vtkTIFFWriter *writer = 
vtkTIFFWriter::New();<BR>&nbsp;//vtkBMPWriter *writer = 
vtkBMPWriter::New();<BR>&nbsp;writer-&gt;SetInput(rsrc-&gt;GetOutput());<BR>&nbsp;//writer-&gt;SetFileName("cones.png");<BR>&nbsp;writer-&gt;SetFileName("cones.jpg");<BR>&nbsp;writer-&gt;Write(); 
<BR>&nbsp;writer-&gt;Delete();<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>int main( int argc, char *argv[] 
)<BR>{<BR>&nbsp;&nbsp; // set up main FLTK window<BR>&nbsp;&nbsp; Fl_Window* 
main_window = new Fl_Window(300,330,"Cone3.cxx");<BR>&nbsp;&nbsp; 
<BR>&nbsp;&nbsp; // and instantiate vtkFlRenderWindowInteractor (here it acts 
like a FLTK window,<BR>&nbsp;&nbsp; // i.e. you could also instantiate it as 
child of a Fl_Group in a window)<BR>&nbsp;&nbsp; vtkFlRenderWindowInteractor* 
fl_vtk_window = new 
vtkFlRenderWindowInteractor(5,5,290,260,NULL);<BR>&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp; main_window-&gt;callback(main_window_callback, 
fl_vtk_window);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // this will result in a little 
message under the rendering<BR>&nbsp;&nbsp; Fl_Box* box = new 
Fl_Box(5,261,290,34,"3 = stereo, j = joystick, t = trackball, w = wireframe, s = 
surface, p = pick; you can also resize the window");<BR>&nbsp;&nbsp; 
box-&gt;labelsize(10);<BR>&nbsp;&nbsp; 
box-&gt;align(FL_ALIGN_WRAP);<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; // we want a 
button with which the user can quit the application<BR>&nbsp;&nbsp; Fl_Button* 
quit_button = new Fl_Button(30,300,100,25,"quit");<BR>&nbsp;&nbsp; 
quit_button-&gt;callback(quit_cb, NULL);<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; 
Fl_Button* save_button = new Fl_Button(160,300,100,25,"save");<BR>&nbsp;&nbsp; 
save_button-&gt;callback(save_callback, (void *) fl_vtk_window);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // we're done populating the 
main_window<BR>&nbsp;&nbsp; main_window-&gt;end();<BR>&nbsp;&nbsp; // if the 
main window gets resized, the vtk window should resize with it<BR>&nbsp;&nbsp; 
main_window-&gt;resizable(fl_vtk_window);<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; // 
these two steps are VERY IMPORTANT, you have to show() the fltk 
window<BR>&nbsp;&nbsp; // containing the vtkFlRenderWindowInteractor, and then 
the<BR>&nbsp;&nbsp; // vtkFlRenderWindowInteractor itself<BR>&nbsp;&nbsp; 
main_window-&gt;show();<BR>&nbsp;&nbsp; 
fl_vtk_window-&gt;show();<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; // now we get to 
setup our VTK rendering pipeline<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; // create a 
rendering window and renderer<BR>&nbsp;&nbsp; vtkRenderer *ren = 
vtkRenderer::New();<BR>&nbsp;&nbsp; vtkRenderWindow *renWindow = 
vtkRenderWindow::New();<BR>&nbsp;&nbsp; 
renWindow-&gt;AddRenderer(ren);<BR>&nbsp;&nbsp; // uncomment the statement below 
if things aren't rendering 100% on your<BR>&nbsp;&nbsp; // configuration; the 
debug output could give you clues as to why<BR>&nbsp;&nbsp; 
//renWindow-&gt;DebugOn();<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; // NB: here we treat 
the vtkFlRenderWindowInteractor just like any other<BR>&nbsp;&nbsp; // old 
vtkRenderWindowInteractor<BR>&nbsp;&nbsp; 
fl_vtk_window-&gt;SetRenderWindow(renWindow);<BR>&nbsp;&nbsp; // just like with 
any other vtkRenderWindowInteractor(), you HAVE to call<BR>&nbsp;&nbsp; // 
Initialize() before the interactor will function.&nbsp; See the docs 
in<BR>&nbsp;&nbsp; // vtkRenderWindowInteractor.h<BR>&nbsp;&nbsp; 
fl_vtk_window-&gt;Initialize();</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // create an actor and give it cone 
geometry<BR>&nbsp;&nbsp; vtkConeSource *cone = 
vtkConeSource::New();<BR>&nbsp;&nbsp; cone-&gt;SetResolution(8);<BR>&nbsp;&nbsp; 
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();<BR>&nbsp;&nbsp; 
coneMapper-&gt;SetInput(cone-&gt;GetOutput());<BR>&nbsp;&nbsp; vtkActor 
*coneActor = vtkActor::New();<BR>&nbsp;&nbsp; 
coneActor-&gt;SetMapper(coneMapper);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // assign our actor to the 
renderer<BR>&nbsp;&nbsp; ren-&gt;AddActor(coneActor);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // We can now delete all our 
references to the VTK pipeline (except for<BR>&nbsp;&nbsp; // our reference to 
the vtkFlRenderWindowInteractor) as the objects<BR>&nbsp;&nbsp; // themselves 
will stick around until we dereference fl_vtk_window<BR>&nbsp;&nbsp; 
ren-&gt;Delete();<BR>&nbsp;&nbsp; renWindow-&gt;Delete();<BR>&nbsp;&nbsp; 
cone-&gt;Delete();<BR>&nbsp;&nbsp; coneMapper-&gt;Delete();<BR>&nbsp;&nbsp; 
coneActor-&gt;Delete();</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // this is the standard way of 
"starting" a fltk application<BR>&nbsp;&nbsp; int fl_ret = 
Fl::run();<BR>&nbsp;//fl_vtk_window-&gt;Start();<BR>&nbsp;&nbsp; 
<BR>&nbsp;&nbsp; // very huge NB: note that we -&gt;Delete() the 
vtkFlRenderWindowInteractor<BR>&nbsp;&nbsp; // once we do this, the rest of the 
vtk pipeline will really disappear<BR>&nbsp;&nbsp; 
fl_vtk_window-&gt;Delete();<BR>&nbsp;&nbsp; // and after we've done that, we can 
delete the main_window<BR>&nbsp;&nbsp; delete main_window;<BR>&nbsp;&nbsp; 
<BR>&nbsp;return 1;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV></BODY></HTML>