[vtkusers] Code controlling vtkImagePlaneWidget
Dean Inglis
dean.inglis at camris.ca
Wed Sep 22 11:34:22 EDT 2010
did you check to see if your origin, point1 and point2
are contained within the bounds of the image data?
double bounds[6];
image->GetBounds(bounds);
vtkBoundingBox box;
box.SetBounds(bounds);
if(box.ContainsPoint( origin ) &&
box.ContainsPoint( point1 ) &&
box.ContainsPoint( point2 ) )
printf("ok");
else
printf("error");
also, widget needs to have UpdatePlacement() called
after changing origin/point1/point2.
Dean
Hello!
I'm trying to control vtkImagePlaneWidget by code. I get the vtkPolyData
representation of a vtkSPLineRepresentation, and also I get the points
of that polydata:
vtkPolyData * pd;
pd = vtkPolyData::New();
LineSP->GetPolyData ( pd );
vtkCellArray * lines = pd->GetLines();
vtkPoints * points = pd->GetPoints();
vtkIdType *pts = 0;
vtkIdType npts = 0;
vtkIdType npts_acum = 0;
double p1[3], p2[3], p3[3], p21[3], p31[3], pn[3];
Slice = 75; // Arbitrary value
for ( lines->InitTraversal(); lines->GetNextCell(npts, pts); )
{
if ( npts + npts_acum >= Slice )
{
int _j = Slice - npts_acum;
puntos->GetPoint( pts[_j], p1);
puntos->GetPoint( pts[_j+1], p2);
break;
}
}
// Point of plane : p1
// Normal of plane: p2-p1
vtkMath::Subtract (p2, p1, pn);
vtkMath::Normalize ( pn );
Then I need to obtain another point of desired plane, I achieve this with:
p31[0] = 0;
p31[1] = 0;
p31[2] = 1;
vtkMath::Cross (pn, p31, p3);
Then I do: _po = p1, _p1 = p1 + p31;
_po = p1;
vtkMath::Add ( p1, p31, _p1);
vtkMath::Add ( p1, p3, _p2);
And finally try to assign that values to the widget:
ImagePlaneWidget->SetOrigin ( _po );
ImagePlaneWidget->SetPoint1 ( _p1 );
ImagePlaneWidget->SetPoint2 ( _p2 );
ImagePlaneWidget->Modfied();
But only background color is show on my render window. Any help on what
could be wrong?
More information about the vtkusers
mailing list