[vtkusers] Window->Image coordinate conversions?
    David Doria 
    daviddoria+vtk at gmail.com
       
    Fri Oct 23 11:58:58 EDT 2009
    
    
  
On Thu, Oct 22, 2009 at 11:32 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
> You may need to:
> ActorCollection->InitTraversal();
> before:
>  vtkActor* actor = ActorCollection->GetNextActor();
Hm that didn't seem to change anything - I addeded InitTraversal on
both the actor and renderer collections. Here is an updated function
with outputs every couple of lines. The last output I see before the
segfault is
"Getting renderer...". I've never used these "collection" objects
before, so I am likely doing something wrong with those. There doesn't
seem to be a "GetFirstActor" function, so maybe "GetNextActor" is
trying to get the second actor (which doesn't exist)? I'm not sure
where the actor counter starts.
void SelectionChangedCallbackFunction ( vtkObject* caller, long
unsigned int eventId, void* clientData, void* callData )
{
  vtkstd::cout << "Selection changed callback" << vtkstd::endl;
  unsigned int* rect = reinterpret_cast<unsigned int*> ( callData );
  unsigned int pos1X = rect[0];
  unsigned int pos1Y = rect[1];
  unsigned int pos2X = rect[2];
  unsigned int pos2Y = rect[3];
  vtkstd::cout << "Start x: " << pos1X << " Start y: " << pos1Y << "
End x: " << pos2X << " End y: " << pos2Y << vtkstd::endl;
  vtkstd::cout << "Getting render window..." << vtkstd::endl;
  vtkRenderWindow* ren = reinterpret_cast<vtkRenderWindow*>(caller);
  vtkstd::cout << "Getting renderer..." << vtkstd::endl;
  vtkRendererCollection* RendererCollection = ren->GetRenderers();
  RendererCollection->InitTraversal();
  vtkRenderer* renderer = RendererCollection->GetFirstRenderer();
  if(renderer == NULL)
  {
    vtkstd::cout << "Invalid renderer!" << vtkstd::endl;
    return;
  }
  vtkstd::cout << "Getting actor..." << vtkstd::endl;
  vtkActorCollection* ActorCollection = renderer->GetActors();
  ActorCollection->InitTraversal();
  vtkActor* actor = ActorCollection->GetNextActor();
  if(actor == NULL)
  {
    vtkstd::cout << "Invalid actor!" << vtkstd::endl;
    return;
  }
  vtkImageActor* ImageActor = reinterpret_cast<vtkImageActor*>(actor);
  vtkstd::cout << "Setting up point placer..." << vtkstd::endl;
  vtkSmartPointer<vtkImageActorPointPlacer> ImageActorPointPlacer =
vtkSmartPointer<vtkImageActorPointPlacer>::New();
  ImageActorPointPlacer->SetImageActor(ImageActor);
  double displayPos[2];
  displayPos[0] = pos1X;
  displayPos[1] = pos1Y;
  double worldPos[3];
  double worldOrient[9];
  vtkstd::cout << "Compute world position..." << vtkstd::endl;
  ImageActorPointPlacer->ComputeWorldPosition(renderer, displayPos,
worldPos, worldOrient);
  vtkstd::cout << "World pos: " << worldPos[0] << " " << worldPos[1]
<< " " << worldPos[2] << vtkstd::endl;
}
Any ideas?
Thanks,
David
    
    
More information about the vtkusers
mailing list