<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-06-16 16:08 GMT+02:00 Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">2016-06-16 15:52 GMT+02:00 Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div><div><div>The MouseEvents.py example [1] currently does:<br><br>class MyInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):<br> <br>    def __init__(self,parent=None):<br>        self.AddObserver("MiddleButtonPressEvent",self.middleButtonPressEvent)<br>        self.AddObserver("MiddleButtonReleaseEvent",self.middleButtonReleaseEvent)<br> <br>    def middleButtonPressEvent(self,obj,event):<br>        print("Middle Button pressed")<br>        self.OnMiddleButtonDown()<br>        return<br> <br>    def middleButtonReleaseEvent(self,obj,event):<br>        print("Middle Button released")<br>        self.OnMiddleButtonUp()<br>        return<br><br>But I don't understand the reason for calling e.g. self.OnMiddleButtonDown() ? Since this is not an override of a virtual function (which is not possible in Python), but simply adding another observer, I don't think it is needed? (..and I would think it would mean OnMiddleButtonDown is called twice, right?).<br></div></div></div></div></div></blockquote><div><br></div></span><div>Sorry, I realize I wasn't really clear here: What I mean is that, if the interactor style above is used, the behavior of vtkInteractorStyleTrackballCamera (the base class) will still be there, even if the call to self.OnMiddleButtonDown() is removed, since the base class will observe the interactor. That's why I don't understand the need for the self.OnMiddleButtonDown() call in the example.<br><br></div><div>This ties in to my other question (another mail), since what I want to do is to actually override the behavior of the base interactor style (similar to how you can in C++, but I need to find some other mechanism to do so, overriding of virtual functions won't work from Python).<span class=""><font color="#888888"><br></font></span></div></div></div></div></blockquote><div><br></div><div>Sorry, I confused myself with all my mails, it actually was in the original mail in this thread I brought up this question.<br><br></div><div>Perhaps I should tell a little more about my goal. I'm building an application with VTK, and in some cases I expect that I want to make use of VTKs interactor + interactor style machinery, and leverage the built-in interactor styles (such as <span class="">vtkInteractorStyleTrackballCamera), but at the same time I might want to override behavior, and also be able to decide whether I want to override a particular event or not at runtime, when handling the event. I also suspect that I might want to modify the event information before passing it on.<br><br></span></div><div><span class="">E.g. in C++ I would just override the virtual method, and in my override I'd be able decide whether I want to do something special or call the base class implementation.<br><br></span></div><div><span class="">It seem there's no easy way of doing the equivalent in Python? At least I haven't found any. I've found some mentions in the vtkCommand docs about being able to stop propagation of an event to observers with lower priority. But I haven't found any exampels of this in Python, and it also seems that the docs in vtkCommand about callData are not applicable to Python? And also, with that solution, I'd have to install observers directly on the interactor, like the interactor style does, in order to end up in the same event propagation chain so to speak.<br><br></span></div><div><span class="">I'd love to hear how others have solved the problem of custom interaction behavior in Python, while still being able to leverage (parts of) the functionality provided by the built-in interactor styles.<br><br></span></div><div><span class="">Elvis<br></span></div><div><span class=""><br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><span class=""><font color="#888888"><br></font></span></div><span class=""><font color="#888888"><div>Elvis<br></div></font></span><span class=""><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div><div><div><br></div>This leads me to another question: What if I really do want to override the behavior that the parent interactor style provides (or modify it by manipulating the event), what are my options?<br><br></div>I saw at<br><br>    <a href="http://www.vtk.org/Wiki/VTK/Examples/Python/Interaction/MouseEventsObserver" target="_blank">http://www.vtk.org/Wiki/VTK/Examples/Python/Interaction/MouseEventsObserver</a><br><br></div>that you can remove all observers of an event from the interactor, but that seems like quite a hack :/ In my case, I'm interested in locking the camera rotation to a certain axis, but perhaps a custom interactor style is not the way to go?<br><br></div>Elvis<br><div><div><div><div><div><div><div><div><br>[1] <a href="http://www.vtk.org/Wiki/VTK/Examples/Python/Interaction/MouseEvents" target="_blank">http://www.vtk.org/Wiki/VTK/Examples/Python/Interaction/MouseEvents</a><br></div></div></div></div></div></div></div></div></div>
</blockquote></span></div><br></div></div>
</blockquote></div><br></div></div>