<!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.6000.16711" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2><FONT face="Times New Roman" size=3>Hi
people,<BR><BR>I'm trying to build an application to read DICOM and Analyse
images. First, I made the interface using glade and I had no problem with that.
I exported it to C++ code. After that, I eddited the code to read DICOM images.
I want to display the image on a vtk renderer window and for that I used vtkmm.
The problem is that the program reads the image but it doesn' t display it
(render it... actually I don't know exactlly what's going on!). Here is the main
C++ source code:<BR><BR>#include <gtkmm/stock.h><BR>#include
<gtkmm/filechooserdialog.h><BR>#include
<vtkPolyDataMapper.h><BR>#include <vtkCubeSource.h><BR>#include
<vtkSphereSource.h><BR>#include <vtkRenderer.h><BR>#include
<vtkRenderWindow.h><BR>#include
<vtkRenderWindowInteractor.h><BR>#include
<vtkVolume16Reader.h><BR>#include <vtkPolyDataMapper.h><BR>#include
<vtkActor.h><BR>#include <vtkOutlineFilter.h><BR>#include
<vtkCamera.h><BR>#include <vtkStripper.h><BR>#include
<vtkLookupTable.h><BR>#include
<vtkImageDataGeometryFilter.h><BR>#include
<vtkProperty.h><BR>#include <vtkPolyDataNormals.h><BR>#include
<vtkContourFilter.h><BR>#include <vtkImageData.h><BR>#include
<vtkImageMapToColors.h><BR>#include <vtkImageActor.h><BR>#include
<vtkDICOMImageReader.h><BR>#include
<vtkImageGaussianSmooth.h><BR><BR>#include "vtkmm.h"<BR>#include
"config.h"<BR>#include "window1.hh"<BR><BR>window1::window1() :
window1_glade()<BR>{<BR> this->signal_check_resize().</FONT>
<DIV dir=ltr> connect(sigc::mem_fun(*this,
&window1::checkResize));<BR> // Creates a widget for VTK
rendering<BR> renArea = new class Gtk::Vtk::RenderingArea();<BR>
renderer = renArea->get_vtk_renderer();<BR>
renderer->SetBackground(0,0,0)<WBR>;<BR><BR> renArea2 = new class
Gtk::Vtk::RenderingArea();<BR> renderer2 =
renArea2->get_vtk_renderer();<BR>
renderer2->SetBackground(0,0,<WBR>0);<BR><BR> renArea3 = new class
Gtk::Vtk::RenderingArea();<BR> renderer3 =
renArea3->get_vtk_renderer();<BR>
renderer3->SetBackground(0,0,<WBR>0);<BR> // Reserves 200 pixels for
the VTK widget<BR> hpaned1->set_position(800);<BR><BR>
fixed1->set_size_request(400,(<WBR>this->get_height())/2);<BR>
fixed2->set_size_request(400,(<WBR>this->get_height())/2);<BR>
fixed3->set_size_request(400,(<WBR>this->get_height())/2);<BR><BR>
// Adds the VTK widget to its reserved area<BR>
fixed1->add(*renArea);<BR> fixed2->add(*renArea2);<BR>
fixed3->add(*renArea3);<BR> renArea->show();<BR>
renArea2->show();<BR> renArea3->show();<BR>
this->maximize();<BR>}<BR><BR>void
window1::on_dicom1_activate()<BR>{<BR> Gtk::FileChooserDialog
dialog("Please choose a
file",Gtk::FILE_CHOOSER_<WBR>ACTION_OPEN);<BR>
dialog.set_transient_for(*<WBR>this);<BR><BR> //Add response buttons
the the dialog:<BR> dialog.add_button(Gtk::Stock::<WBR>CANCEL,
Gtk::RESPONSE_CANCEL);<BR> dialog.add_button(Gtk::Stock::<WBR>OPEN,
Gtk::RESPONSE_OK);<BR><BR> //Add filters, so that only certain file
types can be selected:<BR><BR> Gtk::FileFilter
filter_dicom;<BR> filter_dicom.set_name("DICOM
images");<BR> filter_dicom.add_pattern("*");<BR>
dialog.add_filter(filter_<WBR>dicom); <BR> int result =
dialog.run();<BR><BR> //Handle the response:<BR>
switch(result)<BR> {<BR>
case(Gtk::RESPONSE_OK):<BR>
{<BR> std::cout << "Open clicked."
<< std::endl;<BR><BR> //Notice that
this is a std::string, not a
Glib::ustring.<BR> std::string strFolderPath
=
"/home/talita/Projetos/<WBR>projeto3/src/Fatias";//dialog.<WBR>get_filename();//<BR>
std::cout << "File selected: " << strFolderPath <<
std::endl;<BR><BR> renderer =
renArea->get_vtk_renderer();<BR>
renderer->RemoveAllViewProps()<WBR>;<BR>
vtkDICOMImageReader *dicom = vtkDICOMImageReader::New();//
<BR> dicom->SetDirectoryName
(strFolderPath.c_str());//<WBR>letitura das imagens atraves do string
digitado<BR> dicom->Update();// ler
<BR> <BR> vtkImageGaussianSmooth
*GaussianSmooth = vtkImageGaussianSmooth::New();<BR>
GaussianSmooth-><WBR>SetInputConnection(dicom-><WBR>GetOutputPort());<BR>
GaussianSmooth->Update();<BR> <BR>
<BR> vtkContourFilter *skinExtractor =
vtkContourFilter::New();<BR>
skinExtractor-><WBR>SetInputConnection(
GaussianSmooth->GetOutputPort(<WBR>));<BR>
skinExtractor->SetValue(0, 50);<BR><BR>
<BR> vtkPolyDataNormals *skinNormals =
vtkPolyDataNormals::New();<BR>
skinNormals-><WBR>SetInputConnection(<WBR>skinExtractor->GetOutputPort()<WBR>);<BR>
skinNormals->SetFeatureAngle(<WBR>60.0);<BR> <BR><BR>
vtkStripper *skinStripper =
vtkStripper::New();<BR>
skinStripper-><WBR>SetInputConnection(<WBR>skinNormals->GetOutputPort());<BR>
vtkPolyDataMapper *skinMapper =
vtkPolyDataMapper::New();<BR>
skinMapper-><WBR>SetInputConnection(<WBR>skinStripper->GetOutputPort())<WBR>;<BR>
skinMapper-><WBR>ScalarVisibilityOff();<BR>
vtkActor *skin = vtkActor::New();<BR>
skin->SetMapper(skinMapper);<BR>
skin->GetProperty()-><WBR>SetDiffuseColor(1, .49,
.25);<BR>
skin->GetProperty()-><WBR>SetSpecular(.3);<BR>
skin->GetProperty()-><WBR>SetSpecularPower(20);<BR>
<BR> vtkOutlineFilter *outlineData =
vtkOutlineFilter::New();<BR>
outlineData-><WBR>SetInputConnection(dicom-><WBR>GetOutputPort());<BR>
vtkPolyDataMapper *mapOutline = vtkPolyDataMapper::New();<BR>
mapOutline-><WBR>SetInputConnection(<WBR>outlineData->GetOutputPort());<BR>
vtkActor *outline = vtkActor::New();<BR>
outline->SetMapper(mapOutline)<WBR>;<BR>
outline->GetProperty()-><WBR>SetColor(1,0,0);<BR><BR>
renderer->AddActor(outline);<BR>// THE PROGRAM STOPS HERE
AND DOES'T DISPLAY THE IMAGE <BR><BR>
renderer->AddActor(skin);<BR> <BR>
<BR> renderer->GetActiveCamera()-><WBR>SetPosition(0.0,
0.0, -4.0);<BR>
renderer->GetActiveCamera()-><WBR>SetViewUp(0.0, 0.0,
0.0);<BR>
renderer->GetActiveCamera()-><WBR>SetFocalPoint(0.0, 0.0,
0.0);<BR>
renderer->GetActiveCamera()-><WBR>SetClippingRange(1.0,
4.0);<BR>
renderer->GetActiveCamera()-><WBR>ComputeViewPlaneNormal();<BR>
<BR>
renArea->get_vtk_window()-><WBR>Render();<BR><BR>
break;<BR> }<BR>
case(Gtk::RESPONSE_CANCEL):<BR>
{<BR> std::cout << "Cancel clicked."
<< std::endl;<BR>
break;<BR> }<BR>
default:<BR> {<BR>
std::cout << "Unexpected button clicked." <<
std::endl;<BR>
break;<BR> }<BR> }
<BR>}<BR><BR>void window1::checkResize()<BR>{<BR>
renArea->set_size_request(<WBR>fixed1->get_width(),
(this->get_height())/2);<BR>
renArea2->set_size_request(<WBR>fixed2->get_width(),
(this->get_height())/2);<BR>
renArea3->set_size_request(<WBR>fixed3->get_width(),
(this->get_height())/2);<BR>}</DIV><BR><BR>I would aprecciate some
help.<BR><BR>Thank you in advance,</FONT></DIV>
<DIV><FONT face=Arial size=2>Jihan </FONT><FONT face=Arial
size=2></FONT></DIV></BODY></HTML>