[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