[vtkusers] mouse interaction in SDI application, vtkRenderwindowInteractor??

madness78 madness78 at pusan.ac.kr
Thu Feb 11 21:21:40 EST 2010


Hello, vtkusers!
Can anyone help me?
Below code is to display 2D raw image in SDI application.
The code works well.
The problem is about mouse interaction.
Once the image displays, mouse interaction is already applied (in 3
dimensional coordinate).
I don’t want to have mouse interaction in 3 dimensional coordinate.
I tried to change it to my manual interaction.
But I don’t know how to use “pvtkRenderWindowInteractor” MFC SDI
application.

//vtkRenderWindow *pvtkRenderWindow = vtkRenderWindow::New();
//pvtkRenderWindow->AddRenderer(pVOXA_Ver10View->GetRenderer());
//vtkRenderWindowInteractor *pvtkRenderWindowInteractor =
vtkRenderWindowInteractor::New();
//pvtkRenderWindowInteractor->SetRenderWindow(pvtkRenderWindow);

//pvtkRenderWindowInteractor->Initialize();
//pvtkRenderWindowInteractor->Start();

If I insert the code above, new renderwindow appear with image.
Can any one help me?

void CVOXA_Ver10Doc::TestSlice(void){

        POSITION pos = this->GetFirstViewPosition();
        CVOXA_Ver10View *pVOXA_Ver10View = NULL;
        unsigned short max(0);
        
        if (pos)
        {
               pVOXA_Ver10View = (CVOXA_Ver10View *)GetNextView(pos);
        }
        else  // return
        {
               
               ASSERT(FALSE);
               return;
        }
        int dims[2];
        this->pvtkImageReader1 = vtkImageReader::New();
        this->pvtkImageReader1->SetFileName("Image.slice");
        this->pvtkImageReader1->SetDataExtent(0,255,0,255,0,0);
        this->pvtkImageReader1->SetFileDimensionality(2);
        this->pvtkImageReader1->SetDataOrigin(0,0,0);
        this->pvtkImageReader1->SetDataScalarTypeToUnsignedChar();
        this->pvtkImageReader1-> SetDataByteOrderToLittleEndian();
        this->pvtkImageReader1->Update();

this->pvtkImageActor=vtkImageActor::New();
        this->pvtkImageActor->SetInput(this->pvtkImageReader1->GetOutput());
        
        pVOXA_Ver10View->GetRenderer()->SetBackground(1,1,1);
        pVOXA_Ver10View->GetRenderer()->AddActor(this->pvtkImageActor);
        pVOXA_Ver10View->GetRenderer()->ResetCamera();

        //vtkRenderWindow *pvtkRenderWindow = vtkRenderWindow::New();
       //pvtkRenderWindow->AddRenderer(pVOXA_Ver10View->GetRenderer());

       //vtkRenderWindowInteractor *pvtkRenderWindowInteractor =
vtkRenderWindowInteractor::New();
       //pvtkRenderWindowInteractor->SetRenderWindow(pvtkRenderWindow);

       //pvtkRenderWindowInteractor->Initialize();
       //pvtkRenderWindowInteractor->Start();

        pvtkImageReader1->Delete();
        pvtkImageActor->Delete();
        pvtkImageReader1 = NULL;
        UpdateAllViews(FALSE); 
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
I found this code. It works well.
I want to have mouse interaction like this.
But I don’t still know, how to modify the code to use in my SDI application.

void CVOXA_Ver10Doc::TestJpeg(void)
{       
  
  vtkJPEGReader *pvtkJPEGReader = vtkJPEGReader::New();
  pvtkJPEGReader->SetFileName ("DSC_0190.JPG");
  pvtkJPEGReader->Update();

  // Picker to pick pixels
  vtkPropPicker *pvtkPropPicker = vtkPropPicker::New();
  pvtkPropPicker->PickFromListOn();
 
  // Give the picker a prop to pick
  vtkImageViewer2 *pvtkImageViewer2 = vtkImageViewer2::New();
  pvtkPropPicker->AddPickList(pvtkImageViewer2->GetImageActor());
 
  // Visualize
  vtkRenderWindowInteractor *pvtkRenderWindowInteractor
=vtkRenderWindowInteractor::New();
  pvtkImageViewer2->SetInputConnection(pvtkJPEGReader->GetOutputPort());
  pvtkImageViewer2->SetupInteractor(pvtkRenderWindowInteractor);
  pvtkImageViewer2->SetSize(600,600);
  vtkRenderer* pvktRenderer = pvtkImageViewer2->GetRenderer();

  pvktRenderer->ResetCamera();
  pvktRenderer->GradientBackgroundOn();
  pvktRenderer->SetBackground(0,0,0);
  pvktRenderer->SetBackground2(1,1,1);
 
 

  // Annotate the image with window/level and mouse over pixel information
  vtkCornerAnnotation *pvtkCornerAnnotation = vtkCornerAnnotation::New();
  pvtkCornerAnnotation->SetLinearFontScaleFactor( 2 );
  pvtkCornerAnnotation->SetNonlinearFontScaleFactor( 1 );
  pvtkCornerAnnotation->SetMaximumFontSize( 20 );
  pvtkCornerAnnotation->SetText( 0, "Off Image" );
  pvtkCornerAnnotation->SetText( 3, "<window>\n<level>" );
  pvtkCornerAnnotation->GetTextProperty()->SetColor( 1,0,0);
 
  pvtkImageViewer2->GetRenderer()->AddViewProp(pvtkCornerAnnotation);
 
  // Callback listens to MouseMoveEvents invoked by the interactor's style
  vtkImageInteractionCallback *Callback=vtkImageInteractionCallback::New();
  Callback->SetViewer(pvtkImageViewer2);
  Callback->SetAnnotation(pvtkCornerAnnotation );
  Callback->SetPicker(pvtkPropPicker);
 
  // InteractorStyleImage allows for the following controls:
  // 1) middle mouse + move = camera pan
  // 2) left mouse + move = window/level
  // 3) right mouse + move = camera zoom
  // 4) middle mouse wheel scroll = zoom
  // 5) 'r' = reset window/level
  // 6) shift + 'r' = reset camera
  vtkInteractorStyleImage* imageStyle =
pvtkImageViewer2->GetInteractorStyle();
  imageStyle->AddObserver( vtkCommand::MouseMoveEvent, Callback );
 
  pvtkRenderWindowInteractor->Initialize();
  pvtkRenderWindowInteractor->Start();
 
}

class vtkImageInteractionCallback :            public vtkCommand
{
public:
             //vtkImageInteractionCallback(void);
             //~vtkImageInteractionCallback(void);

              static vtkImageInteractionCallback *New() 
    {
      return new vtkImageInteractionCallback; 
    }
 
    vtkImageInteractionCallback() 
    {
      this->Viewer = 0;
      this->Picker = 0;
      this->Annotation = 0;

      this->PointData = vtkPointData::New();
    }
 
    ~vtkImageInteractionCallback()
    {
      this->Viewer = 0;
      this->Picker = 0;
      this->Annotation = 0;
      this->PointData->Delete();
    }
 
    void SetPicker(vtkPropPicker *picker) 
    {
      this->Picker = picker; 
    }
 
    void SetAnnotation(vtkCornerAnnotation *annotation) 
    {
        this->Annotation = annotation; 
    }
 
    void SetViewer(vtkImageViewer2 *viewer) 
    {
      this->Viewer = viewer; 
    }
 
 
    virtual void Execute(vtkObject *, unsigned long event, void *)
    {
      this->Viewer;
      vtkRenderWindowInteractor *interactor =
this->Viewer->GetRenderWindow()->GetInteractor();
      vtkRenderer* renderer = this->Viewer->GetRenderer();
      vtkImageActor* actor = this->Viewer->GetImageActor();
      vtkImageData* image = this->Viewer->GetInput();
      vtkInteractorStyle *style = vtkInteractorStyle::SafeDownCast(
          interactor->GetInteractorStyle());
 
      image->Update();
 
      // Pick at the mouse location provided by the interactor
      this->Picker->Pick( interactor->GetEventPosition()[0],
                          interactor->GetEventPosition()[1], 0.0, renderer
);
 
      // There could be other props assigned to this picker, so 
      // make sure we picked the image actor
      vtkAssemblyPath* path = this->Picker->GetPath();
      bool validPick = false;
 
      if( path )
        {
        vtkCollectionSimpleIterator sit;
        path->InitTraversal( sit );
        vtkAssemblyNode *node;
        for( int i = 0; i < path->GetNumberOfItems() && !validPick; ++i )
          {
          node = path->GetNextNode( sit );
          if( actor == vtkImageActor::SafeDownCast( node->GetViewProp() ) )
            {
            validPick = true;
            }
          }
        }
 
      if( !validPick )
        {
        this->Annotation->SetText( 0, "Off Image" );
        interactor->Render();
        // Pass the event further on
        style->OnMouseMove();
        return;
        }
 
      // Get the world coordinates of the pick
      double pos[3];
      this->Picker->GetPickPosition( pos );
      // Fixes some numerical problems with the picking
      double *bounds = actor->GetDisplayBounds();
      int axis = this->Viewer->GetSliceOrientation();
      pos[axis] = bounds[2*axis];
 
      vtkPointData* pd = image->GetPointData();
      if( !pd )
        {
        return;
        }
 
      this->PointData->InterpolateAllocate( pd, 1, 1 );
 
      // Use tolerance as a function of size of source data
      double tol2 = image->GetLength();
      tol2 = tol2 ? tol2*tol2 / 1000.0 : 0.001;
 
      // Find the cell that contains pos
      int subId;
      double pcoords[3], weights[8];
      vtkCell* cell = image->FindAndGetCell(
          pos, NULL, -1, tol2, subId, pcoords, weights );
      if( cell )
        {
        // Interpolate the point data
        this->PointData->InterpolatePoint( pd, 0, cell->PointIds, weights );
        int components =
this->PointData->GetScalars()->GetNumberOfComponents();
        double* tuple = this->PointData->GetScalars()->GetTuple( 0 );
 
        vtkStdString message = "Location: ( ";
        message += vtkVariant( pos[0] ).ToString();
        message += ", ";
        message += vtkVariant( pos[1] ).ToString();
        message += ", ";
        message += vtkVariant( pos[2] ).ToString();
        message += " )\nValue: ( ";
 
        for( int c = 0; c < components; ++c )
          {
          message += vtkVariant( tuple[ c ] ).ToString();
          if( c != components - 1 ) 
            {
            message += ", ";
            }
          }
        message += " )";
        this->Annotation->SetText( 0, message.c_str() );
        interactor->Render();
        style->OnMouseMove();
        }
    }
 
  private:
 
  // Pointer to the viewer
  vtkImageViewer2 *Viewer;
 
  // Pointer to the picker
  vtkPropPicker *Picker;
 
  // Pointer to the annotation
  vtkCornerAnnotation *Annotation;
 
  // Interpolator
  vtkPointData* PointData; 
};





-- 
View this message in context: http://old.nabble.com/mouse-interaction-in-SDI-application%2C-vtkRenderwindowInteractor---tp27558047p27558047.html
Sent from the VTK - Users mailing list archive at Nabble.com.




More information about the vtkusers mailing list