[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