[vtkusers] why the vtkpolydata can't be updated

Jim Peterson jimcp at cox.net
Sat Aug 21 09:44:33 EDT 2010


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
>
> 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