<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hey,<br><br>Were you able to try it successfully in java?<br>I am trying to do volume rendering of dicom images in java, and am runnning into lot of problems.<br><br><br><br>--- On <b>Mon, 10/26/09, baliki2@freemail.gr <i><baliki2@freemail.gr></i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: baliki2@freemail.gr <baliki2@freemail.gr><br>Subject: Re: [vtkusers] x-ray effect in volume rendering<br>To: vtkusers@vtk.org<br>Date: Monday, October 26, 2009, 6:59 AM<br><br><div class="plainMail"><br>It works just great! I'll try it in Java, too.<br><br>Thanks a lot Mr. Gasteiger!<br><br>> Hi "Baliki",<br>> <br>> Below I have inserted a VTK-example program, which reads a raw volume<br>> dataset and performs normal volume rendering, X-ray and MIP projection. I<br>> use
it for my students to illustrate these different approaches. The samples<br>> on each ray are interpolated with nearest neighbor (not the best, tri-linear<br>> is much better but expansive in computation time. It inFollowing steps you<br>> have to do:<br>> 1. Define "fname" (in main(...)) with the file name of you dataset<br>> 2 Specify your raw dataset for the vtkImageReader2 reader (In the example I<br>> use a volume version(!) of the foot dataset of the VTK distribution)<br>> 3. Turn on one of the render modes by uncomment one of the<br>> "currentRenderMode" line at the beginning of the example<br>> <br>> I have included some comments which hopefully helps you to understand each<br>> step.<br>> <br>> Best regards, Rocco<br>> <br>> //--------------------------------------------------------------------------<br>> ------------<br>> //<br>> // This example reads a volume dataset and then
displays it.<br>> //<br>> #include "vtkRenderer.h"<br>> #include "vtkRenderWindow.h"<br>> #include "vtkRenderWindowInteractor.h"<br>> #include "vtkCamera.h"<br>> #include "vtkInteractorStyleSwitch.h"<br>> #include "vtkImageReader2.h"<br>> #include "vtkActor.h"<br>> <br>> #include "vtkColorTransferFunction.h"<br>> #include "vtkPiecewiseFunction.h"<br>> #include "vtkVolumeProperty.h"<br>> #include "vtkVolumeRayCastCompositeFunction.h"<br>> #include "vtkVolumeRayCastMapper.h"<br>> #include "vtkVolume.h"<br>> <br>> <br>> #define mode_MIP 0<br>> #define mode_XRay 1<br>> #define mode_Full
2<br>> <br>> static int currentRenderMode = mode_XRay;<br>> <br>> // Necessary for correct MIP and XRay scaling (0-1)<br>> static float globalMaximumScalarValue = 0;<br>> ////////////////////////////////////////////////////////////////<br>> // Definition and implementation of our own ray cast composite function<br>> ----------------------------------<br>> class MyVolumeRayCastCompositeFunction : public<br>> vtkVolumeRayCastCompositeFunction<br>> {<br>> <br>> public:<br>> static MyVolumeRayCastCompositeFunction *New()<br>> { return new MyVolumeRayCastCompositeFunction; }<br>> <br>> protected:<br>> <br>> ////////////////////////////////////////////////////////////////<br>> // Do not change this code<br>> //<br>> // This is called from
RenderAnImage (in vtkDepthPARCMapper.cxx)<br>> // It uses the integer data type flag that is passed in<br>> // to determine what type of ray needs to be cast (which is handled<br>> // by a template function. It also uses the shading and<br>> // interpolation types to determine which template function<br>> // to call.<br>> void MyVolumeRayCastCompositeFunction::CastRay(<br>> vtkVolumeRayCastDynamicInfo *dynamicInfo,<br>> vtkVolumeRayCastStaticInfo *staticInfo )<br>> {<br>> void *data_ptr;<br>> data_ptr = staticInfo->ScalarDataPointer;<br>> <br>> switch ( staticInfo->ScalarDataType ) {<br>> case VTK_UNSIGNED_CHAR:<br>>
vtkCastRay_OwnWork( (unsigned char *)data_ptr, dynamicInfo,<br>> staticInfo );<br>> break;<br>> case VTK_UNSIGNED_SHORT:<br>> vtkCastRay_OwnWork( (unsigned short *)data_ptr, dynamicInfo,<br>> staticInfo );<br>> break;<br>> default:<br>> vtkWarningMacro ( << "Unsigned char and unsigned short are the only<br>> supported datatypes for rendering" );<br>> break;<br>> }<br>> }<br>> <br>> // This is the template function that actually casts a ray and<br>> computes<br>> // the composite value. This version uses nearest neighbor<br>> interpolation, and performs shading.<br>> template <class T><br>> void vtkCastRay_OwnWork(T *data_ptr,
vtkVolumeRayCastDynamicInfo<br>> *dynamicInfo, vtkVolumeRayCastStaticInfo *staticInfo )<br>> {<br>> unsigned char *gmptr = NULL;<br>> float accum_red_intensity, accum_green_intensity,<br>> accum_blue_intensity, accum_opacity;<br>> float opacity;<br>> int xinc, yinc, zinc;<br>> int voxel[3];<br>> float ray_position[3];<br>> T
*dptr;<br>> float *ScalarToOpacityTF;<br>> float *ScalarToColorTF;<br>> float *red_d_shade, *green_d_shade, *blue_d_shade;<br>> float *red_s_shade, *green_s_shade, *blue_s_shade;<br>> unsigned short *encoded_normals;<br>> int currentNormalIndex;<br>> float red_shaded_value, green_shaded_value,<br>> blue_shaded_value;<br>> int
offset;<br>> int steps_this_ray;<br>> int scalar_value;<br>> float r, g, b;<br>> int num_steps;<br>> float *ray_start, *ray_increment;<br>> int shading = staticInfo->Shading;<br>> <br>> <br>> // For each ray some information are fetched which are<br>> needed for color and shading<br>>
// computation.<br>> <br>> // Get ray parameters: Number of sample points, ray start<br>> position, and step size on the ray<br>> num_steps = dynamicInfo->NumberOfStepsToTake;<br>> ray_start = dynamicInfo->TransformedStart;<br>> ray_increment = dynamicInfo->TransformedIncrement;<br>> <br>> // Get diffuse shading table pointers. This table is<br>> preprocessed by VTK and stores<br>> // for different normal directions its diffuse portion of<br>> the phong illumination term.<br>> red_d_shade = staticInfo->RedDiffuseShadingTable;<br>> green_d_shade =
staticInfo->GreenDiffuseShadingTable;<br>> blue_d_shade = staticInfo->BlueDiffuseShadingTable;<br>> <br>> // Get specular shading table pointers. This table is<br>> preprocessed by VTK and stores<br>> // for specular normal directions its diffuse portion of the<br>> phong illumination term.<br>> red_s_shade = staticInfo->RedSpecularShadingTable;<br>> green_s_shade = staticInfo->GreenSpecularShadingTable;<br>> blue_s_shade = staticInfo->BlueSpecularShadingTable;<br>> <br>> // Get a pointer to the encoded normals of this volume. This<br>> table is preprocessed by VTK and stores<br>> // for each
voxel its normal.<br>> encoded_normals = staticInfo->EncodedNormals;<br>> <br>> // Get the scalar opacity transfer function which maps<br>> scalar input values to opacities<br>> ScalarToOpacityTF =<br>> staticInfo->Volume->GetCorrectedScalarOpacityArray();<br>> <br>> // Get the color transfer function which maps scalar input<br>> values to RGB values<br>> ScalarToColorTF = staticInfo->Volume->GetRGBArray();<br>> <br>> // store increments (distance between sample points in x, y,<br>> and z direction) in local variables<br>> xinc = staticInfo->DataIncrement[0];<br>> yinc =
staticInfo->DataIncrement[1];<br>> zinc = staticInfo->DataIncrement[2];<br>> //cerr<<xinc<<", "<<yinc<<", "<<zinc<<", "<<endl; //constant<br>> for a data set<br>> <br>> // Initialize the ray position (in voxel space)<br>> ray_position[0] = ray_start[0];<br>> ray_position[1] = ray_start[1];<br>> ray_position[2] = ray_start[2];<br>> <br>> <br>> // Nearest neighbor interpolation - get nearest voxel (in<br>> voxel space) - you have to change this for tri-linear interpolation<br>> voxel[0] = vtkRoundFuncMacro( ray_position[0] );<br>>
voxel[1] = vtkRoundFuncMacro( ray_position[1] );<br>> voxel[2] = vtkRoundFuncMacro( ray_position[2] );<br>> <br>> // So far we haven't accumulated anything<br>> accum_red_intensity = 0.0;<br>> accum_green_intensity = 0.0;<br>> accum_blue_intensity = 0.0;<br>> // accumulated opacity<br>> accum_opacity = 0.0;<br>> <br>> // added for MIP mode rendering<br>> float maxOpacity = 0.0;<br>> float maxValue = 0.0;<br>> <br>>
currentNormalIndex = 0;<br>> <br>> // For each step along the ray do something (accumulate,<br>> find maximum opacity, ...)<br>> // "accum_opacity < 1.0" means early-ray-termination<br>> for ( steps_this_ray = 0; steps_this_ray < num_steps &&<br>> accum_opacity < 1.0; steps_this_ray++ ) {<br>> <br>> // get offset position of current voxel in linear<br>> list<br>> offset = voxel[2] * zinc + voxel[1] * yinc +<br>> voxel[0];<br>> // get pointer on current voxel in linear list<br>> dptr = data_ptr + offset;<br>> <br>>
// get scalar value at current location<br>> scalar_value = (int) *(dptr);<br>> <br>> if (scalar_value > globalMaximumScalarValue)<br>> {<br>> globalMaximumScalarValue = scalar_value;<br>> }<br>> <br>> // get opacity value for this scalar_value out of<br>> the ScalarOpacityTransferFunction<br>> opacity = ScalarToOpacityTF[scalar_value];<br>> <br>> // If we have a
valid opacity value, then compute<br>> the shading<br>> if ( opacity ) {<br>> switch (currentRenderMode)<br>> {<br>> case mode_MIP:<br>> // MIP - only maximal value or first<br>> local maximum above a threshold is visualized<br>> // check if current voxel opacity is<br>> above max opacity<br>> //if (opacity > maxOpacity)<br>>
if (scalar_value > maxValue)<br>> {<br>> accum_red_intensity =<br>> opacity * ScalarToColorTF[(scalar_value) * 3 ];<br>> accum_green_intensity =<br>> opacity * ScalarToColorTF[(scalar_value) * 3 + 1];<br>> accum_blue_intensity =<br>> opacity * ScalarToColorTF[(scalar_value) * 3 + 2];<br>> <br>>
//maxOpacity = opacity;<br>> maxValue = scalar_value;<br>> accum_opacity = 1.0-opacity;<br>> <br>> }<br>> <br>> break;<br>> case mode_XRay:<br>> // X-ray projection mode:<br>> Accumulation of the scalar values (or opacity values)<br>>
accum_red_intensity =<br>> accum_green_intensity = accum_blue_intensity = accum_red_intensity +<br>> scalar_value;<br>> <br>> break;<br>> case mode_Full:<br>> // get r, g, and b value for current<br>> scalar value out of the ColorTransferFunction<br>> r = ScalarToColorTF[(scalar_value) *<br>> 3 ];<br>> g = ScalarToColorTF[(scalar_value) *<br>> 3 + 1];<br>>
b = ScalarToColorTF[(scalar_value) *<br>> 3 + 2];<br>> <br>> red_shaded_value = opacity * r;<br>> green_shaded_value = opacity * g;<br>> blue_shaded_value = opacity * b;<br>> <br>> <br>> // Accumulate color<br>> // (the color of the current value<br>> is weighted by the remaining opacity of the voxels<br>>
// in front of the current one)<br>> accum_red_intensity =<br>> red_shaded_value * (1.0-accum_opacity) + accum_red_intensity;<br>> accum_green_intensity =<br>> green_shaded_value * (1.0-accum_opacity) + accum_green_intensity;<br>> accum_blue_intensity =<br>> blue_shaded_value * (1.0-accum_opacity) + accum_blue_intensity;<br>> <br>> // Accumulate opacity<br>> accum_opacity
=<br>> opacity*(1.0-accum_opacity) + accum_opacity;<br>> <br>> break;<br>> default:<br>> accum_red_intensity = 0.0;<br>> accum_green_intensity = 0.0;<br>> accum_blue_intensity = 0.0;<br>> accum_opacity = 1.0;<br>> <br>> break;<br>>
}<br>> <br>> }<br>> <br>> // Increment our position and compute new voxel<br>> location<br>> ray_position[0] += ray_increment[0];<br>> ray_position[1] += ray_increment[1];<br>> ray_position[2] += ray_increment[2];<br>> voxel[0] = vtkRoundFuncMacro( ray_position[0] );<br>> voxel[1] = vtkRoundFuncMacro( ray_position[1] );<br>> voxel[2] = vtkRoundFuncMacro( ray_position[2] );<br>> }// endFor each step along the
ray<br>> ----------------------------------------------------------------------------<br>> -----------<br>> <br>> <br>> // Now we stored in accum_{red,green,blue}_intensity the<br>> accumulated RGB values along a ray<br>> // added for XRay mode rendering<br>> if( currentRenderMode == mode_XRay)<br>> {<br>> // divide accumulated scalar values by the number of<br>> steps times maximum scalar value to get the average<br>> accum_red_intensity = accum_green_intensity =<br>> accum_blue_intensity = accum_red_intensity /<br>> float(num_steps*globalMaximumScalarValue);<br>> accum_opacity =
1.0-accum_red_intensity;<br>> <br>> }<br>> <br>> // Cap the accumulated intensities at 1.0<br>> if ( accum_red_intensity > 1.0 ) {<br>> accum_red_intensity = 1.0; }<br>> if ( accum_green_intensity > 1.0 ){ accum_green_intensity =<br>> 1.0;}<br>> if ( accum_blue_intensity > 1.0 ) {<br>> accum_blue_intensity = 1.0;}<br>> <br>> // Set the return pixel value.<br>> dynamicInfo->Color[0] = accum_red_intensity;<br>> dynamicInfo->Color[1] = accum_green_intensity;<br>> dynamicInfo->Color[2] = accum_blue_intensity;<br>>
dynamicInfo->Color[3] = accum_opacity;<br>> dynamicInfo->NumberOfStepsTaken = steps_this_ray;<br>> <br>> <br>> }<br>> <br>> };<br>> //<br>> ----------------------------------------------------------------------------<br>> -<br>> <br>> <br>> ////////////////////////////////////////////////////////////////<br>> //<br>> int main (int argc, char **argv)<br>> {<br>> //check for arguments (e.g. a filename)<br>> const char* fname = "foot.raw";<br>> <br>> // Create the renderer, the render window, and the interactor. The<br>> renderer<br>> // draws into the render window, the interactor enables mouse- and<br>> // keyboard-based interaction with the data within the render<br>> window.<br>>
vtkRenderer *renderer = vtkRenderer::New();<br>> //renderer->SetBackground( 0.2, 0.2, 0.4 );<br>> renderer->SetBackground( 1.0, 1.0, 1.0 );<br>> vtkCamera *camera = renderer->GetActiveCamera();<br>> camera->ParallelProjectionOff();<br>> camera->SetViewUp (0, 0, -1);<br>> camera->SetPosition (-1, 2, -0.5);<br>> vtkRenderWindow *renderWindow = vtkRenderWindow::New();<br>> renderWindow->SetSize( 640, 480 ); // Set the size of the render<br>> window (in pixel).<br>> renderWindow->AddRenderer(renderer);<br>> vtkRenderWindowInteractor *interactionRenderer =<br>> vtkRenderWindowInteractor::New();<br>>
interactionRenderer->SetRenderWindow(renderWindow);<br>> <br>> reinterpret_cast<vtkInteractorStyleSwitch*>(interactionRenderer->GetInteract<br>> orStyle())->SetCurrentStyleToTrackballCamera();<br>> <br>> vtkImageReader2 *volumeDataset = vtkImageReader2::New();<br>> volumeDataset->SetFileName(fname);<br>> volumeDataset->SetFileDimensionality(3);<br>> volumeDataset->SetDataExtent(0, 127, 0, 127, 0, 63);<br>> volumeDataset->SetDataSpacing(1.60938, 1.60938, 1.95313);<br>> volumeDataset->SetDataOrigin(0.0, 0.0, 0.0);<br>> volumeDataset->SetDataScalarTypeToUnsignedShort();<br>> volumeDataset->SetDataByteOrderToLittleEndian();<br>> volumeDataset->UpdateWholeExtent();<br>> <br>> <br>> <br>>
////////////////////////////////////////////////////////////////////////////<br>> ///////////<br>> // Feel free to change this code<br>> // adjustments to the following code may be required and should be<br>> explored<br>> <br>> // Create transfer function - mapping scalar values [0-...] to COLOR<br>> [0-1, 0-1, 0-1]<br>> vtkColorTransferFunction *colorTransferFunction =<br>> vtkColorTransferFunction::New();<br>> colorTransferFunction->AddRGBPoint( 0.0, 0.0,0.0,0.0);<br>> colorTransferFunction->AddRGBPoint( 500.0, 0.9,0.5,0.3);<br>> colorTransferFunction->AddRGBPoint(1100.0, 0.8,0.8,0.6);<br>> colorTransferFunction->AddRGBPoint(1200.0, 0.6,0.6,0.6);<br>> <br>> vtkPiecewiseFunction *opacityTransferFunction
=<br>> vtkPiecewiseFunction::New();<br>> opacityTransferFunction->AddPoint( 0, 0.0);<br>> //opacityTransferFunction->AddPoint( 980, 0.1);<br>> //opacityTransferFunction->AddPoint( 1055, 0.2);<br>> opacityTransferFunction->AddPoint( 1200, 0.05);<br>> opacityTransferFunction->AddPoint( 1300, 1.0);<br>> <br>> // The property describes how the data will look<br>> vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();<br>> volumeProperty->SetColor(colorTransferFunction);<br>> volumeProperty->SetScalarOpacity(opacityTransferFunction);<br>> //volumeProperty->ShadeOn(); // request 3d shading (german:<br>> beleuchtungsberechnung anfordern) //has to be implemented in<br>>
vtkCastRay_OwnWork<br>> <br>> //vtkVolumeRayCastCompositeFunction *rayCompositeFunction =<br>> vtkVolumeRayCastCompositeFunction::New();<br>> MyVolumeRayCastCompositeFunction *rayCompositeFunction =<br>> MyVolumeRayCastCompositeFunction::New();<br>> // The mapper knows how to render the data<br>> vtkVolumeRayCastMapper *rayCastMapper =<br>> vtkVolumeRayCastMapper::New();<br>> rayCastMapper->SetInput( volumeDataset->GetOutput());<br>> rayCastMapper->SetVolumeRayCastFunction(rayCompositeFunction);<br>> //Feel free to change parameters for<br>> //rayCastMapper->AutoAdjustSampleDistancesOff(); //<br>> interactive framerates by lower quality (on/off)<br>>
//rayCastMapper->SetSampleDistance(1.0);<br>> // adjust samples per ray rate if AutoAdjustSampleDistances is OFF<br>> //rayCastMapper->SetImageSampleDistance(1.0); //<br>> adjust rays per pixel rate (e.g. 0.5 => 4 rays for each pixel, 2.0 => 1 ray<br>> for 4 pixel) if AutoAdjustSampleDistances is OFF<br>> //rayCastMapper->SetMaximumImageSampleDistance(6.0); // max<br>> sample distance if AutoAdjustSampleDistances is ON<br>> //rayCastMapper->SetMinimumImageSampleDistance(1.0); // min<br>> sample distance if AutoAdjustSampleDistances is ON<br>> <br>> // The volume holds the mapper and the property and<br>> // can be used to position/orient the volume<br>> vtkVolume *volData= vtkVolume::New();<br>>
volData->SetMapper(rayCastMapper);<br>> volData->SetProperty(volumeProperty);<br>> <br>> // Actors are added to the renderer.<br>> renderer->AddVolume(volData);<br>> <br>> <br>> // adjust camera for good initial view<br>> renderer->ResetCamera();<br>> renderer->GetActiveCamera()->Dolly(1);<br>> renderer->ResetCameraClippingRange();<br>> <br>> // Start the Interactor<br>> interactionRenderer->Initialize();<br>> interactionRenderer->Start();<br>> <br>> // It is important to delete all objects created previously to<br>> prevent<br>> // memory leaks. In this case, since the program is on its way to<br>> //
exiting, it is not so important. But in applications it is<br>> // essential.<br>> renderer->Delete();<br>> renderWindow->Delete();<br>> interactionRenderer->Delete();<br>> <br>> return 0;<br>> }<br>> <br>> <br>> -----Original Message-----<br>> From: <a ymailto="mailto:baliki2@freemail.gr" href="/mc/compose?to=baliki2@freemail.gr">baliki2@freemail.gr</a> [mailto:<a ymailto="mailto:baliki2@freemail.gr" href="/mc/compose?to=baliki2@freemail.gr">baliki2@freemail.gr</a>]<br>> Sent: Friday, October 23, 2009 2:11 PM<br>> To: <a ymailto="mailto:post@rocco-gasteiger.de" href="/mc/compose?to=post@rocco-gasteiger.de">post@rocco-gasteiger.de</a><br>> Subject: Re: Re: [vtkusers] x-ray effect in volume rendering<br>> <br>> <br>> I don't really understand what you mean by "divide it by<br>> >
numSteps*globalMaximumScalarValue at the end".<br>> <br>> What i would like to get is something like this:<br>> <a href="http://www.onlinetelemedicine.com/HTML/product/sam_images/X-Ray.jpg" target="_blank">http://www.onlinetelemedicine.com/HTML/product/sam_images/X-Ray.jpg</a><br>> If you look carefully, the bones edges are more bright than the "inside"<br>> bone area.<br>> I've achieved a similar effect, but not this exact one:<br>> <a href="http://img12.imageshack.us/i/sendj.png/" target="_blank">http://img12.imageshack.us/i/sendj.png/</a><br>> Please download it and zoom in to see it better.<br>> <br>> Thanks!<br>> <br>> > Hello,<br>> ><br>> > Yes, you can! ;-)<br>> ><br>> > It is quite simply. In your composite function accumulate all sampled<br>> scalar<br>> > values (or opacity values) on your ray and divide it by<br>> > numSteps*globalMaximumScalarValue at the end (to
get the average between 0<br>> > and 1). I've implement it and it should work.<br>> ><br>> > Best regards, Rocco<br>> ><br>> > --------------------------------------------------<br>> > Dipl.-Ing. Rocco Gasteiger<br>> > Otto-von-Guericke University<br>> > Faculty of Computer Science<br>> > Department of Simulation and Graphics<br>> > Universit=E4tsplatz 2, 39106 Magdeburg, Germany<br>> ><br>> > Office: G29-223<br>> > Phone: +49 391 67 127 59<br>> > Fax:=A0=A0 +49 391 67 111 64<br>> > Website: <a href="http://wwwisg.cs.uni-magdeburg.de/cvcms/" target="_blank">http://wwwisg.cs.uni-magdeburg.de/cvcms/</a> =<br>> ><br>> > --------------------------------------------------<br>> ><br>> ><br>> ><br>> > -----Original Message-----<br>> > From: <a ymailto="mailto:vtkusers-bounces@vtk.org"
href="/mc/compose?to=vtkusers-bounces@vtk.org">vtkusers-bounces@vtk.org</a> [mailto:<a ymailto="mailto:vtkusers-bounces@vtk.org" href="/mc/compose?to=vtkusers-bounces@vtk.org">vtkusers-bounces@vtk.org</a>] On Behalf<br>> > Of <a ymailto="mailto:baliki2@freemail.gr" href="/mc/compose?to=baliki2@freemail.gr">baliki2@freemail.gr</a><br>> > Sent: Friday, October 23, 2009 11:30 AM<br>> > To: <a ymailto="mailto:vtkusers@vtk.org" href="/mc/compose?to=vtkusers@vtk.org">vtkusers@vtk.org</a><br>> > Subject: [vtkusers] x-ray effect in volume rendering<br>> ><br>> ><br>> > Is there a way that i can achieve an x-ray effect in volume rendering of<br>> > DICOM images?<br>> > I want to see the constructed volume as a 2D xray-like "image".<br>> ><br>> > I've tied the composite function combined with some tranfer and color<br>> > functions, but i didn't take the exact x-ray effect. The images i use
are<br>> of<br>> > short type.<br>> ><br>> ><br>> > _______________________________________________<br>> > Powered by www.kitware.com<br>> ><br>> > Visit other Kitware open-source projects at<br>> > <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>> ><br>> > Please keep messages on-topic and check the VTK FAQ at:<br>> > <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>> ><br>> > Follow this link to subscribe/unsubscribe:<br>> > <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>> ><br>> > _______________________________________________<br>> > Powered by www.kitware.com<br>> ><br>> > Visit other Kitware open-source projects at<br>> <a
href="http://www.kitware.com/opensour=" target="_blank">http://www.kitware.com/opensour=</a><br>> > ce/opensource.html<br>> ><br>> > Please keep messages on-topic and check the VTK FAQ at:<br>> <a href="http://www.vtk.org/=" target="_blank">http://www.vtk.org/=</a><br>> > Wiki/VTK_FAQ<br>> ><br>> > Follow this link to subscribe/unsubscribe:<br>> > <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>> <br>> _______________________________________________<br>> Powered by www.kitware.com<br>> <br>> Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>> <br>> Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ"
target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>> <br>> Follow this link to subscribe/unsubscribe:<br>> <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br><br><br>_______________________________________________<br>Powered by www.kitware.com<br><br>Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br><br>Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br><br>Follow this link to subscribe/unsubscribe:<br><a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br></div></blockquote></td></tr></table><br>