First, I implemented this in Java, but here&#39;s what I did.  I created a data structure that is an array of sets.  The length of the array is the same as the number of planes in the direction I was drawing on (for me that was the XY plane).  The elements in the array were sets because I can have multiple contours on each plane.  For each contour I used a vtkImageActorPointPlacer.  This causes the contours to always be drawn above the image.  Then, every time the XY plane that was being viewed changed, I set every contour in my dataset to Off(), and turned On only those contours that were on the plane being viewed.  This gives the effect of contours being associated with specific planes.<br>
<br><div class="gmail_quote">On Sat, Oct 16, 2010 at 11:58 PM,  <span dir="ltr">&lt;<a href="mailto:shengwen.guo@gmail.com">shengwen.guo@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Dear Mr.Jonathan Morra<br>
  I have a question about the contours for 3D data as same as it at <a href="http://vtk.1045678.n5.nabble.com/Question-about-contour-widget-td3208404.html#a3211419" target="_blank">http://vtk.1045678.n5.nabble.com/Question-about-contour-widget-td3208404.html#a3211419</a><br>

  Would you please help me to solve this problem or send me a sample code?<br>
Thanks,<br>
   Shengwen<br>
<br>
  My code is as following:<br>
<br>
<br>
<br>
///////////////////////////////////////////<br>
// TestContours.cxx<br>
// lars<br>
////////////////////////////////////////////<br>
<br>
#include &quot;vtkImageData.h&quot;<br>
#include &quot;vtkVolume16Reader.h&quot;<br>
#include &quot;vtkImageShiftScale.h&quot;<br>
#include &quot;vtkImageViewer2.h&quot;<br>
#include &quot;vtkPoints.h&quot;<br>
#include &quot;vtkPolyData.h&quot;<br>
#include &quot;vtkRenderer.h&quot;<br>
#include &quot;vtkRenderWindow.h&quot;<br>
#include &quot;vtkRenderWindowInteractor.h&quot;<br>
#include &quot;vtkSliderRepresentation.h&quot;<br>
#include &quot;vtkSliderRepresentation2D.h&quot;<br>
#include &quot;vtkSliderWidget.h&quot;<br>
#include &quot;vtkCommand.h&quot;<br>
#include &quot;vtkContourWidget.h&quot;<br>
// Add the following header files by shengwen@GZ 10/17/2010<br>
<br>
#include &quot;vtkOrientedGlyphContourRepresentation.h&quot;<br>
#include &quot;vtkContourWidget.h&quot;<br>
#include &quot;vtkImageActorPointPlacer.h&quot;<br>
#include &quot;vtkTestUtilities.h&quot;<br>
#include &quot;vtkBoundedPlanePointPlacer.h&quot;<br>
<br>
class vtkSliderCallback : public vtkCommand<br>
{<br>
public:<br>
  static vtkSliderCallback *New()<br>
    { return new vtkSliderCallback; }<br>
  void Delete()<br>
    { delete this; }<br>
  void SetImageViewer(vtkImageViewer2 *viewer)<br>
  { m_Viewer =  viewer; }<br>
  virtual void Execute(vtkObject *caller, unsigned long ul, void* vd)<br>
    {<br>
      vtkSliderWidget *slider = (vtkSliderWidget *)caller;<br>
      vtkSliderRepresentation *sliderRepres = (vtkSliderRepresentation *)slider-&gt;GetRepresentation();<br>
      int pos = (int)sliderRepres-&gt;GetValue();<br>
<br>
      m_Viewer-&gt;SetSlice(pos);<br>
    }<br>
protected:<br>
  vtkImageViewer2 *m_Viewer;<br>
};<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
  char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, &quot;Data/headsq/quarter&quot;);<br>
  //char* fname = &quot;/home/philipp/libs/vtk/VTKData/Data/headsq/quarter&quot;;<br>
<br>
  vtkVolume16Reader* v16 = vtkVolume16Reader::New();<br>
  v16-&gt;SetDataDimensions(64, 64);<br>
  v16-&gt;SetDataByteOrderToLittleEndian();<br>
  v16-&gt;SetImageRange(1, 93);<br>
  v16-&gt;SetDataSpacing(3.2, 3.2, 1.5);<br>
  v16-&gt;SetFilePrefix(fname);<br>
  v16-&gt;ReleaseDataFlagOn();<br>
  v16-&gt;SetDataMask(0x7fff);<br>
  v16-&gt;Update();<br>
  //delete[] fname;<br>
<br>
  double range[2];<br>
  v16-&gt;GetOutput()-&gt;GetScalarRange(range);<br>
<br>
  vtkImageShiftScale* shifter = vtkImageShiftScale::New();<br>
  shifter-&gt;SetShift(-1.0*range[0]);<br>
  shifter-&gt;SetScale(255.0/(range[1]-range[0]));<br>
  shifter-&gt;SetOutputScalarTypeToUnsignedChar();<br>
  shifter-&gt;SetInputConnection(v16-&gt;GetOutputPort());<br>
  shifter-&gt;ReleaseDataFlagOff();<br>
  shifter-&gt;Update();<br>
<br>
<br>
  vtkImageViewer2 *ImageViewer = vtkImageViewer2::New();<br>
  ImageViewer-&gt;SetInput(shifter-&gt;GetOutput());<br>
  ImageViewer-&gt;SetColorLevel(127);<br>
  ImageViewer-&gt;SetColorWindow(255);<br>
<br>
  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();<br>
  ImageViewer-&gt;SetupInteractor(iren);<br>
<br>
  ImageViewer-&gt;Render();<br>
  ImageViewer-&gt;GetRenderer()-&gt;ResetCamera();<br>
<br>
  ImageViewer-&gt;Render();<br>
<br>
  int *dims = v16-&gt;GetOutput()-&gt;GetDimensions();<br>
  std::cout &lt;&lt; dims[0] &lt;&lt; &quot;,&quot; &lt;&lt; dims[1] &lt;&lt; &quot;,&quot; &lt;&lt; dims[2] &lt;&lt; &quot;\n&quot;;<br>
<br>
  vtkSliderRepresentation2D *SliderRepres = vtkSliderRepresentation2D::New();<br>
  int min = ImageViewer-&gt;GetSliceMin();<br>
  int max = ImageViewer-&gt;GetSliceMax();<br>
  SliderRepres-&gt;SetMinimumValue(min);<br>
  SliderRepres-&gt;SetMaximumValue(max);<br>
  SliderRepres-&gt;SetValue((int)((min + max) / 2));<br>
  SliderRepres-&gt;SetTitleText(&quot;Slice&quot;);<br>
  SliderRepres-&gt;GetPoint1Coordinate()-&gt;SetCoordinateSystemToNormalizedDisplay();<br>
  SliderRepres-&gt;GetPoint1Coordinate()-&gt;SetValue(0.3, 0.05);<br>
  SliderRepres-&gt;GetPoint2Coordinate()-&gt;SetCoordinateSystemToNormalizedDisplay();<br>
  SliderRepres-&gt;GetPoint2Coordinate()-&gt;SetValue(0.7, 0.05);<br>
  SliderRepres-&gt;SetSliderLength(0.02);<br>
  SliderRepres-&gt;SetSliderWidth(0.03);<br>
  SliderRepres-&gt;SetEndCapLength(0.01);<br>
  SliderRepres-&gt;SetEndCapWidth(0.03);<br>
  SliderRepres-&gt;SetTubeWidth(0.005);<br>
  SliderRepres-&gt;SetLabelFormat(&quot;%3.0lf&quot;);<br>
  SliderRepres-&gt;SetTitleHeight(0.02);<br>
  SliderRepres-&gt;SetLabelHeight(0.02);<br>
<br>
  vtkSliderWidget *SliderWidget = vtkSliderWidget::New();<br>
  SliderWidget-&gt;SetInteractor(iren);<br>
  SliderWidget-&gt;SetRepresentation(SliderRepres);<br>
  SliderWidget-&gt;KeyPressActivationOff();<br>
  SliderWidget-&gt;SetAnimationModeToAnimate();<br>
  SliderWidget-&gt;SetEnabled(true);<br>
<br>
  vtkSliderCallback *SliderCb = vtkSliderCallback::New();<br>
  SliderCb-&gt;SetImageViewer(ImageViewer);<br>
  SliderWidget-&gt;AddObserver(vtkCommand::InteractionEvent, SliderCb);<br>
<br>
  ImageViewer-&gt;SetSlice((int)SliderRepres-&gt;GetValue());<br>
<br>
  // vtkContourWidget *ContourWidget = vtkContourWidget::New();<br>
  // Change new codes<br>
<br>
        vtkOrientedGlyphContourRepresentation *rep = vtkOrientedGlyphContourRepresentation::New();<br>
        vtkContourWidget *ContourWidget = vtkContourWidget::New();<br>
        ContourWidget-&gt;SetRepresentation(rep);<br>
  // Add<br>
        vtkBoundedPlanePointPlacer *placer =  vtkBoundedPlanePointPlacer::New();<br>
        placer-&gt;SetProjectionNormalToZAxis();<br>
        //placer.SetProjectionPosition(panel.getImageViewer().GetImageActor().GetCenter()[2]);<br>
        rep-&gt;SetPointPlacer(placer);<br>
  //<br>
<br>
    vtkImageActorPointPlacer * imageActorPointPlacer = vtkImageActorPointPlacer::New();<br>
    imageActorPointPlacer-&gt;SetImageActor(ImageViewer-&gt;GetImageActor());<br>
    rep-&gt;SetPointPlacer(imageActorPointPlacer);<br>
<br>
    imageActorPointPlacer-&gt;Delete();<br>
    rep-&gt;Delete();<br>
<br>
   // end of changing new codes<br>
<br>
<br>
  ContourWidget-&gt;SetInteractor(iren);<br>
  ContourWidget-&gt;SetEnabled(true);<br>
  ContourWidget-&gt;ProcessEventsOn();<br>
<br>
  iren-&gt;Start();<br>
<br>
  return -1;<br>
}<br>
<br>
<br>
</blockquote></div><br>