[vtkusers] why the vtkpolydata can't be updated

Ali Habib ali.mahmoud.habib at gmail.com
Fri Aug 20 23:16:10 EDT 2010


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();

            }




        }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100821/d1ddbf7d/attachment.htm>


More information about the vtkusers mailing list