[vtkusers] Retriving vtkInformation from the actor

Abhishek abhishekworld at gmail.com
Tue Nov 6 00:39:58 EST 2018


Anyone? how to determine which object it is in the mouse event?

On Mon, Nov 5, 2018 at 4:10 PM Abhishek <abhishekworld at gmail.com> wrote:

> Hello,
> I have multiple actors in the scene, and I have re-implemented
> the vtkInteractorStyleTrackballCamera to capture the click event on them
> (modified
> https://lorensen.github.io/VTKExamples/site/Python/Interaction/HighlightPickedActor/
> )
> In the click event, I want to know which actor has been clicked to do so I
> am adding vtkInformationStringKey to every actor. But at the click event, I
> am not able to retrieve it back.
> Please let me know what am I missing? Or what am I doing wrong?
>
> Here is my code:
> ```
> import vtk
>
> NUMBER_OF_SPHERES = 10
>
>
> class MouseInteractorHighLightActor(vtk.vtkInteractorStyleTrackballCamera):
>
>     def __init__(self, parent=None):
>         self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)
>
>         self.LastPickedActor = None
>         self.LastPickedProperty = vtk.vtkProperty()
>
>     def leftButtonPressEvent(self, obj, event):
>         clickPos = self.GetInteractor().GetEventPosition()
>
>         picker = vtk.vtkPropPicker()
>         picker.Pick(clickPos[0], clickPos[1], 0, self.GetDefaultRenderer())
>
>         # get the new
>         self.NewPickedActor = picker.GetActor()
>
>         # If something was selected
>         if self.NewPickedActor:
>             # get the information from the new Actor
>             info = self.NewPickedActor.GetProperty().GetInformation()
>             # prepare the key
>             key = vtk.vtkInformationStringKey.MakeKey("CPHY_ID",
> "vtkActor")
>             # get the value for the key
>             id = info.Get(key)
>             print("Id is : ")
>             print(id)
>
>             # If we picked something before, reset its property
>             if self.LastPickedActor:
>
> self.LastPickedActor.GetProperty().DeepCopy(self.LastPickedProperty)
>
>             # Save the property of the picked actor so that we can
>             # restore it next time
>
> self.LastPickedProperty.DeepCopy(self.NewPickedActor.GetProperty())
>             # Highlight the picked actor by changing its properties
>             self.NewPickedActor.GetProperty().SetColor(1.0, 0.0, 0.0)
>             self.NewPickedActor.GetProperty().SetDiffuse(1.0)
>             self.NewPickedActor.GetProperty().SetSpecular(0.0)
>
>             # save the last picked actor
>             self.LastPickedActor = self.NewPickedActor
>
>         self.OnLeftButtonDown()
>         return
>
>
> # A renderer and render window
> renderer = vtk.vtkRenderer()
> renderer.SetBackground(.3, .4, .5)
>
>
> renwin = vtk.vtkRenderWindow()
> renwin.AddRenderer(renderer)
>
> # An interactor
> interactor = vtk.vtkRenderWindowInteractor()
> interactor.SetRenderWindow(renwin)
>
> # add the custom style
> style = MouseInteractorHighLightActor()
> style.SetDefaultRenderer(renderer)
> interactor.SetInteractorStyle(style)
>
> # Add spheres to play with
> for i in range(NUMBER_OF_SPHERES):
>     source = vtk.vtkSphereSource()
>
>     # random position and radius
>     x = vtk.vtkMath.Random(-5, 5)
>     y = vtk.vtkMath.Random(-5, 5)
>     z = vtk.vtkMath.Random(-5, 5)
>     radius = vtk.vtkMath.Random(.5, 1.0)
>
>     source.SetRadius(radius)
>     source.SetCenter(x, y, z)
>     source.SetPhiResolution(11)
>     source.SetThetaResolution(21)
>
>     mapper = vtk.vtkPolyDataMapper()
>     mapper.SetInputConnection(source.GetOutputPort())
>     actor = vtk.vtkActor()
>     actor.SetMapper(mapper)
>
>     r = vtk.vtkMath.Random(.4, 1.0)
>     g = vtk.vtkMath.Random(.4, 1.0)
>     b = vtk.vtkMath.Random(.4, 1.0)
>     actor.GetProperty().SetDiffuseColor(r, g, b)
>     actor.GetProperty().SetDiffuse(.8)
>     actor.GetProperty().SetSpecular(.5)
>     actor.GetProperty().SetSpecularColor(1.0, 1.0, 1.0)
>     actor.GetProperty().SetSpecularPower(30.0)
>
>     info = actor.GetProperty().GetInformation()
>     key = vtk.vtkInformationStringKey.MakeKey("CPHY_ID", "vtkActor")
>     info.Set(key, "SPH_"+str(i))
>     #actor.GetProperty().SetInformation(info)
>
>     renderer.AddActor(actor)
>
> for i in range(NUMBER_OF_SPHERES):
>     source = vtk.vtkConeSource()
>
>     # random position and radius
>     x = vtk.vtkMath.Random(-8, 5)
>     y = vtk.vtkMath.Random(-8, 5)
>     z = vtk.vtkMath.Random(-8, 5)
>     radius = vtk.vtkMath.Random(.5, 1.0)
>
>     angle = vtk.vtkMath.Random(5, 10)
>     source.SetAngle(angle)
>     source.SetRadius(radius)
>     source.SetCenter(x, y, z)
>     # source.SetPhiResolution(11)
>     # source.SetThetaResolution(21)
>
>     mapper = vtk.vtkPolyDataMapper()
>     mapper.SetInputConnection(source.GetOutputPort())
>     actor = vtk.vtkActor()
>     actor.SetMapper(mapper)
>
>     r = vtk.vtkMath.Random(.4, 1.0)
>     g = vtk.vtkMath.Random(.4, 1.0)
>     b = vtk.vtkMath.Random(.4, 1.0)
>     actor.GetProperty().SetDiffuseColor(r, g, b)
>     actor.GetProperty().SetDiffuse(.8)
>     actor.GetProperty().SetSpecular(.5)
>     actor.GetProperty().SetSpecularColor(1.0, 1.0, 1.0)
>     actor.GetProperty().SetSpecularPower(30.0)
>
>     info = actor.GetProperty().GetInformation()
>     key = vtk.vtkInformationStringKey.MakeKey("CPHY_ID", "vtkActor")
>     info.Set(key, "CON_"+str(i))
>     #actor.GetProperty().SetInformation(info)
>     renderer.AddActor(actor)
>
> # Start
> interactor.Initialize()
> interactor.Start()
> ```
>
> Regards,
> --
> Abhishek
> http://zeroth.me
>
>

-- 
Abhishek
http://zeroth.me
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://public.kitware.com/pipermail/vtkusers/attachments/20181106/32ecd4f4/attachment.html>


More information about the vtkusers mailing list