[vtkusers] why the vtkpolydata can't be updated

Ali Habib ali.mahmoud.habib at gmail.com
Sat Aug 21 19:24:17 EDT 2010


Dear Jim,

I made sure that the observers I used work and the algorithm use them

but the shape not be affected

Best regards

On Sat, Aug 21, 2010 at 5:17 PM, Jim Peterson <jimcp at cox.net> wrote:

> Ali,
> Are you sure your interaction events are being invoked? I would put a
> System.out.Println("....."); message in the callback routines to be sure you
> are going through there first. I am a relative Vtk rookie myself, but I do
> use java callbacks to animate vtk objects from Java tabular data. I use the
> callbacks from the renderer and interaction window respectivelym iren is an
> instance of vtkRenderWindowInteractor and ren1 is an instance of
> vtkRenderer:
>
>     iren.AddObserver("UserEvent",this,"updmeth");
>     ren1.AddObserver("StartEvent",this,"startRender");
>     iren.AddObserver("StartPickEvent",this,"startPick");
>     iren.AddObserver("EndPickEvent",this,"endPick");
>
> The UserEvent responds to the U key interaction and allows me to toggle the
> animation on and off, the StartEvent of the renderer is where I  modify my
> pipeline elements.
>
> I perform the .Modified() call for all of the affected elements of the
> pipeline. Points, Scalars, and PolyData objects.
>
>
> Hope that helps,
> Jim
> Ali Habib wrote:
>
>> Dear Jim
>>
>> it didn't affect , do u have any suggestion or a way to reach my goal
>> Best regards
>> On Sat, Aug 21, 2010 at 4:44 PM, Jim Peterson <jimcp at cox.net <mailto:
>> jimcp at cox.net>> wrote:
>>
>>    Ali,
>>    I think you need to invoke apd.Modified() before apd.Update() to
>>    get the changes incorporated in the pipeline.
>>
>>    Hope that helps,
>>    Jim.
>>
>>    Ali Habib wrote:
>>
>>        I select part of vtkpolydata using vtkboxwidget and
>>        vtkclippolydata , then I want to change (do displacement) to
>>        the points be selected  so I search for the points in the
>>        source polydata and change its position
>>
>>        my goal is to for example deform vtkpolydata by stretch
>>        certain part , the problem is that the shape doesn't change
>>        below is the code any suggestion please
>>               static vtkLODActor selectActor;
>>               static vtkLODActor maceActor;
>>               static vtkPlanes planes;
>>               static vtkClipPolyData clipper;
>>               static vtkAppendPolyData apd;
>>
>>              static double[] center_Before =new double[3];
>>               static double[] center_After = new double[3];
>>                 static void Main(string[] args)
>>               {
>>
>>  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>
>>  //////////////////////////////////////////////////////// the
>>        core of cutting tool
>>        /////////////////////////////////////////////////////////////
>>
>>  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>                   // Create a mace out of filters.
>>                   vtkSphereSource sphere = new vtkSphereSource();
>>                   vtkConeSource cone = new vtkConeSource();
>>                   vtkGlyph3D glyph = new vtkGlyph3D();
>>                   glyph.SetInput(sphere.GetOutput());
>>                   glyph.SetSource(cone.GetOutput());
>>                   glyph.SetVectorModeToUseNormal();
>>                   glyph.SetScaleModeToScaleByVector();
>>                   glyph.SetScaleFactor(0.25);
>>
>>                   // The sphere and spikes are appended into a single
>>        polydata. This just
>>                   // makes things simpler to manage.
>>                     apd = new vtkAppendPolyData();
>>                   apd.AddInput(glyph.GetOutput());
>>                   apd.AddInput(sphere.GetOutput());
>>
>>                   vtkPolyDataMapper maceMapper = new vtkPolyDataMapper();
>>                   maceMapper.SetInput(apd.GetOutput());
>>                   maceActor = new vtkLODActor();
>>                   maceActor.SetMapper(maceMapper);
>>                   maceActor.GetProperty().SetColor(1, 0, 0);
>>                   maceActor.VisibilityOn();
>>
>>                   // This portion of the code clips the mace with the
>>        vtkPlanes implicit
>>                   // function.  The clipped region is colored green.
>>                   planes = new vtkPlanes();
>>                     clipper = new vtkClipPolyData();
>>                   clipper.SetInput(apd.GetOutput());
>>                   clipper.SetClipFunction(planes);
>>                   clipper.InsideOutOff();
>>
>>                   vtkPolyDataMapper selectMapper = new
>>        vtkPolyDataMapper();
>>                   selectMapper.SetInput(clipper.GetOutput());
>>                   selectActor = new vtkLODActor();
>>                   selectActor.SetMapper(selectMapper);
>>                   selectActor.GetProperty().SetColor(0, 1, 0);
>>                   selectActor.VisibilityOff();
>>                   selectActor.SetScale(1.01, 1.01, 1.01);
>>
>>                   // Create the RenderWindow, Renderer and both Actors
>>                   vtkRenderer ren = new vtkRenderer();
>>                   vtkRenderWindow renWin = new vtkRenderWindow();
>>                   renWin.AddRenderer(ren);
>>
>>                   vtkRenderWindowInteractor iren = new
>>        vtkRenderWindowInteractor();
>>                   iren.SetRenderWindow(renWin);
>>
>>                   //The SetInteractor method is how 3D widgets are
>>        associated with the
>>                   //render window interactor.  Internally,
>>        SetInteractor sets up a bunch
>>                   //of callbacks using the Command/Observer mechanism
>>        (AddObserver()).
>>                   vtkBoxWidget boxWidget = new vtkBoxWidget();
>>                   boxWidget.SetInteractor(iren);
>>                   boxWidget.SetPlaceFactor(1.25);
>>                   boxWidget.TranslationEnabledOn();
>>                   ren.AddActor(maceActor);
>>                   ren.AddActor(selectActor);
>>
>>                   //Add the actors to the renderer, set the
>>        background and size
>>                   ren.SetBackground(0.1, 0.2, 0.4);
>>                   // renWin.SetSize(300, 300);
>>
>>                   // Place the interactor initially. The input to a
>>        3D widget is used to
>>                   // initially position and scale the widget. The
>>        "EndInteractionEvent" is
>>                   // observed which invokes the SelectPolygons callback.
>>                   boxWidget.SetInput(glyph.GetOutput());
>>                   boxWidget.PlaceWidget();
>>
>>  boxWidget.AddObserver((uint)vtk.EventIds.InteractionEvent,
>>        new vtk.vtkDotNetCallback(InteractionEvent));
>>
>>  boxWidget.AddObserver((uint)vtk.EventIds.EndInteractionEvent,
>>        new vtk.vtkDotNetCallback(EndInteractionEvent));
>>
>>                   boxWidget.On();
>>                   iren.Initialize();
>>                   renWin.Render();
>>                   iren.Start();
>>                               }
>>               public static void InteractionEvent(vtk.vtkObject obj,
>>        uint eventId, Object data, IntPtr clientdata)
>>               {
>>                   vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>>                   widget.GetPlanes(planes);
>>                   selectActor.VisibilityOn();
>>
>>
>>                   vtkPolyData before = new vtkPolyData();
>>                   widget.GetPolyData(before);
>>                   center_Before = GetBoundsCenter(before.GetBounds());
>>
>>                   //maceActor.VisibilityOff();
>>                   ///////////// Test writting
>>        /////////////////////////////////////////////
>>                   //Write the file
>>
>>                   /*vtkXMLPolyDataWriter writer = new
>>        vtkXMLPolyDataWriter ();
>>                   writer.SetInputConnection(clipper.GetOutputPort());
>>                  writer.SetFileName("disk.vtp");
>>                  writer.Write();*/
>>
>>
>>               }
>>               public static void EndInteractionEvent(vtk.vtkObject
>>        obj, uint eventId, Object data, IntPtr clientdata)
>>               {
>>                   vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>>                    vtkPolyData after = new vtkPolyData();
>>                    widget.GetPolyData(after);
>>                    center_After = GetBoundsCenter(after.GetBounds());
>>
>>                    ModifyData();
>>
>>
>>               }
>>
>>               private static double[] GetBoundsCenter(double[] bounds)
>>               {
>>                   double[] center = new double[3];
>>
>>                   center[0] = (bounds[0] + bounds[1]) / 2.0;
>>                   center[1] = (bounds[2] + bounds[3]) / 2.0;
>>                   center[2] = (bounds[4] + bounds[5]) / 2.0;
>>
>>                   return center;
>>               }
>>
>>               private static void ModifyData()
>>               {
>>                   double[] Displacement = { center_After[0] -
>>        center_Before[0], center_After[1] - center_Before[1],
>>        center_After[2] - center_Before[2] };
>>
>>                   int NoOfPoints =
>>        clipper.GetOutput().GetNumberOfPoints();
>>
>>                   for (int i = 0; i < NoOfPoints;i++ )
>>                   {
>>
>>  /////////////////////////////////////////////////////////////////////////////////////
>>
>>  apd.GetOutput().GetPoints().GetPoint(apd.GetOutput().FindPoint(clipper.GetOutput().GetPoints().GetPoint(i)))[0]
>>        =
>>
>>  apd.GetOutput().GetPoints().GetPoint(apd.GetOutput().FindPoint(clipper.GetOutput().GetPoints().GetPoint(i)))[0]
>>        + Displacement[0];
>>
>>
>>  apd.GetOutput().GetPoints().GetPoint(apd.GetOutput().FindPoint(clipper.GetOutput().GetPoints().GetPoint(i)))[1]
>>        =
>>
>>  apd.GetOutput().GetPoints().GetPoint(apd.GetOutput().FindPoint(clipper.GetOutput().GetPoints().GetPoint(i)))[1]
>>        + Displacement[1];
>>
>>
>>  apd.GetOutput().GetPoints().GetPoint(apd.GetOutput().FindPoint(clipper.GetOutput().GetPoints().GetPoint(i)))[2]
>>        =
>>
>>  apd.GetOutput().GetPoints().GetPoint(apd.GetOutput().FindPoint(clipper.GetOutput().GetPoints().GetPoint(i)))[2]
>>        + Displacement[2];
>>
>>                       apd.Update();
>>
>>                   }
>>                                               }
>>
>>  ------------------------------------------------------------------------
>>
>>        _______________________________________________
>>        Powered by www.kitware.com <http://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
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100822/40e24c33/attachment.htm>


More information about the vtkusers mailing list