[vtkusers] Information during callback / vtkImplicitPlaneWidget2
Sebastian Gatzka
sebastian.gatzka at stud.tu-darmstadt.de
Mon Mar 15 07:23:21 EDT 2010
Sorry to bother again. Your code is not working as planned.
It runs, cuts the sphere in half and displays "Hello World".
When interacting with the implicitPlaneWidget (which is possible:
translation, rotation etc.) nothing happens to the sphere and even the
counter does not take effect.
When pressing "e" the code crashes with a heap corruption.
Is there something wrong with our compiler, or did you miss to tell me
anything about using callback functions?
By the way: Is there any kind of tutorial about how to handle a callback
function correctly?!
Am 12.03.2010 15:42, schrieb David Doria:
>
> On Fri, Mar 12, 2010 at 7:17 AM, Sebastian Gatzka
> <sebastian.gatzka at stud.tu-darmstadt.de
> <mailto:sebastian.gatzka at stud.tu-darmstadt.de>> wrote:
>
> Or can I talk to the textActor like this?
>
> vtkTextActor *ta = reinterpret_cast<vtkTextActor*>(caller);
> ta->SetInput("TEST");
>
> or like this?
>
> this->TextActor->SetInput("TEST");
>
> No, does not work either way.
>
>
> Ok, let's close this question - here is an example that updates a
> counter in the lower left corner of the renderwindow every time an
> interaction occurs. This should be easy to adapt to do what you want.
>
> #include <sstream>
>
> #include <vtkSmartPointer.h>
> #include <vtkProperty.h>
> #include <vtkTextProperty.h>
>
> #include <vtkXMLPolyDataReader.h>
> #include <vtkSphereSource.h>
> #include <vtkClipPolyData.h>
> #include <vtkPlane.h>
>
> #include <vtkCommand.h>
> #include <vtkImplicitPlaneWidget2.h>
> #include <vtkImplicitPlaneRepresentation.h>
> #include <vtkPolyDataMapper.h>
> #include <vtkProperty.h>
> #include <vtkActor.h>
> #include <vtkTextActor.h>
> #include <vtkRenderWindow.h>
> #include <vtkRenderer.h>
> #include <vtkRenderWindowInteractor.h>
>
> // Callback for the interaction
> // This does the actual work: updates the vtkPlane implicit function.
> // This in turn causes the pipeline to update and clip the object.
> class vtkIPWCallback : public vtkCommand
> {
> public:
> static vtkIPWCallback *New()
> {
> return new vtkIPWCallback;
> }
> virtual void Execute(vtkObject *caller, unsigned long, void*)
> {
> vtkImplicitPlaneWidget2 *planeWidget =
> reinterpret_cast<vtkImplicitPlaneWidget2*>(caller);
> vtkImplicitPlaneRepresentation *rep =
>
> reinterpret_cast<vtkImplicitPlaneRepresentation*>(planeWidget->GetRepresentation());
> rep->GetPlane(this->Plane);
> std::stringstream ss;
> ss << this->counter;
> this->TextActor->SetInput (ss.str().c_str());
> this->counter++;
> }
> vtkIPWCallback():Plane(0),TextActor(0),counter(0) {}
> void SetPlane(vtkPlane* plane) { this->Plane = plane;}
> void SetTextActor(vtkTextActor* textActor) { this->TextActor =
> textActor;}
> private:
> unsigned int counter;
> vtkPlane* Plane;
> vtkTextActor* TextActor;
>
> };
>
> int main(int argc, char *argv[])
> {
> vtkSmartPointer<vtkSphereSource> sphereSource =
> vtkSmartPointer<vtkSphereSource>::New();
> sphereSource->SetRadius(10.0);
>
> vtkSmartPointer<vtkXMLPolyDataReader> reader =
> vtkSmartPointer<vtkXMLPolyDataReader>::New();
>
> // Setup a visualization pipeline
>
> vtkSmartPointer<vtkPlane> plane =
> vtkSmartPointer<vtkPlane>::New();
> vtkSmartPointer<vtkClipPolyData> clipper =
> vtkSmartPointer<vtkClipPolyData>::New();
> clipper->SetClipFunction(plane);
> clipper->InsideOutOn();
> if (argc < 2)
> {
> clipper->SetInputConnection(sphereSource->GetOutputPort());
> }
> else
> {
> reader->SetFileName(argv[1]);
> clipper->SetInputConnection(reader->GetOutputPort());
> }
> //Create a mapper and actor
> vtkSmartPointer<vtkPolyDataMapper> mapper =
> vtkSmartPointer<vtkPolyDataMapper>::New();
> mapper->SetInputConnection(clipper->GetOutputPort());
> vtkSmartPointer<vtkActor> actor =
> vtkSmartPointer<vtkActor>::New();
> actor->SetMapper(mapper);
>
> vtkSmartPointer<vtkProperty> backFaces =
> vtkSmartPointer<vtkProperty>::New();
> backFaces->SetDiffuseColor(.8, .8, .4);
>
> actor->SetBackfaceProperty(backFaces);
> // a renderer and render window
> vtkSmartPointer<vtkRenderer> renderer =
> vtkSmartPointer<vtkRenderer>::New();
> vtkSmartPointer<vtkRenderWindow> renderWindow =
> vtkSmartPointer<vtkRenderWindow>::New();
> renderWindow->AddRenderer(renderer);
> renderer->AddActor(actor);
> // an interactor
> vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
> vtkSmartPointer<vtkRenderWindowInteractor>::New();
> renderWindowInteractor->SetRenderWindow(renderWindow);
> renderWindow->Render();
>
> // The callback will do the work
> vtkSmartPointer<vtkIPWCallback> myCallback =
> vtkSmartPointer<vtkIPWCallback>::New();
> myCallback->SetPlane(plane);
> vtkSmartPointer<vtkTextActor> textActor =
> vtkSmartPointer<vtkTextActor>::New();
> textActor->SetInput ( "Hello world" );
> textActor->GetTextProperty()->SetColor ( 1.0,0.0,0.0 );
> myCallback->SetTextActor(textActor);
> renderer->AddActor2D ( textActor );
>
> vtkSmartPointer<vtkImplicitPlaneRepresentation> rep =
> vtkSmartPointer<vtkImplicitPlaneRepresentation>::New();
> rep->SetPlaceFactor(1.25); // This must be set prior to placing the
> widget
> rep->PlaceWidget(actor->GetBounds());
> rep->SetNormal(plane->GetNormal());
> rep->SetOrigin(0,0,50);
> vtkSmartPointer<vtkImplicitPlaneWidget2> planeWidget =
> vtkSmartPointer<vtkImplicitPlaneWidget2>::New();
> planeWidget->SetInteractor(renderWindowInteractor);
> planeWidget->SetRepresentation(rep);
> planeWidget->AddObserver(vtkCommand::InteractionEvent,myCallback);
>
> // render an image (lights and cameras are created automatically)
> renderWindowInteractor->Initialize();
> renderWindow->Render();
> planeWidget->On();
> // begin mouse interaction
> renderWindowInteractor->Start();
> return EXIT_SUCCESS;;
> }
>
> Thanks,
>
> David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100315/11e0122f/attachment.htm>
More information about the vtkusers
mailing list