[vtkusers] vtk data type inconsistent

付文宇 fuwenyu at emails.bjut.edu.cn
Mon Oct 30 23:31:26 EST 2006


hi all
   I am a fresher here. Now I am learning 3d image reconstructing by vtk in MS
VC++6.0. I encounter a question now. When I do exercise followed by the example in
"vtk-5.0.2\VTK\Examples\Annotation\Tcl\xyPlot.tcl"(I have changed Tcl code into
c++),there are three errors in compiling(the type of three errors is same).The
error information is:

--------------------Configuration: xyPlot - Win32 Debug--------------------
Compiling...
xyPlot.cxx
D:\fwy\xyPlot\xyPlot.cxx(73) : error C2664: 'SetSource' : cannot convert parameter
1 from 'class vtkStructuredGrid *' to 'class vtkDataObject *'
        Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast
.....
Error executing cl.exe.

xyPlot.obj - 3 error(s), 0 warning(s)
--------------------------------------------------------------------------------

I copy the source code of xyPlot.cxx here
-------------------------------------------------------------------------------
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    $RCSfile: Cylinder.cxx,v $

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
//This example demonstrates the use of vtkXYPlotActor to display three
//probe lines using three different techniques.  In this example, we are
//loading data using the vtkPLOT3DReader.  We are using the vtkProbeFilter
//to extract the underlying point data along three probe lines.

//
//First we include the VTK Tcl packages which will make available
//all of the vtk commands to Tcl.
//
#include "vtkPLOT3DReader.h"
#include "vtkLineSource.h"
#include "vtkTransform.h"
#include "vtkTransformPolyDataFilter.h"
#include "vtkProbeFilter.h"
#include "vtkProperty2D.h"

#include "vtkAppendPolyData.h"
#include "vtkTubeFilter.h"

#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkXYPlotActor.h"
#include "vtkTextProperty.h"
#include "vtkStructuredGridOutlineFilter.h"

#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkCamera.h"

int main()
{
  //Create a PLOT3D reader and load the data.
//
vtkPLOT3DReader *pl3d=vtkPLOT3DReader::New();
    pl3d->SetXYZFileName("combxyz.bin");
    pl3d->SetQFileName("combq.bin");
    pl3d->SetScalarFunctionNumber(100);
    pl3d->SetVectorFunctionNumber(202);
    pl3d->Update();

//Create three the line source to use for the probe lines.
vtkLineSource *line=vtkLineSource::New();
    line->SetResolution(30);


//Move the line into place and create the probe filter.  For vtkProbeFilter,
//the probe line is the input, and the underlying data set is the source.
vtkTransform *transL1=vtkTransform::New();
    transL1->Translate(3.7,0.0,28.37);
    transL1->Scale(5,5,5);
    transL1->RotateY(90);
vtkTransformPolyDataFilter *tf=vtkTransformPolyDataFilter::New();
    tf->SetInputConnection(line->GetOutputPort());
    tf->SetTransform(transL1);
vtkProbeFilter *probe=vtkProbeFilter::New();
    probe->SetInputConnection(tf->GetOutputPort());
    probe->SetSource(pl3d->GetOutput());

//Move the line again and create another probe filter.
vtkTransform *transL2=vtkTransform::New();
    transL2->Translate(9.2,0.0,31.20);
    transL2->Scale (5, 5, 5);
    transL2-> RotateY (90);
vtkTransformPolyDataFilter *tf2=vtkTransformPolyDataFilter::New();
    tf2-> SetInputConnection (line-> GetOutputPort());
    tf2 ->SetTransform (transL2);
vtkProbeFilter *probe2=vtkProbeFilter::New();
    probe2-> SetInputConnection (tf2 ->GetOutputPort());
    probe2-> SetSource (pl3d-> GetOutput());

//Move the line again and create a third probe filter.
vtkTransform *transL3=vtkTransform::New();
    transL3-> Translate( 13.27, 0.0, 33.40);
    transL3->Scale( 4.5, 4.5, 4.5);
    transL3-> RotateY( 90);
vtkTransformPolyDataFilter *tf3=vtkTransformPolyDataFilter::New();
    tf3-> SetInputConnection(line->GetOutputPort());
    tf3-> SetTransform (transL3);
vtkProbeFilter *probe3=vtkProbeFilter::New();
    probe3-> SetInputConnection (tf3 ->GetOutputPort());
    probe3-> SetSource(pl3d-> GetOutput());

//Create a vtkAppendPolyData to merge the output of the three probe filters
//into one data set.
vtkAppendPolyData *appendF=vtkAppendPolyData::New();
    appendF-> AddInput (probe-> GetPolyDataOutput());
    appendF-> AddInput (probe2-> GetPolyDataOutput());
    appendF-> AddInput (probe3-> GetPolyDataOutput());

//Create a tube filter to represent the lines as tubes.  Set up the associated
//mapper and actor.
vtkTubeFilter *tuber=vtkTubeFilter::New();
    tuber-> SetInputConnection (appendF->GetOutputPort());
    tuber-> SetRadius (0.1);
vtkPolyDataMapper *lineMapper=vtkPolyDataMapper::New();
    lineMapper-> SetInputConnection (tuber-> GetOutputPort());
vtkActor *lineActor=vtkActor::New();
    lineActor-> SetMapper( lineMapper);

// Create an xy-plot using the output of the 3 probe filters as input.
//The x-values we are plotting are arc length.
vtkXYPlotActor *xyplot=vtkXYPlotActor::New();
    xyplot-> AddInput (probe-> GetOutput());
    xyplot-> AddInput (probe2-> GetOutput());
    xyplot->AddInput (probe3-> GetOutput());
    xyplot->GetPositionCoordinate()-> SetValue (0.0, 0.67, 0);
    xyplot-> GetPosition2Coordinate()-> SetValue (1.0, 0.33, 0);    //relative to
Position
    xyplot-> SetXValuesToArcLength();
    xyplot-> SetNumberOfXLabels( 6);
    xyplot ->SetTitle ("Pressure vs. Arc Length (Zoomed View)");
    xyplot-> SetXTitle( "");
    xyplot-> SetYTitle ("P");
    xyplot-> SetXRange( .1 ,.35);
    xyplot-> SetYRange( .2, .4);
    xyplot-> GetProperty()-> SetColor (0, 0, 0);
    xyplot-> GetProperty()-> SetLineWidth( 2);
    //Set text prop color (same color for backward compat with test)
    //Assign same object to all text props
vtkTextProperty *tprop;
    tprop =xyplot-> GetTitleTextProperty();
    tprop ->SetColor(xyplot-> GetProperty()-> GetColor());
    xyplot ->SetAxisTitleTextProperty (tprop);
    xyplot-> SetAxisLabelTextProperty (tprop);

//Create an xy-plot using the output of the 3 probe filters as input.
//The x-values we are plotting are normalized arc length.
vtkXYPlotActor *xyplot2=vtkXYPlotActor::New();
    xyplot2-> AddInput (probe-> GetOutput());
    xyplot2 ->AddInput (probe2 ->GetOutput());
    xyplot2-> AddInput (probe3 ->GetOutput());
    xyplot2-> GetPositionCoordinate()-> SetValue (0.00 ,0.33, 0);
    xyplot2-> GetPosition2Coordinate()-> SetValue( 1.0, 0.33, 0);        //
relative to Position
    xyplot2-> SetXValuesToNormalizedArcLength();
    xyplot2-> SetNumberOfXLabels (6);
    xyplot2-> SetTitle ("Pressure vs. Normalized Arc Length");
    xyplot2-> SetXTitle ("");
    xyplot2 ->SetYTitle ("P");
    xyplot2-> PlotPointsOn();
    xyplot2 ->PlotLinesOff();
    xyplot2-> GetProperty()-> SetColor (1 ,0, 0);
    xyplot2-> GetProperty()-> SetPointSize (2);
    //Set text prop color (same color for backward compat with test)
    //Assign same object to all text props
//vtkTextProperty *tprop;
    tprop =xyplot2-> GetTitleTextProperty();
    tprop ->SetColor(xyplot-> GetProperty()-> GetColor());
    xyplot2 ->SetAxisTitleTextProperty (tprop);
    xyplot2-> SetAxisLabelTextProperty (tprop);

//Create an xy-plot using the output of the 3 probe filters as input.
//The x-values we are plotting are the underlying point data values.
vtkXYPlotActor *xyplot3=vtkXYPlotActor::New();
    xyplot3-> AddInput (probe-> GetOutput());
    xyplot3-> AddInput (probe2-> GetOutput());
    xyplot3 ->AddInput (probe3 ->GetOutput());
    xyplot3-> GetPositionCoordinate()-> SetValue (0.0, 0.0 ,0);
    xyplot3-> GetPosition2Coordinate()-> SetValue (1.0, 0.33, 0);            
//relative to Position
    xyplot3 ->SetXValuesToIndex();
    xyplot3-> SetNumberOfXLabels (6);
    xyplot3 ->SetTitle ("Pressure vs. Point Id");
    xyplot3-> SetXTitle ("Probe Length");
    xyplot3 ->SetYTitle ("P");
    xyplot3 ->PlotPointsOn();
    xyplot3->GetProperty()-> SetColor (0 ,0, 1);
    xyplot3-> GetProperty()-> SetPointSize (3);
   // Set text prop color (same color for backward compat with test)
    //sign same object to all text props
//vtkTextProperty *tprop;
    tprop =xyplot3-> GetTitleTextProperty();
    tprop ->SetColor(xyplot-> GetProperty()-> GetColor());
    xyplot3 ->SetAxisTitleTextProperty (tprop);
    xyplot3-> SetAxisLabelTextProperty (tprop);

//aw an outline of the PLOT3D data set.
vtkStructuredGridOutlineFilter *outline=vtkStructuredGridOutlineFilter::New();
    outline ->SetInputConnection (pl3d-> GetOutputPort());
vtkPolyDataMapper *outlineMapper=vtkPolyDataMapper::New();
    outlineMapper-> SetInputConnection (outline ->GetOutputPort());
vtkActor *outlineActor=vtkActor::New();
    outlineActor-> SetMapper (outlineMapper);
    outlineActor-> GetProperty()-> SetColor( 0, 0, 0);

//Create the Renderers, RenderWindow, and RenderWindowInteractor.
  vtkRenderer *ren1 = vtkRenderer::New();
  vtkRenderer *ren2 = vtkRenderer::New();

  vtkRenderWindow *renWin = vtkRenderWindow::New();
  renWin->AddRenderer(ren1);
  renWin->AddRenderer(ren2);

  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  iren->SetRenderWindow(renWin);

//Set the background, viewport (necessary because we want to have the
//renderers draw to different parts of the render window) of the first
// renderer.  Add the outline and line actors to the renderer.  
ren1-> SetBackground (0.6784 ,0.8471, 0.9020);
ren1 ->SetViewport (0, 0, .5, 1);
ren1-> AddActor (outlineActor);
ren1 ->AddActor (lineActor);
// Set the background and viewport of the second renderer.  Add the xy-plot
//actors to the renderer.  Set the size of the render window.
ren2 ->SetBackground (1, 1, 1);
ren2 ->SetViewport (0.5 ,0.0 ,1.0, 1.0);
ren2 ->AddActor2D (xyplot);
ren2->AddActor2D (xyplot2);
ren2-> AddActor2D (xyplot3);
renWin-> SetSize (500, 250);
  // We'll zoom in a little by accessing the camera and invoking a "Zoom"
  // method on it.
  ren1->ResetCamera();
  ren1->GetActiveCamera()->Zoom(1.5);
  renWin->Render();
 
  
// Set up the camera parameters.
  vtkCamera *cam1;
     cam1= ren1 ->GetActiveCamera();
     cam1-> SetClippingRange (3.95297, 100);
     cam1-> SetFocalPoint (8.88908, 0.595038 ,29.3342);
     cam1-> SetPosition (-12.3332, 31.7479, 41.2387);
     cam1-> SetViewUp (0.060772, -0.319905, 0.945498);
iren ->Initialize();



  // This starts the event loop and as a side effect causes an initial render.
 // iren->Start();

  // Exiting from here, we have to delete all the instances that
  // have been created.
  pl3d->Delete();
  line->Delete();
  transL1->Delete();
	tf->Delete();
	probe->Delete();
	transL2->Delete();
	tf2->Delete();
	probe2->Delete();
	transL3->Delete();
	tf3->Delete();
	probe3->Delete();
	appendF->Delete();
	tuber->Delete();
	lineMapper->Delete();
	lineActor->Delete();
	xyplot->Delete();
	xyplot2->Delete();
	xyplot3->Delete();
	outline->Delete();
	outlineMapper->Delete();
	outlineActor->Delete();
  ren1->Delete();
  ren2->Delete();
  renWin->Delete();
  iren->Delete();

  return 0;
}
--------------------------------------------------------------------------------
 Thanking in advance

 Fu Wenyu
 2006.10.31









More information about the vtkusers mailing list