[vtkusers] Getting pointer to currently picked actor

Maarten Beek beekmaarten at yahoo.com
Wed Aug 13 16:45:08 EDT 2014


Thanks for the suggestion, Miro.

I actually implemented something similar.
However, when I pick the actor I make it transparent.
When I then want to get the picked actor, I have to use vtkRenderer::PickProp because that apparently also picks transparent props. However, it is really slow... Any suggestion here?

Thanks - Maarten



On Wednesday, August 13, 2014 4:10:03 PM, Miro Drahos <mdrahos at robodoc.com> wrote:
 


Hi Maarten,
I would suggest creating a callback and registering it with the
    interactor's *ButtonPressEvent. The callback would manage its own
    picker. Something like:

//================================================
class PickCallback : public vtkCommand
{
public :
  static PickCallback * New() { return new PickCallback; }
  void SetRenderer(vtkRenderer * r) { this->ren = r; }
  void Execute(vtkObject *caller, unsigned long event, void *)
  {
    if (this->ren == NULL)
      return;

    if (event ==  vtkCommand::LeftButtonPressEvent)
      {
        vtkRenderWindowInteractor * rwi = vtkRenderWindowInteractor::SafeDownCast(caller);
        if (rwi)
          {
            this->picker->Pick(x, y, this->ren);
            vtkAssemblyPath * path = this->picker->GetPath();
            if (path)
              {
                // Something was picked for sure.
                vtkProp * pickedProp = path->GetLastNode()->GetViewProp();

                // do something with the prop
              }
          }
      }
  }

private :
  PickCallback() { 
    this->picker = vtkSmartPointer<vtkCellPicker>::New(); 
    this->ren    = NULL;
  }
  
  vtkRenderer                   * ren;
  vtkSmartPointer<vtkCellPicker>  picker;
};

//---------------------------------------------------------------------
// How to use the callback:
vtkSmartPointer<PickCallback> cbk = vtkSmartPointer<PickCallback>::New();
cbk->SetRenderer(ren);
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, cbk);
//================================================

Hope this helps,
Miro




On 08/13/2014 09:29 AM, Maarten Beek via vtkusers wrote:

Hi all,
>
>
>I noticed that getting the currently picked actor from the picker in the interactor doesn't always work.
>Some interactor styles and widgets (e.g. vtkInteractorstyleTrackballActor) have their own picker which is used for the picking but which is different from the one in the interactor.
>
>
>I wrote a class that has awareness of the interactor.
>I would like to use this->Interactor->GetPicker() to get access to the currently picked object. However this doesn't work with observers like vtkInteractorstyleTrackballActor. Using this->Interactor->GetInteractorStyle()->GetPicker() is also not an option because not all observers use their own picker (and a GetPicker() function does not exist in vtkInteractorstyleTrackballActor).
>
>
>The hack I made was to derive from vtkInteractorstyleTrackballActor and overload the SetInteractor()  function:
>
>
>void MyClass::SetInteractor(vtkRenderWindowInteractor* rwi)
>{
>    this->Superclass::SetInteractor(rwi);
>    if( this->Interactor != NULL )
>    {
>        vtkCellPicker* picker = vtkCellPicker::New;
>        picker->SetTolerance(0.001);
>        this->Interactor->SetPicker(picker);
>        picker->Delete();
>    }
>}
>
>
>This works. But I'd like to use MyClass with different observers w/o having to derive from all of them...
>
>
>I've also looked at the PickingManager class since all observers seems to register their pickers, but firstly it is not enabled by default and secondly to get the current selection I have to call GetAssemblyPath() which performs a pick which I don't want because this invokes a PickEvent.. I use the event in MyClass but only when I pick an object, not when I want the currently picked object. Giving vtkPickingManager a public SelectedPicker() function (like 
>vtkPickingManager::Internal has) would do the trick here..
>
>
>I guess my question is:
>How would a write code to get the currently picked object that works with various observers when I only have awareness of the interactor?
>
>
>Maarten
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140813/254bcf76/attachment-0001.html>


More information about the vtkusers mailing list