[vtkusers] create a polyData from selected cell
David Doria
daviddoria at gmail.com
Fri May 18 08:10:50 EDT 2012
On Fri, May 18, 2012 at 6:19 AM, tasnim <hanene-jeder at hotmail.fr> wrote:
> 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
>
That code is much too long to troubleshoot (though you definitely need a
vtkTriangleFilter before the LoopSubdivisionFilter in this case). I suggest
you make a very minimal (compilable) example of the part of the code that
is causing the problem.
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120518/890eb251/attachment.htm>
More information about the vtkusers
mailing list