[vtkusers] why the vtkpolydata can't be updated
Ali Habib
ali.mahmoud.habib at gmail.com
Sat Aug 21 09:46:52 EDT 2010
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> 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
>>
>> 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/20100821/63262e8f/attachment.htm>
More information about the vtkusers
mailing list