[vtkusers] create a polyData from selected cell

David Doria daviddoria at gmail.com
Fri May 18 09:29:16 EDT 2012


On Fri, May 18, 2012 at 8:55 AM, tasnim <hanene-jeder at hotmail.fr> wrote:

> Hi David,
> thanks for your answer.Ok, this is my new code with some modifications:
> #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>
> #include <vtkVersion.h>
> #include <vtkRendererCollection.h>
> #include <vtkDataSetMapper.h>
> #include <vtkIdTypeArray.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();
>      // Visualize
>  vtkSmartPointer<vtkPolyDataMapper> mapper =
>    vtkSmartPointer<vtkPolyDataMapper>::New();
>   mapper->SetInputConnection(sphereSource->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 = sphereSource->GetOutput();
>    renderWindowInteractor->SetInteractorStyle(style);
>   renderer->AddActor(actor);
>  renderer->ResetCamera();
>  renderer->SetBackground(0,0,1); // Blue
>    renderWindow->Render();
>  renderWindowInteractor->Start();
>   return EXIT_SUCCESS;
> }
> I think the error is in these lines:
>  // 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();
> The message error says:
> Warning: In C:\vtk\Graphics\vtkLoopSubdivisionFilter.cxx, line 363
> vtkLoopSubdivisionFilter (01AEAA80): vtkLoopSubdivisionFilter only operates
> on triangles, but this data set has no triangles to operate on.
>
> ERROR: In C:\vtk\Filtering\vtkExecutive.cxx, line 756
> vtkStreamingDemandDrivenPipeline (01AE4A48): Algorithm
> vtkLoopSubdivisionFilter(01AEAA80) returned failure for request:
> vtkInformation (01AE7E28)
>

A few things:

1) You still didn't use a TriangleFilter

2) There is no need for all of the visualization code to demonstrate this
problem. It is just polluting the problem.

3)  Why are you doing this?
           vtkSmartPointer<vtkPolyDataAlgorithm> subdivisionFilter;
                subdivisionFilter =  vtkSmartPointer<
vtkLoopSubdivisionFilter>::New();
       dynamic_cast<vtkLoopSubdivisionFilter *>
(subdivisionFilter.GetPointer())->SetNumberOfSubdivisions(
numberOfSubdivisions);

instead of just

vtkSmartPointer< vtkLoopSubdivisionFilter > subdivisionFilter =
 vtkSmartPointer<vtkLoopSubdivisionFilter>::New();
subdivisionFilter->SetNumberOfSubdivisions(numberOfSubdivisions);

?

David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120518/9b752292/attachment.htm>


More information about the vtkusers mailing list