[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