[vtkusers] Invoke "Interactor"-Event to vtkSphereWidget
Rocco Gasteiger
post at rocco-gasteiger.de
Mon Jun 14 09:07:51 EDT 2010
Hello Eric,
Many thanks for your hint! Now it works! :-) Indeed, I used the old
vtkSphereWidget-class. After exchanging with the new vtkSphereWidget2 and an
explicitly Render()-call on the widget the handles are visible now.
Best regards, Rocco
-----Ursprüngliche Nachricht-----
Von: Eric E. Monson [mailto:emonson at cs.duke.edu]
Gesendet: Montag, 14. Juni 2010 13:08
An: Rocco Gasteiger
Cc: 'Karthik Krishnan'; 'vtkusers'
Betreff: Re: [vtkusers] Invoke "Interactor"-Event to vtkSphereWidget
Hey Rocco,
Karthik means really invoking Render() on the widget itself, not the
Interactor or Renderer. Although, I think he's referring to the newer Widget
classes, and it looks like you are using the older ones. Have you tried
using SphereWidget2?
http://www.vtk.org/doc/nightly/html/classvtkSphereWidget2.html
The newer widgets separate out the event handling and the graphical
representation in a nice way. There is a Tcl test listed on that page to
show you how to use it, but you can also get some ideas from any of the
other widgets which end in ...Widget2
Good luck,
-Eric
------------------------------------------------------
Eric E Monson
Duke Visualization Technology Group
On Jun 14, 2010, at 4:35 AM, Rocco Gasteiger wrote:
> Hi Karthik,
>
> Thank you for your fast respond. I invoke the Render()-call in several
ways
> but it was not successful.
> I tried the render call on the interactor of the widget as well as with
the
> GetCurrentRenderer-method of the widget itself. But it doesn't help. I
have
> to press the i-key again.
>
> In my code below I added an observer to the widget renderer, listening to
> the vtkCommand::Start/EndEvent. If I called Render() in the associated
> vtkCommand-class I got a stack overflow exception because I step into a
> recursive render loop. So I removed the observer.
>
> What I've tried now is to add a pointer of my widget to my own interactor
> style. Every time, I double click on my scene object I process my own
> interactor behavior which also enables the sphere widget and calls the
> Render()-method like mentioned above. Here is a code snippet to illustrate
> this:
>
> // in my main-class
> myMouseStyle->SetWidget(widget);
>
> // in my derived style-class
> widget->SetEnabled(1);
> widget->SetHandleVisibility(1);
> widget->GetCurrentRenderer->Render();// Doesn't work
> this->Interactor->Render(); // Doesn't work
>
> Do you have any reasons why it doesn't work? I have to mention that I use
a
> QVTKWidget to display my vtk-scene. Can this have an influence on it?
>
> Best regards, Rocco
>
> -----Ursprüngliche Nachricht-----
> Von: Karthik Krishnan [mailto:karthik.krishnan at kitware.com]
> Gesendet: Sonntag, 13. Juni 2010 11:43
> An: Rocco Gasteiger
> Betreff: Re: [vtkusers] Invoke "Interactor"-Event to vtkSphereWidget
>
> You must invoke Render() explicitly on the widget after invoking
SetEnabled.
>
> Recently (roughly a year ago), the Render() call was removed from
> SetEnabled, so that multiple widgets could be enabled without
> triggering several renders.
>
>
>
> On 6/12/10, Rocco Gasteiger <post at rocco-gasteiger.de> wrote:
>> Dear vtk-users,
>>
>>
>>
>> I want to use a vtkSphereWidget in my scene to orient a geometry.
> Currently,
>> I have to press the key "i" to enable this widget (i.e. make the handle
>> visible). However, I want to enable this widget once the widget geometry
> is
>> shown in my render window. For this purpose I add an observer to my
> renderer
>> with the parameters "vtkCommand::StartEvent" and a derived class of
>> vtkCommand as callback-command. Additionally, I set a pointer to the
>> vtkSphereWidget in my derived callback-command. When the event is
> processed
>> (and I proved that this event is throwing!), I call "SetEnabled(1)" in
my
>> derived callback-command. However, the handle is not visible. I need to
>> press the "i"-key to make it visible. I also tried to add observers to
the
>> interactor but the problem is still the same.
>>
>>
>>
>> Can anybody give me a hint what I'm doing wrong?
>>
>>
>>
>> Thanks in advance, Rocco
>>
>>
>>
>>
>>
>> P.S. Here is a code snippet of what I'm doing currently:
>>
>>
>>
>> // The main-class:
>>
>> .
>>
>> vtkSmartPointer<vtkSphereWidget> sphereWidget =
>> vtkSmartPointer<vtkSphereWidget>::New();
>>
>> sphereWidget ->SetInteractor(windowInteractor);
>>
>> sphereWidget ->SetCurrentRenderer(renderer);
>>
>> sphereWidget ->SetEnabled(1);
>>
>> sphereWidget ->SetHandleSize(0.03);
>>
>> sphereWidget ->SetPhiResolution(20);
>>
>> sphereWidget ->SetThetaResolution(20);
>>
>> sphereWidget ->GetSphereProperty()->BackfaceCullingOn();
>>
>> sphereWidget ->SetHandleVisibility(1);
>>
>> .
>>
>>
>>
>> vtkSmartPointer<vtkMyWidgetCallback> widgetCallback =
>> vtkSmartPointer<vtkMyWidgetCallback>::New();
>>
>> widgetCallback->SetWidget(sphereWidget);
>>
>> renderer->AddObserver(vtkCommand::StartEvent, widgetCallback);
>>
>>
>>
>> // The derived vtkCommand class
>>
>> class vtkMyWidgetCallback : public vtkCommand
>>
>> {
>>
>> public:
>>
>> static vtkMyWidgetCallback *New()
>>
>> {
>>
>> return new vtkMyWidgetCallback;
>>
>> }
>>
>>
>>
>> virtual void Execute(vtkObject *caller, unsigned long,
>> void*)
>>
>> {
>>
>>
>>
>> sphereWidget ->SetEnabled(1);
>>
>> sphereWidget ->SetHandleVisibility(1);
>>
>> cout << "Widget on!" << endl;
>>
>> }
>>
>> void SetWidget(vtkSphereWidget* widget);
>>
>>
>>
>> vtkSphereWidget* sphereWidget;
>>
>> };
>>
>>
>>
>> inline void vtkMyWidgetCallback::SetWidget(vtkSphereWidget* widget)
>>
>> {
>>
>> sphereWidget = widget;
>>
>> }
>>
>>
>>
>>
>>
>>
>>
>>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
More information about the vtkusers
mailing list