[vtkusers] create a polyData from selected cell

tasnim hanene-jeder at hotmail.fr
Fri May 18 06:19:12 EDT 2012


Good Morning,
Since my last post was without a title( i forget to set a title), I will
post my little problem again. I have a program which create a
vtkspheresource and pick a cell.I tryed to create a vtkPolyData from the
selected cell, in order to apply the subdivisionFilter on it. But it didn't
work.Any Help please!!!! here is my code:
//////////////////////////////
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkOBJReader.h>
#include <vtkUnstructuredGrid.h>
#include <vtkCell.h>
#include <vtkCellArray.h>
#include <vtkIdList.h>
#include <vtkUnsignedCharArray.h>
#include <vtkPointData.h>
#include <string>

/// pour la selection d'un triangle
#include <vtkVersion.h>
#include <vtkRendererCollection.h>
#include <vtkDataSetMapper.h>
#include <vtkIdTypeArray.h>
#include <vtkTriangleFilter.h>
#include <vtkCommand.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkCellPicker.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkProperty.h>
#include <vtkSelectionNode.h>
#include <vtkSelection.h>
#include <vtkExtractSelection.h>
#include <vtkObjectFactory.h>

#include <vtkGenericCell.h>
#include <vtkLoopSubdivisionFilter.h>
#include <vtkSphereSource.h>


// Catch mouse events
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
  public:
  static MouseInteractorStyle* New();
 
  MouseInteractorStyle()
  {
    selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
    selectedActor = vtkSmartPointer<vtkActor>::New();
  }
 
    virtual void OnLeftButtonDown()
    {
      // Get the location of the click (in window coordinates)
      int* pos = this->GetInteractor()->GetEventPosition();
 
      vtkSmartPointer<vtkCellPicker> picker =
        vtkSmartPointer<vtkCellPicker>::New();
      picker->SetTolerance(0.0005);
 
      // Pick from this location.
      picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
 
      double* worldPosition = picker->GetPickPosition();
      std::cout << "Cell id is: " << picker->GetCellId() << std::endl;
 
      if(picker->GetCellId() != -1)
        {
 
        std::cout << "Pick position is: " << worldPosition[0] << " " <<
worldPosition[1]
                  << " " << worldPosition[2] << endl;
 
        vtkSmartPointer<vtkIdTypeArray> ids =
          vtkSmartPointer<vtkIdTypeArray>::New();
        ids->SetNumberOfComponents(1);
        ids->InsertNextValue(picker->GetCellId());
 
        vtkSmartPointer<vtkSelectionNode> selectionNode =
          vtkSmartPointer<vtkSelectionNode>::New();
        selectionNode->SetFieldType(vtkSelectionNode::CELL);
        selectionNode->SetContentType(vtkSelectionNode::INDICES);
        selectionNode->SetSelectionList(ids);
		
 
        vtkSmartPointer<vtkSelection> selection =
          vtkSmartPointer<vtkSelection>::New();
        selection->AddNode(selectionNode);
 
        vtkSmartPointer<vtkExtractSelection> extractSelection =
          vtkSmartPointer<vtkExtractSelection>::New();
#if VTK_MAJOR_VERSION <= 5
        extractSelection->SetInput(0, this->Data);
        extractSelection->SetInput(1, selection);
#else
        extractSelection->SetInputData(0, this->Data);
        extractSelection->SetInputData(1, selection);
#endif
        extractSelection->Update();
 
        // In selection
        vtkSmartPointer<vtkUnstructuredGrid> selected =
          vtkSmartPointer<vtkUnstructuredGrid>::New();
        selected->ShallowCopy(extractSelection->GetOutput());
 
        std::cout << "There are " << selected->GetNumberOfPoints()
                  << " points in the selection." << std::endl;
        std::cout << "There are " << selected->GetNumberOfCells()
                  << " cells in the selection." << std::endl;
		/////////////////////

		 // Create a polydata object
  vtkSmartPointer<vtkPolyData> newdata =
    vtkSmartPointer<vtkPolyData>::New();

		vtkPoints* cellPoints = selected->GetPoints(); 
        newdata->SetPoints(cellPoints); 
		 
		int numberOfSubdivisions = 2;
		vtkSmartPointer<vtkPolyDataAlgorithm> subdivisionFilter;
		 subdivisionFilter =  vtkSmartPointer<vtkLoopSubdivisionFilter>::New();
        dynamic_cast<vtkLoopSubdivisionFilter *>
(subdivisionFilter.GetPointer())->SetNumberOfSubdivisions(numberOfSubdivisions);
#if VTK_MAJOR_VERSION <= 5
		subdivisionFilter->SetInputConnection(newdata->GetProducerPort());
#else
    subdivisionFilter->SetInputData(newdata);
#endif
    subdivisionFilter->Update();
		 

		/////////////:
		 vtkSmartPointer<vtkIdTypeArray> id =
      vtkSmartPointer<vtkIdTypeArray>::New();
  id->SetNumberOfComponents(1);
 
  // Set values
  for(unsigned int i = 10; i < 20; i++)
    {
    ids->InsertNextValue(i);
    }


		///////////////
 
 
#if VTK_MAJOR_VERSION <= 5
        selectedMapper->SetInputConnection(
          selected->GetProducerPort());
#else
        selectedMapper->SetInputData(selected);
#endif
 
        selectedActor->SetMapper(selectedMapper);
        selectedActor->GetProperty()->EdgeVisibilityOn();
        selectedActor->GetProperty()->SetEdgeColor(1,0,0);
        selectedActor->GetProperty()->SetLineWidth(3);
 
       
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
 
        }
      // Forward events
      vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
    }
 
    vtkSmartPointer<vtkPolyData> Data;
    vtkSmartPointer<vtkDataSetMapper> selectedMapper;
    vtkSmartPointer<vtkActor> selectedActor;
 
};
 
vtkStandardNewMacro(MouseInteractorStyle);

 
int main(int, char *[])
{
 vtkSmartPointer<vtkSphereSource> sphereSource =
    vtkSmartPointer<vtkSphereSource>::New();
  sphereSource->Update();

  // filtre de triangle
   vtkSmartPointer<vtkTriangleFilter> triangleFilter =
    vtkSmartPointer<vtkTriangleFilter>::New();
   triangleFilter->SetInputConnection(sphereSource->GetOutputPort());
  triangleFilter->Update();
  
 
  // Visualize
  vtkSmartPointer<vtkPolyDataMapper> mapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper->SetInputConnection(triangleFilter->GetOutputPort());
 
  vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);
 
  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);

  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);
  renderWindowInteractor->Initialize();
 
  // Set the custom stype to use for interaction.
  vtkSmartPointer<MouseInteractorStyle> style =
    vtkSmartPointer<MouseInteractorStyle>::New();
  style->SetDefaultRenderer(renderer);
  style->Data = triangleFilter->GetOutput();
   renderWindowInteractor->SetInteractorStyle(style);
 
 
  renderer->AddActor(actor);
  renderer->ResetCamera();
  renderer->SetBackground(0,0,1); // Blue
  //renderer->SetBackground(.3, .6, .3); // Background color green
 
  renderWindow->Render();
  renderWindowInteractor->Start();
 
  return EXIT_SUCCESS;
}

i'd like to apply the loopSubdivisionFilter on my  selected cell.But one i
pick on a cell, it shows me his error message:
vtkLoopSubdivisionFilter (009D6CD0): vtkLoopSubdivisionFilter only operates
on triangles, but this data set has no triangles to operate on.
Any Help please, and  thanks fo all

--
View this message in context: http://vtk.1045678.n5.nabble.com/create-a-polyData-from-selected-cell-tp5711827.html
Sent from the VTK - Users mailing list archive at Nabble.com.



More information about the vtkusers mailing list