[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