User talk:JRobinson
Dear All,
The specific behaviour that I wanted was to be able to position the vtkPlaneWidget according to the origin and normal of an existing vtkPlane. The converse already exists with vtkPlaneWidget::GetPlane(vtkPlane*). THe problem with trying to use existign vtkPlaneWidget methods is the lack of
this->PlaneSource->Update();
in the SetNormal & SetOrigin methods. The workaround was to add a new method to vtkPlaneWidget:
void vtkPlaneWidget::SetPlane(vtkPlane *plane) {
if ( plane == NULL ) { return; } float normal[3] ; float origin[3] ; plane->GetNormal(normal) ; plane->GetOrigin(origin) ; this->SetNormal(normal) ; this->SetCenter(origin) ; this->PlaneSource->Update();
}
Now I can set the initial vtkPlaneWidget position according to an existing vtkPlane orientation and update it at any time. Part of my code looks like this:
///////////////////////////////////////////////////////////////////////////// // CSampleDoc commands ///////////////////////////////////////////////////////////////////////////// void CSampleDoc::SetUpPlaneWidget() {
pPlaneWidget->SetInteractor(GetView()->Interactor);
// Just to get overall dimension
pPlaneWidget->SetInput(pUnstructuredGrid);
// Make it slightly bigger than the actual cross section
pPlaneWidget->SetPlaceFactor(1.25); pPlaneWidget->PlaceWidget();
// This is not pertinent unless the wireframe representation is used
pPlaneWidget->SetResolution(10) ;
// Choose your representation
pPlaneWidget->SetRepresentationToOutline() ;
// pPlaneWidget->SetRepresentationToWireFrame() ; // pPlaneWidget->SetRepresentationToSurface() ;
// Make sure it corresponds to the vtkPlane orientation
UpdatePlaneWidget() ;
// Make sure that reacts
pPlaneWidget->AddObserver(vtkCommand::InteractionEvent, pCutPlaneCallback);
} ///////////////////////////////////////////////////////////////////////////// // CSampleDoc commands ///////////////////////////////////////////////////////////////////////////// void CSampleDoc::UpdatePlaneWidget() { // This method is to update the plane widget from the vtkPlane used as the // implicit function for the vtkCutter
pPlaneWidget->SetPlane(pPlane) ; pPlaneWidget->UpdatePlacement() ;
} I hope this is of some use. If i am doing something obviously wrong or inefficient, please add your comments to the Wiki. Might I suggest to the powers that be that the method that I have added to my vtkPlaneWidget object be added to teh actual next build/release of the vtkHybrid library (and any other objects that could use such a functionality).
Jim